# SPDX-License-Identifier: GPL-2.0
#
# USB Host Controller Drivers
#
comment "USB Host Controller Drivers"

config USB_C67X00_HCD
	tristate "Cypress C67x00 HCD support"
	depends on HAS_IOMEM
	help
	  The Cypress C67x00 (EZ-Host/EZ-OTG) chips are dual-role
	  host/peripheral/OTG USB controllers.

	  Enable this option to support this chip in host controller mode.
	  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called c67x00.

config USB_XHCI_HCD
	tristate "xHCI HCD (USB 3.0) support"
	depends on HAS_DMA && HAS_IOMEM
	help
	  The eXtensible Host Controller Interface (xHCI) is standard for USB 3.0
	  "SuperSpeed" host controller hardware.

	  To compile this driver as a module, choose M here: the
	  module will be called xhci-hcd.

if USB_XHCI_HCD
config USB_XHCI_DBGCAP
	bool "xHCI support for debug capability"
	depends on TTY
	help
	  Say 'Y' to enable the support for the xHCI debug capability. Make
	  sure that your xHCI host supports the extended debug capability and
	  you want a TTY serial device based on the xHCI debug capability
	  before enabling this option. If unsure, say 'N'.

config USB_XHCI_PCI
	tristate
	depends on USB_PCI
	default y

config USB_XHCI_PCI_RENESAS
	tristate "Support for additional Renesas xHCI controller with firmware"
	depends on USB_XHCI_PCI
	help
	  Say 'Y' to enable the support for the Renesas xHCI controller with
	  firmware. Make sure you have the firmware for the device and
	  installed on your system for this device to work.
	  If unsure, say 'N'.

config USB_XHCI_PLATFORM
	tristate "Generic xHCI driver for a platform device"
	help
	  Adds an xHCI host driver for a generic platform device, which
	  provides a memory space and an irq.
	  It is also a prerequisite for platform specific drivers that
	  implement some extra quirks.

	  If unsure, say N.

config USB_XHCI_HISTB
	tristate "xHCI support for HiSilicon STB SoCs"
	depends on USB_XHCI_PLATFORM && (ARCH_HISI || COMPILE_TEST)
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in HiSilicon STB SoCs.

config USB_XHCI_MTK
	tristate "xHCI support for MediaTek SoCs"
	select MFD_SYSCON
	depends on (MIPS && SOC_MT7621) || ARCH_MEDIATEK || COMPILE_TEST
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in MediaTek SoCs.
	  If unsure, say N.

config USB_XHCI_MVEBU
	tristate "xHCI support for Marvell Armada 375/38x/37xx"
	select USB_XHCI_PLATFORM
	depends on HAS_IOMEM
	depends on ARCH_MVEBU || COMPILE_TEST
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in Marvell Armada 375/38x/37xx ARM SOCs.

config USB_XHCI_RCAR
	tristate "xHCI support for Renesas R-Car SoCs"
	depends on USB_XHCI_PLATFORM
	depends on ARCH_RENESAS || COMPILE_TEST
	default ARCH_RENESAS
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in Renesas R-Car ARM SoCs.

config USB_XHCI_RZV2M
	bool "xHCI support for Renesas RZ/V2M SoC"
	depends on USB_XHCI_RCAR
	depends on ARCH_R9A09G011 || COMPILE_TEST
	depends on USB_RZV2M_USB3DRD=y || (USB_RZV2M_USB3DRD=USB_XHCI_RCAR)
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in Renesas RZ/V2M SoC.

config USB_XHCI_TEGRA
	tristate "xHCI support for NVIDIA Tegra SoCs"
	depends on PHY_TEGRA_XUSB
	depends on RESET_CONTROLLER
	select FW_LOADER
	help
	  Say 'Y' to enable the support for the xHCI host controller
	  found in NVIDIA Tegra124 and later SoCs.

endif # USB_XHCI_HCD

config USB_EHCI_BRCMSTB
       tristate

