#
# USB device configuration
#

config USB_OHCI_BIG_ENDIAN_DESC
	bool

config USB_OHCI_BIG_ENDIAN_MMIO
	bool

config USB_OHCI_LITTLE_ENDIAN
	bool
	default n if STB03xxx || PPC_MPC52xx
	default y

config USB_EHCI_BIG_ENDIAN_MMIO
	bool

config USB_EHCI_BIG_ENDIAN_DESC
	bool

config USB_UHCI_BIG_ENDIAN_MMIO
	bool
	default y if SPARC_LEON

config USB_UHCI_BIG_ENDIAN_DESC
	bool
	default y if SPARC_LEON

menuconfig USB_SUPPORT
	bool "USB support"
	depends on HAS_IOMEM
	default y
	---help---
	  This option adds core support for Universal Serial Bus (USB).
	  You will also need drivers from the following menu to make use of it.

if USB_SUPPORT

config USB_COMMON
	tristate

config USB_ARCH_HAS_HCD
	def_bool y

config USB
	tristate "Support for Host-side USB"
	depends on USB_ARCH_HAS_HCD
	select USB_COMMON
	select NLS  # for UTF-8 strings
	---help---
	  Universal Serial Bus (USB) is a specification for a serial bus
	  subsystem which offers higher speeds and more features than the
	  traditional PC serial port.  The bus supplies power to peripherals
	  and allows for hot swapping.  Up to 127 USB peripherals can be
	  connected to a single USB host in a tree structure.
	  
	  The USB host is the root of the tree, the peripherals are the
	  leaves and the inner nodes are special USB devices called hubs.
	  Most PCs now have USB host ports, used to connect peripherals
	  such as scanners, keyboards, mice, modems, cameras, disks,
	  flash memory, network links, and printers to the PC.

	  Say Y here if your computer has a host-side USB port and you want
	  to use USB devices.  You then need to say Y to at least one of the
	  Host Controller Driver (HCD) options below.  Choose a USB 1.1
	  controller, such as "UHCI HCD support" or "OHCI HCD support",
	  and "EHCI HCD (USB 2.0) support" except for older systems that
	  do not have USB 2.0 support.  It doesn't normally hurt to select
	  them all if you are not certain.

	  If your system has a device-side USB port, used in the peripheral
	  side of the USB protocol, see the "USB Gadget" framework instead.

	  After choosing your HCD, then select drivers for the USB peripherals
	  you'll be using.  You may want to check out the information provided
	  in <file:Documentation/usb/> and especially the links given in
	  <file:Documentation/usb/usb-help.txt>.

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

config USB_PCI
	bool "PCI based USB host interface"
	depends on PCI
	default y
	---help---
	  A lot of embeded system SOC (e.g. freescale T2080) have both
	  PCI and USB modules. But USB module is controlled by registers
	  directly, it have no relationship with PCI module.

	  When say N here it will not build PCI related code in USB driver.

if USB

source "drivers/usb/core/Kconfig"

source "drivers/usb/mon/Kconfig"

source "drivers/usb/wusbcore/Kconfig"

source "drivers/usb/host/Kconfig"

source "drivers/usb/renesas_usbhs/Kconfig"

source "drivers/usb/class/Kconfig"

source "drivers/usb/storage/Kconfig"

source "drivers/usb/image/Kconfig"

source "drivers/usb/usbip/Kconfig"

endif

source "drivers/usb/mtu3/Kconfig"

source "drivers/usb/musb/Kconfig"

source "drivers/usb/notify/Kconfig"

source "drivers/usb/manager/Kconfig"

source "drivers/usb/dwc3/Kconfig"

source "drivers/usb/dwc2/Kconfig"

source "drivers/usb/chipidea/Kconfig"

source "drivers/usb/isp1760/Kconfig"

comment "USB port drivers"

if USB

config USB_USS720
	tristate "USS720 parport driver"
	depends on PARPORT
	select PARPORT_NOT_PC
	---help---
	  This driver is for USB parallel port adapters that use the Lucent
	  Technologies USS-720 chip. These cables are plugged into your USB
	  port and provide USB compatibility to peripherals designed with
	  parallel port interfaces.

	  The chip has two modes: automatic mode and manual mode. In automatic
	  mode, it looks to the computer like a standard USB printer. Only
	  printers may be connected to the USS-720 in this mode. The generic
	  USB printer driver ("USB Printer support", above) may be used in
	  that mode, and you can say N here if you want to use the chip only
	  in this mode.

	  Manual mode is not limited to printers, any parallel port
	  device should work. This driver utilizes manual mode.
	  Note however that some operations are three orders of magnitude
	  slower than on a PCI/ISA Parallel Port, so timing critical
	  applications might not work.

	  Say Y here if you own an USS-720 USB->Parport cable and intend to
	  connect anything other than a printer to it.

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

source "drivers/usb/serial/Kconfig"

source "drivers/usb/misc/Kconfig"

source "drivers/usb/atm/Kconfig"

endif # USB

source "drivers/usb/phy/Kconfig"

source "drivers/usb/gadget/Kconfig"

source "drivers/usb/typec/Kconfig"

config USB_LED_TRIG
	bool "USB LED Triggers"
	depends on LEDS_CLASS && USB_COMMON && LEDS_TRIGGERS
	help
	  This option adds LED triggers for USB host and/or gadget activity.

	  Say Y here if you are working on a system with led-class supported
	  LEDs and you want to use them as activity indicators for USB host or
	  gadget.

config USB_ULPI_BUS
	tristate "USB ULPI PHY interface support"
	select USB_COMMON
	help
	  UTMI+ Low Pin Interface (ULPI) is specification for a commonly used
	  USB 2.0 PHY interface. The ULPI specification defines a standard set
	  of registers that can be used to detect the vendor and product which
	  allows ULPI to be handled as a bus. This module is the driver for that
	  bus.

	  The ULPI interfaces (the buses) are registered by the drivers for USB
	  controllers which support ULPI register access and have ULPI PHY
	  attached to them. The ULPI PHY drivers themselves are normal PHY
	  drivers.

	  ULPI PHYs provide often functions such as ADP sensing/probing (OTG
	  protocol) and USB charger detection.

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

endif # USB_SUPPORT
