#
# USB Gadget support on a system involves
#    (a) a peripheral controller, and
#    (b) the gadget driver using it.
#
# NOTE:  Gadget support ** DOES NOT ** depend on host-side CONFIG_USB !!
#
#  - Host systems (like PCs) need CONFIG_USB (with "A" jacks).
#  - Peripherals (like PDAs) need CONFIG_USB_GADGET (with "B" jacks).
#  - Some systems have both kinds of controllers.
#
# With help from a special transceiver and a "Mini-AB" jack, systems with
# both kinds of controller can also support "USB On-the-Go" (CONFIG_USB_OTG).
#

menuconfig USB_GADGET
	tristate "USB Gadget Support"
	help
	   USB is a master/slave protocol, organized with one master
	   host (such as a PC) controlling up to 127 peripheral devices.
	   The USB hardware is asymmetric, which makes it easier to set up:
	   you can't connect a "to-the-host" connector to a peripheral.

	   Linux can run in the host, or in the peripheral.  In both cases
	   you need a low level bus controller driver, and some software
	   talking to it.  Peripheral controllers are often discrete silicon,
	   or are integrated with the CPU in a microcontroller.  The more
	   familiar host side controllers have names like "EHCI", "OHCI",
	   or "UHCI", and are usually integrated into southbridges on PC
	   motherboards.

	   Enable this configuration option if you want to run Linux inside
	   a USB peripheral device.  Configure one hardware driver for your
	   peripheral/device side bus controller, and a "gadget driver" for
	   your peripheral protocol.  (If you use modular gadget drivers,
	   you may configure more than one.)

	   If in doubt, say "N" and don't enable these drivers; most people
	   don't have this kind of hardware (except maybe inside Linux PDAs).

	   For more information, see <http://www.linux-usb.org/gadget> and
	   the kernel DocBook documentation for this API.

if USB_GADGET

config USB_GADGET_DEBUG
	boolean "Debugging messages (DEVELOPMENT)"
	depends on DEBUG_KERNEL
	help
	   Many controller and gadget drivers will print some debugging
	   messages if you use this option to ask for those messages.

	   Avoid enabling these messages, even if you're actively
	   debugging such a driver.  Many drivers will emit so many
	   messages that the driver timings are affected, which will
	   either create new failure modes or remove the one you're
	   trying to track down.  Never enable these messages for a
	   production build.

config USB_GADGET_DEBUG_FILES
	boolean "Debugging information files (DEVELOPMENT)"
	depends on PROC_FS
	help
	   Some of the drivers in the "gadget" framework can expose
	   debugging information in files such as /proc/driver/udc
	   (for a peripheral controller).  The information in these
	   files may help when you're troubleshooting or bringing up a
	   driver on a new board.   Enable these files by choosing "Y"
	   here.  If in doubt, or to conserve kernel memory, say "N".

config USB_GADGET_DEBUG_FS
	boolean "Debugging information files in debugfs (DEVELOPMENT)"
	depends on DEBUG_FS
	help
	   Some of the drivers in the "gadget" framework can expose
	   debugging information in files under /sys/kernel/debug/.
	   The information in these files may help when you're
	   troubleshooting or bringing up a driver on a new board.
	   Enable these files by choosing "Y" here.  If in doubt, or
	   to conserve kernel memory, say "N".

config USB_GADGET_VBUS_DRAW
	int "Maximum VBUS Power usage (2-500 mA)"
	range 2 500
	default 2
	help
	   Some devices need to draw power from USB when they are
	   configured, perhaps to operate circuitry or to recharge
	   batteries.  This is in addition to any local power supply,
	   such as an AC adapter or batteries.

	   Enter the maximum power your device draws through USB, in
	   milliAmperes.  The permitted range of values is 2 - 500 mA;
	   0 mA would be legal, but can make some hosts misbehave.

	   This value will be used except for system-specific gadget
	   drivers that have more specific information.

config	USB_GADGET_SELECTED
	boolean

