#
# 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 NOP_USB_XCEIV
	depends on BROKEN

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

config USB_MUSB_TUSB6010
	tristate "TUSB6010"
	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_BLACKFIN
	tristate "Blackfin"
	depends on (BF54x && !BF544) || (BF52x && ! BF522 && !BF523)
	depends on NOP_USB_XCEIV

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

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
