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