#
# USB Peripheral Controller Support
#
# The order here is alphabetical, except that integrated controllers go
# before discrete ones so they will be the initial/default value:
#   - integrated/SOC controllers first
#   - licensed IP used in both SOC and discrete versions
#   - discrete ones (including all PCI-only controllers)
#   - debug/dummy gadget+hcd is last.
#
choice
	prompt "USB Peripheral Controller"
	depends on USB_GADGET
	help
	   A USB device uses a controller to talk to its host.
	   Systems should have only one such upstream link.
	   Many controller drivers are platform-specific; these
	   often need board-specific hooks.

#
# Integrated controllers
#

config USB_GADGET_AT91
	boolean "Atmel AT91 USB Device Port"
	depends on ARCH_AT91 && !ARCH_AT91SAM9RL && !ARCH_AT91CAP9 && !ARCH_AT91SAM9G45
	select USB_GADGET_SELECTED
	help
	   Many Atmel AT91 processors (such as the AT91RM2000) have a
	   full speed USB Device Port with support for five configurable
	   endpoints (plus endpoint zero).

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "at91_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_AT91
	tristate
	depends on USB_GADGET_AT91
	default USB_GADGET

config USB_GADGET_ATMEL_USBA
	boolean "Atmel USBA"
	select USB_GADGET_DUALSPEED
	depends on AVR32 || ARCH_AT91CAP9 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45
	help
	  USBA is the integrated high-speed USB Device controller on
	  the AT32AP700x, some AT91SAM9 and AT91CAP9 processors from Atmel.

config USB_ATMEL_USBA
	tristate
	depends on USB_GADGET_ATMEL_USBA
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_FSL_USB2
	boolean "Freescale Highspeed USB DR Peripheral Controller"
	depends on FSL_SOC || ARCH_MXC
	select USB_GADGET_DUALSPEED
	select USB_FSL_MPH_DR_OF if OF
	help
	   Some of Freescale PowerPC processors have a High Speed
	   Dual-Role(DR) USB controller, which supports device mode.

	   The number of programmable endpoints is different through
	   SOC revisions.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "fsl_usb2_udc" and force
	   all gadget drivers to also be dynamically linked.

config USB_FSL_USB2
	tristate
	depends on USB_GADGET_FSL_USB2
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_FUSB300
	boolean "Faraday FUSB300 USB Peripheral Controller"
	select USB_GADGET_DUALSPEED
	help
	   Faraday usb device controller FUSB300 driver

config USB_FUSB300
	tristate
	depends on USB_GADGET_FUSB300
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_OMAP
	boolean "OMAP USB Device Controller"
	depends on ARCH_OMAP
	select ISP1301_OMAP if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_H4_OTG
	select USB_OTG_UTILS if ARCH_OMAP
	help
	   Many Texas Instruments OMAP processors have flexible full
	   speed USB device controllers, with support for up to 30
	   endpoints (plus endpoint zero).  This driver supports the
	   controller in the OMAP 1611, and should work with controllers
	   in other OMAP processors too, given minor tweaks.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "omap_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_OMAP
	tristate
	depends on USB_GADGET_OMAP
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_PXA25X
	boolean "PXA 25x or IXP 4xx"
	depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX
	select USB_OTG_UTILS
	help
	   Intel's PXA 25x series XScale ARM-5TE processors include
	   an integrated full speed USB 1.1 device controller.  The
	   controller in the IXP 4xx series is register-compatible.

	   It has fifteen fixed-function endpoints, as well as endpoint
	   zero (for control transfers).

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "pxa25x_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_PXA25X
	tristate
	depends on USB_GADGET_PXA25X
	default USB_GADGET
	select USB_GADGET_SELECTED

# if there's only one gadget driver, using only two bulk endpoints,
# don't waste memory for the other endpoints
config USB_PXA25X_SMALL
	depends on USB_GADGET_PXA25X
	bool
	default n if USB_ETH_RNDIS
	default y if USB_ZERO
	default y if USB_ETH
	default y if USB_G_SERIAL