config USB_BRCMSTB
	tristate "Broadcom STB USB support"
	depends on (ARCH_BRCMSTB && PHY_BRCM_USB) || COMPILE_TEST
	select USB_OHCI_HCD_PLATFORM if USB_OHCI_HCD
	select USB_EHCI_BRCMSTB if USB_EHCI_HCD
	select USB_XHCI_PLATFORM if USB_XHCI_HCD
	help
	  Enables support for XHCI, EHCI and OHCI host controllers
	  found in Broadcom STB SoC's.

	  To compile these drivers as modules, choose M here: the
	  modules will be called ohci-platform.ko, ehci-brcm.ko and
	  xhci-plat-hcd.ko

	  Disabling this will keep the controllers and corresponding
	  PHYs powered down.

config USB_EHCI_HCD
	tristate "EHCI HCD (USB 2.0) support"
	depends on HAS_DMA && HAS_IOMEM
	help
	  The Enhanced Host Controller Interface (EHCI) is standard for USB 2.0
	  "high speed" (480 Mbit/sec, 60 Mbyte/sec) host controller hardware.
	  If your USB host controller supports USB 2.0, you will likely want to
	  configure this Host Controller Driver.

	  EHCI controllers are packaged with "companion" host controllers (OHCI
	  or UHCI) to handle USB 1.1 devices connected to root hub ports.  Ports
	  will connect to EHCI if the device is high speed, otherwise they
	  connect to a companion controller.  If you configure EHCI, you should
	  probably configure the OHCI (for NEC and some other vendors) USB Host
	  Controller Driver or UHCI (for Via motherboards) Host Controller
	  Driver too.

	  You may want to read <file:Documentation/usb/ehci.rst>.

	  To compile this driver as a module, choose M here: the
	  module will be called ehci-hcd.

config USB_EHCI_ROOT_HUB_TT
	bool "Root Hub Transaction Translators"
	depends on USB_EHCI_HCD
	help
	  Some EHCI chips have vendor-specific extensions to integrate
	  transaction translators, so that no OHCI or UHCI companion
	  controller is needed.  It's safe to say "y" even if your
	  controller doesn't support this feature.

	  This supports the EHCI implementation that's originally
	  from ARC, and has since changed hands a few times.

config USB_EHCI_TT_NEWSCHED
	bool "Improved Transaction Translator scheduling"
	depends on USB_EHCI_HCD
	default y
	help
	  This changes the periodic scheduling code to fill more of the low
	  and full speed bandwidth available from the Transaction Translator
	  (TT) in USB 2.0 hubs.  Without this, only one transfer will be
	  issued in each microframe, significantly reducing the number of
	  periodic low/fullspeed transfers possible.

	  If you have multiple periodic low/fullspeed devices connected to a
	  highspeed USB hub which is connected to a highspeed USB Host
	  Controller, and some of those devices will not work correctly
	  (possibly due to "ENOSPC" or "-28" errors), say Y.  Conversely, if
	  you have only one such device and it doesn't work, you could try
	  saying N.

	  If unsure, say Y.

if USB_EHCI_HCD

config USB_EHCI_PCI
	tristate
	depends on USB_PCI
	default y

config XPS_USB_HCD_XILINX
	bool "Use Xilinx usb host EHCI controller core"
	depends on (PPC32 || MICROBLAZE)
	select USB_EHCI_BIG_ENDIAN_DESC
	select USB_EHCI_BIG_ENDIAN_MMIO
	help
		Xilinx xps USB host controller core is EHCI compliant and has
		transaction translator built-in. It can be configured to either
		support both high speed and full speed devices, or high speed
		devices only.

config USB_EHCI_FSL
	tristate "Support for Freescale on-chip EHCI USB controller"
	select USB_EHCI_ROOT_HUB_TT
	help
	  Variation of ARC USB block used in some Freescale chips.

