#
# 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"
	select NLS
	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
	bool "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_VERBOSE
	bool "Verbose debugging Messages (DEVELOPMENT)"
	depends on USB_GADGET_DEBUG
	help
	   Many controller and gadget drivers will print verbose 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
	bool "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
	bool "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_STORAGE_NUM_BUFFERS
	int "Number of storage pipeline buffers"
	range 2 32
	default 2
	help
	   Usually 2 buffers are enough to establish a good buffering
	   pipeline. The number may be increased in order to compensate
	   for a bursty VFS behaviour. For instance there may be CPU wake up
	   latencies that makes the VFS to appear bursty in a system with
	   an CPU on-demand governor. Especially if DMA is doing IO to
	   offload the CPU. In this case the CPU will go into power
	   save often and spin up occasionally to move data within VFS.
	   If selecting USB_GADGET_DEBUG_FILES this value may be set by
	   a module parameter as well.
	   If unsure, say 2.

source "drivers/usb/gadget/udc/Kconfig"

#
# USB Gadget Drivers
#

# composite based drivers
config USB_LIBCOMPOSITE
	tristate
	select CONFIGFS_FS
	depends on USB_GADGET

config USB_F_ACM
	tristate

config USB_F_SS_LB
	tristate

config USB_U_SERIAL
	tristate

config USB_U_ETHER
	tristate

config USB_F_SERIAL
	tristate

config USB_F_OBEX
	tristate

config USB_F_NCM
	tristate

config USB_F_ECM
	tristate

config USB_F_PHONET
	tristate

config USB_F_EEM
	tristate

config USB_F_SUBSET
	tristate

config USB_F_RNDIS
	tristate

config USB_F_MASS_STORAGE
	tristate

config USB_F_FS
	tristate

config USB_F_UAC1
	tristate

config USB_F_UAC2
	tristate

config USB_F_UVC
	tristate

config USB_F_MIDI
	tristate

config USB_F_HID
	tristate

config USB_F_PRINTER
	tristate

config USB_F_MTP
	tristate

config USB_F_PTP
        tristate

config USB_F_AUDIO_SRC
	tristate

config USB_F_ACC
	tristate

choice
	tristate "USB Gadget Drivers"
	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_CONFIGFS
	tristate "USB functions configurable through configfs"
	select USB_LIBCOMPOSITE
	help
	  A Linux USB "gadget" can be set up through configfs.
	  If this is the case, the USB functions (which from the host's
	  perspective are seen as interfaces) and configurations are
	  specified simply by creating appropriate directories in configfs.
	  Associating functions with configurations is done by creating
	  appropriate symbolic links.
	  For more information see Documentation/usb/gadget_configfs.txt.

config USB_CONFIGFS_SERIAL
	bool "Generic serial bulk in/out"
	depends on USB_CONFIGFS
	depends on TTY
	select USB_U_SERIAL
	select USB_F_SERIAL
	help
	  The function talks to the Linux-USB generic serial driver.

config USB_CONFIGFS_ACM
	bool "Abstract Control Model (CDC ACM)"
	depends on USB_CONFIGFS
	depends on TTY
	select USB_U_SERIAL
	select USB_F_ACM
	help
	  ACM serial link.  This function can be used to interoperate with
	  MS-Windows hosts or with the Linux-USB "cdc-acm" driver.

config USB_CONFIGFS_OBEX
	bool "Object Exchange Model (CDC OBEX)"
	depends on USB_CONFIGFS
	depends on TTY
	select USB_U_SERIAL
	select USB_F_OBEX
	help
	  You will need a user space OBEX server talking to /dev/ttyGS*,
	  since the kernel itself doesn't implement the OBEX protocol.

config USB_CONFIGFS_NCM
	bool "Network Control Model (CDC NCM)"
	depends on USB_CONFIGFS
	depends on NET
	select USB_U_ETHER
	select USB_F_NCM
	help
	  NCM is an advanced protocol for Ethernet encapsulation, allows
	  grouping of several ethernet frames into one USB transfer and
	  different alignment possibilities.

config USB_CONFIGFS_ECM
	bool "Ethernet Control Model (CDC ECM)"
	depends on USB_CONFIGFS
	depends on NET
	select USB_U_ETHER
	select USB_F_ECM
	help
	  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.

config USB_CONFIGFS_ECM_SUBSET
	bool "Ethernet Control Model (CDC ECM) subset"
	depends on USB_CONFIGFS
	depends on NET
	select USB_U_ETHER
	select USB_F_SUBSET
	help
	  On hardware that can't implement the full protocol,
	  a simple CDC subset is used, placing fewer demands on USB.