config USB_GADGET_R8A66597
	boolean "Renesas R8A66597 USB Peripheral Controller"
	select USB_GADGET_DUALSPEED
	help
	   R8A66597 is a discrete USB host and peripheral controller chip that
	   supports both full and high speed USB 2.0 data transfers.
	   It has nine configurable endpoints, and endpoint zero.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "r8a66597_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_R8A66597
	tristate
	depends on USB_GADGET_R8A66597
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_RENESAS_USBHS
	boolean "Renesas USBHS"
	depends on USB_RENESAS_USBHS
	select USB_GADGET_DUALSPEED
	help
	   Renesas USBHS is a discrete USB host and peripheral controller
	   chip that supports both full and high speed USB 2.0 data transfers.
	   platform is able to configure endpoint (pipe) style

	   Say "y" to enable the gadget specific portion of the USBHS driver.


config USB_RENESAS_USBHS_UDC
	tristate
	depends on USB_GADGET_RENESAS_USBHS
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_PXA27X
	boolean "PXA 27x"
	depends on ARCH_PXA && (PXA27x || PXA3xx)
	select USB_OTG_UTILS
	help
	   Intel's PXA 27x series XScale ARM v5TE processors include
	   an integrated full speed USB 1.1 device controller.

	   It has up to 23 endpoints, as well as endpoint zero (for
	   control transfers).

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "pxa27x_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_PXA27X
	tristate
	depends on USB_GADGET_PXA27X
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_S3C_HSOTG
	boolean "S3C HS/OtG USB Device controller"
	depends on S3C_DEV_USB_HSOTG
	select USB_GADGET_S3C_HSOTG_PIO
	select USB_GADGET_DUALSPEED
	help
	  The Samsung S3C64XX USB2.0 high-speed gadget controller
	  integrated into the S3C64XX series SoC.

config USB_S3C_HSOTG
	tristate
	depends on USB_GADGET_S3C_HSOTG
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_IMX
	boolean "Freescale IMX USB Peripheral Controller"
	depends on ARCH_MX1
	help
	   Freescale's IMX series include an integrated full speed
	   USB 1.1 device controller.  The controller in the IMX series
	   is register-compatible.

	   It has Six fixed-function endpoints, as well as endpoint
	   zero (for control transfers).

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "imx_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_IMX
	tristate
	depends on USB_GADGET_IMX
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_S3C2410
	boolean "S3C2410 USB Device Controller"
	depends on ARCH_S3C2410
	help
	  Samsung's S3C2410 is an ARM-4 processor with an integrated
	  full speed USB 1.1 device controller.  It has 4 configurable
	  endpoints, as well as endpoint zero (for control transfers).

	  This driver has been tested on the S3C2410, S3C2412, and
	  S3C2440 processors.

config USB_S3C2410
	tristate
	depends on USB_GADGET_S3C2410
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_S3C2410_DEBUG
	boolean "S3C2410 udc debug messages"
	depends on USB_GADGET_S3C2410

config USB_GADGET_S3C_HSUDC
	boolean "S3C2416, S3C2443 and S3C2450 USB Device Controller"
	depends on ARCH_S3C2410
	select USB_GADGET_DUALSPEED
	help
	  Samsung's S3C2416, S3C2443 and S3C2450 is an ARM9 based SoC
	  integrated with dual speed USB 2.0 device controller. It has
	  8 endpoints, as well as endpoint zero.

	  This driver has been tested on S3C2416 and S3C2450 processors.

config USB_S3C_HSUDC
	tristate
	depends on USB_GADGET_S3C_HSUDC
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_PXA_U2O
	boolean "PXA9xx Processor USB2.0 controller"
	select USB_GADGET_DUALSPEED
	help
	  PXA9xx Processor series include a high speed USB2.0 device
	  controller, which support high speed and full speed USB peripheral.

config USB_PXA_U2O
	tristate
	depends on USB_GADGET_PXA_U2O
	default USB_GADGET
	select USB_GADGET_SELECTED

#
# Controllers available in both integrated and discrete versions
#

# musb builds in ../musb along with host support
config USB_GADGET_MUSB_HDRC
	boolean "Inventra HDRC USB Peripheral (TI, ADI, ...)"
	depends on USB_MUSB_HDRC && (USB_MUSB_PERIPHERAL || USB_MUSB_OTG)
	select USB_GADGET_DUALSPEED
	select USB_GADGET_SELECTED
	help
	  This OTG-capable silicon IP is used in dual designs including
	  the TI DaVinci, OMAP 243x, OMAP 343x, TUSB 6010, and ADI Blackfin

