#
# 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
	default n
	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
	default n
	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
	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.
