#
# 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_PCI
       tristate
       depends on USB_PCI
       default y

config USB_XHCI_PLATFORM
	tristate "Generic xHCI driver for a platform device"
	select USB_XHCI_RCAR if ARCH_RENESAS
	---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_MTK
	tristate "xHCI support for Mediatek MT65xx/MT7621"
	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 MT65xx SoCs.
	  If unsure, say N.

config USB_XHCI_MVEBU
	tristate "xHCI support for Marvell Armada 375/38x"
	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 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
	---help---
	  Say 'Y' to enable the support for the xHCI host controller
	  found in Renesas R-Car ARM SoCs.

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

	  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 USB_EHCI_HCD_PMC_MSP
	tristate "EHCI support for on-chip PMC MSP71xx USB controller"
	depends on MSP_HAS_USB
	default n
	select USB_EHCI_BIG_ENDIAN_DESC
	select USB_EHCI_BIG_ENDIAN_MMIO
	---help---
		Enables support for the onchip USB controller on the PMC_MSP7100 Family SoC's.
		If unsure, say N.

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 PPC on-chip EHCI USB controller"
	depends on FSL_SOC
	select USB_EHCI_ROOT_HUB_TT
	---help---
	  Variation of ARC USB block used in some Freescale chips.

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

config USB_EHCI_HCD_OMAP
	tristate "EHCI support for OMAP3 and later chips"
	depends on ARCH_OMAP
	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)
	default y
	---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
        default y
        ---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 && 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
        default y
        ---help---
          Enables support for the on-chip EHCI controller on
          Atmel chips.

config USB_EHCI_MSM
	tristate "Support for Qualcomm QSD/MSM on-chip EHCI USB controller"
	depends on ARCH_QCOM
	select USB_EHCI_ROOT_HUB_TT
	---help---
	  Enables support for the USB Host controller present on the
	  Qualcomm chipsets. Root Hub has inbuilt TT.
	  This driver depends on OTG driver for PHY initialization,
	  clock management, powering up VBUS, and power management.
	  This driver is not supported on boards like trout which
	  has an external PHY.

config USB_EHCI_TEGRA
       tristate "NVIDIA Tegra HCD support"
       depends on ARCH_TEGRA
       select USB_EHCI_ROOT_HUB_TT
       select USB_PHY
	select USB_ULPI
	select USB_ULPI_VIEWPORT
       help
         This driver enables 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
	---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
       help
	Enable support for the Samsung Exynos SOC's on-chip EHCI controller.

config USB_EHCI_MV
	bool "EHCI support for Marvell PXA/MMP USB controller"
	depends on (ARCH_PXA || ARCH_MMP)
	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_W90X900_EHCI
	tristate "W90X900(W90P910) EHCI support"
	depends on ARCH_W90X900
	---help---
		Enables support for the W90X900 USB controller

config USB_CNS3XXX_EHCI
	bool "Cavium CNS3XXX EHCI Module (DEPRECATED)"
	depends on ARCH_CNS3XXX
	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 CNS3XXX SOC's on-chip EHCI controller.
	  It is needed for high-speed (480Mbit/sec) USB 2.0 device
	  support.

config USB_EHCI_ATH79
	bool "EHCI support for AR7XXX/AR9XXX SoCs (DEPRECATED)"
	depends on (SOC_AR71XX || SOC_AR724X || SOC_AR913X || SOC_AR933X)
	select USB_EHCI_ROOT_HUB_TT
	select USB_EHCI_HCD_PLATFORM
	default y
	---help---
	  This option is deprecated now and the driver was removed, use
	  USB_EHCI_HCD_PLATFORM instead.

	  Enables support for the built-in EHCI controller present
	  on the Atheros AR7XXX/AR9XXX SoCs.

config USB_EHCI_HCD_PLATFORM
	tristate "Generic EHCI driver for a platform device"
	default n
	---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
	default n
	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_IOMEM
	---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_FOTG210_HCD
	tristate "FOTG210 HCD support"
	depends on USB && HAS_DMA && HAS_IOMEM
	---help---
	  Faraday FOTG210 is an OTG controller which can be configured as
	  an USB2.0 host. It is designed to meet USB2.0 EHCI specification
	  with minor modification.

	  To compile this driver as a module, choose M here: the
	  module will be called fotg210-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
	depends on ISP1301_OMAP || !(MACH_OMAP_H2 || MACH_OMAP_H3)
	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
        default y
        ---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 && 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 S3C24xx/S3C64xx SoC series"
        depends on USB_OHCI_HCD && (ARCH_S3C24XX || ARCH_S3C64XX)
        default y
        ---help---
          Enables support for the on-chip OHCI controller on
          S3C24xx/S3C64xx chips.