config USB_GADGET_M66592
	boolean "Renesas M66592 USB Peripheral Controller"
	select USB_GADGET_DUALSPEED
	help
	   M66592 is a discrete USB peripheral controller chip that
	   supports both full and high speed USB 2.0 data transfers.
	   It has seven configurable endpoints, and endpoint zero.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "m66592_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_M66592
	tristate
	depends on USB_GADGET_M66592
	default USB_GADGET
	select USB_GADGET_SELECTED

#
# Controllers available only in discrete form (and all PCI controllers)
#

config USB_GADGET_AMD5536UDC
	boolean "AMD5536 UDC"
	depends on PCI
	select USB_GADGET_DUALSPEED
	help
	   The AMD5536 UDC is part of the AMD Geode CS5536, an x86 southbridge.
	   It is a USB Highspeed DMA capable USB device controller. Beside ep0
	   it provides 4 IN and 4 OUT endpoints (bulk or interrupt type).
	   The UDC port supports OTG operation, and may be used as a host port
	   if it's not being used to implement peripheral or OTG roles.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "amd5536udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_AMD5536UDC
	tristate
	depends on USB_GADGET_AMD5536UDC
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_FSL_QE
	boolean "Freescale QE/CPM USB Device Controller"
	depends on FSL_SOC && (QUICC_ENGINE || CPM)
	help
	   Some of Freescale PowerPC processors have a Full Speed
	   QE/CPM2 USB controller, which support device mode with 4
	   programmable endpoints. This driver supports the
	   controller in the MPC8360 and MPC8272, and should work with
	   controllers having QE or CPM2, given minor tweaks.

	   Set CONFIG_USB_GADGET to "m" to build this driver as a
	   dynamically linked module called "fsl_qe_udc".

config USB_FSL_QE
	tristate
	depends on USB_GADGET_FSL_QE
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_CI13XXX_PCI
	boolean "MIPS USB CI13xxx PCI UDC"
	depends on PCI
	select USB_GADGET_DUALSPEED
	help
	  MIPS USB IP core family device controller
	  Currently it only supports IP part number CI13412

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "ci13xxx_udc" and force all
	  gadget drivers to also be dynamically linked.

config USB_CI13XXX_PCI
	tristate
	depends on USB_GADGET_CI13XXX_PCI
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_NET2280
	boolean "NetChip 228x"
	depends on PCI
	select USB_GADGET_DUALSPEED
	help
	   NetChip 2280 / 2282 is a PCI based USB peripheral controller which
	   supports both full and high speed USB 2.0 data transfers.

	   It has six configurable endpoints, as well as endpoint zero
	   (for control transfers) and several endpoints with dedicated
	   functions.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "net2280" and force all
	   gadget drivers to also be dynamically linked.

config USB_NET2280
	tristate
	depends on USB_GADGET_NET2280
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_GOKU
	boolean "Toshiba TC86C001 'Goku-S'"
	depends on PCI
	help
	   The Toshiba TC86C001 is a PCI device which includes controllers
	   for full speed USB devices, IDE, I2C, SIO, plus a USB host (OHCI).

	   The device controller has three configurable (bulk or interrupt)
	   endpoints, plus endpoint zero (for control transfers).

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "goku_udc" and to force all
	   gadget drivers to also be dynamically linked.

config USB_GOKU
	tristate
	depends on USB_GADGET_GOKU
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_LANGWELL
	boolean "Intel Langwell USB Device Controller"
	depends on PCI
	select USB_GADGET_DUALSPEED
	help
	   Intel Langwell USB Device Controller is a High-Speed USB
	   On-The-Go device controller.

	   The number of programmable endpoints is different through
	   controller revision.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "langwell_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_LANGWELL
	tristate
	depends on USB_GADGET_LANGWELL
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_EG20T
	boolean "Intel EG20T PCH/OKI SEMICONDUCTOR ML7213 IOH UDC"
	depends on PCI
	select USB_GADGET_DUALSPEED
	help
	  This is a USB device driver for EG20T PCH.
	  EG20T PCH is the platform controller hub that is used in Intel's
	  general embedded platform. EG20T PCH has USB device interface.
	  Using this interface, it is able to access system devices connected
	  to USB device.
	  This driver enables USB device function.
	  USB device is a USB peripheral controller which
	  supports both full and high speed USB 2.0 data transfers.
	  This driver supports both control transfer and bulk transfer modes.
	  This driver dose not support interrupt transfer or isochronous
	  transfer modes.

	  This driver also can be used for OKI SEMICONDUCTOR's ML7213 which is
	  for IVI(In-Vehicle Infotainment) use.
	  ML7213 is companion chip for Intel Atom E6xx series.
	  ML7213 is completely compatible for Intel EG20T PCH.

