#
# USB device configuration
#

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

# Host-side USB depends on having a host controller
# NOTE:  dummy_hcd is always an option, but it's ignored here ...
# NOTE:  SL-811 option should be board-specific ...
config USB_ARCH_HAS_HCD
	boolean
	default y if USB_ARCH_HAS_OHCI
	default y if USB_ARCH_HAS_EHCI
	default y if PCMCIA && !M32R			# sl811_cs
	default y if ARM				# SL-811
	default y if SUPERH				# r8a66597-hcd
	default PCI

# many non-PCI SOC chips embed OHCI
config USB_ARCH_HAS_OHCI
	boolean
	# ARM:
	default y if SA1111
	default y if ARCH_OMAP
	default y if ARCH_LH7A404
	default y if ARCH_S3C2410
	default y if PXA27x
	default y if PXA3xx
	default y if ARCH_EP93XX
	default y if ARCH_AT91
	default y if ARCH_PNX4008
	# PPC:
	default y if STB03xxx
	default y if PPC_MPC52xx
	# MIPS:
	default y if SOC_AU1X00
	# SH:
	default y if CPU_SUBTYPE_SH7720
	default y if CPU_SUBTYPE_SH7721
	default y if CPU_SUBTYPE_SH7763
	# more:
	default PCI

# some non-PCI hcds implement EHCI
config USB_ARCH_HAS_EHCI
	boolean
	default y if PPC_83xx
	default y if SOC_AU1200
	default y if ARCH_IXP4XX
	default PCI

# ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
config USB
	tristate "Support for Host-side USB"
	depends on USB_ARCH_HAS_HCD
	---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.

source "drivers/usb/core/Kconfig"

source "drivers/usb/host/Kconfig"

source "drivers/usb/class/Kconfig"

source "drivers/usb/storage/Kconfig"

source "drivers/usb/image/Kconfig"

source "drivers/usb/mon/Kconfig"

comment "USB port drivers"
	depends on USB

config USB_USS720
	tristate "USS720 parport driver"
	depends on USB && 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"

source "drivers/usb/gadget/Kconfig"

endif # USB_SUPPORT