config USB_EHCI_HCD_NPCM7XX
	tristate "Support for Nuvoton NPCM on-chip EHCI USB controller"
	depends on (USB_EHCI_HCD && ARCH_NPCM) || COMPILE_TEST
	default y if (USB_EHCI_HCD && ARCH_NPCM)
	help
	  Enables support for the on-chip EHCI controller on
	  Nuvoton NPCM chips.

config USB_EHCI_HCD_OMAP
	tristate "EHCI support for OMAP3 and later chips"
	depends on ARCH_OMAP || COMPILE_TEST
	depends on NOP_USB_XCEIV
	default y
	help
	  Enables support for the on-chip EHCI controller on
	  OMAP3 and later chips.

config USB_EHCI_HCD_ORION
	tristate  "Support for Marvell EBU on-chip EHCI USB controller"
	depends on USB_EHCI_HCD && (PLAT_ORION || ARCH_MVEBU || COMPILE_TEST)
	default y if (PLAT_ORION || ARCH_MVEBU)
	help
	  Enables support for the on-chip EHCI controller on Marvell's
	  embedded ARM SoCs, including Orion, Kirkwood, Dove, Armada XP,
	  Armada 370.  This is different from the EHCI implementation
	  on Marvell's mobile PXA and MMP SoC, see "EHCI support for
	  Marvell PXA/MMP USB controller" for those.

config USB_EHCI_HCD_SPEAR
	tristate "Support for ST SPEAr on-chip EHCI USB controller"
	depends on USB_EHCI_HCD && (PLAT_SPEAR || COMPILE_TEST)
	default y if PLAT_SPEAR
	help
	  Enables support for the on-chip EHCI controller on
	  ST SPEAr chips.

config USB_EHCI_HCD_STI
	tristate "Support for ST STiHxxx on-chip EHCI USB controller"
	depends on (ARCH_STI || COMPILE_TEST) && OF
	select GENERIC_PHY
	select USB_EHCI_HCD_PLATFORM
	help
	  Enable support for the on-chip EHCI controller found on
	  STMicroelectronics consumer electronics SoC's.

config USB_EHCI_HCD_AT91
	tristate  "Support for Atmel on-chip EHCI USB controller"
	depends on USB_EHCI_HCD && (ARCH_AT91 || COMPILE_TEST)
	default y if ARCH_AT91
	help
	  Enables support for the on-chip EHCI controller on
	  Atmel chips.

config USB_EHCI_TEGRA
	tristate "NVIDIA Tegra HCD support"
	depends on ARCH_TEGRA
	select USB_CHIPIDEA
	select USB_CHIPIDEA_HOST
	select USB_CHIPIDEA_TEGRA
	select USB_GADGET
	help
	  This option is deprecated now and the driver was removed, use
	  USB_CHIPIDEA_TEGRA instead.

	  Enable support for the internal USB Host Controllers
	  found in NVIDIA Tegra SoCs. The controllers are EHCI compliant.

config USB_EHCI_HCD_PPC_OF
	bool "EHCI support for PPC USB controller on OF platform bus"
	depends on PPC
	default y
	help
	  Enables support for the USB controller present on the PowerPC
	  OpenFirmware platform bus.

config USB_EHCI_SH
	bool "EHCI support for SuperH USB controller"
	depends on SUPERH || COMPILE_TEST
	help
	  Enables support for the on-chip EHCI controller on the SuperH.
	  If you use the PCI EHCI controller, this option is not necessary.

config USB_EHCI_EXYNOS
	tristate "EHCI support for Samsung S5P/Exynos SoC Series"
	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
	help
	  Enable support for the Samsung S5Pv210 and Exynos SOC's on-chip EHCI
	  controller.

config USB_EHCI_MV
	tristate "EHCI support for Marvell PXA/MMP USB controller"
	depends on ARCH_PXA || ARCH_MMP || COMPILE_TEST
	select USB_EHCI_ROOT_HUB_TT
	help
	  Enables support for Marvell (including PXA and MMP series) on-chip
	  USB SPH and OTG controller. SPH is a single port host, and it can
	  only be EHCI host. OTG is controller that can switch to host mode.
	  Note that this driver will not work on Marvell's other EHCI
	  controller used by the EBU-type SoCs including Orion, Kirkwood,
	  Dova, Armada 370 and Armada XP. See "Support for Marvell EBU
	  on-chip EHCI USB controller" for those.