config USB_EG20T
	tristate
	depends on USB_GADGET_EG20T
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_CI13XXX_MSM
	boolean "MIPS USB CI13xxx for MSM"
	depends on ARCH_MSM
	select USB_GADGET_DUALSPEED
	select USB_MSM_OTG
	help
	  MSM SoC has chipidea USB controller.  This driver uses
	  ci13xxx_udc core.
	  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.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "ci13xxx_msm" and force all
	  gadget drivers to also be dynamically linked.

config USB_CI13XXX_MSM
	tristate
	depends on USB_GADGET_CI13XXX_MSM
	default USB_GADGET
	select USB_GADGET_SELECTED

#
# LAST -- dummy/emulated controller
#

config USB_GADGET_DUMMY_HCD
	boolean "Dummy HCD (DEVELOPMENT)"
	depends on USB=y || (USB=m && USB_GADGET=m)
	select USB_GADGET_DUALSPEED
	help
	  This host controller driver emulates USB, looping all data transfer
	  requests back to a USB "gadget driver" in the same host.  The host
	  side is the master; the gadget side is the slave.  Gadget drivers
	  can be high, full, or low speed; and they have access to endpoints
	  like those from NET2280, PXA2xx, or SA1100 hardware.
	  
	  This may help in some stages of creating a driver to embed in a
	  Linux device, since it lets you debug several parts of the gadget
	  driver without its hardware or drivers being involved.
	  
	  Since such a gadget side driver needs to interoperate with a host
	  side Linux-USB device driver, this may help to debug both sides
	  of a USB protocol stack.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "dummy_hcd" and force all
	  gadget drivers to also be dynamically linked.

config USB_DUMMY_HCD
	tristate
	depends on USB_GADGET_DUMMY_HCD
	default USB_GADGET
	select USB_GADGET_SELECTED

# NOTE:  Please keep dummy_hcd LAST so that "real hardware" appears
# first and will be selected by default.

endchoice

config USB_GADGET_DUALSPEED
	bool
	depends on USB_GADGET
	default n
	help
	  Means that gadget drivers should include extra descriptors
	  and code to handle dual-speed controllers.

#
# USB Gadget Drivers
#
choice
	tristate "USB Gadget Drivers"
	depends on USB_GADGET && USB_GADGET_SELECTED
	default USB_ETH
	help
	  A Linux "Gadget Driver" talks to the USB Peripheral Controller
	  driver through the abstract "gadget" API.  Some other operating
	  systems call these "client" drivers, of which "class drivers"
	  are a subset (implementing a USB device class specification).
	  A gadget driver implements one or more USB functions using
	  the peripheral hardware.

	  Gadget drivers are hardware-neutral, or "platform independent",
	  except that they sometimes must understand quirks or limitations
	  of the particular controllers they work with.  For example, when
	  a controller doesn't support alternate configurations or provide
	  enough of the right types of endpoints, the gadget driver might
	  not be able work with that controller, or might need to implement
	  a less common variant of a device class protocol.

# this first set of drivers all depend on bulk-capable hardware.

config USB_ZERO
	tristate "Gadget Zero (DEVELOPMENT)"
	help
	  Gadget Zero is a two-configuration device.  It either sinks and
	  sources bulk data; or it loops back a configurable number of
	  transfers.  It also implements control requests, for "chapter 9"
	  conformance.  The driver needs only two bulk-capable endpoints, so
	  it can work on top of most device-side usb controllers.  It's
	  useful for testing, and is also a working example showing how
	  USB "gadget drivers" can be written.

	  Make this be the first driver you try using on top of any new
	  USB peripheral controller driver.  Then you can use host-side
	  test software, like the "usbtest" driver, to put your hardware
	  and its driver through a basic set of functional tests.

	  Gadget Zero also works with the host-side "usb-skeleton" driver,
	  and with many kinds of host-side test software.  You may need
	  to tweak product and vendor IDs before host software knows about
	  this device, and arrange to select an appropriate configuration.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_zero".