config USB_CONFIGFS_RNDIS
	bool "RNDIS"
	depends on USB_CONFIGFS
	depends on NET
	select USB_U_ETHER
	select USB_F_RNDIS
	help
	   Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol,
	   and Microsoft provides redistributable binary RNDIS drivers for
	   older versions of Windows.

	   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_CONFIGFS_EEM
	bool "Ethernet Emulation Model (EEM)"
	depends on USB_CONFIGFS
	depends on NET
	select USB_U_ETHER
	select USB_F_EEM
	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.

config USB_CONFIGFS_PHONET
	bool "Phonet protocol"
	depends on USB_CONFIGFS
	depends on NET
	depends on PHONET
	select USB_U_ETHER
	select USB_F_PHONET
	help
	  The Phonet protocol implementation for USB device.

config USB_CONFIGFS_MASS_STORAGE
	bool "Mass storage"
	depends on USB_CONFIGFS
	depends on BLOCK
	select USB_F_MASS_STORAGE
	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.

config USB_CONFIGFS_F_LB_SS
	bool "Loopback and sourcesink function (for testing)"
	depends on USB_CONFIGFS
	select USB_F_SS_LB
	help
	  Loopback function loops back a configurable number of transfers.
	  Sourcesink function either sinks and sources bulk data.
	  It also implements control requests, for "chapter 9" conformance.
	  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.

config USB_CONFIGFS_F_FS
	bool "Function filesystem (FunctionFS)"
	depends on USB_CONFIGFS
	select USB_F_FS
	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.

config USB_CONFIGFS_F_MTP
	boolean "MTP gadget"
	depends on USB_CONFIGFS
	select USB_F_MTP
	help
	  USB gadget MTP support

config USB_CONFIGFS_F_PTP
	boolean "PTP gadget"
	depends on USB_CONFIGFS && USB_CONFIGFS_F_MTP
	select USB_F_PTP
	help
	  USB gadget PTP support

config USB_CONFIGFS_F_ACC
	boolean "Accessory gadget"
	depends on USB_CONFIGFS
	select USB_F_ACC
	help
	  USB gadget Accessory support

config USB_CONFIGFS_F_AUDIO_SRC
	boolean "Audio Source gadget"
	depends on USB_CONFIGFS && USB_CONFIGFS_F_ACC
	depends on SND
	select SND_PCM
	select USB_F_AUDIO_SRC
	help
	  USB gadget Audio Source support

config USB_CONFIGFS_UEVENT
	boolean "Uevent notification of Gadget state"
	depends on USB_CONFIGFS
	help
	  Enable uevent notifications to userspace when the gadget
	  state changes. The gadget can be in any of the following
	  three states: "CONNECTED/DISCONNECTED/CONFIGURED"

config USB_CONFIGFS_F_UAC1
	bool "Audio Class 1.0"
	depends on USB_CONFIGFS
	depends on SND
	select USB_LIBCOMPOSITE
	select SND_PCM
	select USB_F_UAC1
	help
	  This Audio function implements 1 AudioControl interface,
	  1 AudioStreaming Interface each for USB-OUT and USB-IN.
	  This driver requires a real Audio codec to be present
	  on the device.

config USB_CONFIGFS_F_UAC2
	bool "Audio Class 2.0"
	depends on USB_CONFIGFS
	depends on SND
	select USB_LIBCOMPOSITE
	select SND_PCM
	select USB_F_UAC2
	help
	  This Audio function is compatible with USB Audio Class
	  specification 2.0. It implements 1 AudioControl interface,
	  1 AudioStreaming Interface each for USB-OUT and USB-IN.
	  This driver doesn't expect any real Audio codec to be present
	  on the device - the audio streams are simply sinked to and
	  sourced from a virtual ALSA sound card created. The user-space
	  application may choose to do whatever it wants with the data
	  received from the USB Host and choose to provide whatever it
	  wants as audio data to the USB Host.

config USB_CONFIGFS_F_MIDI
	bool "MIDI function"
	depends on USB_CONFIGFS
	depends on SND
	select USB_LIBCOMPOSITE
	select SND_RAWMIDI
	select USB_F_MIDI
	help
	  The MIDI Function 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.

config USB_CONFIGFS_F_HID
	bool "HID function"
	depends on USB_CONFIGFS
	select USB_F_HID
	help
	  The HID function driver provides generic emulation of USB
	  Human Interface Devices (HID).

	  For more information, see Documentation/usb/gadget_hid.txt.

config USB_CONFIGFS_F_UVC
	bool "USB Webcam function"
	depends on USB_CONFIGFS
	depends on VIDEO_DEV
	select VIDEOBUF2_VMALLOC
	select USB_F_UVC
	help
	  The Webcam function 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.

config USB_CONFIGFS_F_PRINTER
	bool "Printer function"
	select USB_F_PRINTER
	depends on USB_CONFIGFS
	help
	  The Printer function 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<X> to
	  receive or send printer data. It can use ioctl calls to
	  the device file to get or set printer status.

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

source "drivers/usb/gadget/legacy/Kconfig"

endchoice

endif # USB_GADGET
