#
# MUSB Controller Driver
#
comment "MUSB Controller Driver"

config USB_MUSB_HOST
	bool "MUSB host mode support"
	depends on DM && OF_CONTROL
	select SPL_SPRINTF if SPL
	select TPL_SPRINTF if TPL
	select USB_HOST
	help
	  Enables the MUSB USB dual-role controller in host mode.

config USB_MUSB_GADGET
	bool "MUSB gadget mode support"
	depends on USB_GADGET
	select USB_GADGET_DUALSPEED
	select SPL_SPRINTF if SPL
	select TPL_SPRINTF if TPL
	help
	  Enables the MUSB USB dual-role controller in gadget mode.

if USB_MUSB_HOST || USB_MUSB_GADGET
config USB_MUSB_DA8XX
	bool "Enable DA8xx MUSB Controller"
	depends on ARCH_DAVINCI
	help
	  Say y here to enable support for the dual role high
	  speed USB controller based on the Mentor Graphics
	  silicon IP.

config USB_MUSB_TI
	bool "Enable TI OTG USB controller"
	depends on AM33XX
	select USB_MUSB_DSPS
	help
	  Say y here to enable support for the dual role high
	  speed USB controller based on the Mentor Graphics
	  silicon IP.

config USB_MUSB_OMAP2PLUS
	tristate "OMAP2430 and onwards"
	depends on ARCH_OMAP2PLUS

config USB_MUSB_AM35X
	bool "AM35x"

config USB_MUSB_DSPS
	bool "TI DSPS platforms"

config USB_MUSB_MT85XX
	bool "Enable Mediatek MT85XX DRC USB controller"
	depends on ARCH_MEDIATEK
	help
	  Say y to enable Mediatek MT85XX USB DRC controller support
	  if it is available on your Mediatek MUSB IP based platform.
	  DMA controllers are ignored. This driver follow musb-new
	  driver and usb gadget framework.

config USB_MUSB_PIC32
	bool "Enable Microchip PIC32 DRC USB controller"
	depends on MACH_PIC32
	help
	  Say y to enable PIC32 USB DRC controller support
	  if it is available on your Microchip PIC32 platform.

config USB_MUSB_SUNXI
	bool "Enable sunxi OTG / DRC USB controller"
	depends on ARCH_SUNXI
	select USB_MUSB_PIO_ONLY
	default y
	---help---
	Say y here to enable support for the sunxi OTG / DRC USB controller
	used on almost all sunxi boards.

config USB_MUSB_UX500
	bool "Enable ST-Ericsson Ux500 USB controller"
	depends on DM_USB && DM_USB_GADGET && ARCH_U8500
	default y
	help
	  Say y to enable support for the MUSB OTG USB controller used in
	  ST-Ericsson Ux500. The driver supports either gadget or host mode
	  based on the selection of CONFIG_USB_MUSB_HOST.

config USB_MUSB_DISABLE_BULK_COMBINE_SPLIT
	bool "Disable MUSB bulk split/combine"
	default y
	help
	  On TI AM335x devices, MUSB has bulk split/combine feature enabled
	  in the ConfigData register, but the current MUSB driver does not
	  support it yet. Select this option to disable the feature until the
	  driver adds the support.

endif

config USB_MUSB_PIO_ONLY
	bool "Disable DMA (always use PIO)"
	default y if USB_MUSB_AM35X || USB_MUSB_PIC32 || USB_MUSB_OMAP2PLUS || USB_MUSB_DSPS || USB_MUSB_SUNXI || USB_MUSB_MT85XX || USB_MUSB_UX500
	help
	  All data is copied between memory and FIFO by the CPU.
	  DMA controllers are ignored.

config USB_MUSB_FIXED_CONFIGDATA
	bool "Hardcode MUSB CONFIGDATA register"
	depends on USB_MUSB_SUNXI
	default n if MACH_SUN4I || MACH_SUN5I || MACH_SUN6I || MACH_SUN7I || MACH_SUN8I_A23
	default y
	help
	  Newer Allwinner SoCs do not implement the MUSB_CONFIGDATA register,
	  so it always reads 0. Select this option to override this and
	  return a hardcoded value instead.