config USB_ZERO_HNPTEST
	boolean "HNP Test Device"
	depends on USB_ZERO && USB_OTG
	help
	  You can configure this device to enumerate using the device
	  identifiers of the USB-OTG test device.  That means that when
	  this gadget connects to another OTG device, with this one using
	  the "B-Peripheral" role, that device will use HNP to let this
	  one serve as the USB host instead (in the "B-Host" role).

config USB_AUDIO
	tristate "Audio Gadget (EXPERIMENTAL)"
	depends on SND
	select SND_PCM
	help
	  Gadget Audio is compatible with USB Audio Class specification 1.0.
	  It will include at least one AudioControl interface, zero or more
	  AudioStream interface and zero or more MIDIStream interface.

	  Gadget Audio will use on-board ALSA (CONFIG_SND) audio card to
	  playback or capture audio stream.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_audio".

config USB_ETH
	tristate "Ethernet Gadget (with CDC Ethernet support)"
	depends on NET
	select CRC32
	help
	  This driver implements Ethernet style communication, in one of
	  several ways:
	  
	   - The "Communication Device Class" (CDC) Ethernet Control Model.
	     That protocol is often avoided with pure Ethernet adapters, in
	     favor of simpler vendor-specific hardware, but is widely
	     supported by firmware for smart network devices.

	   - On hardware can't implement that protocol, a simple CDC subset
	     is used, placing fewer demands on USB.

	   - CDC Ethernet Emulation Model (EEM) is a newer standard that has
	     a simpler interface that can be used by more USB hardware.

	  RNDIS support is an additional option, more demanding than than
	  subset.

	  Within the USB device, this gadget driver exposes a network device
	  "usbX", where X depends on what other networking devices you have.
	  Treat it like a two-node Ethernet link:  host, and gadget.

	  The Linux-USB host-side "usbnet" driver interoperates with this
	  driver, so that deep I/O queues can be supported.  On 2.4 kernels,
	  use "CDCEther" instead, if you're using the CDC option. That CDC
	  mode should also interoperate with standard CDC Ethernet class
	  drivers on other host operating systems.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_ether".

config USB_ETH_RNDIS
	bool "RNDIS support"
	depends on USB_ETH
	default y
	help
	   Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol,
	   and Microsoft provides redistributable binary RNDIS drivers for
	   older versions of Windows.

	   If you say "y" here, the Ethernet gadget driver will try to provide
	   a second device configuration, supporting RNDIS to talk to such
	   Microsoft USB hosts.
	   
	   To make MS-Windows work with this, use Documentation/usb/linux.inf
	   as the "driver info file".  For versions of MS-Windows older than
	   XP, you'll need to download drivers from Microsoft's website; a URL
	   is given in comments found in that info file.

config USB_ETH_EEM
       bool "Ethernet Emulation Model (EEM) support"
       depends on USB_ETH
       default n
       help
         CDC EEM is a newer USB standard that is somewhat simpler than CDC ECM
         and therefore can be supported by more hardware.  Technically ECM and
         EEM are designed for different applications.  The ECM model extends
         the network interface to the target (e.g. a USB cable modem), and the
         EEM model is for mobile devices to communicate with hosts using
         ethernet over USB.  For Linux gadgets, however, the interface with
         the host is the same (a usbX device), so the differences are minimal.

         If you say "y" here, the Ethernet gadget driver will use the EEM
         protocol rather than ECM.  If unsure, say "n".

config USB_G_NCM
	tristate "Network Control Model (NCM) support"
	depends on NET
	select CRC32
	help
	  This driver implements USB CDC NCM subclass standard. NCM is
	  an advanced protocol for Ethernet encapsulation, allows grouping
	  of several ethernet frames into one USB transfer and diffferent
	  alignment possibilities.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_ncm".

