#
# 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 (TI, ADI, ...)'
	depends on (USB || USB_GADGET)
	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.

	  Analog Devices parts using this IP include Blackfin BF54x,
	  BF525 and BF527.

	  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_DAVINCI
	tristate "DaVinci"
	depends on ARCH_DAVINCI_DMx
	depends on BROKEN

config USB_MUSB_DA8XX
	tristate "DA8xx/OMAP-L1x"
	depends on ARCH_DAVINCI_DA8XX
	depends on BROKEN

config USB_MUSB_TUSB6010
	tristate "TUSB6010"

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

config USB_MUSB_AM35X
	tristate "AM35x"
	depends on ARCH_OMAP

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

config USB_MUSB_BLACKFIN
	tristate "Blackfin"
	depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523)

config USB_MUSB_UX500
	tristate "Ux500 platforms"

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

config USB_MUSB_AM335X_CHILD
	tristate

choice
	prompt 'MUSB DMA mode'
	default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740
	default USB_UX500_DMA if USB_MUSB_UX500
	default USB_INVENTRA_DMA if USB_MUSB_OMAP2PLUS || USB_MUSB_BLACKFIN
	default USB_TI_CPPI_DMA if USB_MUSB_DAVINCI
	default USB_TUSB_OMAP_DMA if USB_MUSB_TUSB6010
	default MUSB_PIO_ONLY if USB_MUSB_TUSB6010 || USB_MUSB_DA8XX || USB_MUSB_AM35X \
				|| USB_MUSB_DSPS
	help
	  Unfortunately, only one option can be enabled here. Ideally one
	  should be able to build all these drivers into one kernel to
	  allow using DMA on multiplatform kernels.

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 || USB_MUSB_BLACKFIN
	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 (AM335x)'
	depends on ARCH_OMAP
	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.

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.

endchoice

endif # USB_MUSB_HDRC