config USB_OCTEON_HCD
	tristate "Cavium Networks Octeon USB support"
	depends on CAVIUM_OCTEON_SOC && USB
	help
	  This driver supports USB host controller on some Cavium
	  Networks' products in the Octeon family.

	  To compile this driver as a module, choose M here. The module
	  will be called octeon-hcd.

config USB_EHCI_HCD_PLATFORM
	tristate "Generic EHCI driver for a platform device"
	help
	  Adds an EHCI host driver for a generic platform device, which
	  provides a memory space and an irq.

	  If unsure, say N.

config USB_OCTEON_EHCI
	bool "Octeon on-chip EHCI support (DEPRECATED)"
	depends on CAVIUM_OCTEON_SOC
	select USB_EHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN
	select USB_EHCI_HCD_PLATFORM
	help
	  This option is deprecated now and the driver was removed, use
	  USB_EHCI_HCD_PLATFORM instead.

	  Enable support for the Octeon II SOC's on-chip EHCI
	  controller.  It is needed for high-speed (480Mbit/sec)
	  USB 2.0 device support.  All CN6XXX based chips with USB are
	  supported.

endif # USB_EHCI_HCD

config USB_OXU210HP_HCD
	tristate "OXU210HP HCD support"
	depends on HAS_IOMEM
	help
	  The OXU210HP is an USB host/OTG/device controller. Enable this
	  option if your board has this chip. If unsure, say N.

	  This driver does not support isochronous transfers and doesn't
	  implement OTG nor USB device controllers.

	  To compile this driver as a module, choose M here: the
	  module will be called oxu210hp-hcd.

config USB_ISP116X_HCD
	tristate "ISP116X HCD support"
	depends on HAS_IOMEM
	help
	  The ISP1160 and ISP1161 chips are USB host controllers. Enable this
	  option if your board has this chip. If unsure, say N.

	  This driver does not support isochronous transfers.

	  To compile this driver as a module, choose M here: the
	  module will be called isp116x-hcd.

config USB_ISP1362_HCD
	tristate "ISP1362 HCD support"
	depends on HAS_IOPORT
	depends on COMPILE_TEST # nothing uses this
	help
	  Supports the Philips ISP1362 chip as a host controller

	  This driver does not support isochronous transfers.

	  To compile this driver as a module, choose M here: the
	  module will be called isp1362-hcd.

config USB_MAX3421_HCD
	tristate "MAX3421 HCD (USB-over-SPI) support"
	depends on USB && SPI
	help
	  The Maxim MAX3421E chip supports standard USB 2.0-compliant
	  full-speed devices either in host or peripheral mode.  This
	  driver supports the host-mode of the MAX3421E only.

	  To compile this driver as a module, choose M here: the module will
	  be called max3421-hcd.

config USB_OHCI_HCD
	tristate "OHCI HCD (USB 1.1) support"
	depends on HAS_DMA && HAS_IOMEM
	help
	  The Open Host Controller Interface (OHCI) is a standard for accessing
	  USB 1.1 host controller hardware.  It does more in hardware than Intel's
	  UHCI specification.  If your USB host controller follows the OHCI spec,
	  say Y.  On most non-x86 systems, and on x86 hardware that's not using a
	  USB controller from Intel or VIA, this is appropriate.  If your host
	  controller doesn't use PCI, this is probably appropriate.  For a PCI
	  based system where you're not sure, the "lspci -v" entry will list the
	  right "prog-if" for your USB controller(s):  EHCI, OHCI, or UHCI.

	  To compile this driver as a module, choose M here: the
	  module will be called ohci-hcd.

if USB_OHCI_HCD