config USB_GADGETFS
	tristate "Gadget Filesystem (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	help
	  This driver provides a filesystem based API that lets user mode
	  programs implement a single-configuration USB device, including
	  endpoint I/O and control requests that don't relate to enumeration.
	  All endpoints, transfer speeds, and transfer types supported by
	  the hardware are available, through read() and write() calls.

	  Currently, this option is still labelled as EXPERIMENTAL because
	  of existing race conditions in the underlying in-kernel AIO core.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "gadgetfs".

config USB_FUNCTIONFS
	tristate "Function Filesystem (EXPERIMENTAL)"
	depends on EXPERIMENTAL
	select USB_FUNCTIONFS_GENERIC if !(USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
	help
	  The Function Filesystem (FunctionFS) lets one create USB
	  composite functions in user space in the same way GadgetFS
	  lets one create USB gadgets in user space.  This allows creation
	  of composite gadgets such that some of the functions are
	  implemented in kernel space (for instance Ethernet, serial or
	  mass storage) and other are implemented in user space.

	  If you say "y" or "m" here you will be able what kind of
	  configurations the gadget will provide.

	  Say "y" to link the driver statically, or "m" to build
	  a dynamically linked module called "g_ffs".

config USB_FUNCTIONFS_ETH
	bool "Include configuration with CDC ECM (Ethernet)"
	depends on USB_FUNCTIONFS && NET
	help
	  Include a configuration with CDC ECM function (Ethernet) and the
	  Function Filesystem.

config USB_FUNCTIONFS_RNDIS
	bool "Include configuration with RNDIS (Ethernet)"
	depends on USB_FUNCTIONFS && NET
	help
	  Include a configuration with RNDIS function (Ethernet) and the Filesystem.

config USB_FUNCTIONFS_GENERIC
	bool "Include 'pure' configuration"
	depends on USB_FUNCTIONFS
	help
	  Include a configuration with the Function Filesystem alone with
	  no Ethernet interface.

config USB_FILE_STORAGE
	tristate "File-backed Storage Gadget"
	depends on BLOCK
	help
	  The File-backed Storage Gadget acts as a USB Mass Storage
	  disk drive.  As its storage repository it can use a regular
	  file or a block device (in much the same way as the "loop"
	  device driver), specified as a module parameter.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_file_storage".

config USB_FILE_STORAGE_TEST
	bool "File-backed Storage Gadget testing version"
	depends on USB_FILE_STORAGE
	default n
	help
	  Say "y" to generate the larger testing version of the
	  File-backed Storage Gadget, useful for probing the
	  behavior of USB Mass Storage hosts.  Not needed for
	  normal operation.

config USB_MASS_STORAGE
	tristate "Mass Storage Gadget"
	depends on BLOCK
	help
	  The Mass Storage Gadget acts as a USB Mass Storage disk drive.
	  As its storage repository it can use a regular file or a block
	  device (in much the same way as the "loop" device driver),
	  specified as a module parameter or sysfs option.

	  This is heavily based on File-backed Storage Gadget and in most
	  cases you will want to use FSG instead.  This gadget is mostly
	  here to test the functionality of the Mass Storage Function
	  which may be used with composite framework.

	  Say "y" to link the driver statically, or "m" to build
	  a dynamically linked module called "g_mass_storage".  If unsure,
	  consider File-backed Storage Gadget.

config USB_G_SERIAL
	tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
	help
	  The Serial Gadget talks to the Linux-USB generic serial driver.
	  This driver supports a CDC-ACM module option, which can be used
	  to interoperate with MS-Windows hosts or with the Linux-USB
	  "cdc-acm" driver.

	  This driver also supports a CDC-OBEX option.  You will need a
	  user space OBEX server talking to /dev/ttyGS*, since the kernel
	  itself doesn't implement the OBEX protocol.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_serial".

	  For more information, see Documentation/usb/gadget_serial.txt
	  which includes instructions and a "driver info file" needed to
	  make MS-Windows work with CDC ACM.

config USB_MIDI_GADGET
	tristate "MIDI Gadget (EXPERIMENTAL)"
	depends on SND && EXPERIMENTAL
	select SND_RAWMIDI
	help
	  The MIDI Gadget acts as a USB Audio device, with one MIDI
	  input and one MIDI output. These MIDI jacks appear as
	  a sound "card" in the ALSA sound system. Other MIDI
	  connections can then be made on the gadget system, using
	  ALSA's aconnect utility etc.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_midi".

config USB_G_PRINTER
	tristate "Printer Gadget"
	help
	  The Printer Gadget channels data between the USB host and a
	  userspace program driving the print engine. The user space
	  program reads and writes the device file /dev/g_printer to
	  receive or send printer data. It can use ioctl calls to
	  the device file to get or set printer status.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_printer".

	  For more information, see Documentation/usb/gadget_printer.txt
	  which includes sample code for accessing the device file.

config USB_CDC_COMPOSITE
	tristate "CDC Composite Device (Ethernet and ACM)"
	depends on NET
	help
	  This driver provides two functions in one configuration:
	  a CDC Ethernet (ECM) link, and a CDC ACM (serial port) link.

	  This driver requires four bulk and two interrupt endpoints,
	  plus the ability to handle altsettings.  Not all peripheral
	  controllers are that capable.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module.

config USB_G_NOKIA
	tristate "Nokia composite gadget"
	depends on PHONET
	help
	  The Nokia composite gadget provides support for acm, obex
	  and phonet in only one composite gadget driver.

	  It's only really useful for N900 hardware. If you're building
	  a kernel for N900, say Y or M here. If unsure, say N.

config USB_G_MULTI
	tristate "Multifunction Composite Gadget (EXPERIMENTAL)"
	depends on BLOCK && NET
	select USB_G_MULTI_CDC if !USB_G_MULTI_RNDIS
	help
	  The Multifunction Composite Gadget provides Ethernet (RNDIS
	  and/or CDC Ethernet), mass storage and ACM serial link
	  interfaces.

	  You will be asked to choose which of the two configurations is
	  to be available in the gadget.  At least one configuration must
	  be chosen to make the gadget usable.  Selecting more than one
	  configuration will prevent Windows from automatically detecting
	  the gadget as a composite gadget, so an INF file will be needed to
	  use the gadget.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_multi".

config USB_G_MULTI_RNDIS
	bool "RNDIS + CDC Serial + Storage configuration"
	depends on USB_G_MULTI
	default y
	help
	  This option enables a configuration with RNDIS, CDC Serial and
	  Mass Storage functions available in the Multifunction Composite
	  Gadget.  This is the configuration dedicated for Windows since RNDIS
	  is Microsoft's protocol.

	  If unsure, say "y".

config USB_G_MULTI_CDC
	bool "CDC Ethernet + CDC Serial + Storage configuration"
	depends on USB_G_MULTI
	default n
	help
	  This option enables a configuration with CDC Ethernet (ECM), CDC
	  Serial and Mass Storage functions available in the Multifunction
	  Composite Gadget.

	  If unsure, say "y".

config USB_G_HID
	tristate "HID Gadget"
	help
	  The HID gadget driver provides generic emulation of USB
	  Human Interface Devices (HID).

	  For more information, see Documentation/usb/gadget_hid.txt which
	  includes sample code for accessing the device files.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_hid".

config USB_G_DBGP
	tristate "EHCI Debug Device Gadget"
	help
	  This gadget emulates an EHCI Debug device. This is useful when you want
	  to interact with an EHCI Debug Port.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_dbgp".

if USB_G_DBGP
choice
	prompt "EHCI Debug Device mode"
	default USB_G_DBGP_SERIAL

config USB_G_DBGP_PRINTK
	depends on USB_G_DBGP
	bool "printk"
	help
	  Directly printk() received data. No interaction.

config USB_G_DBGP_SERIAL
	depends on USB_G_DBGP
	bool "serial"
	help
	  Userland can interact using /dev/ttyGSxxx.
endchoice
endif

# put drivers that need isochronous transfer support (for audio
# or video class gadget drivers), or specific hardware, here.
config USB_G_WEBCAM
	tristate "USB Webcam Gadget"
	depends on VIDEO_DEV
	help
	  The Webcam Gadget acts as a composite USB Audio and Video Class
	  device. It provides a userspace API to process UVC control requests
	  and stream video data to the host.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_webcam".

endchoice

endif # USB_GADGET
