#
# 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, AW, ...)'
	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.

	  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
	depends on 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
	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

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

endif # !MUSB_PIO_ONLY

endif # USB_MUSB_HDRC