config USB_OHCI_HCD_OMAP1
	tristate "OHCI support for OMAP1/2 chips"
	depends on ARCH_OMAP1
	default y
	help
	  Enables support for the OHCI controller on OMAP1/2 chips.

config USB_OHCI_HCD_SPEAR
	tristate "Support for ST SPEAr on-chip OHCI USB controller"
	depends on USB_OHCI_HCD && (PLAT_SPEAR || COMPILE_TEST)
	default y if PLAT_SPEAR
	help
	  Enables support for the on-chip OHCI controller on
	  ST SPEAr chips.

config USB_OHCI_HCD_STI
	tristate "Support for ST STiHxxx on-chip OHCI USB controller"
	depends on (ARCH_STI || COMPILE_TEST) && OF
	select GENERIC_PHY
	select USB_OHCI_HCD_PLATFORM
	help
	  Enable support for the on-chip OHCI controller found on
	  STMicroelectronics consumer electronics SoC's.

config USB_OHCI_HCD_S3C2410
	tristate "OHCI support for Samsung S3C64xx SoC series"
	depends on USB_OHCI_HCD && (ARCH_S3C64XX || COMPILE_TEST)
	default ARCH_S3C64XX
	help
	  Enables support for the on-chip OHCI controller on
	  S3C64xx chips.

config USB_OHCI_HCD_LPC32XX
	tristate "Support for LPC on-chip OHCI USB controller"
	depends on USB_OHCI_HCD
	depends on ARCH_LPC32XX || COMPILE_TEST
	depends on USB_ISP1301
	default y
	help
	  Enables support for the on-chip OHCI controller on
	  NXP chips.

config USB_OHCI_HCD_PXA27X
	tristate "Support for PXA27X/PXA3XX on-chip OHCI USB controller"
	depends on USB_OHCI_HCD && (PXA27x || PXA3xx)
	default y
	help
	  Enables support for the on-chip OHCI controller on
	  PXA27x/PXA3xx chips.

config USB_OHCI_HCD_AT91
	tristate "Support for Atmel on-chip OHCI USB controller"
	depends on USB_OHCI_HCD && (ARCH_AT91 || COMPILE_TEST) && OF
	default y if ARCH_AT91
	help
	  Enables support for the on-chip OHCI controller on
	  Atmel chips.

config USB_OHCI_HCD_OMAP3
	tristate "OHCI support for OMAP3 and later chips"
	depends on ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5 || COMPILE_TEST
	select USB_OHCI_HCD_PLATFORM
	default y if ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5
	help
	  This option is deprecated now and the driver was removed, use
	  USB_OHCI_HCD_PLATFORM instead.

	  Enables support for the on-chip OHCI controller on
	  OMAP3 and later chips.

config USB_OHCI_HCD_DAVINCI
	tristate "OHCI support for TI DaVinci DA8xx"
	depends on ARCH_DAVINCI_DA8XX || COMPILE_TEST
	depends on USB_OHCI_HCD
	select PHY_DA8XX_USB
	default y if ARCH_DAVINCI_DA8XX
	help
	  Enables support for the DaVinci DA8xx integrated OHCI
	  controller. This driver cannot currently be a loadable
	  module because it lacks a proper PHY abstraction.

config USB_OHCI_HCD_PPC_OF_BE
	bool "OHCI support for OF platform bus (big endian)"
	depends on PPC
	select USB_OHCI_BIG_ENDIAN_DESC
	select USB_OHCI_BIG_ENDIAN_MMIO
	help
	  Enables support for big-endian USB controllers present on the
	  OpenFirmware platform bus.

config USB_OHCI_HCD_PPC_OF_LE
	bool "OHCI support for OF platform bus (little endian)"
	depends on PPC
	select USB_OHCI_LITTLE_ENDIAN
	help
	  Enables support for little-endian USB controllers present on the
	  OpenFirmware platform bus.

