#
# USB Dual Role (OTG-ready) Controller Drivers
# for silicon based on Mentor Graphics INVENTRA designs
#

# (M)HDRC = (Multipoint) Highspeed Dual-Role Controller
config USB_MUSB_HDRC
	tristate 'Inventra Highspeed Dual Role Controller'
	depends on (USB || USB_GADGET)
	depends on HAS_IOMEM
	help
	  Say Y here if your system has a dual role high speed USB
	  controller based on the Mentor Graphics silicon IP.  Then
	  configure options to match your silicon and the board
	  it's being used with, including the USB peripheral role,
	  or the USB host role, or both.

	  Texas Instruments families using this IP include DaVinci
	  (35x, 644x ...), OMAP 243x, OMAP 3, and TUSB 6010.

	  Allwinner SoCs using this IP include A10, A13, A20, ...

	  If you do not know what this is, please say N.

	  To compile this driver as a module, choose M here; the
	  module will be called "musb-hdrc".

if USB_MUSB_HDRC

choice
	bool "MUSB Mode Selection"
	default USB_MUSB_DUAL_ROLE if (USB && USB_GADGET)
	default USB_MUSB_HOST if (USB && !USB_GADGET)
	default USB_MUSB_GADGET if (!USB && USB_GADGET)

config USB_MUSB_HOST
	bool "Host only mode"
	depends on USB=y || USB=USB_MUSB_HDRC
	help
	  Select this when you want to use MUSB in host mode only,
	  thereby the gadget feature will be regressed.

config USB_MUSB_GADGET
	bool "Gadget only mode"
	depends on USB_GADGET=y || USB_GADGET=USB_MUSB_HDRC
	depends on HAS_DMA
	help
	  Select this when you want to use MUSB in gadget mode only,
	  thereby the host feature will be regressed.

config USB_MUSB_DUAL_ROLE
	bool "Dual Role mode"
	depends on ((USB=y || USB=USB_MUSB_HDRC) && (USB_GADGET=y || USB_GADGET=USB_MUSB_HDRC))
	depends on HAS_DMA
	help
	  This is the default mode of working of MUSB controller where
	  both host and gadget features are enabled.

endchoice

comment "Platform Glue Layer"

config USB_MUSB_SUNXI
	tristate "Allwinner (sunxi)"
	depends on ARCH_SUNXI
	depends on NOP_USB_XCEIV
	depends on PHY_SUN4I_USB
	depends on EXTCON
	select GENERIC_PHY
	select SUNXI_SRAM

config USB_MUSB_DAVINCI
	tristate "DaVinci"
	depends on ARCH_DAVINCI_DMx
	depends on NOP_USB_XCEIV
	depends on BROKEN

config USB_MUSB_DA8XX
	tristate "DA8xx/OMAP-L1x"
	depends on ARCH_DAVINCI_DA8XX
	depends on NOP_USB_XCEIV
	select PHY_DA8XX_USB

config USB_MUSB_TUSB6010
	tristate "TUSB6010"
	depends on HAS_IOMEM
	depends on ARCH_OMAP2PLUS || COMPILE_TEST
	depends on NOP_USB_XCEIV = USB_MUSB_HDRC # both built-in or both modules

config USB_MUSB_OMAP2PLUS
	tristate "OMAP2430 and onwards"
	depends on ARCH_OMAP2PLUS && USB
	depends on OMAP_CONTROL_PHY || !OMAP_CONTROL_PHY
	select GENERIC_PHY

config USB_MUSB_AM35X
	tristate "AM35x"
	depends on ARCH_OMAP
	depends on NOP_USB_XCEIV

config USB_MUSB_DSPS
	tristate "TI DSPS platforms"
	select USB_MUSB_AM335X_CHILD
	depends on ARCH_OMAP2PLUS || COMPILE_TEST
	depends on OF_IRQ

config USB_MUSB_UX500
	tristate "Ux500 platforms"
	depends on ARCH_U8500 || COMPILE_TEST

config USB_MUSB_JZ4740
	tristate "JZ4740"
	depends on NOP_USB_XCEIV
	depends on MACH_JZ4740 || COMPILE_TEST
	depends on USB_MUSB_GADGET
	depends on USB_OTG_BLACKLIST_HUB

config USB_MUSB_AM335X_CHILD
	tristate

comment "MUSB DMA mode"

config MUSB_PIO_ONLY
	bool 'Disable DMA (always use PIO)'
	help
	  All data is copied between memory and FIFO by the CPU.
	  DMA controllers are ignored.

	  Do not choose this unless DMA support for your SOC or board
	  is unavailable (or unstable).  When DMA is enabled at compile time,
	  you can still disable it at run time using the "use_dma=n" module
	  parameter.

if !MUSB_PIO_ONLY

config USB_UX500_DMA
	bool 'ST Ericsson Ux500'
	depends on USB_MUSB_UX500
	help
	  Enable DMA transfers on UX500 platforms.

config USB_INVENTRA_DMA
	bool 'Inventra'
	depends on USB_MUSB_OMAP2PLUS
	help
	  Enable DMA transfers using Mentor's engine.

config USB_TI_CPPI_DMA
	bool 'TI CPPI (Davinci)'
	depends on USB_MUSB_DAVINCI
	help
	  Enable DMA transfers when TI CPPI DMA is available.

config USB_TI_CPPI41_DMA
	bool 'TI CPPI 4.1'
	depends on (ARCH_OMAP || ARCH_DAVINCI_DA8XX) && DMADEVICES
	select TI_CPPI41

config USB_TUSB_OMAP_DMA
	bool 'TUSB 6010'
	depends on USB_MUSB_TUSB6010 = USB_MUSB_HDRC # both built-in or both modules
	depends on ARCH_OMAP
	help
	  Enable DMA transfers on TUSB 6010 when OMAP DMA is available.

endif # !MUSB_PIO_ONLY

endif # USB_MUSB_HDRC
