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

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/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 && LEDS_TRIGGERS
	select USB_COMMON
	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