config USB_OHCI_HCD_PPC_OF
	bool
	depends on PPC
	default USB_OHCI_HCD_PPC_OF_BE || USB_OHCI_HCD_PPC_OF_LE

config USB_OHCI_HCD_PCI
	tristate "OHCI support for PCI-bus USB controllers"
	depends on USB_PCI
	default y
	select USB_OHCI_LITTLE_ENDIAN
	help
	  Enables support for PCI-bus plug-in USB controller cards.
	  If unsure, say Y.

config USB_OHCI_HCD_SSB
	bool "OHCI support for Broadcom SSB OHCI core (DEPRECATED)"
	depends on (SSB = y || SSB = USB_OHCI_HCD)
	select USB_HCD_SSB
	select USB_OHCI_HCD_PLATFORM
	help
	  This option is deprecated now and the driver was removed, use
	  USB_HCD_SSB and USB_OHCI_HCD_PLATFORM instead.

	  Support for the Sonics Silicon Backplane (SSB) attached
	  Broadcom USB OHCI core.

	  This device is present in some embedded devices with
	  Broadcom based SSB bus.

	  If unsure, say N.

config USB_OHCI_EXYNOS
	tristate "OHCI support for Samsung S5P/Exynos SoC Series"
	depends on ARCH_S5PV210 || ARCH_EXYNOS || COMPILE_TEST
	help
	  Enable support for the Samsung S5Pv210 and Exynos SOC's on-chip OHCI
	  controller.

config USB_OHCI_HCD_PLATFORM
	tristate "Generic OHCI driver for a platform device"
	help
	  Adds an OHCI host driver for a generic platform device, which
	  provides a memory space and an irq.

	  If unsure, say N.

config USB_OCTEON_OHCI
	bool "Octeon on-chip OHCI support (DEPRECATED)"
	depends on CAVIUM_OCTEON_SOC
	default USB_OCTEON_EHCI
	select USB_OHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN
	select USB_OHCI_LITTLE_ENDIAN
	select USB_OHCI_HCD_PLATFORM
	help
	  This option is deprecated now and the driver was removed, use
	  USB_OHCI_HCD_PLATFORM instead.

	  Enable support for the Octeon II SOC's on-chip OHCI
	  controller.  It is needed for low-speed USB 1.0 device
	  support.  All CN6XXX based chips with USB are supported.

endif # USB_OHCI_HCD

config USB_UHCI_HCD
	tristate "UHCI HCD (most Intel and VIA) support"
	depends on (USB_PCI && HAS_IOPORT) || USB_UHCI_SUPPORT_NON_PCI_HC
	help
	  The Universal Host Controller Interface is a standard by Intel for
	  accessing the USB hardware in the PC (which is also called the USB
	  host controller). If your USB host controller conforms to this
	  standard, you may want to say Y, but see below. All recent boards
	  with Intel PCI chipsets (like intel 430TX, 440FX, 440LX, 440BX,
	  i810, i820) conform to this standard. Also all VIA PCI chipsets
	  (like VIA VP2, VP3, MVP3, Apollo Pro, Apollo Pro II or Apollo Pro
	  133) and LEON/GRLIB SoCs with the GRUSBHC controller.
	  If unsure, say Y.

	  To compile this driver as a module, choose M here: the
	  module will be called uhci-hcd.

config USB_UHCI_SUPPORT_NON_PCI_HC
	bool
	default y if (SPARC_LEON || USB_UHCI_PLATFORM)

config USB_UHCI_PLATFORM
	bool
	default y if (ARCH_VT8500 || ARCH_ASPEED)

config USB_UHCI_ASPEED
	bool
	default y if ARCH_ASPEED

config USB_FHCI_HCD
	tristate "Freescale QE USB Host Controller support"
	depends on OF_GPIO && QE_GPIO && QUICC_ENGINE
	select FSL_GTM
	select QE_USB
	help
	  This driver enables support for Freescale QE USB Host Controller
	  (as found on MPC8360 and MPC8323 processors), the driver supports
	  Full and Low Speed USB.

