# SPDX-License-Identifier: GPL-2.0
#
# 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
	prompt "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_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!=m || USB_MUSB_HDRC=m

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_DSPS
	tristate "TI DSPS platforms"
	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 OF
	depends on MIPS || COMPILE_TEST
	depends on USB_MUSB_GADGET
	select USB_ROLE_SWITCH

config USB_MUSB_MEDIATEK
	tristate "MediaTek platforms"
	depends on ARCH_MEDIATEK || COMPILE_TEST
	depends on NOP_USB_XCEIV
	select GENERIC_PHY
	select USB_ROLE_SWITCH

config USB_MUSB_POLARFIRE_SOC
	tristate "Microchip PolarFire SoC platforms"
	depends on ARCH_MICROCHIP_POLARFIRE || COMPILE_TEST
	depends on NOP_USB_XCEIV
	select USB_MUSB_DUAL_ROLE
	help
	  Say Y here to enable support for USB on Microchip's PolarFire SoC.

	  This support is also available as a module.  If so, the module
	  will be called mpfs.

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_MEDIATEK || USB_MUSB_JZ4740 || USB_MUSB_POLARFIRE_SOC
	help
	  Enable DMA transfers using Mentor's engine.

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
