#
# 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
	depends on PHY_SUN4I_USB
	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.