config FHCI_DEBUG
	bool "Freescale QE USB Host Controller debug support"
	depends on USB_FHCI_HCD && DEBUG_FS
	help
	  Say "y" to see some FHCI debug information and statistics
	  through debugfs.

config USB_SL811_HCD
	tristate "SL811HS HCD support"
	depends on HAS_IOMEM
	help
	  The SL811HS is a single-port USB controller that supports either
	  host side or peripheral side roles.  Enable this option if your
	  board has this chip, and you want to use it as a host controller. 
	  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called sl811-hcd.

config USB_SL811_HCD_ISO
	bool "partial ISO support"
	depends on USB_SL811_HCD
	help
	  The driver doesn't support iso_frame_desc (yet), but for some simple
	  devices that just queue one ISO frame per URB, then ISO transfers
	  "should" work using the normal urb status fields.

	  If unsure, say N.

config USB_SL811_CS
	tristate "CF/PCMCIA support for SL811HS HCD"
	depends on USB_SL811_HCD && PCMCIA
	help
	  Wraps a PCMCIA driver around the SL811HS HCD, supporting the RATOC
	  REX-CFU1U CF card (often used with PDAs).  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called "sl811_cs".

config USB_R8A66597_HCD
	tristate "R8A66597 HCD support"
	depends on HAS_IOMEM
	help
	  The R8A66597 is a USB 2.0 host and peripheral controller.

	  Enable this option if your board has this chip, and you want
	  to use it as a host controller.  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called r8a66597-hcd.

config USB_RENESAS_USBHS_HCD
	tristate "Renesas USBHS HCD support"
	depends on USB_RENESAS_USBHS
	help
	  The Renesas USBHS is a USB 2.0 host and peripheral controller.

	  Enable this option if your board has this chip, and you want
	  to use it as a host controller.  If unsure, say N.

	  To compile this driver as a module, choose M here: the
	  module will be called renesas-usbhs.

config USB_HCD_BCMA
	tristate "BCMA usb host driver"
	depends on BCMA
	select USB_OHCI_HCD_PLATFORM if USB_OHCI_HCD
	select USB_EHCI_HCD_PLATFORM if USB_EHCI_HCD
	help
	  Enable support for the EHCI and OCHI host controller on an bcma bus.
	  It converts the bcma driver into two platform device drivers
	  for ehci and ohci.

	  If unsure, say N.

config USB_HCD_SSB
	tristate "SSB usb host driver"
	depends on SSB
	select USB_OHCI_HCD_PLATFORM if USB_OHCI_HCD
	select USB_EHCI_HCD_PLATFORM if USB_EHCI_HCD
	help
	  Enable support for the EHCI and OCHI host controller on an bcma bus.
	  It converts the bcma driver into two platform device drivers
	  for ehci and ohci.

	  If unsure, say N.

config USB_HCD_TEST_MODE
	bool "HCD test mode support"
	help
	  Say 'Y' to enable additional software test modes that may be
	  supported by the host controller drivers.

	  One such test mode is the Embedded High-speed Host Electrical Test
	  (EHSET) for EHCI host controller hardware, specifically the "Single
	  Step Set Feature" test.  Typically this will be enabled for On-the-Go
	  or embedded hosts that need to undergo USB-IF compliance testing with
	  the aid of special testing hardware.  In the future, this may expand
	  to include other tests that require support from a HCD driver.

	  This option is of interest only to developers who need to validate
	  their USB hardware designs.  It is not needed for normal use.  If
	  unsure, say N.

config USB_XEN_HCD
	tristate "Xen usb virtual host driver"
	depends on XEN
	select XEN_XENBUS_FRONTEND
	help
	  The Xen usb virtual host driver serves as a frontend driver enabling
	  a Xen guest system to access USB Devices passed through to the guest
	  by the Xen host (usually Dom0).
	  Only needed if the kernel is running in a Xen guest and generic
	  access to a USB device is needed.