config USB_OHCI_HCD_LPC32XX
	tristate "Support for LPC on-chip OHCI USB controller"
	depends on USB_OHCI_HCD && ARCH_LPC32XX
	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 && OF
	default y
	---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)
	default y
	---help---
	  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
	depends on USB_OHCI_HCD
	select PHY_DA8XX_USB
	default y
	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_ATH79
	bool "USB OHCI support for the Atheros AR71XX/AR7240 SoCs (DEPRECATED)"
	depends on (SOC_AR71XX || SOC_AR724X)
	select USB_OHCI_HCD_PLATFORM
	default y
	help
	  This option is deprecated now and the driver was removed, use
	  USB_OHCI_HCD_PLATFORM instead.

	  Enables support for the built-in OHCI controller present on the
	  Atheros AR71XX/AR7240 SoCs.

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
	default n
	---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_SH
	bool "OHCI support for SuperH USB controller (DEPRECATED)"
	depends on SUPERH
	select USB_OHCI_HCD_PLATFORM
	---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 the SuperH.
	  If you use the PCI OHCI controller, this option is not necessary.

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

config USB_CNS3XXX_OHCI
	bool "Cavium CNS3XXX OHCI Module (DEPRECATED)"
	depends on ARCH_CNS3XXX
	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 CNS3XXX SOC's on-chip OHCI controller.
	  It is needed for low-speed USB 1.0 device support.

config USB_OHCI_HCD_PLATFORM
	tristate "Generic OHCI driver for a platform device"
	default n
	---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 || 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

config USB_UHCI_BIG_ENDIAN_MMIO
	bool
	default y if SPARC_LEON

config USB_UHCI_BIG_ENDIAN_DESC
	bool
	default y if SPARC_LEON

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_U132_HCD
	tristate "Elan U132 Adapter Host Controller"
	depends on USB_FTDI_ELAN
	help
	  The U132 adapter is a USB to CardBus adapter specifically designed
	  for PC cards that contain an OHCI host controller. Typical PC cards
	  are the Orange Mobile 3G Option GlobeTrotter Fusion card. The U132
	  adapter will *NOT* work with PC cards that do not contain an OHCI
	  controller.

	  For those PC cards that contain multiple OHCI controllers only the
	  first one is used.

	  The driver consists of two modules, the "ftdi-elan" module is a
	  USB client driver that interfaces to the FTDI chip within ELAN's
	  USB-to-PCMCIA adapter, and this "u132-hcd" module is a USB host
	  controller driver that talks to the OHCI controller within the
	  CardBus cards that are inserted in the U132 adapter.

	  This driver has been tested with a CardBus OHCI USB adapter, and
	  worked with a USB PEN Drive inserted into the first USB port of
	  the PCCARD. A rather pointless thing to do, but useful for testing.

	  It is safe to say M here.

	  See also <http://www.elandigitalsystems.com/support/ufaq/u132linux.php>

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_WHCI_HCD
	tristate "Wireless USB Host Controller Interface (WHCI) driver"
	depends on USB_PCI && USB && UWB
	select USB_WUSB
	select UWB_WHCI
	help
	  A driver for PCI-based Wireless USB Host Controllers that are
	  compliant with the WHCI specification.

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

config USB_HWA_HCD
	tristate "Host Wire Adapter (HWA) driver"
	depends on USB && UWB
	select USB_WUSB
	select UWB_HWA
	help
	  This driver enables you to connect Wireless USB devices to
	  your system using a Host Wire Adaptor USB dongle. This is an
	  UWB Radio Controller and WUSB Host Controller connected to
	  your machine via USB (specified in WUSB1.0).

	  To compile this driver a module, choose M here: the module
	  will be called "hwa-hc".

config USB_IMX21_HCD
       tristate "i.MX21 HCD support"
       depends on ARM && ARCH_MXC
       help
         This driver enables support for the on-chip USB host in the
         i.MX21 processor.

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

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.
