€• Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ)/translations/zh_CN/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/zh_TW/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/it_IT/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ja_JP/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/ko_KR/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/pt_BR/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ)/translations/sp_SP/driver-api/usb/gadget”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒUSB Gadget API for Linux”h]”hŒUSB Gadget API for Linux”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³ŒC/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget.rst”h´KubhŒ field_list”“”)�”}”(hhh]”(hŒfield”“”)�”}”(hhh]”(hŒ field_name”“”)�”}”(hŒAuthor”h]”hŒAuthor”…”�”}”(hh×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÕhhÒh³hÊh´KubhŒ field_body”“”)�”}”(hŒDavid Brownell”h]”hŒ paragraph”“”)�”}”(hhéh]”hŒDavid Brownell”…”�”}”(hhíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhçubah}”(h]”h ]”h"]”h$]”h&]”uh1håhhÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍh²hubhÑ)�”}”(hhh]”(hÖ)�”}”(hŒDate”h]”hŒDate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÕhjh³hÊh´Kubhæ)�”}”(hŒ20 August 2004 ”h]”hì)�”}”(hŒ20 August 2004”h]”hŒ20 August 2004”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1håhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj;h²hh³hÊh´K ubhì)�”}”(hXKThis document presents a Linux-USB "Gadget" kernel mode API, for use within peripherals and other USB devices that embed Linux. It provides an overview of the API structure, and shows how that fits into a system development project. This is the first such API released on Linux to address a number of important problems, including:”h]”hXOThis document presents a Linux-USB “Gadgetâ€� kernel mode API, for use within peripherals and other USB devices that embed Linux. It provides an overview of the API structure, and shows how that fits into a system development project. This is the first such API released on Linux to address a number of important problems, including:”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K hj;h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒfSupports USB 2.0, for high speed devices which can stream data at several dozen megabytes per second. ”h]”hì)�”}”(hŒeSupports USB 2.0, for high speed devices which can stream data at several dozen megabytes per second.”h]”hŒeSupports USB 2.0, for high speed devices which can stream data at several dozen megabytes per second.”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjaubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubj`)�”}”(hŒ¨Handles devices with dozens of endpoints just as well as ones with just two fixed-function ones. Gadget drivers can be written so they're easy to port to new hardware. ”h]”hì)�”}”(hŒ§Handles devices with dozens of endpoints just as well as ones with just two fixed-function ones. Gadget drivers can be written so they're easy to port to new hardware.”h]”hŒ©Handles devices with dozens of endpoints just as well as ones with just two fixed-function ones. Gadget drivers can be written so they’re easy to port to new hardware.”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjyubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubj`)�”}”(hŒªFlexible enough to expose more complex USB device capabilities such as multiple configurations, multiple interfaces, composite devices, and alternate interface settings. ”h]”hì)�”}”(hŒ©Flexible enough to expose more complex USB device capabilities such as multiple configurations, multiple interfaces, composite devices, and alternate interface settings.”h]”hŒ©Flexible enough to expose more complex USB device capabilities such as multiple configurations, multiple interfaces, composite devices, and alternate interface settings.”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubj`)�”}”(hŒWUSB "On-The-Go" (OTG) support, in conjunction with updates to the Linux-USB host side. ”h]”hì)�”}”(hŒVUSB "On-The-Go" (OTG) support, in conjunction with updates to the Linux-USB host side.”h]”hŒZUSB “On-The-Goâ€� (OTG) support, in conjunction with updates to the Linux-USB host side.”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubj`)�”}”(hŒÝSharing data structures and API models with the Linux-USB host side API. This helps the OTG support, and looks forward to more-symmetric frameworks (where the same I/O model is used by both host and device side drivers). ”h]”hì)�”}”(hŒÜSharing data structures and API models with the Linux-USB host side API. This helps the OTG support, and looks forward to more-symmetric frameworks (where the same I/O model is used by both host and device side drivers).”h]”hŒÜSharing data structures and API models with the Linux-USB host side API. This helps the OTG support, and looks forward to more-symmetric frameworks (where the same I/O model is used by both host and device side drivers).”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubj`)�”}”(hŒŽMinimalist, so it's easier to support new device controller hardware. I/O processing doesn't imply large demands for memory or CPU resources. ”h]”hì)�”}”(hŒ�Minimalist, so it's easier to support new device controller hardware. I/O processing doesn't imply large demands for memory or CPU resources.”h]”hŒ‘Minimalist, so it’s easier to support new device controller hardware. I/O processing doesn’t imply large demands for memory or CPU resources.”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K$hjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj\h²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jZh³hÊh´Khj;h²hubhì)�”}”(hXSMost Linux developers will not be able to use this API, since they have USB ``host`` hardware in a PC, workstation, or server. Linux users with embedded systems are more likely to have USB peripheral hardware. To distinguish drivers running inside such hardware from the more familiar Linux "USB device drivers", which are host side proxies for the real USB devices, a different term is used: the drivers inside the peripherals are "USB gadget drivers". In USB protocol interactions, the device driver is the master (or "client driver") and the gadget driver is the slave (or "function driver").”h]”(hŒLMost Linux developers will not be able to use this API, since they have USB ”…”�”}”(hjùh²hh³Nh´NubhŒliteral”“”)�”}”(hŒ``host``”h]”hŒhost”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjùubhX hardware in a PC, workstation, or server. Linux users with embedded systems are more likely to have USB peripheral hardware. To distinguish drivers running inside such hardware from the more familiar Linux “USB device driversâ€�, which are host side proxies for the real USB devices, a different term is used: the drivers inside the peripherals are “USB gadget driversâ€�. In USB protocol interactions, the device driver is the master (or “client driverâ€�) and the gadget driver is the slave (or “function driverâ€�).”…”�”}”(hjùh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K(hj;h²hubhì)�”}”(hXñThe gadget API resembles the host side Linux-USB API in that both use queues of request objects to package I/O buffers, and those requests may be submitted or canceled. They share common definitions for the standard USB *Chapter 9* messages, structures, and constants. Also, both APIs bind and unbind drivers to devices. The APIs differ in detail, since the host side's current URB framework exposes a number of implementation details and assumptions that are inappropriate for a gadget API. While the model for control transfers and configuration management is necessarily different (one side is a hardware-neutral master, the other is a hardware-aware slave), the endpoint I/0 API used here should also be usable for an overhead-reduced host side API.”h]”(hŒÜThe gadget API resembles the host side Linux-USB API in that both use queues of request objects to package I/O buffers, and those requests may be submitted or canceled. They share common definitions for the standard USB ”…”�”}”(hjh²hh³Nh´NubhŒemphasis”“”)�”}”(hŒ *Chapter 9*”h]”hŒ Chapter 9”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjubhX  messages, structures, and constants. Also, both APIs bind and unbind drivers to devices. The APIs differ in detail, since the host side’s current URB framework exposes a number of implementation details and assumptions that are inappropriate for a gadget API. While the model for control transfers and configuration management is necessarily different (one side is a hardware-neutral master, the other is a hardware-aware slave), the endpoint I/0 API used here should also be usable for an overhead-reduced host side API.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K2hj;h²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´K ubh¶)�”}”(hhh]”(h»)�”}”(hŒStructure of Gadget Drivers”h]”hŒStructure of Gadget Drivers”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjEh²hh³hÊh´K?ubhì)�”}”(hX'A system running inside a USB peripheral normally has at least three layers inside the kernel to handle USB protocol processing, and may have additional layers in user space code. The ``gadget`` API is used by the middle layer to interact with the lowest level (which directly handles hardware).”h]”(hŒ¸A system running inside a USB peripheral normally has at least three layers inside the kernel to handle USB protocol processing, and may have additional layers in user space code. The ”…”�”}”(hjVh²hh³Nh´Nubj)�”}”(hŒ ``gadget``”h]”hŒgadget”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjVubhŒe API is used by the middle layer to interact with the lowest level (which directly handles hardware).”…”�”}”(hjVh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KAhjEh²hubhì)�”}”(hŒ/In Linux, from the bottom up, these layers are:”h]”hŒ/In Linux, from the bottom up, these layers are:”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KGhjEh²hubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hX*USB Controller Driver* This is the lowest software level. It is the only layer that talks to hardware, through registers, fifos, dma, irqs, and the like. The ```` API abstracts the peripheral controller endpoint hardware. That hardware is exposed through endpoint objects, which accept streams of IN/OUT buffers, and through callbacks that interact with gadget drivers. Since normal USB devices only have one upstream port, they only have one of these drivers. The controller driver can support any number of different gadget drivers, but only one of them can be used at a time. Examples of such controller hardware include the PCI-based NetChip 2280 USB 2.0 high speed controller, the SA-11x0 or PXA-25x UDC (found within many PDAs), and a variety of other products. ”h]”(hŒterm”“”)�”}”(hŒ*USB Controller Driver*”h]”j$)�”}”(hj“h]”hŒUSB Controller Driver”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÊh´KVhj‹ubhŒ definition”“”)�”}”(hhh]”(hì)�”}”(hX?This is the lowest software level. It is the only layer that talks to hardware, through registers, fifos, dma, irqs, and the like. The ```` API abstracts the peripheral controller endpoint hardware. That hardware is exposed through endpoint objects, which accept streams of IN/OUT buffers, and through callbacks that interact with gadget drivers. Since normal USB devices only have one upstream port, they only have one of these drivers. The controller driver can support any number of different gadget drivers, but only one of them can be used at a time.”h]”(hŒ‡This is the lowest software level. It is the only layer that talks to hardware, through registers, fifos, dma, irqs, and the like. The ”…”�”}”(hj­h²hh³Nh´Nubj)�”}”(hŒ````”h]”hŒ”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj­ubhX  API abstracts the peripheral controller endpoint hardware. That hardware is exposed through endpoint objects, which accept streams of IN/OUT buffers, and through callbacks that interact with gadget drivers. Since normal USB devices only have one upstream port, they only have one of these drivers. The controller driver can support any number of different gadget drivers, but only one of them can be used at a time.”…”�”}”(hj­h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KJhjªubhì)�”}”(hŒ¼Examples of such controller hardware include the PCI-based NetChip 2280 USB 2.0 high speed controller, the SA-11x0 or PXA-25x UDC (found within many PDAs), and a variety of other products.”h]”hŒ¼Examples of such controller hardware include the PCI-based NetChip 2280 USB 2.0 high speed controller, the SA-11x0 or PXA-25x UDC (found within many PDAs), and a variety of other products.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KThjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj‹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³hÊh´KVhj†ubjŠ)�”}”(hXú*Gadget Driver* The lower boundary of this driver implements hardware-neutral USB functions, using calls to the controller driver. Because such hardware varies widely in capabilities and restrictions, and is used in embedded environments where space is at a premium, the gadget driver is often configured at compile time to work with endpoints supported by one particular controller. Gadget drivers may be portable to several different controllers, using conditional compilation. (Recent kernels substantially simplify the work involved in supporting new hardware, by *autoconfiguring* endpoints automatically for many bulk-oriented drivers.) Gadget driver responsibilities include: - handling setup requests (ep0 protocol responses) possibly including class-specific functionality - returning configuration and string descriptors - (re)setting configurations and interface altsettings, including enabling and configuring endpoints - handling life cycle events, such as managing bindings to hardware, USB suspend/resume, remote wakeup, and disconnection from the USB host. - managing IN and OUT transfers on all currently enabled endpoints Such drivers may be modules of proprietary code, although that approach is discouraged in the Linux community. ”h]”(j�)�”}”(hŒ*Gadget Driver*”h]”j$)�”}”(hjíh]”hŒ Gadget Driver”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÊh´Kthjçubj©)�”}”(hhh]”(hì)�”}”(hXšThe lower boundary of this driver implements hardware-neutral USB functions, using calls to the controller driver. Because such hardware varies widely in capabilities and restrictions, and is used in embedded environments where space is at a premium, the gadget driver is often configured at compile time to work with endpoints supported by one particular controller. Gadget drivers may be portable to several different controllers, using conditional compilation. (Recent kernels substantially simplify the work involved in supporting new hardware, by *autoconfiguring* endpoints automatically for many bulk-oriented drivers.) Gadget driver responsibilities include:”h]”(hX(The lower boundary of this driver implements hardware-neutral USB functions, using calls to the controller driver. Because such hardware varies widely in capabilities and restrictions, and is used in embedded environments where space is at a premium, the gadget driver is often configured at compile time to work with endpoints supported by one particular controller. Gadget drivers may be portable to several different controllers, using conditional compilation. (Recent kernels substantially simplify the work involved in supporting new hardware, by ”…”�”}”(hjh²hh³Nh´Nubj$)�”}”(hŒ*autoconfiguring*”h]”hŒautoconfiguring”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjubhŒa endpoints automatically for many bulk-oriented drivers.) Gadget driver responsibilities include:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KYhjubj[)�”}”(hhh]”(j`)�”}”(hŒahandling setup requests (ep0 protocol responses) possibly including class-specific functionality ”h]”hì)�”}”(hŒ`handling setup requests (ep0 protocol responses) possibly including class-specific functionality”h]”hŒ`handling setup requests (ep0 protocol responses) possibly including class-specific functionality”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kehj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj%ubj`)�”}”(hŒ/returning configuration and string descriptors ”h]”hì)�”}”(hŒ.returning configuration and string descriptors”h]”hŒ.returning configuration and string descriptors”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj%ubj`)�”}”(hŒc(re)setting configurations and interface altsettings, including enabling and configuring endpoints ”h]”hì)�”}”(hŒb(re)setting configurations and interface altsettings, including enabling and configuring endpoints”h]”hŒb(re)setting configurations and interface altsettings, including enabling and configuring endpoints”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KjhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj%ubj`)�”}”(hŒ‹handling life cycle events, such as managing bindings to hardware, USB suspend/resume, remote wakeup, and disconnection from the USB host. ”h]”hì)�”}”(hŒŠhandling life cycle events, such as managing bindings to hardware, USB suspend/resume, remote wakeup, and disconnection from the USB host.”h]”hŒŠhandling life cycle events, such as managing bindings to hardware, USB suspend/resume, remote wakeup, and disconnection from the USB host.”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kmhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj%ubj`)�”}”(hŒAmanaging IN and OUT transfers on all currently enabled endpoints ”h]”hì)�”}”(hŒ@managing IN and OUT transfers on all currently enabled endpoints”h]”hŒ@managing IN and OUT transfers on all currently enabled endpoints”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kqhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hj%ubeh}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´Kehjubhì)�”}”(hŒnSuch drivers may be modules of proprietary code, although that approach is discouraged in the Linux community.”h]”hŒnSuch drivers may be modules of proprietary code, although that approach is discouraged in the Linux community.”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kshjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³hÊh´Kthj†h²hubjŠ)�”}”(hXÒ*Upper Level* Most gadget drivers have an upper boundary that connects to some Linux driver or framework in Linux. Through that boundary flows the data which the gadget driver produces and/or consumes through protocol transfers over USB. Examples include: - user mode code, using generic (gadgetfs) or application specific files in ``/dev`` - networking subsystem (for network gadgets, like the CDC Ethernet Model gadget driver) - data capture drivers, perhaps video4Linux or a scanner driver; or test and measurement hardware. - input subsystem (for HID gadgets) - sound subsystem (for audio gadgets) - file system (for PTP gadgets) - block i/o subsystem (for usb-storage gadgets) - ... and more ”h]”(j�)�”}”(hŒ *Upper Level*”h]”j$)�”}”(hjÆh]”hŒ Upper Level”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÊh´K�hjÀubj©)�”}”(hhh]”(hì)�”}”(hŒñMost gadget drivers have an upper boundary that connects to some Linux driver or framework in Linux. Through that boundary flows the data which the gadget driver produces and/or consumes through protocol transfers over USB. Examples include:”h]”hŒñMost gadget drivers have an upper boundary that connects to some Linux driver or framework in Linux. Through that boundary flows the data which the gadget driver produces and/or consumes through protocol transfers over USB. Examples include:”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KwhjÛubj[)�”}”(hhh]”(j`)�”}”(hŒSuser mode code, using generic (gadgetfs) or application specific files in ``/dev`` ”h]”hì)�”}”(hŒRuser mode code, using generic (gadgetfs) or application specific files in ``/dev``”h]”(hŒJuser mode code, using generic (gadgetfs) or application specific files in ”…”�”}”(hjóh²hh³Nh´Nubj)�”}”(hŒ``/dev``”h]”hŒ/dev”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K|hjïubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒVnetworking subsystem (for network gadgets, like the CDC Ethernet Model gadget driver) ”h]”hì)�”}”(hŒUnetworking subsystem (for network gadgets, like the CDC Ethernet Model gadget driver)”h]”hŒUnetworking subsystem (for network gadgets, like the CDC Ethernet Model gadget driver)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒadata capture drivers, perhaps video4Linux or a scanner driver; or test and measurement hardware. ”h]”hì)�”}”(hŒ`data capture drivers, perhaps video4Linux or a scanner driver; or test and measurement hardware.”h]”hŒ`data capture drivers, perhaps video4Linux or a scanner driver; or test and measurement hardware.”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‚hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒ"input subsystem (for HID gadgets) ”h]”hì)�”}”(hŒ!input subsystem (for HID gadgets)”h]”hŒ!input subsystem (for HID gadgets)”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K…hjEubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒ$sound subsystem (for audio gadgets) ”h]”hì)�”}”(hŒ#sound subsystem (for audio gadgets)”h]”hŒ#sound subsystem (for audio gadgets)”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‡hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒfile system (for PTP gadgets) ”h]”hì)�”}”(hŒfile system (for PTP gadgets)”h]”hŒfile system (for PTP gadgets)”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‰hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒ.block i/o subsystem (for usb-storage gadgets) ”h]”hì)�”}”(hŒ-block i/o subsystem (for usb-storage gadgets)”h]”hŒ-block i/o subsystem (for usb-storage gadgets)”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‹hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubj`)�”}”(hŒ ... and more ”h]”hì)�”}”(hŒ ... and more”h]”hŒ ... and more”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K�hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjìubeh}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´K|hjÛubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÀubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³hÊh´K�hj†h²hubjŠ)�”}”(hX’*Additional Layers* Other layers may exist. These could include kernel layers, such as network protocol stacks, as well as user mode applications building on standard POSIX system call APIs such as ``open()``, ``close()``, ``read()`` and ``write()``. On newer systems, POSIX Async I/O calls may be an option. Such user mode code will not necessarily be subject to the GNU General Public License (GPL). ”h]”(j�)�”}”(hŒ*Additional Layers*”h]”j$)�”}”(hjÕh]”hŒAdditional Layers”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³hÊh´K•hjÏubj©)�”}”(hhh]”hì)�”}”(hX}Other layers may exist. These could include kernel layers, such as network protocol stacks, as well as user mode applications building on standard POSIX system call APIs such as ``open()``, ``close()``, ``read()`` and ``write()``. On newer systems, POSIX Async I/O calls may be an option. Such user mode code will not necessarily be subject to the GNU General Public License (GPL).”h]”(hŒ²Other layers may exist. These could include kernel layers, such as network protocol stacks, as well as user mode applications building on standard POSIX system call APIs such as ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ ``open()``”h]”hŒopen()”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒ, ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ ``close()``”h]”hŒclose()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒ, ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ ``read()``”h]”hŒread()”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒ and ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ ``write()``”h]”hŒwrite()”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒ˜. On newer systems, POSIX Async I/O calls may be an option. Such user mode code will not necessarily be subject to the GNU General Public License (GPL).”…”�”}”(hjíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K�hjêubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÏubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³hÊh´K•hj†h²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjEh²hh³hÊh´Nubhì)�”}”(hXoOTG-capable systems will also need to include a standard Linux-USB host side stack, with ``usbcore``, one or more *Host Controller Drivers* (HCDs), *USB Device Drivers* to support the OTG "Targeted Peripheral List", and so forth. There will also be an *OTG Controller Driver*, which is visible to gadget and device driver developers only indirectly. That helps the host and device side USB controllers implement the two new OTG protocols (HNP and SRP). Roles switch (host to peripheral, or vice versa) using HNP during USB suspend processing, and SRP can be viewed as a more battery-friendly kind of device wakeup protocol.”h]”(hŒYOTG-capable systems will also need to include a standard Linux-USB host side stack, with ”…”�”}”(hjUh²hh³Nh´Nubj)�”}”(hŒ ``usbcore``”h]”hŒusbcore”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjUubhŒ, one or more ”…”�”}”(hjUh²hh³Nh´Nubj$)�”}”(hŒ*Host Controller Drivers*”h]”hŒHost Controller Drivers”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjUubhŒ (HCDs), ”…”�”}”(hjUh²hh³Nh´Nubj$)�”}”(hŒ*USB Device Drivers*”h]”hŒUSB Device Drivers”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjUubhŒX to support the OTG “Targeted Peripheral Listâ€�, and so forth. There will also be an ”…”�”}”(hjUh²hh³Nh´Nubj$)�”}”(hŒ*OTG Controller Driver*”h]”hŒOTG Controller Driver”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjUubhX\, which is visible to gadget and device driver developers only indirectly. That helps the host and device side USB controllers implement the two new OTG protocols (HNP and SRP). Roles switch (host to peripheral, or vice versa) using HNP during USB suspend processing, and SRP can be viewed as a more battery-friendly kind of device wakeup protocol.”…”�”}”(hjUh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K—hjEh²hubhì)�”}”(hXOver time, reusable utilities are evolving to help make some gadget driver tasks simpler. For example, building configuration descriptors from vectors of descriptors for the configurations interfaces and endpoints is now automated, and many drivers now use autoconfiguration to choose hardware endpoints and initialize their descriptors. A potential example of particular interest is code implementing standard USB-IF protocols for HID, networking, storage, or audio classes. Some developers are interested in KDB or KGDB hooks, to let target hardware be remotely debugged. Most such USB protocol code doesn't need to be hardware-specific, any more than network protocols like X11, HTTP, or NFS are. Such gadget-side interface drivers should eventually be combined, to implement composite devices.”h]”hXOver time, reusable utilities are evolving to help make some gadget driver tasks simpler. For example, building configuration descriptors from vectors of descriptors for the configurations interfaces and endpoints is now automated, and many drivers now use autoconfiguration to choose hardware endpoints and initialize their descriptors. A potential example of particular interest is code implementing standard USB-IF protocols for HID, networking, storage, or audio classes. Some developers are interested in KDB or KGDB hooks, to let target hardware be remotely debugged. Most such USB protocol code doesn’t need to be hardware-specific, any more than network protocols like X11, HTTP, or NFS are. Such gadget-side interface drivers should eventually be combined, to implement composite devices.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¡hjEh²hubeh}”(h]”Œstructure-of-gadget-drivers”ah ]”h"]”Œstructure of gadget drivers”ah$]”h&]”uh1hµhh·h²hh³hÊh´K?ubh¶)�”}”(hhh]”(h»)�”}”(hŒKernel Mode Gadget API”h]”hŒKernel Mode Gadget API”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÁh²hh³hÊh´K¯ubhì)�”}”(hXÅGadget drivers declare themselves through a struct :c:type:`usb_gadget_driver`, which is responsible for most parts of enumeration for a struct usb_gadget. The response to a set_configuration usually involves enabling one or more of the struct usb_ep objects exposed by the gadget, and submitting one or more struct usb_request buffers to transfer data. Understand those four data types, and their operations, and you will understand how this API works.”h]”(hŒ3Gadget drivers declare themselves through a struct ”…”�”}”(hjÒh²hh³Nh´Nubh)�”}”(hŒ:c:type:`usb_gadget_driver`”h]”j)�”}”(hjÜh]”hŒusb_gadget_driver”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-type”eh"]”h$]”h&]”uh1jhjÚubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œdriver-api/usb/gadget”Œ refdomain”jéŒreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰Œ reftarget”Œusb_gadget_driver”uh1hh³hÊh´K±hjÒubhXw, which is responsible for most parts of enumeration for a struct usb_gadget. The response to a set_configuration usually involves enabling one or more of the struct usb_ep objects exposed by the gadget, and submitting one or more struct usb_request buffers to transfer data. Understand those four data types, and their operations, and you will understand how this API works.”…”�”}”(hjÒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K±hjÁh²hubhŒnote”“”)�”}”(hX;Other than the "Chapter 9" data types, most of the significant data types and functions are described here. However, some relevant information is likely omitted from what you are reading. One example of such information is endpoint autoconfiguration. You'll have to read the header file, and use example source code (such as that for "Gadget Zero"), to fully understand the API. The part of the API implementing some basic driver capabilities is specific to the version of the Linux kernel that's in use. The 2.6 and upper kernel versions include a *driver model* framework that has no analogue on earlier kernels; so those parts of the gadget API are not fully portable. (They are implemented on 2.4 kernels, but in a different way.) The driver model state is another part of this API that is ignored by the kerneldoc tools.”h]”(hì)�”}”(hŒkOther than the "Chapter 9" data types, most of the significant data types and functions are described here.”h]”hŒoOther than the “Chapter 9â€� data types, most of the significant data types and functions are described here.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K»hj ubhì)�”}”(hXHowever, some relevant information is likely omitted from what you are reading. One example of such information is endpoint autoconfiguration. You'll have to read the header file, and use example source code (such as that for "Gadget Zero"), to fully understand the API.”h]”hXHowever, some relevant information is likely omitted from what you are reading. One example of such information is endpoint autoconfiguration. You’ll have to read the header file, and use example source code (such as that for “Gadget Zeroâ€�), to fully understand the API.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¾hj ubhì)�”}”(hX¾The part of the API implementing some basic driver capabilities is specific to the version of the Linux kernel that's in use. The 2.6 and upper kernel versions include a *driver model* framework that has no analogue on earlier kernels; so those parts of the gadget API are not fully portable. (They are implemented on 2.4 kernels, but in a different way.) The driver model state is another part of this API that is ignored by the kerneldoc tools.”h]”(hŒ¬The part of the API implementing some basic driver capabilities is specific to the version of the Linux kernel that’s in use. The 2.6 and upper kernel versions include a ”…”�”}”(hj)h²hh³Nh´Nubj$)�”}”(hŒ*driver model*”h]”hŒ driver model”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj)ubhX framework that has no analogue on earlier kernels; so those parts of the gadget API are not fully portable. (They are implemented on 2.4 kernels, but in a different way.) The driver model state is another part of this API that is ignored by the kerneldoc tools.”…”�”}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÄhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁh²hh³hÊh´Nubhì)�”}”(hX The core API does not expose every possible hardware feature, only the most widely available ones. There are significant hardware features, such as device-to-device DMA (without temporary storage in a memory buffer) that would be added using hardware-specific APIs.”h]”hX The core API does not expose every possible hardware feature, only the most widely available ones. There are significant hardware features, such as device-to-device DMA (without temporary storage in a memory buffer) that would be added using hardware-specific APIs.”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÌhjÁh²hubhì)�”}”(hXGThis API allows drivers to use conditional compilation to handle endpoint capabilities of different hardware, but doesn't require that. Hardware tends to have arbitrary restrictions, relating to transfer types, addressing, packet sizes, buffering, and availability. As a rule, such differences only matter for "endpoint zero" logic that handles device configuration and management. The API supports limited run-time detection of capabilities, through naming conventions for endpoints. Many drivers will be able to at least partially autoconfigure themselves. In particular, driver init sections will often have endpoint autoconfiguration logic that scans the hardware's list of endpoints to find ones matching the driver requirements (relying on those conventions), to eliminate some of the most common reasons for conditional compilation.”h]”hXOThis API allows drivers to use conditional compilation to handle endpoint capabilities of different hardware, but doesn’t require that. Hardware tends to have arbitrary restrictions, relating to transfer types, addressing, packet sizes, buffering, and availability. As a rule, such differences only matter for “endpoint zeroâ€� logic that handles device configuration and management. The API supports limited run-time detection of capabilities, through naming conventions for endpoints. Many drivers will be able to at least partially autoconfigure themselves. In particular, driver init sections will often have endpoint autoconfiguration logic that scans the hardware’s list of endpoints to find ones matching the driver requirements (relying on those conventions), to eliminate some of the most common reasons for conditional compilation.”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÑhjÁh²hubhì)�”}”(hXÂLike the Linux-USB host side API, this API exposes the "chunky" nature of USB messages: I/O requests are in terms of one or more "packets", and packet boundaries are visible to drivers. Compared to RS-232 serial protocols, USB resembles synchronous protocols like HDLC (N bytes per frame, multipoint addressing, host as the primary station and devices as secondary stations) more than asynchronous ones (tty style: 8 data bits per frame, no parity, one stop bit). So for example the controller drivers won't buffer two single byte writes into a single two-byte USB IN packet, although gadget drivers may do so when they implement protocols where packet boundaries (and "short packets") are not significant.”h]”hXÐLike the Linux-USB host side API, this API exposes the “chunkyâ€� nature of USB messages: I/O requests are in terms of one or more “packetsâ€�, and packet boundaries are visible to drivers. Compared to RS-232 serial protocols, USB resembles synchronous protocols like HDLC (N bytes per frame, multipoint addressing, host as the primary station and devices as secondary stations) more than asynchronous ones (tty style: 8 data bits per frame, no parity, one stop bit). So for example the controller drivers won’t buffer two single byte writes into a single two-byte USB IN packet, although gadget drivers may do so when they implement protocols where packet boundaries (and “short packetsâ€�) are not significant.”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KßhjÁh²hubh¶)�”}”(hhh]”(h»)�”}”(hŒDriver Life Cycle”h]”hŒDriver Life Cycle”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjyh²hh³hÊh´Kìubhì)�”}”(hŒÈGadget drivers make endpoint I/O requests to hardware without needing to know many details of the hardware, but driver setup/configuration code needs to handle some differences. Use the API like this:”h]”hŒÈGadget drivers make endpoint I/O requests to hardware without needing to know many details of the hardware, but driver setup/configuration code needs to handle some differences. Use the API like this:”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kîhjyh²hubhŒenumerated_list”“”)�”}”(hhh]”(j`)�”}”(hXÜRegister a driver for the particular device side usb controller hardware, such as the net2280 on PCI (USB 2.0), sa11x0 or pxa25x as found in Linux PDAs, and so on. At this point the device is logically in the USB ch9 initial state (``attached``), drawing no power and not usable (since it does not yet support enumeration). Any host should not see the device, since it's not activated the data line pullup used by the host to detect a device, even if VBUS power is available. ”h]”hì)�”}”(hXÛRegister a driver for the particular device side usb controller hardware, such as the net2280 on PCI (USB 2.0), sa11x0 or pxa25x as found in Linux PDAs, and so on. At this point the device is logically in the USB ch9 initial state (``attached``), drawing no power and not usable (since it does not yet support enumeration). Any host should not see the device, since it's not activated the data line pullup used by the host to detect a device, even if VBUS power is available.”h]”(hŒèRegister a driver for the particular device side usb controller hardware, such as the net2280 on PCI (USB 2.0), sa11x0 or pxa25x as found in Linux PDAs, and so on. At this point the device is logically in the USB ch9 initial state (”…”�”}”(hj¡h²hh³Nh´Nubj)�”}”(hŒ ``attached``”h]”hŒattached”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¡ubhŒé), drawing no power and not usable (since it does not yet support enumeration). Any host should not see the device, since it’s not activated the data line pullup used by the host to detect a device, even if VBUS power is available.”…”�”}”(hj¡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kòhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hŒÁRegister a gadget driver that implements some higher level device function. That will then bind() to a :c:type:`usb_gadget`, which activates the data line pullup sometime after detecting VBUS. ”h]”hì)�”}”(hŒÀRegister a gadget driver that implements some higher level device function. That will then bind() to a :c:type:`usb_gadget`, which activates the data line pullup sometime after detecting VBUS.”h]”(hŒgRegister a gadget driver that implements some higher level device function. That will then bind() to a ”…”�”}”(hjËh²hh³Nh´Nubh)�”}”(hŒ:c:type:`usb_gadget`”h]”j)�”}”(hjÕh]”hŒ usb_gadget”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”(jèjéŒc-type”eh"]”h$]”h&]”uh1jhjÓubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jõŒ refdomain”jéŒreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰jûŒ usb_gadget”uh1hh³hÊh´KúhjËubhŒE, which activates the data line pullup sometime after detecting VBUS.”…”�”}”(hjËh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KúhjÇubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hXThe hardware driver can now start enumerating. The steps it handles are to accept USB ``power`` and ``set_address`` requests. Other steps are handled by the gadget driver. If the gadget driver module is unloaded before the host starts to enumerate, steps before step 7 are skipped. ”h]”hì)�”}”(hXThe hardware driver can now start enumerating. The steps it handles are to accept USB ``power`` and ``set_address`` requests. Other steps are handled by the gadget driver. If the gadget driver module is unloaded before the host starts to enumerate, steps before step 7 are skipped.”h]”(hŒVThe hardware driver can now start enumerating. The steps it handles are to accept USB ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ ``power``”h]”hŒpower”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ and ”…”�”}”(hjh²hh³Nh´Nubj)�”}”(hŒ``set_address``”h]”hŒ set_address”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubhŒ¦ requests. Other steps are handled by the gadget driver. If the gadget driver module is unloaded before the host starts to enumerate, steps before step 7 are skipped.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kþhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hXPThe gadget driver's ``setup()`` call returns usb descriptors, based both on what the bus interface hardware provides and on the functionality being implemented. That can involve alternate settings or configurations, unless the hardware prevents such operation. For OTG devices, each configuration descriptor includes an OTG descriptor. ”h]”hì)�”}”(hXOThe gadget driver's ``setup()`` call returns usb descriptors, based both on what the bus interface hardware provides and on the functionality being implemented. That can involve alternate settings or configurations, unless the hardware prevents such operation. For OTG devices, each configuration descriptor includes an OTG descriptor.”h]”(hŒThe gadget driver’s ”…”�”}”(hjBh²hh³Nh´Nubj)�”}”(hŒ ``setup()``”h]”hŒsetup()”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBubhX0 call returns usb descriptors, based both on what the bus interface hardware provides and on the functionality being implemented. That can involve alternate settings or configurations, unless the hardware prevents such operation. For OTG devices, each configuration descriptor includes an OTG descriptor.”…”�”}”(hjBh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hX)The gadget driver handles the last step of enumeration, when the USB host issues a ``set_configuration`` call. It enables all endpoints used in that configuration, with all interfaces in their default settings. That involves using a list of the hardware's endpoints, enabling each endpoint according to its descriptor. It may also involve using ``usb_gadget_vbus_draw`` to let more power be drawn from VBUS, as allowed by that configuration. For OTG devices, setting a configuration may also involve reporting HNP capabilities through a user interface. ”h]”hì)�”}”(hX(The gadget driver handles the last step of enumeration, when the USB host issues a ``set_configuration`` call. It enables all endpoints used in that configuration, with all interfaces in their default settings. That involves using a list of the hardware's endpoints, enabling each endpoint according to its descriptor. It may also involve using ``usb_gadget_vbus_draw`` to let more power be drawn from VBUS, as allowed by that configuration. For OTG devices, setting a configuration may also involve reporting HNP capabilities through a user interface.”h]”(hŒSThe gadget driver handles the last step of enumeration, when the USB host issues a ”…”�”}”(hjlh²hh³Nh´Nubj)�”}”(hŒ``set_configuration``”h]”hŒset_configuration”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlubhŒó call. It enables all endpoints used in that configuration, with all interfaces in their default settings. That involves using a list of the hardware’s endpoints, enabling each endpoint according to its descriptor. It may also involve using ”…”�”}”(hjlh²hh³Nh´Nubj)�”}”(hŒ``usb_gadget_vbus_draw``”h]”hŒusb_gadget_vbus_draw”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlubhŒ· to let more power be drawn from VBUS, as allowed by that configuration. For OTG devices, setting a configuration may also involve reporting HNP capabilities through a user interface.”…”�”}”(hjlh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M hjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hXgDo real work and perform data transfers, possibly involving changes to interface settings or switching to new configurations, until the device is disconnect()ed from the host. Queue any number of transfer requests to each endpoint. It may be suspended and resumed several times before being disconnected. On disconnect, the drivers go back to step 3 (above). ”h]”hì)�”}”(hXfDo real work and perform data transfers, possibly involving changes to interface settings or switching to new configurations, until the device is disconnect()ed from the host. Queue any number of transfer requests to each endpoint. It may be suspended and resumed several times before being disconnected. On disconnect, the drivers go back to step 3 (above).”h]”hXfDo real work and perform data transfers, possibly involving changes to interface settings or switching to new configurations, until the device is disconnect()ed from the host. Queue any number of transfer requests to each endpoint. It may be suspended and resumed several times before being disconnected. On disconnect, the drivers go back to step 3 (above).”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubj`)�”}”(hŒ†When the gadget driver module is being unloaded, the driver unbind() callback is issued. That lets the controller driver be unloaded. ”h]”hì)�”}”(hŒ…When the gadget driver module is being unloaded, the driver unbind() callback is issued. That lets the controller driver be unloaded.”h]”hŒ…When the gadget driver module is being unloaded, the driver unbind() callback is issued. That lets the controller driver be unloaded.”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjšh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j˜hjyh²hh³hÊh´Kòubhì)�”}”(hXœDrivers will normally be arranged so that just loading the gadget driver module (or statically linking it into a Linux kernel) allows the peripheral device to be enumerated, but some drivers will defer enumeration until some higher level component (like a user mode daemon) enables it. Note that at this lowest level there are no policies about how ep0 configuration logic is implemented, except that it should obey USB specifications. Such issues are in the domain of gadget drivers, including knowing about implementation constraints imposed by some USB controllers or understanding that composite devices might happen to be built by integrating reusable components.”h]”hXœDrivers will normally be arranged so that just loading the gadget driver module (or statically linking it into a Linux kernel) allows the peripheral device to be enumerated, but some drivers will defer enumeration until some higher level component (like a user mode daemon) enables it. Note that at this lowest level there are no policies about how ep0 configuration logic is implemented, except that it should obey USB specifications. Such issues are in the domain of gadget drivers, including knowing about implementation constraints imposed by some USB controllers or understanding that composite devices might happen to be built by integrating reusable components.”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mhjyh²hubhì)�”}”(hX¨Note that the lifecycle above can be slightly different for OTG devices. Other than providing an additional OTG descriptor in each configuration, only the HNP-related differences are particularly visible to driver code. They involve reporting requirements during the ``SET_CONFIGURATION`` request, and the option to invoke HNP during some suspend callbacks. Also, SRP changes the semantics of ``usb_gadget_wakeup`` slightly.”h]”(hX Note that the lifecycle above can be slightly different for OTG devices. Other than providing an additional OTG descriptor in each configuration, only the HNP-related differences are particularly visible to driver code. They involve reporting requirements during the ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ``SET_CONFIGURATION``”h]”hŒSET_CONFIGURATION”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒi request, and the option to invoke HNP during some suspend callbacks. Also, SRP changes the semantics of ”…”�”}”(hjíh²hh³Nh´Nubj)�”}”(hŒ``usb_gadget_wakeup``”h]”hŒusb_gadget_wakeup”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjíubhŒ slightly.”…”�”}”(hjíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M(hjyh²hubeh}”(h]”Œdriver-life-cycle”ah ]”h"]”Œdriver life cycle”ah$]”h&]”uh1hµhjÁh²hh³hÊh´Kìubh¶)�”}”(hhh]”(h»)�”}”(hŒ%USB 2.0 Chapter 9 Types and Constants”h]”hŒ%USB 2.0 Chapter 9 Types and Constants”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj'h²hh³hÊh´M0ubhì)�”}”(hŒõGadget drivers rely on common USB structures and constants defined in the :ref:`linux/usb/ch9.h ` header file, which is standard in Linux 2.6+ kernels. These are the same types and constants used by host side drivers (and usbcore).”h]”(hŒJGadget drivers rely on common USB structures and constants defined in the ”…”�”}”(hj8h²hh³Nh´Nubh)�”}”(hŒ%:ref:`linux/usb/ch9.h `”h]”hŒinline”“”)�”}”(hjBh]”hŒlinux/usb/ch9.h”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”(jèŒstd”Œstd-ref”eh"]”h$]”h&]”uh1jDhj@ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jõŒ refdomain”jPŒreftype”Œref”Œ refexplicit”ˆŒrefwarn”ˆjûŒ usb_chapter9”uh1hh³hÊh´M2hj8ubhŒ† header file, which is standard in Linux 2.6+ kernels. These are the same types and constants used by host side drivers (and usbcore).”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M2hj'h²hubeh}”(h]”Œ%usb-2-0-chapter-9-types-and-constants”ah ]”h"]”Œ%usb 2.0 chapter 9 types and constants”ah$]”h&]”uh1hµhjÁh²hh³hÊh´M0ubh¶)�”}”(hhh]”(h»)�”}”(hŒCore Objects and Methods”h]”hŒCore Objects and Methods”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjth²hh³hÊh´M8ubhì)�”}”(hŒ‚These are declared in ````, and are used by gadget drivers to interact with USB peripheral controller drivers.”h]”(hŒThese are declared in ”…”�”}”(hj…h²hh³Nh´Nubj)�”}”(hŒ````”h]”hŒ”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj…ubhŒT, and are used by gadget drivers to interact with USB peripheral controller drivers.”…”�”}”(hj…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M:hjth²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œusb_request (C struct)”Œ c.usb_request”hNt”auh1j¥hjth²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ usb_request”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct usb_request”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jÇhjÃh²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jÙhjÃh²hh³jØh´KubhŒ desc_name”“”)�”}”(hŒ usb_request”h]”hŒ desc_sig_name”“”)�”}”(hj¿h]”hŒ usb_request”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jðhjìubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jêhjÃh²hh³jØh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j j Œ add_permalink”ˆuh1jÁŒsphinx_line_type”Œ declarator”hj½h²hh³jØh´Kubah}”(h]”j´ah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1j»h³jØh´Khj¸h²hubhŒ desc_content”“”)�”}”(hhh]”hì)�”}”(hŒdescribes one i/o request”h]”hŒdescribes one i/o request”…”�”}”(hj# h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K#hj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¸h²hh³jØh´Kubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”Œdomain”jéŒobjtype”j; Œdesctype”j; Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j¶h²hhjth³Nh´NubhŒ container”“”)�”}”(hX[ **Definition**:: struct usb_request { struct usb_ep *ep; void *buf; unsigned length; dma_addr_t dma; struct scatterlist *sg; unsigned num_sgs; unsigned num_mapped_sgs; unsigned stream_id:16; unsigned is_last:1; unsigned no_interrupt:1; unsigned zero:1; unsigned short_not_ok:1; unsigned dma_mapped:1; unsigned sg_was_mapped:1; void (*complete)(struct usb_ep *ep, struct usb_request *req); void *context; struct list_head list; unsigned frame_number; int status; unsigned actual; }; **Members** ``ep`` The associated endpoint set by usb_ep_alloc_request(). ``buf`` Buffer used for data. Always provide this; some controllers only use PIO, or don't use DMA for some endpoints. ``length`` Length of that data ``dma`` DMA address corresponding to 'buf'. If you don't set this field, and the usb controller needs one, it is responsible for mapping and unmapping the buffer. ``sg`` a scatterlist for SG-capable controllers. ``num_sgs`` number of SG entries ``num_mapped_sgs`` number of SG entries mapped to DMA (internal) ``stream_id`` The stream id, when USB3.0 bulk streams are being used ``is_last`` Indicates if this is the last request of a stream_id before switching to a different stream (required for DWC3 controllers). ``no_interrupt`` If true, hints that no completion irq is needed. Helpful sometimes with deep request queues that are handled directly by DMA controllers. ``zero`` If true, when writing data, makes the last packet be "short" by adding a zero length packet as needed; ``short_not_ok`` When reading data, makes short packets be treated as errors (queue stops advancing till cleanup). ``dma_mapped`` Indicates if request has been mapped to DMA (internal) ``sg_was_mapped`` Set if the scatterlist has been mapped before the request ``complete`` Function called when request completes, so this request and its buffer may be re-used. The function will always be called with interrupts disabled, and it must not sleep. Reads terminate with a short packet, or when the buffer fills, whichever comes first. When writes terminate, some data bytes will usually still be in flight (often in a hardware fifo). Errors (for reads or writes) stop the queue from advancing until the completion function returns, so that any transfers invalidated by the error may first be dequeued. ``context`` For use by the completion callback ``list`` For use by the gadget driver. ``frame_number`` Reports the interval number in (micro)frame in which the isochronous transfer was transmitted or received. ``status`` Reports completion code, zero or a negative errno. Normally, faults block the transfer queue from advancing until the completion callback returns. Code "-ESHUTDOWN" indicates completion caused by device disconnect, or when the driver disabled the endpoint. ``actual`` Reports bytes transferred to/from the buffer. For reads (OUT transfers) this may be less than the requested length. If the short_not_ok flag is set, short reads are treated as errors even when status otherwise indicates successful completion. Note that for writes (IN transfers) some data bytes may still reside in a device-side FIFO when the request is reported as complete.”h]”(hì)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjK ubhŒ:”…”�”}”(hjK h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K'hjG ubhŒ literal_block”“”)�”}”(hX6struct usb_request { struct usb_ep *ep; void *buf; unsigned length; dma_addr_t dma; struct scatterlist *sg; unsigned num_sgs; unsigned num_mapped_sgs; unsigned stream_id:16; unsigned is_last:1; unsigned no_interrupt:1; unsigned zero:1; unsigned short_not_ok:1; unsigned dma_mapped:1; unsigned sg_was_mapped:1; void (*complete)(struct usb_ep *ep, struct usb_request *req); void *context; struct list_head list; unsigned frame_number; int status; unsigned actual; };”h]”hX6struct usb_request { struct usb_ep *ep; void *buf; unsigned length; dma_addr_t dma; struct scatterlist *sg; unsigned num_sgs; unsigned num_mapped_sgs; unsigned stream_id:16; unsigned is_last:1; unsigned no_interrupt:1; unsigned zero:1; unsigned short_not_ok:1; unsigned dma_mapped:1; unsigned sg_was_mapped:1; void (*complete)(struct usb_ep *ep, struct usb_request *req); void *context; struct list_head list; unsigned frame_number; int status; unsigned actual; };”…”�”}”hjl sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K)hjG ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj} h]”hŒMembers”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj{ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K@hjG ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ>``ep`` The associated endpoint set by usb_ep_alloc_request(). ”h]”(j�)�”}”(hŒ``ep``”h]”j)�”}”(hjœ h]”hŒep”…”�”}”(hjž h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjš ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K%hj– ubj©)�”}”(hhh]”hì)�”}”(hŒ6The associated endpoint set by usb_ep_alloc_request().”h]”hŒ6The associated endpoint set by usb_ep_alloc_request().”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j± h´K%hj² ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj– ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j± h´K%hj“ ubjŠ)�”}”(hŒx``buf`` Buffer used for data. Always provide this; some controllers only use PIO, or don't use DMA for some endpoints. ”h]”(j�)�”}”(hŒ``buf``”h]”j)�”}”(hjÕ h]”hŒbuf”…”�”}”(hj× h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÓ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K'hjÏ ubj©)�”}”(hhh]”hì)�”}”(hŒoBuffer used for data. Always provide this; some controllers only use PIO, or don't use DMA for some endpoints.”h]”hŒqBuffer used for data. Always provide this; some controllers only use PIO, or don’t use DMA for some endpoints.”…”�”}”(hjî h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K&hjë ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÏ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jê h´K'hj“ ubjŠ)�”}”(hŒ``length`` Length of that data ”h]”(j�)�”}”(hŒ ``length``”h]”j)�”}”(hj h]”hŒlength”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K.hj ubj©)�”}”(hhh]”hì)�”}”(hŒLength of that data”h]”hŒLength of that data”…”�”}”(hj( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j$ h´K.hj% ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j$ h´K.hj“ ubjŠ)�”}”(hŒ¤``dma`` DMA address corresponding to 'buf'. If you don't set this field, and the usb controller needs one, it is responsible for mapping and unmapping the buffer. ”h]”(j�)�”}”(hŒ``dma``”h]”j)�”}”(hjH h]”hŒdma”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjF ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K*hjB ubj©)�”}”(hhh]”hì)�”}”(hŒ›DMA address corresponding to 'buf'. If you don't set this field, and the usb controller needs one, it is responsible for mapping and unmapping the buffer.”h]”hŒ¡DMA address corresponding to ‘buf’. If you don’t set this field, and the usb controller needs one, it is responsible for mapping and unmapping the buffer.”…”�”}”(hja h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K(hj^ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjB ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j] h´K*hj“ ubjŠ)�”}”(hŒ1``sg`` a scatterlist for SG-capable controllers. ”h]”(j�)�”}”(hŒ``sg``”h]”j)�”}”(hj‚ h]”hŒsg”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj€ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K+hj| ubj©)�”}”(hhh]”hì)�”}”(hŒ)a scatterlist for SG-capable controllers.”h]”hŒ)a scatterlist for SG-capable controllers.”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j— h´K+hj˜ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj| ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j— h´K+hj“ ubjŠ)�”}”(hŒ!``num_sgs`` number of SG entries ”•h]”(j�)�”}”(hŒ ``num_sgs``”h]”j)�”}”(hj» h]”hŒnum_sgs”…”�”}”(hj½ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K,hjµ ubj©)�”}”(hhh]”hì)�”}”(hŒnumber of SG entries”h]”hŒnumber of SG entries”…”�”}”(hjÔ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÐ h´K,hjÑ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjµ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÐ h´K,hj“ ubjŠ)�”}”(hŒA``num_mapped_sgs`` number of SG entries mapped to DMA (internal) ”h]”(j�)�”}”(hŒ``num_mapped_sgs``”h]”j)�”}”(hjô h]”hŒnum_mapped_sgs”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjò ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K-hjî ubj©)�”}”(hhh]”hì)�”}”(hŒ-number of SG entries mapped to DMA (internal)”h]”hŒ-number of SG entries mapped to DMA (internal)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´K-hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjî ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j h´K-hj“ ubjŠ)�”}”(hŒE``stream_id`` The stream id, when USB3.0 bulk streams are being used ”h]”(j�)�”}”(hŒ ``stream_id``”h]”j)�”}”(hj- h]”hŒ stream_id”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj+ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K/hj' ubj©)�”}”(hhh]”hì)�”}”(hŒ6The stream id, when USB3.0 bulk streams are being used”h]”hŒ6The stream id, when USB3.0 bulk streams are being used”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jB h´K/hjC ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj' ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jB h´K/hj“ ubjŠ)�”}”(hŒ‰``is_last`` Indicates if this is the last request of a stream_id before switching to a different stream (required for DWC3 controllers). ”h]”(j�)�”}”(hŒ ``is_last``”h]”j)�”}”(hjf h]”hŒis_last”…”�”}”(hjh h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K1hj` ubj©)�”}”(hhh]”hì)�”}”(hŒ|Indicates if this is the last request of a stream_id before switching to a different stream (required for DWC3 controllers).”h]”hŒ|Indicates if this is the last request of a stream_id before switching to a different stream (required for DWC3 controllers).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K0hj| ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj` ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j{ h´K1hj“ ubjŠ)�”}”(hŒ›``no_interrupt`` If true, hints that no completion irq is needed. Helpful sometimes with deep request queues that are handled directly by DMA controllers. ”h]”(j�)�”}”(hŒ``no_interrupt``”h]”j)�”}”(hj  h]”hŒ no_interrupt”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjž ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K4hjš ubj©)�”}”(hhh]”hì)�”}”(hŒ‰If true, hints that no completion irq is needed. Helpful sometimes with deep request queues that are handled directly by DMA controllers.”h]”hŒ‰If true, hints that no completion irq is needed. Helpful sometimes with deep request queues that are handled directly by DMA controllers.”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K2hj¶ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjš ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jµ h´K4hj“ ubjŠ)�”}”(hŒp``zero`` If true, when writing data, makes the last packet be "short" by adding a zero length packet as needed; ”h]”(j�)�”}”(hŒ``zero``”h]”j)�”}”(hjÚ h]”hŒzero”…”�”}”(hjÜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjØ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K6hjÔ ubj©)�”}”(hhh]”hì)�”}”(hŒfIf true, when writing data, makes the last packet be "short" by adding a zero length packet as needed;”h]”hŒjIf true, when writing data, makes the last packet be “shortâ€� by adding a zero length packet as needed;”…”�”}”(hjó h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K5hjð ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÔ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jï h´K6hj“ ubjŠ)�”}”(hŒs``short_not_ok`` When reading data, makes short packets be treated as errors (queue stops advancing till cleanup). ”h]”(j�)�”}”(hŒ``short_not_ok``”h]”j)�”}”(hj h]”hŒ short_not_ok”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K8hj ubj©)�”}”(hhh]”hì)�”}”(hŒaWhen reading data, makes short packets be treated as errors (queue stops advancing till cleanup).”h]”hŒaWhen reading data, makes short packets be treated as errors (queue stops advancing till cleanup).”…”�”}”(hj- h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K7hj* ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j) h´K8hj“ ubjŠ)�”}”(hŒF``dma_mapped`` Indicates if request has been mapped to DMA (internal) ”h]”(j�)�”}”(hŒ``dma_mapped``”h]”j)�”}”(hjN h]”hŒ dma_mapped”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjL ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K9hjH ubj©)�”}”(hhh]”hì)�”}”(hŒ6Indicates if request has been mapped to DMA (internal)”h]”hŒ6Indicates if request has been mapped to DMA (internal)”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jc h´K9hjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjH ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jc h´K9hj“ ubjŠ)�”}”(hŒL``sg_was_mapped`` Set if the scatterlist has been mapped before the request ”h]”(j�)�”}”(hŒ``sg_was_mapped``”h]”j)�”}”(hj‡ h]”hŒ sg_was_mapped”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj… ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K:hj� ubj©)�”}”(hhh]”hì)�”}”(hŒ9Set if the scatterlist has been mapped before the request”h]”hŒ9Set if the scatterlist has been mapped before the request”…”�”}”(hj  h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jœ h´K:hj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jœ h´K:hj“ ubjŠ)�”}”(hX``complete`` Function called when request completes, so this request and its buffer may be re-used. The function will always be called with interrupts disabled, and it must not sleep. Reads terminate with a short packet, or when the buffer fills, whichever comes first. When writes terminate, some data bytes will usually still be in flight (often in a hardware fifo). Errors (for reads or writes) stop the queue from advancing until the completion function returns, so that any transfers invalidated by the error may first be dequeued. ”h]”(j�)�”}”(hŒ ``complete``”h]”j)�”}”(hjÀ h]”hŒcomplete”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¾ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KChjº ubj©)�”}”(hhh]”hì)�”}”(hX Function called when request completes, so this request and its buffer may be re-used. The function will always be called with interrupts disabled, and it must not sleep. Reads terminate with a short packet, or when the buffer fills, whichever comes first. When writes terminate, some data bytes will usually still be in flight (often in a hardware fifo). Errors (for reads or writes) stop the queue from advancing until the completion function returns, so that any transfers invalidated by the error may first be dequeued.”h]”hX Function called when request completes, so this request and its buffer may be re-used. The function will always be called with interrupts disabled, and it must not sleep. Reads terminate with a short packet, or when the buffer fills, whichever comes first. When writes terminate, some data bytes will usually still be in flight (often in a hardware fifo). Errors (for reads or writes) stop the queue from advancing until the completion function returns, so that any transfers invalidated by the error may first be dequeued.”…”�”}”(hjÙ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K;hjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjº ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÕ h´KChj“ ubjŠ)�”}”(hŒ/``context`` For use by the completion callback ”h]”(j�)�”}”(hŒ ``context``”h]”j)�”}”(hjú h]”hŒcontext”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjø ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KDhjô ubj©)�”}”(hhh]”hì)�”}”(hŒ"For use by the completion callback”h]”hŒ"For use by the completion callback”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´KDhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjô ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j h´KDhj“ ubjŠ)�”}”(hŒ'``list`` For use by the gadget driver. ”h]”(j�)�”}”(hŒ``list``”h]”j)�”}”(hj3 h]”hŒlist”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KEhj- ubj©)�”}”(hhh]”hì)�”}”(hŒFor use by the gadget driver.”h]”hŒFor use by the gadget driver.”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jH h´KEhjI ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj- ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jH h´KEhj“ ubjŠ)�”}”(hŒ|``frame_number`` Reports the interval number in (micro)frame in which the isochronous transfer was transmitted or received. ”h]”(j�)�”}”(hŒ``frame_number``”h]”j)�”}”(hjl h]”hŒ frame_number”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KGhjf ubj©)�”}”(hhh]”hì)�”}”(hŒjReports the interval number in (micro)frame in which the isochronous transfer was transmitted or received.”h]”hŒjReports the interval number in (micro)frame in which the isochronous transfer was transmitted or received.”…”�”}”(hj… h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KFhj‚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjf ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j� h´KGhj“ ubjŠ)�”}”(hX ``status`` Reports completion code, zero or a negative errno. Normally, faults block the transfer queue from advancing until the completion callback returns. Code "-ESHUTDOWN" indicates completion caused by device disconnect, or when the driver disabled the endpoint. ”h]”(j�)�”}”(hŒ ``status``”h]”j)�”}”(hj¦ h]”hŒstatus”…”�”}”(hj¨ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¤ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KLhj  ubj©)�”}”(hhh]”hì)�”}”(hXReports completion code, zero or a negative errno. Normally, faults block the transfer queue from advancing until the completion callback returns. Code "-ESHUTDOWN" indicates completion caused by device disconnect, or when the driver disabled the endpoint.”h]”hXReports completion code, zero or a negative errno. Normally, faults block the transfer queue from advancing until the completion callback returns. Code “-ESHUTDOWNâ€� indicates completion caused by device disconnect, or when the driver disabled the endpoint.”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KHhj¼ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj  ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j» h´KLhj“ ubjŠ)�”}”(hX„``actual`` Reports bytes transferred to/from the buffer. For reads (OUT transfers) this may be less than the requested length. If the short_not_ok flag is set, short reads are treated as errors even when status otherwise indicates successful completion. Note that for writes (IN transfers) some data bytes may still reside in a device-side FIFO when the request is reported as complete.”h]”(j�)�”}”(hŒ ``actual``”h]”j)�”}”(hjà h]”hŒactual”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KRhjÚ ubj©)�”}”(hhh]”hì)�”}”(hXyReports bytes transferred to/from the buffer. For reads (OUT transfers) this may be less than the requested length. If the short_not_ok flag is set, short reads are treated as errors even when status otherwise indicates successful completion. Note that for writes (IN transfers) some data bytes may still reside in a device-side FIFO when the request is reported as complete.”h]”hXyReports bytes transferred to/from the buffer. For reads (OUT transfers) this may be less than the requested length. If the short_not_ok flag is set, short reads are treated as errors even when status otherwise indicates successful completion. Note that for writes (IN transfers) some data bytes may still reside in a device-side FIFO when the request is reported as complete.”…”�”}”(hjù h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KMhjö ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÚ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jõ h´KRhj“ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjG ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj#h]”hŒ Description”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KVhjth²hubhì)�”}”(hŒøThese are allocated/freed through the endpoint they're used with. The hardware's driver can add extra per-request data to the memory it returns, which often avoids separate memory allocations (potential failures), later when the request is queued.”h]”hŒüThese are allocated/freed through the endpoint they’re used with. The hardware’s driver can add extra per-request data to the memory it returns, which often avoids separate memory allocations (potential failures), later when the request is queued.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KShjth²hubhì)�”}”(hXARequest flags affect request handling, such as whether a zero length packet is written (the "zero" flag), whether a short read should be treated as an error (blocking request queue advance, the "short_not_ok" flag), or hinting that an interrupt is not required (the "no_interrupt" flag, for use with deep request queues).”h]”hXMRequest flags affect request handling, such as whether a zero length packet is written (the “zeroâ€� flag), whether a short read should be treated as an error (blocking request queue advance, the “short_not_okâ€� flag), or hinting that an interrupt is not required (the “no_interruptâ€� flag, for use with deep request queues).”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KXhjth²hubhì)�”}”(hŒŒBulk endpoints can use any size buffers, and can also be used for interrupt transfers. interrupt-only endpoints can be much less functional.”h]”hŒŒBulk endpoints can use any size buffers, and can also be used for interrupt transfers. interrupt-only endpoints can be much less functional.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K^hjth²hubhì)�”}”(hŒ**NOTE**”h]”jP )�”}”(hjhh]”hŒNOTE”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Kahjth²hubhì)�”}”(hŒnthis is analogous to 'struct urb' on the host side, except that it's thinner and promotes more pre-allocation.”h]”hŒtthis is analogous to ‘struct urb’ on the host side, except that it’s thinner and promotes more pre-allocation.”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Kbhjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_ep_caps (C struct)”Œ c.usb_ep_caps”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ usb_ep_caps”h]”jÂ)�”}”(hŒstruct usb_ep_caps”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj¢h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KhubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¢h²hh³j³h´Khubjë)�”}”(hŒ usb_ep_caps”h]”jñ)�”}”(hj h]”hŒ usb_ep_caps”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÂubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj¢h²hh³j³h´Khubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjžh²hh³j³h´Khubah}”(h]”j™ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j³h´Khhj›h²hubj )�”}”(hhh]”hì)�”}”(hŒ!endpoint capabilities description”h]”hŒ!endpoint capabilities description”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¢hjåh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj›h²hh³j³h´Khubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jjA jjB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hX&**Definition**:: struct usb_ep_caps { unsigned type_control:1; unsigned type_iso:1; unsigned type_bulk:1; unsigned type_int:1; unsigned dir_in:1; unsigned dir_out:1; }; **Members** ``type_control`` Endpoint supports control type (reserved for ep0). ``type_iso`` Endpoint supports isochronous transfers. ``type_bulk`` Endpoint supports bulk transfers. ``type_int`` Endpoint supports interrupt transfers. ``dir_in`` Endpoint supports IN direction. ``dir_out`` Endpoint supports OUT direction.”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjubhŒ:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¦hjubjk )�”}”(hŒ¯struct usb_ep_caps { unsigned type_control:1; unsigned type_iso:1; unsigned type_bulk:1; unsigned type_int:1; unsigned dir_in:1; unsigned dir_out:1; };”h]”hŒ¯struct usb_ep_caps { unsigned type_control:1; unsigned type_iso:1; unsigned type_bulk:1; unsigned type_int:1; unsigned dir_in:1; unsigned dir_out:1; };”…”�”}”hj%sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¨hjubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj6h]”hŒMembers”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K±hjubj…)�”}”(hhh]”(jŠ)�”}”(hŒD``type_control`` Endpoint supports control type (reserved for ep0). ”h]”(j�)�”}”(hŒ``type_control``”h]”j)�”}”(hjUh]”hŒ type_control”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¤hjOubj©)�”}”(hhh]”hì)�”}”(hŒ2Endpoint supports control type (reserved for ep0).”h]”hŒ2Endpoint supports control type (reserved for ep0).”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jjh´K¤hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jjh´K¤hjLubjŠ)�”}”(hŒ6``type_iso`` Endpoint supports isochronous transfers. ”h]”(j�)�”}”(hŒ ``type_iso``”h]”j)�”}”(hjŽh]”hŒtype_iso”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¥hjˆubj©)�”}”(hhh]”hì)�”}”(hŒ(Endpoint supports isochronous transfers.”h]”hŒ(Endpoint supports isochronous transfers.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j£h´K¥hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j£h´K¥hjLubjŠ)�”}”(hŒ0``type_bulk`` Endpoint supports bulk transfers. ”h]”(j�)�”}”(hŒ ``type_bulk``”h]”j)�”}”(hjÇh]”hŒ type_bulk”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¦hjÁubj©)�”}”(hhh]”hì)�”}”(hŒ!Endpoint supports bulk transfers.”h]”hŒ!Endpoint supports bulk transfers.”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÜh´K¦hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÜh´K¦hjLubjŠ)�”}”(hŒ4``type_int`` Endpoint supports interrupt transfers. ”h]”(j�)�”}”(hŒ ``type_int``”h]”j)�”}”(hjh]”hŒtype_int”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K§hjúubj©)�”}”(hhh]”hì)�”}”(hŒ&Endpoint supports interrupt transfers.”h]”hŒ&Endpoint supports interrupt transfers.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´K§hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjúubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´K§hjLubjŠ)�”}”(hŒ+``dir_in`` Endpoint supports IN direction. ”h]”(j�)�”}”(hŒ ``dir_in``”h]”j)�”}”(hj9h]”hŒdir_in”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¨hj3ubj©)�”}”(hhh]”hì)�”}”(hŒEndpoint supports IN direction.”h]”hŒEndpoint supports IN direction.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jNh´K¨hjOubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jNh´K¨hjLubjŠ)�”}”(hŒ,``dir_out`` Endpoint supports OUT direction.”h]”(j�)�”}”(hŒ ``dir_out``”h]”j)�”}”(hjrh]”hŒdir_out”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¨hjlubj©)�”}”(hhh]”hì)�”}”(hŒ Endpoint supports OUT direction.”h]”hŒ Endpoint supports OUT direction.”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K©hjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjlubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‡h´K¨hjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_ep (C struct)”Œc.usb_ep”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_ep”h]”jÂ)�”}”(hŒ struct usb_ep”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÈh²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´K¯ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÈh²hh³jÙh´K¯ubjë)�”}”(hŒusb_ep”h]”jñ)�”}”(hjÆh]”hŒusb_ep”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjèubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÈh²hh³jÙh´K¯ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÄh²hh³jÙh´K¯ubah}”(h]”j¿ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÙh´K¯hjÁh²hubj )�”}”(hhh]”hì)�”}”(hŒ*device side representation of USB endpoint”h]”hŒ*device side representation of USB endpoint”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÈhj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÁh²hh³jÙh´K¯ubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j&jA j&jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hXÒ**Definition**:: struct usb_ep { void *driver_data; const char *name; const struct usb_ep_ops *ops; const struct usb_endpoint_descriptor *desc; const struct usb_ss_ep_comp_descriptor *comp_desc; struct list_head ep_list; struct usb_ep_caps caps; bool claimed; bool enabled; unsigned mult:2; unsigned maxburst:5; u8 address; u16 maxpacket; u16 maxpacket_limit; u16 max_streams; }; **Members** ``driver_data`` for use by the gadget driver. ``name`` identifier for the endpoint, such as "ep-a" or "ep9in-bulk" ``ops`` Function pointers used to access hardware-specific operations. ``desc`` endpoint descriptor. This pointer is set before the endpoint is enabled and remains valid until the endpoint is disabled. ``comp_desc`` In case of SuperSpeed support, this is the endpoint companion descriptor that is used to configure the endpoint ``ep_list`` the gadget's ep_list holds all of its endpoints ``caps`` The structure describing types and directions supported by endpoint. ``claimed`` True if this endpoint is claimed by a function. ``enabled`` The current endpoint enabled/disabled state. ``mult`` multiplier, 'mult' value for SS Isoc EPs ``maxburst`` the maximum number of bursts supported by this EP (for usb3) ``address`` used to identify the endpoint when finding descriptor that matches connection speed ``maxpacket`` The maximum packet size used on this endpoint. The initial value can sometimes be reduced (hardware allowing), according to the endpoint descriptor used to configure the endpoint. ``maxpacket_limit`` The maximum packet size value which can be handled by this endpoint. It's set once by UDC driver when endpoint is initialized, and should not be changed. Should not be confused with maxpacket. ``max_streams`` The maximum number of streams supported by this EP (0 - 16, actual number is 2^n)”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj.ubhŒ:”…”�”}”(hj.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÌhj*ubjk )�”}”(hXÃstruct usb_ep { void *driver_data; const char *name; const struct usb_ep_ops *ops; const struct usb_endpoint_descriptor *desc; const struct usb_ss_ep_comp_descriptor *comp_desc; struct list_head ep_list; struct usb_ep_caps caps; bool claimed; bool enabled; unsigned mult:2; unsigned maxburst:5; u8 address; u16 maxpacket; u16 maxpacket_limit; u16 max_streams; };”h]”hXÃstruct usb_ep { void *driver_data; const char *name; const struct usb_ep_ops *ops; const struct usb_endpoint_descriptor *desc; const struct usb_ss_ep_comp_descriptor *comp_desc; struct list_head ep_list; struct usb_ep_caps caps; bool claimed; bool enabled; unsigned mult:2; unsigned maxburst:5; u8 address; u16 maxpacket; u16 maxpacket_limit; u16 max_streams; };”…”�”}”hjKsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÎhj*ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj\h]”hŒMembers”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Kàhj*ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ.``driver_data`` for use by the gadget driver. ”h]”(j�)�”}”(hŒ``driver_data``”h]”j)�”}”(hj{h]”hŒ driver_data”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÚhjuubj©)�”}”(hhh]”hì)�”}”(hŒfor use by the gadget driver.”h]”hŒfor use by the gadget driver.”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�h´KÚhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�h´KÚhjrubjŠ)�”}”(hŒE``name`` identifier for the endpoint, such as "ep-a" or "ep9in-bulk" ”h]”(j�)�”}”(hŒ``name``”h]”j)�”}”(hj´h]”hŒname”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÊhj®ubj©)�”}”(hhh]”hì)�”}”(hŒ;identifier for the endpoint, such as "ep-a" or "ep9in-bulk"”h]”hŒCidentifier for the endpoint, such as “ep-aâ€� or “ep9in-bulkâ€�”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÉh´KÊhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÉh´KÊhjrubjŠ)�”}”(hŒG``ops`` Function pointers used to access hardware-specific operations. ”h]”(j�)�”}”(hŒ``ops``”h]”j)�”}”(hjíh]”hŒops”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KËhjçubj©)�”}”(hhh]”hì)�”}”(hŒ>Function pointers used to access hardware-specific operations.”h]”hŒ>Function pointers used to access hardware-specific operations.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´KËhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´KËhjrubjŠ)�”}”(hŒ„``desc`` endpoint descriptor. This pointer is set before the endpoint is enabled and remains valid until the endpoint is disabled. ”h]”(j�)�”}”(hŒ``desc``”h]”j)�”}”(hj&h]”hŒdesc”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÞhj ubj©)�”}”(hhh]”hì)�”}”(hŒzendpoint descriptor. This pointer is set before the endpoint is enabled and remains valid until the endpoint is disabled.”h]”hŒzendpoint descriptor. This pointer is set before the endpoint is enabled and remains valid until the endpoint is disabled.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÝhj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j;h´KÞhjrubjŠ)�”}”(hŒ~``comp_desc`` In case of SuperSpeed support, this is the endpoint companion descriptor that is used to configure the endpoint ”h]”(j�)�”}”(hŒ ``comp_desc``”h]”j)�”}”(hj`h]”hŒ comp_desc”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KàhjZubj©)�”}”(hhh]”hì)�”}”(hŒoIn case of SuperSpeed support, this is the endpoint companion descriptor that is used to configure the endpoint”h]”hŒoIn case of SuperSpeed support, this is the endpoint companion descriptor that is used to configure the endpoint”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Kßhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³juh´KàhjrubjŠ)�”}”(hŒ<``ep_list`` the gadget's ep_list holds all of its endpoints ”h]”(j�)�”}”(hŒ ``ep_list``”h]”j)�”}”(hjšh]”hŒep_list”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÌhj”ubj©)�”}”(hhh]”hì)�”}”(hŒ/the gadget's ep_list holds all of its endpoints”h]”hŒ1the gadget’s ep_list holds all of its endpoints”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¯h´KÌhj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¯h´KÌhjrubjŠ)�”}”(hŒN``caps`` The structure describing types and directions supported by endpoint. ”h]”(j�)�”}”(hŒ``caps``”h]”j)�”}”(hjÓh]”hŒcaps”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÍhjÍubj©)�”}”(hhh]”hì)�”}”(hŒDThe structure describing types and directions supported by endpoint.”h]”hŒDThe structure describing types and directions supported by endpoint.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jèh´KÍhjéubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÍubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jèh´KÍhjrubjŠ)�”}”(hŒ<``claimed`` True if this endpoint is claimed by a function. ”h]”(j�)�”}”(hŒ ``claimed``”h]”j)�”}”(hj h]”hŒclaimed”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÏhjubj©)�”}”(hhh]”hì)�”}”(hŒ/True if this endpoint is claimed by a function.”h]”hŒ/True if this endpoint is claimed by a function.”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j!h´KÏhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j!h´KÏhjrubjŠ)�”}”(hŒ9``enabled`` The current endpoint enabled/disabled state. ”h]”(j�)�”}”(hŒ ``enabled``”h]”j)�”}”(hjEh]”hŒenabled”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÎhj?ubj©)�”}”(hhh]”hì)�”}”(hŒ,The current endpoint enabled/disabled state.”h]”hŒ,The current endpoint enabled/disabled state.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jZh´KÎhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj?ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jZh´KÎhjrubjŠ)�”}”(hŒ2``mult`` multiplier, 'mult' value for SS Isoc EPs ”h]”(j�)�”}”(hŒ``mult``”h]”j)�”}”(hj~h]”hŒmult”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KØhjxubj©)�”}”(hhh]”hì)�”}”(hŒ(multiplier, 'mult' value for SS Isoc EPs”h]”hŒ,multiplier, ‘mult’ value for SS Isoc EPs”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j“h´KØhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j“h´KØhjrubjŠ)�”}”(hŒJ``maxburst`` the maximum number of bursts supported by this EP (for usb3) ”h]”(j�)�”}”(hŒ ``maxburst``”h]”j)�”}”(hj·h]”hŒmaxburst”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´KÙhj±ubj©)�”}”(hhh]”hì)�”}”(hŒep_list. the control endpoint (gadget->ep0) is not in that list, and is accessed only in response to a driver setup() callback.”h]”hŒÍthe bus controller driver lists all the general purpose endpoints in gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, and is accessed only in response to a driver setup() callback.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Kàhjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œfree_usb_request (C function)”Œc.free_usb_request”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ/void free_usb_request (struct usb_request *req)”h]”jÂ)�”}”(hŒ.void free_usb_request(struct usb_request *req)”h]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jhjh²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M*ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjh²hh³j/h´M*ubjë)�”}”(hŒfree_usb_request”h]”jñ)�”}”(hŒfree_usb_request”h]”hŒfree_usb_request”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj>ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjh²hh³j/h´M*ubhŒdesc_parameterlist”“”)�”}”(hŒ(struct usb_request *req)”h]”hŒdesc_parameter”“”)�”}”(hŒstruct usb_request *req”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj^ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj^ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_request”h]”hŒ usb_request”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj}ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”Œ identifier”Œ reftarget”j‚Œmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”j›Œ ASTIdentifier”“”)�”}”j–jDsbŒc.free_usb_request”†”asbuh1hhj^ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj^ubhŒdesc_sig_punctuation”“”)�”}”(hŒ*”h]”hŒ*”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j¶hj^ubjñ)�”}”(hŒreq”h]”hŒreq”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj^ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjXubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjh²hh³j/h´M*ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjh²hh³j/h´M*ubah}”(h]”jah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j/h´M*hjh²hubj )�”}”(hhh]”hì)�”}”(hŒ)frees a usb_request object and its buffer”h]”hŒ)frees a usb_request object and its buffer”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M*hjîh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjh²hh³j/h´M*ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j jA j jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hXG**Parameters** ``struct usb_request *req`` the request being freed **Description** This helper function frees both the request's buffer and the request object itself by calling usb_ep_free_request(). Its signature is designed to be used with DEFINE_FREE() to enable automatic, scope-based cleanup for usb_request pointers.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjh]”hŒ Parameters”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M.hj ubj…)�”}”(hhh]”jŠ)�”}”(hŒ4``struct usb_request *req`` the request being freed ”h]”(j�)�”}”(hŒ``struct usb_request *req``”h]”j)�”}”(hj2h]”hŒstruct usb_request *req”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M+hj,ubj©)�”}”(hhh]”hì)�”}”(hŒthe request being freed”h]”hŒthe request being freed”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jGh´M+hjHubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jGh´M+hj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjmh]”hŒ Description”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M-hj ubhì)�”}”(hŒïThis helper function frees both the request's buffer and the request object itself by calling usb_ep_free_request(). Its signature is designed to be used with DEFINE_FREE() to enable automatic, scope-based cleanup for usb_request pointers.”h]”hŒñThis helper function frees both the request’s buffer and the request object itself by calling usb_ep_free_request(). Its signature is designed to be used with DEFINE_FREE() to enable automatic, scope-based cleanup for usb_request pointers.”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M,hj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_gadget (C struct)”Œ c.usb_gadget”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ usb_gadget”h]”jÂ)�”}”(hŒstruct usb_gadget”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj®h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M4ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj®h²hh³j¿h´M4ubjë)�”}”(hŒ usb_gadget”h]”jñ)�”}”(hj¬h]”hŒ usb_gadget”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÎubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj®h²hh³j¿h´M4ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjªh²hh³j¿h´M4ubah}”(h]”j¥ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j¿h´M4hj§h²hubj )�”}”(hhh]”hì)�”}”(hŒrepresents a usb device”h]”hŒrepresents a usb device”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mlhjñh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj§h²hh³j¿h´M4ubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j jA j jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hX**Definition**:: struct usb_gadget { struct work_struct work; struct usb_udc *udc; const struct usb_gadget_ops *ops; struct usb_ep *ep0; struct list_head ep_list; enum usb_device_speed speed; enum usb_device_speed max_speed; enum usb_ssp_rate ssp_rate; enum usb_ssp_rate max_ssp_rate; enum usb_device_state state; spinlock_t state_lock; bool teardown; const char *name; struct device dev; unsigned isoch_delay; unsigned out_epnum; unsigned in_epnum; unsigned mA; struct usb_otg_caps *otg_caps; unsigned sg_supported:1; unsigned is_otg:1; unsigned is_a_peripheral:1; unsigned b_hnp_enable:1; unsigned a_hnp_support:1; unsigned a_alt_hnp_support:1; unsigned hnp_polling_support:1; unsigned host_request_flag:1; unsigned quirk_ep_out_aligned_size:1; unsigned quirk_altset_not_supp:1; unsigned quirk_stall_not_supp:1; unsigned quirk_zlp_not_supp:1; unsigned quirk_avoids_skb_reserve:1; unsigned is_selfpowered:1; unsigned deactivated:1; unsigned connected:1; unsigned lpm_capable:1; unsigned wakeup_capable:1; unsigned wakeup_armed:1; int irq; int id_number; }; **Members** ``work`` (internal use) Workqueue to be used for sysfs_notify() ``udc`` struct usb_udc pointer for this gadget ``ops`` Function pointers used to access hardware-specific operations. ``ep0`` Endpoint zero, used when reading or writing responses to driver setup() requests ``ep_list`` List of other endpoints supported by the device. ``speed`` Speed of current connection to USB host. ``max_speed`` Maximal speed the UDC can handle. UDC must support this and all slower speeds. ``ssp_rate`` Current connected SuperSpeed Plus signaling rate and lane count. ``max_ssp_rate`` Maximum SuperSpeed Plus signaling rate and lane count the UDC can handle. The UDC must support this and all slower speeds and lower number of lanes. ``state`` the state we are now (attached, suspended, configured, etc) ``state_lock`` Spinlock protecting the `state` and `teardown` members. ``teardown`` True if the device is undergoing teardown, used to prevent new work from being scheduled during cleanup. ``name`` Identifies the controller hardware type. Used in diagnostics and sometimes configuration. ``dev`` Driver model state for this abstract device. ``isoch_delay`` value from Set Isoch Delay request. Only valid on SS/SSP ``out_epnum`` last used out ep number ``in_epnum`` last used in ep number ``mA`` last set mA value ``otg_caps`` OTG capabilities of this gadget. ``sg_supported`` true if we can handle scatter-gather ``is_otg`` True if the USB device port uses a Mini-AB jack, so that the gadget driver must provide a USB OTG descriptor. ``is_a_peripheral`` False unless is_otg, the "A" end of a USB cable is in the Mini-AB jack, and HNP has been used to switch roles so that the "A" device currently acts as A-Peripheral, not A-Host. ``b_hnp_enable`` OTG device feature flag, indicating that the A-Host enabled HNP support. ``a_hnp_support`` OTG device feature flag, indicating that the A-Host supports HNP at this port. ``a_alt_hnp_support`` OTG device feature flag, indicating that the A-Host only supports HNP on a different root port. ``hnp_polling_support`` OTG device feature flag, indicating if the OTG device in peripheral mode can support HNP polling. ``host_request_flag`` OTG device feature flag, indicating if A-Peripheral or B-Peripheral wants to take host role. ``quirk_ep_out_aligned_size`` epout requires buffer size to be aligned to MaxPacketSize. ``quirk_altset_not_supp`` UDC controller doesn't support alt settings. ``quirk_stall_not_supp`` UDC controller doesn't support stalling. ``quirk_zlp_not_supp`` UDC controller doesn't support ZLP. ``quirk_avoids_skb_reserve`` udc/platform wants to avoid skb_reserve() in u_ether.c to improve performance. ``is_selfpowered`` if the gadget is self-powered. ``deactivated`` True if gadget is deactivated - in deactivated state it cannot be connected. ``connected`` True if gadget is connected. ``lpm_capable`` If the gadget max_speed is FULL or HIGH, this flag indicates that it supports LPM as per the LPM ECN & errata. ``wakeup_capable`` True if gadget is capable of sending remote wakeup. ``wakeup_armed`` True if gadget is armed by the host for remote wakeup. ``irq`` the interrupt number for device controller. ``id_number`` a unique ID number for ensuring that gadget names are distinct”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjubhŒ:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mphjubjk )�”}”(hX`struct usb_gadget { struct work_struct work; struct usb_udc *udc; const struct usb_gadget_ops *ops; struct usb_ep *ep0; struct list_head ep_list; enum usb_device_speed speed; enum usb_device_speed max_speed; enum usb_ssp_rate ssp_rate; enum usb_ssp_rate max_ssp_rate; enum usb_device_state state; spinlock_t state_lock; bool teardown; const char *name; struct device dev; unsigned isoch_delay; unsigned out_epnum; unsigned in_epnum; unsigned mA; struct usb_otg_caps *otg_caps; unsigned sg_supported:1; unsigned is_otg:1; unsigned is_a_peripheral:1; unsigned b_hnp_enable:1; unsigned a_hnp_support:1; unsigned a_alt_hnp_support:1; unsigned hnp_polling_support:1; unsigned host_request_flag:1; unsigned quirk_ep_out_aligned_size:1; unsigned quirk_altset_not_supp:1; unsigned quirk_stall_not_supp:1; unsigned quirk_zlp_not_supp:1; unsigned quirk_avoids_skb_reserve:1; unsigned is_selfpowered:1; unsigned deactivated:1; unsigned connected:1; unsigned lpm_capable:1; unsigned wakeup_capable:1; unsigned wakeup_armed:1; int irq; int id_number; };”h]”hX`struct usb_gadget { struct work_struct work; struct usb_udc *udc; const struct usb_gadget_ops *ops; struct usb_ep *ep0; struct list_head ep_list; enum usb_device_speed speed; enum usb_device_speed max_speed; enum usb_ssp_rate ssp_rate; enum usb_ssp_rate max_ssp_rate; enum usb_device_state state; spinlock_t state_lock; bool teardown; const char *name; struct device dev; unsigned isoch_delay; unsigned out_epnum; unsigned in_epnum; unsigned mA; struct usb_otg_caps *otg_caps; unsigned sg_supported:1; unsigned is_otg:1; unsigned is_a_peripheral:1; unsigned b_hnp_enable:1; unsigned a_hnp_support:1; unsigned a_alt_hnp_support:1; unsigned hnp_polling_support:1; unsigned host_request_flag:1; unsigned quirk_ep_out_aligned_size:1; unsigned quirk_altset_not_supp:1; unsigned quirk_stall_not_supp:1; unsigned quirk_zlp_not_supp:1; unsigned quirk_avoids_skb_reserve:1; unsigned is_selfpowered:1; unsigned deactivated:1; unsigned connected:1; unsigned lpm_capable:1; unsigned wakeup_capable:1; unsigned wakeup_armed:1; int irq; int id_number; };”…”�”}”hj1sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mrhjubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjBh]”hŒMembers”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjubj…)�”}”(hhh]”(jŠ)�”}”(hŒ@``work`` (internal use) Workqueue to be used for sysfs_notify() ”h]”(j�)�”}”(hŒ``work``”h]”j)�”}”(hjah]”hŒwork”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mnhj[ubj©)�”}”(hhh]”hì)�”}”(hŒ6(internal use) Workqueue to be used for sysfs_notify()”h]”hŒ6(internal use) Workqueue to be used for sysfs_notify()”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jvh´Mnhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jvh´MnhjXubjŠ)�”}”(hŒ/``udc`` struct usb_udc pointer for this gadget ”h]”(j�)�”}”(hŒ``udc``”h]”j)�”}”(hjšh]”hŒudc”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mohj”ubj©)�”}”(hhh]”hì)�”}”(hŒ&struct usb_udc pointer for this gadget”h]”hŒ&struct usb_udc pointer for this gadget”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¯h´Mohj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¯h´MohjXubjŠ)�”}”(hŒG``ops`` Function pointers used to access hardware-specific operations. ”h]”(j�)�”}”(hŒ``ops``”h]”j)�”}”(hjÓh]”hŒops”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MphjÍubj©)�”}”(hhh]”hì)�”}”(hŒ>Function pointers used to access hardware-specific operations.”h]”hŒ>Function pointers used to access hardware-specific operations.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jèh´Mphjéubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÍubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jèh´MphjXubjŠ)�”}”(hŒY``ep0`` Endpoint zero, used when reading or writing responses to driver setup() requests ”h]”(j�)�”}”(hŒ``ep0``”h]”j)�”}”(hj h]”hŒep0”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mrhjubj©)�”}”(hhh]”hì)�”}”(hŒPEndpoint zero, used when reading or writing responses to driver setup() requests”h]”hŒPEndpoint zero, used when reading or writing responses to driver setup() requests”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mqhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j!h´MrhjXubjŠ)�”}”(hŒ=``ep_list`` List of other endpoints supported by the device. ”h]”(j�)�”}”(hŒ ``ep_list``”h]”j)�”}”(hjFh]”hŒep_list”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mshj@ubj©)�”}”(hhh]”hì)�”}”(hŒ0List of other endpoints supported by the device.”h]”hŒ0List of other endpoints supported by the device.”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j[h´Mshj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j[h´MshjXubjŠ)�”}”(hŒ3``speed`` Speed of current connection to USB host. ”h]”(j�)�”}”(hŒ ``speed``”h]”j)�”}”(hjh]”hŒspeed”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mthjyubj©)�”}”(hhh]”hì)�”}”(hŒ(Speed of current connection to USB host.”h]”hŒ(Speed of current connection to USB host.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j”h´Mthj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j”h´MthjXubjŠ)�”}”(hŒ^``max_speed`` Maximal speed the UDC can handle. UDC must support this and all slower speeds. ”h]”(j�)�”}”(hŒ ``max_speed``”h]”j)�”}”(hj¸h]”hŒ max_speed”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mvhj²ubj©)�”}”(hhh]”hì)�”}”(hŒOMaximal speed the UDC can handle. UDC must support this and all slower speeds.”h]”hŒOMaximal speed the UDC can handle. UDC must support this and all slower speeds.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MuhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÍh´MvhjXubjŠ)�”}”(hŒN``ssp_rate`` Current connected SuperSpeed Plus signaling rate and lane count. ”h]”(j�)�”}”(hŒ ``ssp_rate``”h]”j)�”}”(hjòh]”hŒssp_rate”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mwhjìubj©)�”}”(hhh]”hì)�”}”(hŒ@Current connected SuperSpeed Plus signaling rate and lane count.”h]”hŒ@Current connected SuperSpeed Plus signaling rate and lane count.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´Mwhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjìubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´MwhjXubjŠ)�”}”(hŒ¦``max_ssp_rate`` Maximum SuperSpeed Plus signaling rate and lane count the UDC can handle. The UDC must support this and all slower speeds and lower number of lanes. ”h]”(j�)�”}”(hŒ``max_ssp_rate``”h]”j)�”}”(hj+h]”hŒ max_ssp_rate”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mzhj%ubj©)�”}”(hhh]”hì)�”}”(hŒ”Maximum SuperSpeed Plus signaling rate and lane count the UDC can handle. The UDC must support this and all slower speeds and lower number of lanes.”h]”hŒ”Maximum SuperSpeed Plus signaling rate and lane count the UDC can handle. The UDC must support this and all slower speeds and lower number of lanes.”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MxhjAubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j@h´Mzh• jXubjŠ)�”}”(hŒF``state`` the state we are now (attached, suspended, configured, etc) ”h]”(j�)�”}”(hŒ ``state``”h]”j)�”}”(hjeh]”hŒstate”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M{hj_ubj©)�”}”(hhh]”hì)�”}”(hŒ;the state we are now (attached, suspended, configured, etc)”h]”hŒ;the state we are now (attached, suspended, configured, etc)”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jzh´M{hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jzh´M{hjXubjŠ)�”}”(hŒG``state_lock`` Spinlock protecting the `state` and `teardown` members. ”h]”(j�)�”}”(hŒ``state_lock``”h]”j)�”}”(hjžh]”hŒ state_lock”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M|hj˜ubj©)�”}”(hhh]”hì)�”}”(hŒ7Spinlock protecting the `state` and `teardown` members.”h]”(hŒSpinlock protecting the ”…”�”}”(hj·h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`state`”h]”hŒstate”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¿hj·ubhŒ and ”…”�”}”(hj·h²hh³Nh´NubjÀ)�”}”(hŒ `teardown`”h]”hŒteardown”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¿hj·ubhŒ members.”…”�”}”(hj·h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j³h´M|hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j³h´M|hjXubjŠ)�”}”(hŒv``teardown`` True if the device is undergoing teardown, used to prevent new work from being scheduled during cleanup. ”h]”(j�)�”}”(hŒ ``teardown``”h]”j)�”}”(hjýh]”hŒteardown”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M~hj÷ubj©)�”}”(hhh]”hì)�”}”(hŒhTrue if the device is undergoing teardown, used to prevent new work from being scheduled during cleanup.”h]”hŒhTrue if the device is undergoing teardown, used to prevent new work from being scheduled during cleanup.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M}hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´M~hjXubjŠ)�”}”(hŒd``name`` Identifies the controller hardware type. Used in diagnostics and sometimes configuration. ”h]”(j�)�”}”(hŒ``name``”h]”j)�”}”(hj7h]”hŒname”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M€hj1ubj©)�”}”(hhh]”hì)�”}”(hŒZIdentifies the controller hardware type. Used in diagnostics and sometimes configuration.”h]”hŒZIdentifies the controller hardware type. Used in diagnostics and sometimes configuration.”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jLh´M€hjXubjŠ)�”}”(hŒ5``dev`` Driver model state for this abstract device. ”h]”(j�)�”}”(hŒ``dev``”h]”j)�”}”(hjqh]”hŒdev”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjkubj©)�”}”(hhh]”hì)�”}”(hŒ,Driver model state for this abstract device.”h]”hŒ,Driver model state for this abstract device.”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j†h´M�hj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j†h´M�hjXubjŠ)�”}”(hŒI``isoch_delay`` value from Set Isoch Delay request. Only valid on SS/SSP ”h]”(j�)�”}”(hŒ``isoch_delay``”h]”j)�”}”(hjªh]”hŒ isoch_delay”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M‚hj¤ubj©)�”}”(hhh]”hì)�”}”(hŒ8value from Set Isoch Delay request. Only valid on SS/SSP”h]”hŒ8value from Set Isoch Delay request. Only valid on SS/SSP”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¿h´M‚hjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¤ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¿h´M‚hjXubjŠ)�”}”(hŒ&``out_epnum`` last used out ep number ”h]”(j�)�”}”(hŒ ``out_epnum``”h]”j)�”}”(hjãh]”hŒ out_epnum”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjáubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MƒhjÝubj©)�”}”(hhh]”hì)�”}”(hŒlast used out ep number”h]”hŒlast used out ep number”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jøh´Mƒhjùubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÝubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jøh´MƒhjXubjŠ)�”}”(hŒ$``in_epnum`` last used in ep number ”h]”(j�)�”}”(hŒ ``in_epnum``”h]”j)�”}”(hjh]”hŒin_epnum”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M„hjubj©)�”}”(hhh]”hì)�”}”(hŒlast used in ep number”h]”hŒlast used in ep number”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j1h´M„hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j1h´M„hjXubjŠ)�”}”(hŒ``mA`` last set mA value ”h]”(j�)�”}”(hŒ``mA``”h]”j)�”}”(hjUh]”hŒmA”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M…hjOubj©)�”}”(hhh]”hì)�”}”(hŒlast set mA value”h]”hŒlast set mA value”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jjh´M…hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jjh´M…hjXubjŠ)�”}”(hŒ.``otg_caps`` OTG capabilities of this gadget. ”h]”(j�)�”}”(hŒ ``otg_caps``”h]”j)�”}”(hjŽh]”hŒotg_caps”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M†hjˆubj©)�”}”(hhh]”hì)�”}”(hŒ OTG capabilities of this gadget.”h]”hŒ OTG capabilities of this gadget.”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j£h´M†hj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjˆubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j£h´M†hjXubjŠ)�”}”(hŒ6``sg_supported`` true if we can handle scatter-gather ”h]”(j�)�”}”(hŒ``sg_supported``”h]”j)�”}”(hjÇh]”hŒ sg_supported”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M‡hjÁubj©)�”}”(hhh]”hì)�”}”(hŒ$true if we can handle scatter-gather”h]”hŒ$true if we can handle scatter-gather”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÜh´M‡hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÁubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÜh´M‡hjXubjŠ)�”}”(hŒy``is_otg`` True if the USB device port uses a Mini-AB jack, so that the gadget driver must provide a USB OTG descriptor. ”h]”(j�)�”}”(hŒ ``is_otg``”h]”j)�”}”(hjh]”hŒis_otg”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M‰hjúubj©)�”}”(hhh]”hì)�”}”(hŒmTrue if the USB device port uses a Mini-AB jack, so that the gadget driver must provide a USB OTG descriptor.”h]”hŒmTrue if the USB device port uses a Mini-AB jack, so that the gadget driver must provide a USB OTG descriptor.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mˆhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjúubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´M‰hjXubjŠ)�”}”(hŒÅ``is_a_peripheral`` False unless is_otg, the "A" end of a USB cable is in the Mini-AB jack, and HNP has been used to switch roles so that the "A" device currently acts as A-Peripheral, not A-Host. ”h]”(j�)�”}”(hŒ``is_a_peripheral``”h]”j)�”}”(hj:h]”hŒis_a_peripheral”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MŒhj4ubj©)�”}”(hhh]”hì)�”}”(hŒ°False unless is_otg, the "A" end of a USB cable is in the Mini-AB jack, and HNP has been used to switch roles so that the "A" device currently acts as A-Peripheral, not A-Host.”h]”hŒ¸False unless is_otg, the “Aâ€� end of a USB cable is in the Mini-AB jack, and HNP has been used to switch roles so that the “Aâ€� device currently acts as A-Peripheral, not A-Host.”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MŠhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jOh´MŒhjXubjŠ)�”}”(hŒZ``b_hnp_enable`` OTG device feature flag, indicating that the A-Host enabled HNP support. ”h]”(j�)�”}”(hŒ``b_hnp_enable``”h]”j)�”}”(hjth]”hŒ b_hnp_enable”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M’hjnubj©)�”}”(hhh]”hì)�”}”(hŒHOTG device feature flag, indicating that the A-Host enabled HNP support.”h]”hŒHOTG device feature flag, indicating that the A-Host enabled HNP support.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M‘hjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjnubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‰h´M’hjXubjŠ)�”}”(hŒa``a_hnp_support`` OTG device feature flag, indicating that the A-Host supports HNP at this port. ”h]”(j�)�”}”(hŒ``a_hnp_support``”h]”j)�”}”(hj®h]”hŒ a_hnp_support”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MŽhj¨ubj©)�”}”(hhh]”hì)�”}”(hŒNOTG device feature flag, indicating that the A-Host supports HNP at this port.”h]”hŒNOTG device feature flag, indicating that the A-Host supports HNP at this port.”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÃh´MŽhjXubjŠ)�”}”(hŒv``a_alt_hnp_support`` OTG device feature flag, indicating that the A-Host only supports HNP on a different root port. ”h]”(j�)�”}”(hŒ``a_alt_hnp_support``”h]”j)�”}”(hjèh]”hŒa_alt_hnp_support”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjæubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjâubj©)�”}”(hhh]”hì)�”}”(hŒ_OTG device feature flag, indicating that the A-Host only supports HNP on a different root port.”h]”hŒ_OTG device feature flag, indicating that the A-Host only supports HNP on a different root port.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjþubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjâubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jýh´M�hjXubjŠ)�”}”(hŒz``hnp_polling_support`` OTG device feature flag, indicating if the OTG device in peripheral mode can support HNP polling. ”h]”(j�)�”}”(hŒ``hnp_polling_support``”h]”j)�”}”(hj"h]”hŒhnp_polling_support”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M”hjubj©)�”}”(hhh]”hì)�”}”(hŒaOTG device feature flag, indicating if the OTG device in peripheral mode can support HNP polling.”h]”hŒaOTG device feature flag, indicating if the OTG device in peripheral mode can support HNP polling.”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M“hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j7h´M”hjXubjŠ)�”}”(hŒs``host_request_flag`` OTG device feature flag, indicating if A-Peripheral or B-Peripheral wants to take host role. ”h]”(j�)�”}”(hŒ``host_request_flag``”h]”j)�”}”(hj\h]”hŒhost_request_flag”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M–hjVubj©)�”}”(hhh]”hì)�”}”(hŒ\OTG device feature flag, indicating if A-Peripheral or B-Peripheral wants to take host role.”h]”hŒ\OTG device feature flag, indicating if A-Peripheral or B-Peripheral wants to take host role.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M•hjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jqh´M–hjXubjŠ)�”}”(hŒY``quirk_ep_out_aligned_size`` epout requires buffer size to be aligned to MaxPacketSize. ”h]”(j�)�”}”(hŒ``quirk_ep_out_aligned_size``”h]”j)�”}”(hj–h]”hŒquirk_ep_out_aligned_size”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M˜hj�ubj©)�”}”(hhh]”hì)�”}”(hŒ:epout requires buffer size to be aligned to MaxPacketSize.”h]”hŒ:epout requires buffer size to be aligned to MaxPacketSize.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M—hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j«h´M˜hjXubjŠ)�”}”(hŒG``quirk_altset_not_supp`` UDC controller doesn't support alt settings. ”h]”(j�)�”}”(hŒ``quirk_altset_not_supp``”h]”j)�”}”(hjÐh]”hŒquirk_altset_not_supp”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M™hjÊubj©)�”}”(hhh]”hì)�”}”(hŒ,UDC controller doesn't support alt settings.”h]”hŒ.UDC controller doesn’t support alt settings.”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jåh´M™hjæubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÊubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jåh´M™hjXubjŠ)�”}”(hŒB``quirk_stall_not_supp`` UDC controller doesn't support stalling. ”h]”(j�)�”}”(hŒ``quirk_stall_not_supp``”h]”j)�”}”(hj h]”hŒquirk_stall_not_supp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mšhjubj©)�”}”(hhh]”hì)�”}”(hŒ(UDC controller doesn't support stalling.”h]”hŒ*UDC controller doesn’t support stalling.”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´Mšhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´MšhjXubjŠ)�”}”(hŒ;``quirk_zlp_not_supp`` UDC controller doesn't support ZLP. ”h]”(j�)�”}”(hŒ``quirk_zlp_not_supp``”h]”j)�”}”(hjBh]”hŒquirk_zlp_not_supp”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M›hj<ubj©)�”}”(hhh]”hì)�”}”(hŒ#UDC controller doesn't support ZLP.”h]”hŒ%UDC controller doesn’t support ZLP.”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jWh´M›hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jWh´M›hjXubjŠ)�”}”(hŒl``quirk_avoids_skb_reserve`` udc/platform wants to avoid skb_reserve() in u_ether.c to improve performance. ”h]”(j�)�”}”(hŒ``quirk_avoids_skb_reserve``”h]”j)�”}”(hj{h]”hŒquirk_avoids_skb_reserve”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M�hjuubj©)�”}”(hhh]”hì)�”}”(hŒNudc/platform wants to avoid skb_reserve() in u_ether.c to improve performance.”h]”hŒNudc/platform wants to avoid skb_reserve() in u_ether.c to improve performance.”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mœhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�h´M�hjXubjŠ)�”}”(hŒ2``is_selfpowered`` if the gadget is self-powered. ”h]”(j�)�”}”(hŒ``is_selfpowered``”h]”j)�”}”(hjµh]”hŒis_selfpowered”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj³ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mžhj¯ubj©)�”}”(hhh]”hì)�”}”(hŒif the gadget is self-powered.”h]”hŒif the gadget is self-powered.”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÊh´MžhjËubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¯ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÊh´MžhjXubjŠ)�”}”(hŒ]``deactivated`` True if gadget is deactivated - in deactivated state it cannot be connected. ”h]”(j�)�”}”(hŒ``deactivated``”h]”j)�”}”(hjîh]”hŒ deactivated”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M hjèubj©)�”}”(hhh]”hì)�”}”(hŒLTrue if gadget is deactivated - in deactivated state it cannot be connected.”h]”hŒLTrue if gadget is deactivated - in deactivated state it cannot be connected.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MŸhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjèubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh´M hjXubjŠ)�”}”(hŒ+``connected`` True if gadget is connected. ”h]”(j�)�”}”(hŒ ``connected``”h]”j)�”}”(hj(h]”hŒ connected”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¡hj"ubj©)�”}”(hhh]”hì)�”}”(hŒTrue if gadget is connected.”h]”hŒTrue if gadget is connected.”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j=h´M¡hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j=h´M¡hjXubjŠ)�”}”(hŒ``lpm_capable`` If the gadget max_speed is FULL or HIGH, this flag indicates that it supports LPM as per the LPM ECN & errata. ”h]”(j�)�”}”(hŒ``lpm_capable``”h]”j)�”}”(hjah]”hŒ lpm_capable”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M£hj[ubj©)�”}”(hhh]”hì)�”}”(hŒnIf the gadget max_speed is FULL or HIGH, this flag indicates that it supports LPM as per the LPM ECN & errata.”h]”hŒnIf the gadget max_speed is FULL or HIGH, this flag indicates that it supports LPM as per the LPM ECN & errata.”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¢hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jvh´M£hjXubjŠ)�”}”(hŒG``wakeup_capable`` True if gadget is capable of sending remote wakeup. ”h]”(j�)�”}”(hŒ``wakeup_capable``”h]”j)�”}”(hj›h]”hŒwakeup_capable”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¤hj•ubj©)�”}”(hhh]”hì)�”}”(hŒ3True if gadget is capable of sending remote wakeup.”h]”hŒ3True if gadget is capable of sending remote wakeup.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j°h´M¤hj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j°h´M¤hjXubjŠ)�”}”(hŒH``wakeup_armed`` True if gadget is armed by the host for remote wakeup. ”h]”(j�)�”}”(hŒ``wakeup_armed``”h]”j)�”}”(hjÔh]”hŒ wakeup_armed”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¥hjÎubj©)�”}”(hhh]”hì)�”}”(hŒ6True if gadget is armed by the host for remote wakeup.”h]”hŒ6True if gadget is armed by the host for remote wakeup.”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jéh´M¥hjêubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÎubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jéh´M¥hjXubjŠ)�”}”(hŒ4``irq`` the interrupt number for device controller. ”h]”(j�)�”}”(hŒ``irq``”h]”j)�”}”(hj h]”hŒirq”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¦hj ubj©)�”}”(hhh]”hì)�”}”(hŒ+the interrupt number for device controller.”h]”hŒ+the interrupt number for device controller.”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j" h´M¦hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j" h´M¦hjXubjŠ)�”}”(hŒL``id_number`` a unique ID number for ensuring that gadget names are distinct”h]”(j�)�”}”(hŒ ``id_number``”h]”j)�”}”(hjF h]”hŒ id_number”…”�”}”(hjH h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjD ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¦hj@ ubj©)�”}”(hhh]”hì)�”}”(hŒ>a unique ID number for ensuring that gadget names are distinct”h]”hŒ>a unique ID number for ensuring that gadget names are distinct”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M§hj\ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj@ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j[ h´M¦hjXubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj‰ h]”hŒ Description”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mªhjth²hubhì)�”}”(hXšGadgets have a mostly-portable "gadget driver" implementing device functions, handling all usb configurations and interfaces. Gadget drivers talk to hardware-specific code indirectly, through ops vectors. That insulates the gadget driver from hardware details, and packages the hardware endpoints through generic i/o queues. The "usb_gadget" and "usb_ep" interfaces provide that insulation from the hardware.”h]”hX¦Gadgets have a mostly-portable “gadget driverâ€� implementing device functions, handling all usb configurations and interfaces. Gadget drivers talk to hardware-specific code indirectly, through ops vectors. That insulates the gadget driver from hardware details, and packages the hardware endpoints through generic i/o queues. The “usb_gadgetâ€� and “usb_epâ€� interfaces provide that insulation from the hardware.”…”�”}”(hjŸ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M§hjth²hubhì)�”}”(hXExcept for the driver data, all fields in this structure are read-only to the gadget driver. That driver data is part of the "driver model" infrastructure in 2.6 (and later) kernels, and for earlier systems is grouped in a similar structure that's not known to the rest of the kernel.”h]”hX#Except for the driver data, all fields in this structure are read-only to the gadget driver. That driver data is part of the “driver modelâ€� infrastructure in 2.6 (and later) kernels, and for earlier systems is grouped in a similar structure that’s not known to the rest of the kernel.”…”�”}”(hj® h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M®hjth²hubhì)�”}”(hXValues of the three OTG device feature flags are updated before the setup() call corresponding to USB_REQ_SET_CONFIGURATION, and before driver suspend() calls. They are valid only when is_otg, and when the device is acting as a B-Peripheral (so is_a_peripheral is false).”h]”hXValues of the three OTG device feature flags are updated before the setup() call corresponding to USB_REQ_SET_CONFIGURATION, and before driver suspend() calls. They are valid only when is_otg, and when the device is acting as a B-Peripheral (so is_a_peripheral is false).”…”�”}”(hj½ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M´hjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_ep_align (C function)”Œc.usb_ep_align”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ3size_t usb_ep_align (struct usb_ep *ep, size_t len)”h]”jÂ)�”}”(hŒ2size_t usb_ep_align(struct usb_ep *ep, size_t len)”h]”(h)�”}”(hhh]”jñ)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjå ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jê Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–Œ usb_ep_align”sbŒc.usb_ep_align”†”asbuh1hhjá h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj !h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjá h²hh³j !h´Mubjë)�”}”(hŒ usb_ep_align”h]”jñ)�”}”(hj!h]”hŒ usb_ep_align”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj!ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjá h²hh³j !h´MubjW)�”}”(hŒ(struct usb_ep *ep, size_t len)”h]”(j])�”}”(hŒstruct usb_ep *ep”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj7!h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj3!ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjD!h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj3!ubh)�”}”(hhh]”jñ)�”}”(hŒusb_ep”h]”hŒusb_ep”…”�”}”(hjU!h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjR!ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jW!Œmodname”NŒ classname”Njšj�)�”}”j ]”j!Œc.usb_ep_align”†”asbuh1hhj3!ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjs!h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj3!ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj�!h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj3!ubjñ)�”}”(hŒep”h]”hŒep”…”�”}”(hjŽ!h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj3!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj/!ubj])�”}”(hŒ size_t len”h]”(h)�”}”(hhh]”jñ)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjª!h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj§!ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j¬!Œmodname”NŒ classname”Njšj�)�”}”j ]”j!Œc.usb_ep_align”†”asbuh1hhj£!ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÈ!h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj£!ubjñ)�”}”(hŒlen”h]”hŒlen”…”�”}”(hjÖ!h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj£!ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj/!ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjá h²hh³j !h´Mubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÝ h²hh³j !h´Mubah}”(h]”jØ ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j !h´MhjÚ h²hubj )�”}”(hhh]”hì)�”}”(hŒ.returns **len** aligned to ep's maxpacketsize.”h]”(hŒreturns ”…”�”}”(hj"h²hh³Nh´NubjP )�”}”(hŒ**len**”h]”hŒlen”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj"ubhŒ! aligned to ep’s maxpacketsize.”…”�”}”(hj"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhjý!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÚ h²hh³j !h´Mubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j*"jA j*"jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hX**Parameters** ``struct usb_ep *ep`` the endpoint whose maxpacketsize is used to align **len** ``size_t len`` buffer size's length to align to **ep**'s maxpacketsize **Description** This helper is used to align buffer's size to an ep's maxpacketsize.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj4"h]”hŒ Parameters”…”�”}”(hj6"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj2"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj."ubj…)�”}”(hhh]”(jŠ)�”}”(hŒP``struct usb_ep *ep`` the endpoint whose maxpacketsize is used to align **len** ”h]”(j�)�”}”(hŒ``struct usb_ep *ep``”h]”j)�”}”(hjS"h]”hŒstruct usb_ep *ep”…”�”}”(hjU"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjQ"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MhjM"ubj©)�”}”(hhh]”hì)�”}”(hŒ9the endpoint whose maxpacketsize is used to align **len**”h]”(hŒ2the endpoint whose maxpacketsize is used to align ”…”�”}”(hjl"h²hh³Nh´NubjP )�”}”(hŒ**len**”h]”hŒlen”…”�”}”(hjt"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjl"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh"h´Mhji"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjM"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh"h´MhjJ"ubjŠ)�”}”(hŒG``size_t len`` buffer size's length to align to **ep**'s maxpacketsize ”h]”(j�)�”}”(hŒ``size_t len``”h]”j)�”}”(hjš"h]”hŒ size_t len”…”�”}”(hjœ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj˜"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj”"ubj©)�”}”(hhh]”hì)�”}”(hŒ7buffer size's length to align to **ep**'s maxpacketsize”h]”(hŒ#buffer size’s length to align to ”…”�”}”(hj³"h²hh³Nh´NubjP )�”}”(hŒ**ep**”h]”hŒep”…”�”}”(hj»"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj³"ubhŒ’s maxpacketsize”…”�”}”(hj³"h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¯"h´Mhj°"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj”"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¯"h´MhjJ"ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hj."ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjç"h]”hŒ Description”…”�”}”(hjé"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjå"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj."ubhì)�”}”(hŒDThis helper is used to align buffer's size to an ep's maxpacketsize.”h]”hŒHThis helper is used to align buffer’s size to an ep’s maxpacketsize.”…”�”}”(hjý"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj."ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_ep_align_maybe (C function)”Œc.usb_ep_align_maybe”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒOsize_t usb_ep_align_maybe (struct usb_gadget *g, struct usb_ep *ep, size_t len)”h]”jÂ)�”}”(hŒNsize_t usb_ep_align_maybe(struct usb_gadget *g, struct usb_ep *ep, size_t len)”h]”(h)�”}”(hhh]”jñ)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj/#h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj,#ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j1#Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–Œusb_ep_align_maybe”sbŒc.usb_ep_align_maybe”†”asbuh1hhj(#h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjQ#h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj(#h²hh³jP#h´Mubjë)�”}”(hŒusb_ep_align_maybe”h]”jñ)�”}”(hjM#h]”hŒusb_ep_align_maybe”…”�”}”(hjc#h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj_#ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj(#h²hh³jP#h´MubjW)�”}”(hŒ5(struct usb_gadget *g, struct usb_ep *ep, size_t len)”h]”(j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj~#h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjz#ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‹#h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjz#ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjœ#h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj™#ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jž#Œmodname”NŒ classname”Njšj�)�”}”j ]”jK#Œc.usb_ep_align_maybe”†”asbuh1hhjz#ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjº#h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjz#ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÈ#h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjz#ubjñ)�”}”(hŒg”h]”hŒg”…”�”}”(hjÕ#h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjz#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjv#ubj])�”}”(hŒstruct usb_ep *ep”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjî#h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjê#ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjû#h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjê#ubh)�”}”(hhh]”jñ)�”}”(hŒusb_ep”h]”hŒusb_ep”…”�”}”(hj $h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj $ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j$Œmodname”NŒ classname”Njšj�)�”}”j ]”jK#Œc.usb_ep_align_maybe”†”asbuh1hhjê#ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj*$h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjê#ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj8$h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjê#ubjñ)�”}”(hŒep”h]”hŒep”…”�”}”(hjE$h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjê#ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjv#ubj])�”}”(hŒ size_t len”h]”(h)�”}”(hhh]”jñ)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hja$h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj^$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jc$Œmodname”NŒ classname”Njšj�)�”}”j ]”jK#Œc.usb_ep_align_maybe”†”asbuh1hhjZ$ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjZ$ubjñ)�”}”(hŒlen”h]”hŒlen”…”�”}”(hj�$h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjZ$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjv#ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj(#h²hh³jP#h´Mubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj$#h²hh³jP#h´Mubah}”(h]”j#ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jP#h´Mhj!#h²hubj )�”}”(hhh]”hì)�”}”(hŒrreturns **len** aligned to ep's maxpacketsize if gadget requires quirk_ep_out_aligned_size, otherwise returns len.”h]”(hŒreturns ”…”�”}”(hj·$h²hh³Nh´NubjP )�”}”(hŒ**len**”h]”hŒlen”…”�”}”(hj¿$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj·$ubhŒe aligned to ep’s maxpacketsize if gadget requires quirk_ep_out_aligned_size, otherwise returns len.”…”�”}”(hj·$h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj´$h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj!#h²hh³jP#h´Mubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ já$jA já$jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hXq**Parameters** ``struct usb_gadget *g`` controller to check for quirk ``struct usb_ep *ep`` the endpoint whose maxpacketsize is used to align **len** ``size_t len`` buffer size's length to align to **ep**'s maxpacketsize **Description** This helper is used in case it's required for any reason to check and maybe align buffer's size to an ep's maxpacketsize.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjë$h]”hŒ Parameters”…”�”}”(hjí$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjé$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M hjå$ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ7``struct usb_gadget *g`` controller to check for quirk ”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj %h]”hŒstruct usb_gadget *g”…”�”}”(hj %h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj%ubj©)�”}”(hhh]”hì)�”}”(hŒcontroller to check for quirk”h]”hŒcontroller to check for quirk”…”�”}”(hj#%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j%h´Mhj %ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j%h´Mhj%ubjŠ)�”}”(hŒP``struct usb_ep *ep`` the endpoint whose maxpacketsize is used to align **len** ”h]”(j�)�”}”(hŒ``struct usb_ep *ep``”h]”j)�”}”(hjC%h]”hŒstruct usb_ep *ep”…”�”}”(hjE%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjA%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj=%ubj©)�”}”(hhh]”hì)�”}”(hŒ9the endpoint whose maxpacketsize is used to align **len**”h]”(hŒ2the endpoint whose maxpacketsize is used to align ”…”�”}”(hj\%h²hh³Nh´NubjP )�”}”(hŒ**len**”h]”hŒlen”…”�”}”(hjd%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj\%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jX%h´MhjY%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj=%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jX%h´Mhj%ubjŠ)�”}”(hŒG``size_t len`` buffer size's length to align to **ep**'s maxpacketsize ”h]”(j�)�”}”(hŒ``size_t len``”h]”j)�”}”(hjŠ%h]”hŒ size_t len”…”�”}”(hjŒ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M hj„%ubj©)�”}”(hhh]”hì)�”}”(hŒ7buffer size's length to align to **ep**'s maxpacketsize”h]”(hŒ#buffer size’s length to align to ”…”�”}”(hj£%h²hh³Nh´NubjP )�”}”(hŒ**ep**”h]”hŒep”…”�”}”(hj«%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj£%ubhŒ’s maxpacketsize”…”�”}”(hj£%h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jŸ%h´M hj %ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj„%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jŸ%h´M hj%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjå$ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj×%h]”hŒ Description”…”�”}”(hjÙ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÕ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M"hjå$ubhì)�”}”(hŒyThis helper is used in case it's required for any reason to check and maybe align buffer's size to an ep's maxpacketsize.”h]”hŒThis helper is used in case it’s required for any reason to check and maybe align buffer’s size to an ep’s maxpacketsize.”…”�”}”(hjí%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M!hjå$ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ'gadget_is_altset_supported (C function)”Œc.gadget_is_altset_supported”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ5int gadget_is_altset_supported (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ4int gadget_is_altset_supported(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj&h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M,ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj+&h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj&h²hh³j*&h´M,ubjë)�”}”(hŒgadget_is_altset_supported”h]”jñ)�”}”(hŒgadget_is_altset_supported”h]”hŒgadget_is_altset_supported”…”�”}”(hj=&h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj9&ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj&h²hh³j*&h´M,ubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjY&h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjU&ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjf&h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjU&ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjw&h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjt&ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jy&Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j?&sbŒc.gadget_is_altset_supported”†”asbuh1hhjU&ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj—&h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjU&ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj¥&h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjU&ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hj²&h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjU&ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjQ&ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj&h²hh³j*&h´M,ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj&h²hh³j*&h´M,ubah}”(h]”j&ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j*&h´M,hj&h²hubj )�”}”(hhh]”hì)�”}”(hŒ1return true iff the hardware supports altsettings”h]”hŒ1return true iff the hardware supports altsettings”…”�”}”(hjÛ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M,hjØ&h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj&h²hh³j*&h´M,ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jó&jA jó&jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒH**Parameters** ``struct usb_gadget *g`` controller to check for quirk”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjý&h]”hŒ Parameters”…”�”}”(hjÿ&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjû&ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M0hj÷&ubj…)�”}”(hhh]”jŠ)�”}”(hŒ6``struct usb_gadget *g`` controller to check for quirk”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj'h]”hŒstruct usb_gadget *g”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M2hj'ubj©)�”}”(hhh]”hì)�”}”(hŒcontroller to check for quirk”h]”hŒcontroller to check for quirk”…”�”}”(hj5'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M.hj2'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j1'h´M2hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj÷&ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ&gadget_is_stall_supported (C function)”Œc.gadget_is_stall_supported”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ4int gadget_is_stall_supported (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ3int gadget_is_stall_supported(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjv'h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjr'h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M6ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…'h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjr'h²hh³j„'h´M6ubjë)�”}”(hŒgadget_is_stall_supported”h]”jñ)�”}”(hŒgadget_is_stall_supported”h]”hŒgadget_is_stall_supported”…”�”}”(hj—'h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj“'ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjr'h²hh³j„'h´M6ubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj³'h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj¯'ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÀ'h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¯'ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjÑ'h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÎ'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jÓ'Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j™'sbŒc.gadget_is_stall_supported”†”asbuh1hhj¯'ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjñ'h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¯'ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÿ'h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯'ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hj (h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¯'ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj«'ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjr'h²hh³j„'h´M6ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjn'h²hh³j„'h´M6ubah}”(h]”ji'ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j„'h´M6hjk'h²hubj )�”}”(hhh]”hì)�”}”(hŒ.return true iff the hardware supports stalling”h]”hŒ.return true iff the hardware supports stalling”…”�”}”(hj5(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M6hj2(h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjk'h²hh³j„'h´M6ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jM(jA jM(jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒH**Parameters** ``struct usb_gadget *g`` controller to check for quirk”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjW(h]”hŒ Parameters”…”�”}”(hjY(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjU(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M:hjQ(ubj…)�”}”(hhh]”jŠ)�”}”(hŒ6``struct usb_gadget *g`` controller to check for quirk”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hjv(h]”hŒstruct usb_gadget *g”…”�”}”(hjx(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjt(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M<hjp(ubj©)�”}”(hhh]”hì)�”}”(hŒcontroller to check for quirk”h]”hŒcontroller to check for quirk”…”�”}”(hj�(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M7hjŒ(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjp(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‹(h´M<hjm(ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjQ(ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ$gadget_is_zlp_supported (C function)”Œc.gadget_is_zlp_supported”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ2int gadget_is_zlp_supported (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ1int gadget_is_zlp_supported(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjÐ(h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÌ(h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M?ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjß(h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÌ(h²hh³jÞ(h´M?ubjë)�”}”(hŒgadget_is_zlp_supported”h]”jñ)�”}”(hŒgadget_is_zlp_supported”h]”hŒgadget_is_zlp_supported”…”�”}”(hjñ(h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjí(ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÌ(h²hh³jÞ(h´M?ubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj )h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj )ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj )ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hj+)h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj()ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j-)Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jó(sbŒc.gadget_is_zlp_supported”†”asbuh1hhj )ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjK)h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj )ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjY)h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj )ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hjf)h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj )ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj)ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjÌ(h²hh³jÞ(h´M?ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÈ(h²hh³jÞ(h´M?ubah}”(h]”jÃ(ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÞ(h´M?hjÅ(h²hubj )�”}”(hhh]”hì)�”}”(hŒ)return true iff the hardware supports zlp”h]”hŒ)return true iff the hardware supports zlp”…”�”}”(hj�)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M?hjŒ)h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÅ(h²hh³jÞ(h´M?ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j§)jA j§)jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒH**Parameters** ``struct usb_gadget *g`` controller to check for quirk”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj±)h]”hŒ Parameters”…”�”}”(hj³)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj¯)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MChj«)ubj…)�”}”(hhh]”jŠ)�”}”(hŒ6``struct usb_gadget *g`` controller to check for quirk”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hjÐ)h]”hŒstruct usb_gadget *g”…”�”}”(hjÒ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÎ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MEhjÊ)ubj©)�”}”(hhh]”hì)�”}”(hŒcontroller to check for quirk”h]”hŒcontroller to check for quirk”…”�”}”(hjé)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M@hjæ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÊ)ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jå)h´MEhjÇ)ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj«)ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ&gadget_avoids_skb_reserve (C function)”Œc.gadget_avoids_skb_reserve”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ4int gadget_avoids_skb_reserve (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ3int gadget_avoids_skb_reserve(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj**h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj&*h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MHubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj9*h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj&*h²hh³j8*h´MHubjë)�”}”(hŒgadget_avoids_skb_reserve”h]”jñ)�”}”(hŒgadget_avoids_skb_reserve”h]”hŒgadget_avoids_skb_reserve”…”�”}”(hjK*h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjG*ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj&*h²hh³j8*h´MHubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjg*h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjc*ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjt*h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjc*ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hj…*h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj‚*ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j‡*Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jM*sbŒc.gadget_avoids_skb_reserve”†”asbuh1hhjc*ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¥*h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjc*ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj³*h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjc*ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hjÀ*h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjc*ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj_*ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj&*h²hh³j8*h´MHubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj"*h²hh³j8*h´MHubah}”(h]”j*ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j8*h´MHhj*h²hubj )�”}”(hhh]”hì)�”}”(hŒTreturn true iff the hardware would like to avoid skb_reserve to improve performance.”h]”hŒTreturn true iff the hardware would like to avoid skb_reserve to improve performance.”…”�”}”(hjé*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MHhjæ*h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj*h²hh³j8*h´MHubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j+jA j+jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒH**Parameters** ``struct usb_gadget *g`` controller to check for quirk”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj +h]”hŒ Parameters”…”�”}”(hj +h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj +ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MLhj+ubj…)�”}”(hhh]”jŠ)�”}”(hŒ6``struct usb_gadget *g`` controller to check for quirk”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj*+h]”hŒstruct usb_gadget *g”…”�”}”(hj,+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj(+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MNhj$+ubj©)�”}”(hhh]”hì)�”}”(hŒcontroller to check for quirk”h]”hŒcontroller to check for quirk”…”�”}”(hjC+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MJhj@+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj$+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j?+h´MNhj!+ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj+ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ gadget_is_dualspeed (C function)”Œc.gadget_is_dualspeed”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ.int gadget_is_dualspeed (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ-int gadget_is_dualspeed(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj„+h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj€+h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MRubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj“+h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj€+h²hh³j’+h´MRubjë)�”}”(hŒgadget_is_dualspeed”h]”jñ)�”}”(hŒgadget_is_dualspeed”h]”hŒgadget_is_dualspeed”…”�”}”(hj¥+h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¡+ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj€+h²hh³j’+h´MRubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÁ+h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj½+ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎ+h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½+ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjß+h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÜ+ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”já+Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j§+sbŒc.gadget_is_dualspeed”†”asbuh1hhj½+ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÿ+h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½+ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj ,h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj½+ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj½+ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj¹+ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj€+h²hh³j’+h´MRubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj|+h²hh³j’+h´MRubah}”(h]”jw+ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j’+h´MRhjy+h²hubj )�”}”(hhh]”hì)�”}”(hŒ/return true iff the hardware handles high speed”h]”hŒ/return true iff the hardware handles high speed”…”�”}”(hjC,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MRhj@,h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjy+h²hh³j’+h´MRubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j[,jA j[,jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒb**Parameters** ``struct usb_gadget *g`` controller that might support both high and full speeds”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hje,h]”hŒ Parameters”…”�”}”(hjg,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjc,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MVhj_,ubj…)�”}”(hhh]”jŠ)�”}”(hŒP``struct usb_gadget *g`` controller that might support both high and full speeds”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj„,h]”hŒstruct usb_gadget *g”…”�”}”(hj†,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‚,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MXhj~,ubj©)�”}”(hhh]”hì)�”}”(hŒ7controller that might support both high and full speeds”h]”hŒ7controller that might support both high and full speeds”…”�”}”(hj�,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MShjš,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj~,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j™,h´MXhj{,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj_,ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ!gadget_is_superspeed (C function)”Œc.gadget_is_superspeed”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ/int gadget_is_superspeed (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ.int gadget_is_superspeed(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjÞ,h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÚ,h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M[ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjí,h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÚ,h²hh³jì,h´M[ubjë)�”}”(hŒgadget_is_superspeed”h]”jñ)�”}”(hŒgadget_is_superspeed”h]”hŒgadget_is_superspeed”…”�”}”(hjÿ,h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjû,ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÚ,h²hh³jì,h´M[ubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj-ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj(-h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj-ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hj9-h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj6-ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j;-Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j-sbŒc.gadget_is_superspeed”†”asbuh1hhj-ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjY-h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj-ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjg-h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj-ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hjt-h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj-ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj-ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjÚ,h²hh³jì,h´M[ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÖ,h²hh³jì,h´M[ubah}”(h]”jÑ,ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jì,h´M[hjÓ,h²hubj )�”}”(hhh]”hì)�”}”(hŒ.return true if the hardware handles superspeed”h]”hŒ.return true if the hardware handles superspeed”…”�”}”(hj�-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M[hjš-h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÓ,h²hh³jì,h´M[ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jµ-jA jµ-jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒS**Parameters** ``struct usb_gadget *g`` controller that might support superspeed”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj¿-h]”hŒ Parameters”…”�”}”(hjÁ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj½-ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M_hj¹-ubj…)�”}”(hhh]”jŠ)�”}”(hŒA``struct usb_gadget *g`` controller that might support superspeed”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”•;h]”j)�”}”(hjÞ-h]”hŒstruct usb_gadget *g”…”�”}”(hjà-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜ-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MahjØ-ubj©)�”}”(hhh]”hì)�”}”(hŒ(controller that might support superspeed”h]”hŒ(controller that might support superspeed”…”�”}”(hj÷-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M\hjô-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjØ-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jó-h´MahjÕ-ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj¹-ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ&gadget_is_superspeed_plus (C function)”Œc.gadget_is_superspeed_plus”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ4int gadget_is_superspeed_plus (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ3int gadget_is_superspeed_plus(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj8.h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj4.h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MdubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjG.h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj4.h²hh³jF.h´Mdubjë)�”}”(hŒgadget_is_superspeed_plus”h]”jñ)�”}”(hŒgadget_is_superspeed_plus”h]”hŒgadget_is_superspeed_plus”…”�”}”(hjY.h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjU.ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj4.h²hh³jF.h´MdubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hju.h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjq.ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‚.h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjq.ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hj“.h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj�.ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j•.Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j[.sbŒc.gadget_is_superspeed_plus”†”asbuh1hhjq.ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³.h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjq.ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÁ.h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjq.ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hjÎ.h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjq.ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjm.ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj4.h²hh³jF.h´Mdubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj0.h²hh³jF.h´Mdubah}”(h]”j+.ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jF.h´Mdhj-.h²hubj )�”}”(hhh]”hì)�”}”(hŒ3return true if the hardware handles superspeed plus”h]”hŒ3return true if the hardware handles superspeed plus”…”�”}”(hj÷.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mdhjô.h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj-.h²hh³jF.h´Mdubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j/jA j/jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒX**Parameters** ``struct usb_gadget *g`` controller that might support superspeed plus”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj/h]”hŒ Parameters”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhhj/ubj…)�”}”(hhh]”jŠ)�”}”(hŒF``struct usb_gadget *g`` controller that might support superspeed plus”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj8/h]”hŒstruct usb_gadget *g”…”�”}”(hj:/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mjhj2/ubj©)�”}”(hhh]”hì)�”}”(hŒ-controller that might support superspeed plus”h]”hŒ-controller that might support superspeed plus”…”�”}”(hjQ/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MfhjN/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj2/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jM/h´Mjhj//ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj/ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œgadget_is_otg (C function)”Œc.gadget_is_otg”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ(int gadget_is_otg (struct usb_gadget *g)”h]”jÂ)�”}”(hŒ'int gadget_is_otg(struct usb_gadget *g)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj’/h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjŽ/h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MnubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¡/h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjŽ/h²hh³j /h´Mnubjë)�”}”(hŒ gadget_is_otg”h]”jñ)�”}”(hŒ gadget_is_otg”h]”hŒ gadget_is_otg”…”�”}”(hj³/h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¯/ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjŽ/h²hh³j /h´MnubjW)�”}”(hŒ(struct usb_gadget *g)”h]”j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÏ/h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjË/ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÜ/h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjË/ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjí/h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjê/ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jï/Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jµ/sbŒc.gadget_is_otg”†”asbuh1hhjË/ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj 0h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjË/ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjË/ubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hj(0h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjË/ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÇ/ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjŽ/h²hh³j /h´Mnubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjŠ/h²hh³j /h´Mnubah}”(h]”j…/ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j /h´Mnhj‡/h²hubj )�”}”(hhh]”hì)�”}”(hŒ)return true iff the hardware is OTG-ready”h]”hŒ)return true iff the hardware is OTG-ready”…”�”}”(hjQ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MnhjN0h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj‡/h²hh³j /h´Mnubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ ji0jA ji0jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒî**Parameters** ``struct usb_gadget *g`` controller that might have a Mini-AB connector **Description** This is a runtime test, since kernels with a USB-OTG stack sometimes run on boards which only have a Mini-B (or Mini-A) connector.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjs0h]”hŒ Parameters”…”�”}”(hju0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjq0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mrhjm0ubj…)�”}”(hhh]”jŠ)�”}”(hŒH``struct usb_gadget *g`` controller that might have a Mini-AB connector ”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj’0h]”hŒstruct usb_gadget *g”…”�”}”(hj”0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MohjŒ0ubj©)�”}”(hhh]”hì)�”}”(hŒ.controller that might have a Mini-AB connector”h]”hŒ.controller that might have a Mini-AB connector”…”�”}”(hj«0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j§0h´Mohj¨0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjŒ0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j§0h´Mohj‰0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjm0ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjÍ0h]”hŒ Description”…”�”}”(hjÏ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjË0ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mqhjm0ubhì)�”}”(hŒ‚This is a runtime test, since kernels with a USB-OTG stack sometimes run on boards which only have a Mini-B (or Mini-A) connector.”h]”hŒ‚This is a runtime test, since kernels with a USB-OTG stack sometimes run on boards which only have a Mini-B (or Mini-A) connector.”…”�”}”(hjã0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mphjm0ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_gadget_driver (C struct)”Œc.usb_gadget_driver”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_gadget_driver”h]”jÂ)�”}”(hŒstruct usb_gadget_driver”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj1h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MvubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj 1h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj1h²hh³j1h´Mvubjë)�”}”(hŒusb_gadget_driver”h]”jñ)�”}”(hj 1h]”hŒusb_gadget_driver”…”�”}”(hj21h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj.1ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj1h²hh³j1h´Mvubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj 1h²hh³j1h´Mvubah}”(h]”j1ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j1h´Mvhj1h²hubj )�”}”(hhh]”hì)�”}”(hŒdriver for usb gadget devices”h]”hŒdriver for usb gadget devices”…”�”}”(hjT1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M­hjQ1h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj1h²hh³j1h´Mvubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jl1jA jl1jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hXh**Definition**:: struct usb_gadget_driver { char *function; enum usb_device_speed max_speed; int (*bind)(struct usb_gadget *gadget, struct usb_gadget_driver *driver); void (*unbind)(struct usb_gadget *); int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); void (*disconnect)(struct usb_gadget *); void (*suspend)(struct usb_gadget *); void (*resume)(struct usb_gadget *); void (*reset)(struct usb_gadget *); struct device_driver driver; char *udc_name; unsigned match_existing_only:1; bool is_bound:1; }; **Members** ``function`` String describing the gadget's function ``max_speed`` Highest speed the driver handles. ``bind`` the driver's bind callback ``unbind`` Invoked when the driver is unbound from a gadget, usually from rmmod (after a disconnect is reported). Called in a context that permits sleeping. ``setup`` Invoked for ep0 control requests that aren't handled by the hardware level driver. Most calls must be handled by the gadget driver, including descriptor and configuration management. The 16 bit members of the setup data are in USB byte order. Called in_interrupt; this may not sleep. Driver queues a response to ep0, or returns negative to stall. ``disconnect`` Invoked after all transfers have been stopped, when the host is disconnected. May be called in_interrupt; this may not sleep. Some devices can't detect disconnect, so this might not be called except as part of controller shutdown. ``suspend`` Invoked on USB suspend. May be called in_interrupt. ``resume`` Invoked on USB resume. May be called in_interrupt. ``reset`` Invoked on USB bus reset. It is mandatory for all gadget drivers and should be called in_interrupt. ``driver`` Driver model state for this driver. ``udc_name`` A name of UDC this driver should be bound to. If udc_name is NULL, this driver will be bound to any available UDC. ``match_existing_only`` If udc is not found, return an error and fail the driver registration ``is_bound`` Allow a driver to be bound to only one gadget”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjx1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjt1ubhŒ:”…”�”}”(hjt1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M±hjp1ubjk )�”}”(hX/struct usb_gadget_driver { char *function; enum usb_device_speed max_speed; int (*bind)(struct usb_gadget *gadget, struct usb_gadget_driver *driver); void (*unbind)(struct usb_gadget *); int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); void (*disconnect)(struct usb_gadget *); void (*suspend)(struct usb_gadget *); void (*resume)(struct usb_gadget *); void (*reset)(struct usb_gadget *); struct device_driver driver; char *udc_name; unsigned match_existing_only:1; bool is_bound:1; };”h]”hX/struct usb_gadget_driver { char *function; enum usb_device_speed max_speed; int (*bind)(struct usb_gadget *gadget, struct usb_gadget_driver *driver); void (*unbind)(struct usb_gadget *); int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); void (*disconnect)(struct usb_gadget *); void (*suspend)(struct usb_gadget *); void (*resume)(struct usb_gadget *); void (*reset)(struct usb_gadget *); struct device_driver driver; char *udc_name; unsigned match_existing_only:1; bool is_bound:1; };”…”�”}”hj‘1sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M³hjp1ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj¢1h]”hŒMembers”…”�”}”(hj¤1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj 1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÃhjp1ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ5``function`` String describing the gadget's function ”h]”(j�)�”}”(hŒ ``function``”h]”j)�”}”(hjÁ1h]”hŒfunction”…”�”}”(hjÃ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¿1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¯hj»1ubj©)�”}”(hhh]”hì)�”}”(hŒ'String describing the gadget's function”h]”hŒ)String describing the gadget’s function”…”�”}”(hjÚ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÖ1h´M¯hj×1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj»1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÖ1h´M¯hj¸1ubjŠ)�”}”(hŒ0``max_speed`` Highest speed the driver handles. ”h]”(j�)�”}”(hŒ ``max_speed``”h]”j)�”}”(hjú1h]”hŒ max_speed”…”�”}”(hjü1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjø1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M°hjô1ubj©)�”}”(hhh]”hì)�”}”(hŒ!Highest speed the driver handles.”h]”hŒ!Highest speed the driver handles.”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j2h´M°hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjô1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j2h´M°hj¸1ubjŠ)�”}”(hŒ$``bind`` the driver's bind callback ”h]”(j�)�”}”(hŒ``bind``”h]”j)�”}”(hj32h]”hŒbind”…”�”}”(hj52h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj12ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M»hj-2ubj©)�”}”(hhh]”hì)�”}”(hŒthe driver's bind callback”h]”hŒthe driver’s bind callback”…”�”}”(hjL2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jH2h´M»hjI2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj-2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jH2h´M»hj¸1ubjŠ)�”}”(hŒ�``unbind`` Invoked when the driver is unbound from a gadget, usually from rmmod (after a disconnect is reported). Called in a context that permits sleeping. ”h]”(j�)�”}”(hŒ ``unbind``”h]”j)�”}”(hjl2h]”hŒunbind”…”�”}”(hjn2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¾hjf2ubj©)�”}”(hhh]”hì)�”}”(hŒ‘Invoked when the driver is unbound from a gadget, usually from rmmod (after a disconnect is reported). Called in a context that permits sleeping.”h]”hŒ‘Invoked when the driver is unbound from a gadget, usually from rmmod (after a disconnect is reported). Called in a context that permits sleeping.”…”�”}”(hj…2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¼hj‚2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjf2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�2h´M¾hj¸1ubjŠ)�”}”(hXg``setup`` Invoked for ep0 control requests that aren't handled by the hardware level driver. Most calls must be handled by the gadget driver, including descriptor and configuration management. The 16 bit members of the setup data are in USB byte order. Called in_interrupt; this may not sleep. Driver queues a response to ep0, or returns negative to stall. ”h]”(j�)�”}”(hŒ ``setup``”h]”j)�”}”(hj¦2h]”hŒsetup”…”�”}”(hj¨2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¤2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¶hj 2ubj©)�”}”(hhh]”hì)�”}”(hX\Invoked for ep0 control requests that aren't handled by the hardware level driver. Most calls must be handled by the gadget driver, including descriptor and configuration management. The 16 bit members of the setup data are in USB byte order. Called in_interrupt; this may not sleep. Driver queues a response to ep0, or returns negative to stall.”h]”hX^Invoked for ep0 control requests that aren’t handled by the hardware level driver. Most calls must be handled by the gadget driver, including descriptor and configuration management. The 16 bit members of the setup data are in USB byte order. Called in_interrupt; this may not sleep. Driver queues a response to ep0, or returns negative to stall.”…”�”}”(hj¿2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M±hj¼2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj 2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j»2h´M¶hj¸1ubjŠ)�”}”(hŒø``disconnect`` Invoked after all transfers have been stopped, when the host is disconnected. May be called in_interrupt; this may not sleep. Some devices can't detect disconnect, so this might not be called except as part of controller shutdown. ”h]”(j�)�”}”(hŒ``disconnect``”h]”j)�”}”(hjà2h]”hŒ disconnect”…”�”}”(hjâ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞ2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MºhjÚ2ubj©)�”}”(hhh]”hì)�”}”(hŒèInvoked after all transfers have been stopped, when the host is disconnected. May be called in_interrupt; this may not sleep. Some devices can't detect disconnect, so this might not be called except as part of controller shutdown.”h]”hŒêInvoked after all transfers have been stopped, when the host is disconnected. May be called in_interrupt; this may not sleep. Some devices can’t detect disconnect, so this might not be called except as part of controller shutdown.”…”�”}”(hjù2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M·hjö2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÚ2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jõ2h´Mºhj¸1ubjŠ)�”}”(hŒA``suspend`` Invoked on USB suspend. May be called in_interrupt. ”h]”(j�)�”}”(hŒ ``suspend``”h]”j)�”}”(hj3h]”hŒsuspend”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M¿hj3ubj©)�”}”(hhh]”hì)�”}”(hŒ4Invoked on USB suspend. May be called in_interrupt.”h]”hŒ4Invoked on USB suspend. May be called in_interrupt.”…”�”}”(hj33h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j/3h´M¿hj03ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j/3h´M¿hj¸1ubjŠ)�”}”(hŒ?``resume`` Invoked on USB resume. May be called in_interrupt. ”h]”(j�)�”}”(hŒ ``resume``”h]”j)�”}”(hjS3h]”hŒresume”…”�”}”(hjU3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjQ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÀhjM3ubj©)�”}”(hhh]”hì)�”}”(hŒ3Invoked on USB resume. May be called in_interrupt.”h]”hŒ3Invoked on USB resume. May be called in_interrupt.”…”�”}”(hjl3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh3h´MÀhji3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjM3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jh3h´MÀhj¸1ubjŠ)�”}”(hŒn``reset`` Invoked on USB bus reset. It is mandatory for all gadget drivers and should be called in_interrupt. ”h]”(j�)�”}”(hŒ ``reset``”h]”j)�”}”(hjŒ3h]”hŒreset”…”�”}”(hjŽ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŠ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÂhj†3ubj©)�”}”(hhh]”hì)�”}”(hŒcInvoked on USB bus reset. It is mandatory for all gadget drivers and should be called in_interrupt.”h]”hŒcInvoked on USB bus reset. It is mandatory for all gadget drivers and should be called in_interrupt.”…”�”}”(hj¥3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÁhj¢3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj†3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¡3h´MÂhj¸1ubjŠ)�”}”(hŒ/``driver`` Driver model state for this driver. ”h]”(j�)�”}”(hŒ ``driver``”h]”j)�”}”(hjÆ3h]”hŒdriver”…”�”}”(hjÈ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÃhjÀ3ubj©)�”}”(hhh]”hì)�”}”(hŒ#Driver model state for this driver.”h]”hŒ#Driver model state for this driver.”…”�”}”(hjß3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÛ3h´MÃhjÜ3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÀ3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÛ3h´MÃhj¸1ubjŠ)�”}”(hŒ€``udc_name`` A name of UDC this driver should be bound to. If udc_name is NULL, this driver will be bound to any available UDC. ”h]”(j�)�”}”(hŒ ``udc_name``”h]”j)�”}”(hjÿ3h]”hŒudc_name”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjý3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÅhjù3ubj©)�”}”(hhh]”hì)�”}”(hŒrA name of UDC this driver should be bound to. If udc_name is NULL, this driver will be bound to any available UDC.”h]”hŒrA name of UDC this driver should be bound to. If udc_name is NULL, this driver will be bound to any available UDC.”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÄhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjù3ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j4h´MÅhj¸1ubjŠ)�”}”(hŒ^``match_existing_only`` If udc is not found, return an error and fail the driver registration ”h]”(j�)�”}”(hŒ``match_existing_only``”h]”j)�”}”(hj94h]”hŒmatch_existing_only”…”�”}”(hj;4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj74ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÇhj34ubj©)�”}”(hhh]”hì)�”}”(hŒEIf udc is not found, return an error and fail the driver registration”h]”hŒEIf udc is not found, return an error and fail the driver registration”…”�”}”(hjR4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÆhjO4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj34ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jN4h´MÇhj¸1ubjŠ)�”}”(hŒ:``is_bound`` Allow a driver to be bound to only one gadget”h]”(j�)�”}”(hŒ ``is_bound``”h]”j)�”}”(hjs4h]”hŒis_bound”…”�”}”(hju4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjq4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÇhjm4ubj©)�”}”(hhh]”hì)�”}”(hŒ-Allow a driver to be bound to only one gadget”h]”hŒ-Allow a driver to be bound to only one gadget”…”�”}”(hjŒ4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÈhj‰4ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjm4ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jˆ4h´MÇhj¸1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjp1ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj¶4h]”hŒ Description”…”�”}”(hj¸4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj´4ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MËhjth²hubhì)�”}”(hŒÅDevices are disabled till a gadget driver successfully bind()s, which means the driver will handle setup() requests needed to enumerate (and meet "chapter 9" requirements) then do some useful work.”h]”hŒÉDevices are disabled till a gadget driver successfully bind()s, which means the driver will handle setup() requests needed to enumerate (and meet “chapter 9â€� requirements) then do some useful work.”…”�”}”(hjÌ4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÈhjth²hubhì)�”}”(hXIf gadget->is_otg is true, the gadget driver must provide an OTG descriptor during enumeration, or else fail the bind() call. In such cases, no USB traffic may flow until both bind() returns without having called usb_gadget_disconnect(), and the USB host stack has initialized.”h]”hXIf gadget->is_otg is true, the gadget driver must provide an OTG descriptor during enumeration, or else fail the bind() call. In such cases, no USB traffic may flow until both bind() returns without having called usb_gadget_disconnect(), and the USB host stack has initialized.”…”�”}”(hjÛ4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÌhjth²hubhì)�”}”(hŒÕDrivers use hardware-specific knowledge to configure the usb hardware. endpoint addressing is only one of several hardware characteristics that are in descriptors the ep0 implementation returns from setup() calls.”h]”hŒÕDrivers use hardware-specific knowledge to configure the usb hardware. endpoint addressing is only one of several hardware characteristics that are in descriptors the ep0 implementation returns from setup() calls.”…”�”}”(hjê4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÒhjth²hubhì)�”}”(hŒ©Except for ep0 implementation, most driver code shouldn't need change to run on top of different usb controllers. It'll use endpoints set up by that ep0 implementation.”h]”hŒ­Except for ep0 implementation, most driver code shouldn’t need change to run on top of different usb controllers. It’ll use endpoints set up by that ep0 implementation.”…”�”}”(hjù4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÖhjth²hubhì)�”}”(hŒÎThe usb controller driver handles a few standard usb requests. Those include set_address, and feature flags for devices, interfaces, and endpoints (the get_status, set_feature, and clear_feature requests).”h]”hŒÎThe usb controller driver handles a few standard usb requests. Those include set_address, and feature flags for devices, interfaces, and endpoints (the get_status, set_feature, and clear_feature requests).”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÚhjth²hubhì)�”}”(hXZAccordingly, the driver's setup() callback must always implement all get_descriptor requests, returning at least a device descriptor and a configuration descriptor. Drivers must make sure the endpoint descriptors match any hardware constraints. Some hardware also constrains other descriptors. (The pxa250 allows only configurations 1, 2, or 3).”h]”hX\Accordingly, the driver’s setup() callback must always implement all get_descriptor requests, returning at least a device descriptor and a configuration descriptor. Drivers must make sure the endpoint descriptors match any hardware constraints. Some hardware also constrains other descriptors. (The pxa250 allows only configurations 1, 2, or 3).”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MÞhjth²hubhì)�”}”(hŒûThe driver's setup() callback must also implement set_configuration, and should also implement set_interface, get_configuration, and get_interface. Setting a configuration (or interface) is where endpoints should be activated or (config 0) shut down.”h]”hŒýThe driver’s setup() callback must also implement set_configuration, and should also implement set_interface, get_configuration, and get_interface. Setting a configuration (or interface) is where endpoints should be activated or (config 0) shut down.”…”�”}”(hj&5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mähjth²hubhì)�”}”(hXThe gadget driver's setup() callback does not have to queue a response to ep0 within the setup() call, the driver can do it after setup() returns. The UDC driver must wait until such a response is queued before proceeding with the data/status stages of the control transfer.”h]”hXThe gadget driver’s setup() callback does not have to queue a response to ep0 within the setup() call, the driver can do it after setup() returns. The UDC driver must wait until such a response is queued before proceeding with the data/status stages of the control transfer.”…”�”}”(hj55h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Méhjth²hubhì)�”}”(hŒ**NOTE**”h]”jP )�”}”(hjF5h]”hŒNOTE”…”�”}”(hjH5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjD5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mîhjth²hubhì)�”}”(hŒ½Currently, a number of UDC drivers rely on USB_GADGET_DELAYED_STATUS being returned from the setup() callback, which is a bug. See the comment next to USB_GADGET_DELAYED_STATUS for details.”h]”hŒ½Currently, a number of UDC drivers rely on USB_GADGET_DELAYED_STATUS being returned from the setup() callback, which is a bug. See the comment next to USB_GADGET_DELAYED_STATUS for details.”…”�”}”(hj\5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mïhjth²hubhì)�”}”(hŒ‡(Note that only the default control endpoint is supported. Neither hosts nor devices generally support control traffic except to ep0.)”h]”hŒ‡(Note that only the default control endpoint is supported. Neither hosts nor devices generally support control traffic except to ep0.)”…”�”}”(hjk5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Móhjth²hubhì)�”}”(hX­Most devices will ignore USB suspend/resume operations, and so will not provide those callbacks. However, some may need to change modes when the host is not longer directing those activities. For example, local controls (buttons, dials, etc) may need to be re-enabled since the (remote) host can't do that any longer; or an error state might be cleared, to make the device behave identically whether or not power is maintained.”h]”hX¯Most devices will ignore USB suspend/resume operations, and so will not provide those callbacks. However, some may need to change modes when the host is not longer directing those activities. For example, local controls (buttons, dials, etc) may need to be re-enabled since the (remote) host can’t do that any longer; or an error state might be cleared, to make the device behave identically whether or not power is maintained.”…”�”}”(hjz5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Möhjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ-usb_gadget_register_driver_owner (C function)”Œ"c.usb_gadget_register_driver_owner”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒsint usb_gadget_register_driver_owner (struct usb_gadget_driver *driver, struct module *owner, const char *mod_name)”h]”jÂ)�”}”(hŒrint usb_gadget_register_driver_owner(struct usb_gadget_driver *driver, struct module *owner, const char *mod_name)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj¢5h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjž5h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj±5h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjž5h²hh³j°5h´Mubjë)�”}”(hŒ usb_gadget_register_driver_owner”h]”jñ)�”}”(hŒ usb_gadget_register_driver_owner”h]”hŒ usb_gadget_register_driver_owner”…”�”}”(hjÃ5h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¿5ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjž5h²hh³j°5h´MubjW)�”}”(hŒN(struct usb_gadget_driver *driver, struct module *owner, const char *mod_name)”h]”(j])�”}”(hŒ struct usb_gadget_driver *driver”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjß5h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÛ5ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjì5h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÛ5ubh)�”}”(hhh]”jñ)�”}”(hŒusb_gadget_driver”h]”hŒusb_gadget_driver”…”�”}”(hjý5h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjú5ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jÿ5Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jÅ5sbŒ"c.usb_gadget_register_driver_owner”†”asbuh1hhjÛ5ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÛ5ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj+6h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÛ5ubjñ)�”}”(hŒdriver”h]”hŒdriver”…”�”}”(hj86h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÛ5ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj×5ubj])�”}”(hŒstruct module *owner”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjQ6h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjM6ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj^6h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjM6ubh)�”}”(hhh]”jñ)�”}”(hŒmodule”h]”hŒmodule”…”�”}”(hjo6h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjl6ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jq6Œmodname”NŒ classname”Njšj�)�”}”j ]”j6Œ"c.usb_gadget_register_driver_owner”†”asbuh1hhjM6ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�6h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjM6ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj›6h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjM6ubjñ)�”}”(hŒowner”h]”hŒowner”…”�”}”(hj¨6h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjM6ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj×5ubj])�”}”(hŒconst char *mod_name”h]”(jÈ)�”}”(hŒconst”h]”hŒconst”…”�”}”(hjÁ6h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj½6ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÏ6h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½6ubj)�”}”(hŒchar”h]”hŒchar”…”�”}”(hjÝ6h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj½6ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjë6h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½6ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjù6h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj½6ubjñ)�”}”(hŒmod_name”h]”hŒmod_name”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj½6ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj×5ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjž5h²hh³j°5h´Mubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjš5h²hh³j°5h´Mubah}”(h]”j•5ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j°5h´Mhj—5h²hubj )�”}”(hhh]”hì)�”}”(hŒregister a gadget driver”h]”hŒregister a gadget driver”…”�”}”(hj07h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhj-7h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj—5h²hh³j°5h´Mubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jH7jA jH7jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hXU**Parameters** ``struct usb_gadget_driver *driver`` the driver being registered ``struct module *owner`` the driver module ``const char *mod_name`` the driver module's build name **Context** can sleep **Description** Call this in your gadget driver's module initialization function, to tell the underlying UDC controller driver about your driver. The **bind\(\)** function will be called to bind it to a gadget before this registration call returns. It's expected that the **bind\(\)** function will be in init sections. Use the macro defined below instead of calling this directly.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjR7h]”hŒ Parameters”…”�”}”(hjT7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjP7ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M"hjL7ubj…)�”}”(hhh]”(jŠ)�”}”(hŒA``struct usb_gadget_driver *driver`` the driver being registered ”h]”(j�)�”}”(hŒ$``struct usb_gadget_driver *driver``”h]”j)�”}”(hjq7h]”hŒ struct usb_gadget_driver *driver”…”�”}”(hjs7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjo7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mhjk7ubj©)�”}”(hhh]”hì)�”}”(hŒthe driver being registered”h]”hŒthe driver being registered”…”�”}”(hjŠ7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j†7h´Mhj‡7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjk7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j†7h´Mhjh7ubjŠ)�”}”(hŒ+``struct module *owner`` the driver module ”h]”(j�)�”}”(hŒ``struct module *owner``”h]”j)�”}”(hjª7h]”hŒstruct module *owner”…”�”}”(hj¬7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¨7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M hj¤7ubj©)�”}”(hhh]”hì)�”}”(hŒthe driver module”h]”hŒthe driver module”…”�”}”(hjÃ7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¿7h´M hjÀ7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¤7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¿7h´M hjh7ubjŠ)�”}”(hŒ8``const char *mod_name`` the driver module's build name ”h]”(j�)�”}”(hŒ``const char *mod_name``”h]”j)�”}”(hjã7h]”hŒconst char *mod_name”…”�”}”(hjå7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjá7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M!hjÝ7ubj©)�”}”(hhh]”hì)�”}”(hŒthe driver module's build name”h]”hŒ the driver module’s build name”…”�”}”(hjü7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jø7h´M!hjù7ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÝ7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jø7h´M!hjh7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjL7ubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hj8h]”hŒContext”…”�”}”(hj 8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M#hjL7ubhì)�”}”(hŒ can sleep”h]”hŒ can sleep”…”�”}”(hj48h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M"hjL7ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjE8h]”hŒ Description”…”�”}”(hjG8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjC8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M$hjL7ubhì)�”}”(hX0Call this in your gadget driver's module initialization function, to tell the underlying UDC controller driver about your driver. The **bind\(\)** function will be called to bind it to a gadget before this registration call returns. It's expected that the **bind\(\)** function will be in init sections.”h]”(hŒˆCall this in your gadget driver’s module initialization function, to tell the underlying UDC controller driver about your driver. The ”…”�”}”(hj[8h²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjc8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj[8ubhŒq function will be called to bind it to a gadget before this registration call returns. It’s expected that the ”…”�”}”(hj[8h²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hju8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj[8ubhŒ# function will be in init sections.”…”�”}”(hj[8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M#hjL7ubhì)�”}”(hŒ=Use the macro defined below instead of calling this directly.”h]”hŒ=Use the macro defined below instead of calling this directly.”…”�”}”(hjŽ8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M)hjL7ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ)usb_gadget_unregister_driver (C function)”Œc.usb_gadget_unregister_driver”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒCint usb_gadget_unregister_driver (struct usb_gadget_driver *driver)”h]”jÂ)�”}”(hŒBint usb_gadget_unregister_driver(struct usb_gadget_driver *driver)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj½8h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj¹8h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M4ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÌ8h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¹8h²hh³jË8h´M4ubjë)�”}”(hŒusb_gadget_unregister_driver”h]”jñ)�”}”(hŒusb_gadget_unregister_driver”h]”hŒusb_gadget_unregister_driver”…”�”}”(hjÞ8h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÚ8ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj¹8h²hh³jË8h´M4ubjW)�”}”(hŒ"(struct usb_gadget_driver *driver)”h]”j])�”}”(hŒ struct usb_gadget_driver *driver”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjú8h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjö8ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjö8ubh)�”}”(hhh]”jñ)�”}”(hŒusb_gadget_driver”h]”hŒusb_gadget_driver”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj9ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j9Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jà8sbŒc.usb_gadget_unregister_driver”†”asbuh1hhjö8ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj89h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjö8ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjF9h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjö8ubjñ)�”}”(hŒdriver”h]”hŒdriver”…”�”}”(hjS9h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjö8ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjò8ubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj¹8h²hh³jË8h´M4ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjµ8h²hh³jË8h´M4ubah}”(h]”j°8ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jË8h´M4hj²8h²hubj )�”}”(hhh]”hì)�”}”(hŒunregister a gadget driver”h]”hŒunregister a gadget driver”…”�”}”(hj}9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M4hjz9h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj²8h²hh³jË8h´M4ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j•9jA j•9jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hX%**Parameters** ``struct usb_gadget_driver *driver`` the driver being unregistered **Context** can sleep **Description** Call this in your gadget driver's module cleanup function, to tell the underlying usb controller that your driver is going away. If the controller is connected to a USB host, it will first disconnect(). The driver is also requested to unbind() and clean up any device state, before this procedure finally returns. It's expected that the unbind() functions will be in exit sections, so may not be linked in some kernels.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjŸ9h]”hŒ Parameters”…”�”}”(hj¡9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj�9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M8hj™9ubj…)�”}”(hhh]”jŠ)�”}”(hŒC``struct usb_gadget_driver *driver`` the driver being unregistered ”h]”(j�)�”}”(hŒ$``struct usb_gadget_driver *driver``”h]”j)�”}”(hj¾9h]”hŒ struct usb_gadget_driver *driver”…”�”}”(hjÀ9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¼9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M5hj¸9ubj©)�”}”(hhh]”hì)�”}”(hŒthe driver being unregistered”h]”hŒthe driver being unregistered”…”�”}”(hj×9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÓ9h´M5hjÔ9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¸9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÓ9h´M5hjµ9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj™9ubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjù9h]”hŒContext”…”�”}”(hjû9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj÷9ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M7hj™9ubhì)�”}”(hŒ can sleep”h]”hŒ can sleep”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M6hj™9ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj :h]”hŒ Description”…”�”}”(hj":h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M8hj™9ubhì)�”}”(hX¦Call this in your gadget driver's module cleanup function, to tell the underlying usb controller that your driver is going away. If the controller is connected to a USB host, it will first disconnect(). The driver is also requested to unbind() and clean up any device state, before this procedure finally returns. It's expected that the unbind() functions will be in exit sections, so may not be linked in some kernels.”h]”hXªCall this in your gadget driver’s module cleanup function, to tell the underlying usb controller that your driver is going away. If the controller is connected to a USB host, it will first disconnect(). The driver is also requested to unbind() and clean up any device state, before this procedure finally returns. It’s expected that the unbind() functions will be in exit sections, so may not be linked in some kernels.”…”�”}”(hj6:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M7hj™9ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_string (C struct)”Œ c.usb_string”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ usb_string”h]”jÂ)�”}”(hŒstruct usb_string”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hje:h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhja:h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MBubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjs:h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhja:h²hh³jr:h´MBubjë)�”}”(hŒ usb_string”h]”jñ)�”}”(hj_:h]”hŒ usb_string”…”�”}”(hj…:h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj�:ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhja:h²hh³jr:h´MBubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj]:h²hh³jr:h´MBubah}”(h]”jX:ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jr:h´MBhjZ:h²hubj )�”}”(hhh]”hì)�”}”(hŒwraps a C string and its USB id”h]”hŒwraps a C string and its USB id”…”�”}”(hj§:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MGhj¤:h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjZ:h²hh³jr:h´MBubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j¿:jA j¿:jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒº**Definition**:: struct usb_string { u8 id; const char *s; }; **Members** ``id`` the (nonzero) ID for this string ``s`` the string, in UTF-8 encoding”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjË:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÇ:ubhŒ:”…”�”}”(hjÇ:h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MKhjÃ:ubjk )�”}”(hŒAstruct usb_string { u8 id; const char *s; };”h]”hŒAstruct usb_string { u8 id; const char *s; };”…”�”}”hjä:sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MMhjÃ:ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjõ:h]”hŒMembers”…”�”}”(hj÷:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjó:ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MRhjÃ:ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ(``id`` the (nonzero) ID for this string ”h]”(j�)�”}”(hŒ``id``”h]”j)�”}”(hj;h]”hŒid”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MIhj;ubj©)�”}”(hhh]”hì)�”}”(hŒ the (nonzero) ID for this string”h]”hŒ the (nonzero) ID for this string”…”�”}”(hj-;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j);h´MIhj*;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j);h´MIhj ;ubjŠ)�”}”(hŒ#``s`` the string, in UTF-8 encoding”h]”(j�)�”}”(hŒ``s``”h]”j)�”}”(hjM;h]”hŒs”…”�”}”(hjO;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjK;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MIhjG;ubj©)�”}”(hhh]”hì)�”}”(hŒthe string, in UTF-8 encoding”h]”hŒthe string, in UTF-8 encoding”…”�”}”(hjf;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MJhjc;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjG;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jb;h´MIhj ;ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjÃ:ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj�;h]”hŒ Description”…”�”}”(hj’;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjŽ;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MMhjth²hubhì)�”}”(hŒXIf you're using usb_gadget_get_string(), use this to wrap a string together with its ID.”h]”hŒZIf you’re using usb_gadget_get_string(), use this to wrap a string together with its ID.”…”�”}”(hj¦;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MJhjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_gadget_strings (C struct)”Œc.usb_gadget_strings”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_gadget_strings”h]”jÂ)�”}”(hŒstruct usb_gadget_strings”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÎ;h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÊ;h²hh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MPubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÜ;h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÊ;h²hh³jÛ;h´MPubjë)�”}”(hŒusb_gadget_strings”h]”jñ)�”}”(hjÈ;h]”hŒusb_gadget_strings”…”�”}”(hjî;h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjê;ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÊ;h²hh³jÛ;h´MPubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÆ;h²hh³jÛ;h´MPubah}”(h]”jÁ;ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÛ;h´MPhjÃ;h²hubj )�”}”(hhh]”hì)�”}”(hŒ(a set of USB strings in a given language”h]”hŒ(a set of USB strings in a given language”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MThj <h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÃ;h²hh³jÛ;h´MPubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j(<jA j(<jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒð**Definition**:: struct usb_gadget_strings { u16 language; struct usb_string *strings; }; **Members** ``language`` identifies the strings' language (0x0409 for en-us) ``strings`` array of strings with their ids”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj4<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj0<ubhŒ:”…”�”}”(hj0<h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MXhj,<ubjk )�”}”(hŒVstruct usb_gadget_strings { u16 language; struct usb_string *strings; };”h]”hŒVstruct usb_gadget_strings { u16 language; struct usb_string *strings; };”…”�”}”hjM<sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MZhj,<ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj^<h]”hŒMembers”…”�”}”(hj`<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj\<ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M_hj,<ubj…)�”}”(hhh]”(jŠ)�”}”(hŒA``language`` identifies the strings' language (0x0409 for en-us) ”h]”(j�)�”}”(hŒ ``language``”h]”j)�”}”(hj}<h]”hŒlanguage”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MVhjw<ubj©)�”}”(hhh]”hì)�”}”(hŒ3identifies the strings' language (0x0409 for en-us)”h]”hŒ5identifies the strings’ language (0x0409 for en-us)”…”�”}”(hj–<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j’<h´MVhj“<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjw<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j’<h´MVhjt<ubjŠ)�”}”(hŒ+``strings`` array of strings with their ids”h]”(j�)�”}”(hŒ ``strings``”h]”j)�”}”(hj¶<h]”hŒstrings”…”�”}”(hj¸<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj´<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MVhj°<ubj©)�”}”(hhh]”hì)�”}”(hŒarray of strings with their ids”h]”hŒarray of strings with their ids”…”�”}”(hjÏ<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MWhjÌ<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj°<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jË<h´MVhjt<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hj,<ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjù<h]”hŒ Description”…”�”}”(hjû<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj÷<ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MZhjth²hubhì)�”}”(hŒ_If you're using usb_gadget_get_string(), use this to wrap all the strings for a given language.”h]”hŒaIf you’re using usb_gadget_get_string(), use this to wrap all the strings for a given language.”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´MWhjth²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ!usb_free_descriptors (C function)”Œc.usb_free_descriptors”hNt”auh1j¥hjth²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M‚hj>h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj,=h²hh³jE=h´M‚ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j>jA j>jB ‰jC ‰jD ‰uh1j¶h²hhjth³Nh´NubjF )�”}”(hŒL**Parameters** ``struct usb_descriptor_header **v`` vector of descriptors”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj&>h]”hŒ Parameters”…”�”}”(hj(>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj$>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´M†hj >ubj…)�”}”(hhh]”jŠ)�”}”(hŒ:``struct usb_descriptor_header **v`` vector of descriptors”h]”(j�)�”}”(hŒ$``struct usb_descriptor_header **v``”h]”j)�”}”(hjE>h]”hŒ struct usb_descriptor_header **v”…”�”}”(hjG>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjC>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mˆhj?>ubj©)�”}”(hhh]”hì)�”}”(hŒvector of descriptors”h]”hŒvector of descriptors”…”�”}”(hj^>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œa/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:317: ./include/linux/usb/gadget.h”h´Mƒhj[>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj?>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jZ>h´Mˆhj<>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj >ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjth²hh³Nh´Nubeh}”(h]”Œcore-objects-and-methods”ah ]”h"]”Œcore objects and methods”ah$]”h&]”uh1hµhjÁh²hh³hÊh´M8ubh¶)�”}”(hhh]”(h»)�”}”(hŒOptional Utilities”h]”hŒOptional Utilities”…”�”}”(hj‘>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjŽ>h²hh³hÊh´MAubhì)�”}”(hŒ²The core API is sufficient for writing a USB Gadget Driver, but some optional utilities are provided to simplify common tasks. These utilities include endpoint autoconfiguration.”h]”hŒ²The core API is sufficient for writing a USB Gadget Driver, but some optional utilities are provided to simplify common tasks. These utilities include endpoint autoconfiguration.”…”�”}”(hjŸ>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MChjŽ>h²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ"usb_gadget_get_string (C function)”Œc.usb_gadget_get_string”hNt”auh1j¥hjŽ>h²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒSint usb_gadget_get_string (const struct usb_gadget_strings *table, int id, u8 *buf)”•h]”jÂ)�”}”(hŒRint usb_gadget_get_string(const struct usb_gadget_strings *table, int id, u8 *buf)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjÆ>h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÂ>h²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÕ>h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÂ>h²hh³jÔ>h´Kubjë)�”}”(hŒusb_gadget_get_string”h]”jñ)�”}”(hŒusb_gadget_get_string”h]”hŒusb_gadget_get_string”…”�”}”(hjç>h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjã>ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÂ>h²hh³jÔ>h´KubjW)�”}”(hŒ9(const struct usb_gadget_strings *table, int id, u8 *buf)”h]”(j])�”}”(hŒ&const struct usb_gadget_strings *table”h]”(jÈ)�”}”(hjÃ6h]”hŒconst”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÿ>ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÿ>ubjÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÿ>ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj+?h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÿ>ubh)�”}”(hhh]”jñ)�”}”(hŒusb_gadget_strings”h]”hŒusb_gadget_strings”…”�”}”(hj?Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jé>sbŒc.usb_gadget_get_string”†”asbuh1hhjÿ>ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj\?h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÿ>ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjj?h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÿ>ubjñ)�”}”(hŒtable”h]”hŒtable”…”�”}”(hjw?h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÿ>ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjû>ubj])�”}”(hŒint id”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj�?h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjŒ?ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjž?h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjŒ?ubjñ)�”}”(hŒid”h]”hŒid”…”�”}”(hj¬?h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjŒ?ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjû>ubj])�”}”(hŒu8 *buf”h]”(h)�”}”(hhh]”jñ)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjÈ?h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÅ?ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jÊ?Œmodname”NŒ classname”Njšj�)�”}”j ]”jX?Œc.usb_gadget_get_string”†”asbuh1hhjÁ?ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjæ?h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÁ?ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjô?h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÁ?ubjñ)�”}”(hŒbuf”h]”hŒbuf”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÁ?ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjû>ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjÂ>h²hh³jÔ>h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj¾>h²hh³jÔ>h´Kubah}”(h]”j¹>ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÔ>h´Khj»>h²hubj )�”}”(hhh]”hì)�”}”(hŒfill out a string descriptor”h]”hŒfill out a string descriptor”…”�”}”(hj+@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´Khj(@h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj»>h²hh³jÔ>h´Kubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jC@jA jC@jB ‰jC ‰jD ‰uh1j¶h²hhjŽ>h³Nh´NubjF )�”}”(hX**Parameters** ``const struct usb_gadget_strings *table`` of c strings encoded using UTF-8 ``int id`` string id, from low byte of wValue in get string descriptor ``u8 *buf`` at least 256 bytes, must be 16-bit aligned **Description** Finds the UTF-8 string matching the ID, and converts it into a string descriptor in utf16-le. Returns length of descriptor (always even) or negative errno If your driver needs stings in multiple languages, you'll probably "switch (wIndex) { ... }" in your ep0 string descriptor logic, using this routine after choosing which set of UTF-8 strings to use. Note that US-ASCII is a strict subset of UTF-8; any string bytes with the eighth bit set will be multibyte UTF-8 characters, not ISO-8859/1 characters (which are also widely used in C strings).”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjM@h]”hŒ Parameters”…”�”}”(hjO@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjK@ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjG@ubj…)�”}”(hhh]”(jŠ)�”}”(hŒL``const struct usb_gadget_strings *table`` of c strings encoded using UTF-8 ”h]”(j�)�”}”(hŒ*``const struct usb_gadget_strings *table``”h]”j)�”}”(hjl@h]”hŒ&const struct usb_gadget_strings *table”…”�”}”(hjn@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´Khjf@ubj©)�”}”(hhh]”hì)�”}”(hŒ of c strings encoded using UTF-8”h]”hŒ of c strings encoded using UTF-8”…”�”}”(hj…@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�@h´Khj‚@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjf@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�@h´Khjc@ubjŠ)�”}”(hŒG``int id`` string id, from low byte of wValue in get string descriptor ”h]”(j�)�”}”(hŒ ``int id``”h]”j)�”}”(hj¥@h]”hŒint id”…”�”}”(hj§@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj£@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjŸ@ubj©)�”}”(hhh]”hì)�”}”(hŒ;string id, from low byte of wValue in get string descriptor”h]”hŒ;string id, from low byte of wValue in get string descriptor”…”�”}”(hj¾@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jº@h´Khj»@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjŸ@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jº@h´Khjc@ubjŠ)�”}”(hŒ7``u8 *buf`` at least 256 bytes, must be 16-bit aligned ”h]”(j�)�”}”(hŒ ``u8 *buf``”h]”j)�”}”(hjÞ@h]”hŒu8 *buf”…”�”}”(hjà@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÜ@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjØ@ubj©)�”}”(hhh]”hì)�”}”(hŒ*at least 256 bytes, must be 16-bit aligned”h]”hŒ*at least 256 bytes, must be 16-bit aligned”…”�”}”(hj÷@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jó@h´Khjô@ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjØ@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jó@h´Khjc@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjG@ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjAh]”hŒ Description”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjG@ubhì)�”}”(hŒšFinds the UTF-8 string matching the ID, and converts it into a string descriptor in utf16-le. Returns length of descriptor (always even) or negative errno”h]”hŒšFinds the UTF-8 string matching the ID, and converts it into a string descriptor in utf16-le. Returns length of descriptor (always even) or negative errno”…”�”}”(hj/Ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjG@ubhì)�”}”(hX‰If your driver needs stings in multiple languages, you'll probably "switch (wIndex) { ... }" in your ep0 string descriptor logic, using this routine after choosing which set of UTF-8 strings to use. Note that US-ASCII is a strict subset of UTF-8; any string bytes with the eighth bit set will be multibyte UTF-8 characters, not ISO-8859/1 characters (which are also widely used in C strings).”h]”hX�If your driver needs stings in multiple languages, you’ll probably “switch (wIndex) { ... }â€� in your ep0 string descriptor logic, using this routine after choosing which set of UTF-8 strings to use. Note that US-ASCII is a strict subset of UTF-8; any string bytes with the eighth bit set will be multibyte UTF-8 characters, not ISO-8859/1 characters (which are also widely used in C strings).”…”�”}”(hj>Ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KhjG@ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjŽ>h²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ usb_validate_langid (C function)”Œc.usb_validate_langid”hNt”auh1j¥hjŽ>h²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ%bool usb_validate_langid (u16 langid)”h]”jÂ)�”}”(hŒ$bool usb_validate_langid(u16 langid)”h]”(j)�”}”(hŒbool”h]”hŒbool”…”�”}”(hjmAh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjiAh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KFubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj|Ah²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjiAh²hh³j{Ah´KFubjë)�”}”(hŒusb_validate_langid”h]”jñ)�”}”(hŒusb_validate_langid”h]”hŒusb_validate_langid”…”�”}”(hjŽAh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjŠAubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjiAh²hh³j{Ah´KFubjW)�”}”(hŒ (u16 langid)”h]”j])�”}”(hŒ u16 langid”h]”(h)�”}”(hhh]”jñ)�”}”(hŒu16”h]”hŒu16”…”�”}”(hj­Ah²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjªAubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j¯AŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j�AsbŒc.usb_validate_langid”†”asbuh1hhj¦AubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍAh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¦Aubjñ)�”}”(hŒlangid”h]”hŒlangid”…”�”}”(hjÛAh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¦Aubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj¢Aubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjiAh²hh³j{Ah´KFubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjeAh²hh³j{Ah´KFubah}”(h]”j`Aah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j{Ah´KFhjbAh²hubj )�”}”(hhh]”hì)�”}”(hŒ!validate usb language identifiers”h]”hŒ!validate usb language identifiers”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KFhjBh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjbAh²hh³j{Ah´KFubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jBjA jBjB ‰jC ‰jD ‰uh1j¶h²hhjŽ>h³Nh´NubjF )�”}”(hŒ‡**Parameters** ``u16 langid`` usb language identifier **Description** Returns true for valid language identifier, otherwise false.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj'Bh]”hŒ Parameters”…”�”}”(hj)Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj%Bubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KJhj!Bubj…)�”}”(hhh]”jŠ)�”}”(hŒ'``u16 langid`` usb language identifier ”h]”(j�)�”}”(hŒ``u16 langid``”h]”j)�”}”(hjFBh]”hŒ u16 langid”…”�”}”(hjHBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjDBubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KGhj@Bubj©)�”}”(hhh]”hì)�”}”(hŒusb language identifier”h]”hŒusb language identifier”…”�”}”(hj_Bh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j[Bh´KGhj\Bubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj@Bubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j[Bh´KGhj=Bubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj!Bubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj�Bh]”hŒ Description”…”�”}”(hjƒBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:327: ./drivers/usb/gadget/usbstring.c”h´KIhj!Bubhì)�”}”(hŒh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ#usb_descriptor_fillbuf (C function)”Œc.usb_descriptor_fillbuf”hNt”auh1j¥hjŽ>h²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒaint usb_descriptor_fillbuf (void *buf, unsigned buflen, const struct usb_descriptor_header **src)”h]”jÂ)�”}”(hŒ`int usb_descriptor_fillbuf(void *buf, unsigned buflen, const struct usb_descriptor_header **src)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjÆBh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÂBh²hh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´KubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÕBh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÂBh²hh³jÔBh´Kubjë)�”}”(hŒusb_descriptor_fillbuf”h]”jñ)�”}”(hŒusb_descriptor_fillbuf”h]”hŒusb_descriptor_fillbuf”…”�”}”(hjçBh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjãBubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÂBh²hh³jÔBh´KubjW)�”}”(hŒF(void *buf, unsigned buflen, const struct usb_descriptor_header **src)”h]”(j])�”}”(hŒ void *buf”h]”(j)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÿBubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÿBubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÿBubjñ)�”}”(hŒbuf”h]”hŒbuf”…”�”}”(hj,Ch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÿBubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjûBubj])�”}”(hŒunsigned buflen”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjECh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjACubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjSCh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjACubjñ)�”}”(hŒbuflen”h]”hŒbuflen”…”�”}”(hjaCh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjACubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjûBubj])�”}”(hŒ(const struct usb_descriptor_header **src”h]”(jÈ)�”}”(hjÃ6h]”hŒconst”…”�”}”(hjzCh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjvCubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj‡Ch²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjvCubjÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj•Ch²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjvCubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¢Ch²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjvCubh)�”}”(hhh]”jñ)�”}”(hŒusb_descriptor_header”h]”hŒusb_descriptor_header”…”�”}”(hj³Ch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj°Cubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jµCŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jéBsbŒc.usb_descriptor_fillbuf”†”asbuh1hhjvCubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÓCh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjvCubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjáCh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjvCubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjîCh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjvCubjñ)�”}”(hŒsrc”h]”hŒsrc”…”�”}”(hjûCh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjvCubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjûBubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjÂBh²hh³jÔBh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj¾Bh²hh³jÔBh´Kubah}”(h]”j¹Bah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÔBh´Khj»Bh²hubj )�”}”(hhh]”hì)�”}”(hŒfill buffer with descriptors”h]”hŒfill buffer with descriptors”…”�”}”(hj%Dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´Khj"Dh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj»Bh²hh³jÔBh´Kubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j=DjA j=DjB ‰jC ‰jD ‰uh1j¶h²hhjŽ>h³Nh´NubjF )�”}”(hXû**Parameters** ``void *buf`` Buffer to be filled ``unsigned buflen`` Size of buf ``const struct usb_descriptor_header **src`` Array of descriptor pointers, terminated by null pointer. **Description** Copies descriptors into the buffer, returning the length or a negative error code if they can't all be copied. Useful when assembling descriptors for an associated set of interfaces used as part of configuring a composite device; or in other cases where sets of descriptors need to be marshaled.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjGDh]”hŒ Parameters”…”�”}”(hjIDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjEDubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´KhjADubj…)�”}”(hhh]”(jŠ)�”}”(hŒ"``void *buf`` Buffer to be filled ”h]”(j�)�”}”(hŒ ``void *buf``”h]”j)�”}”(hjfDh]”hŒ void *buf”…”�”}”(hjhDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjdDubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´Khj`Dubj©)�”}”(hhh]”hì)�”}”(hŒBuffer to be filled”h]”hŒBuffer to be filled”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j{Dh´Khj|Dubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj`Dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j{Dh´Khj]DubjŠ)�”}”(hŒ ``unsigned buflen`` Size of buf ”h]”(j�)�”}”(hŒ``unsigned buflen``”h]”j)�”}”(hjŸDh]”hŒunsigned buflen”…”�”}”(hj¡Dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�Dubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´Khj™Dubj©)�”}”(hhh]”hì)�”}”(hŒ Size of buf”h]”hŒ Size of buf”…”�”}”(hj¸Dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j´Dh´KhjµDubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj™Dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j´Dh´Khj]DubjŠ)�”}”(hŒg``const struct usb_descriptor_header **src`` Array of descriptor pointers, terminated by null pointer. ”h]”(j�)�”}”(hŒ,``const struct usb_descriptor_header **src``”h]”j)�”}”(hjØDh]”hŒ(const struct usb_descriptor_header **src”…”�”}”(hjÚDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÖDubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´KhjÒDubj©)�”}”(hhh]”hì)�”}”(hŒ9Array of descriptor pointers, terminated by null pointer.”h]”hŒ9Array of descriptor pointers, terminated by null pointer.”…”�”}”(hjñDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jíDh´KhjîDubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÒDubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jíDh´Khj]Dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjADubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjEh]”hŒ Description”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjEubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´KhjADubhì)�”}”(hX(Copies descriptors into the buffer, returning the length or a negative error code if they can't all be copied. Useful when assembling descriptors for an associated set of interfaces used as part of configuring a composite device; or in other cases where sets of descriptors need to be marshaled.”h]”hX*Copies descriptors into the buffer, returning the length or a negative error code if they can’t all be copied. Useful when assembling descriptors for an associated set of interfaces used as part of configuring a composite device; or in other cases where sets of descriptors need to be marshaled.”…”�”}”(hj)Eh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´KhjADubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjŽ>h²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ!usb_copy_descriptors (C function)”Œc.usb_copy_descriptors”hNt”auh1j¥hjŽ>h²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒYstruct usb_descriptor_header ** usb_copy_descriptors (struct usb_descriptor_header **src)”h]”jÂ)�”}”(hŒWstruct usb_descriptor_header **usb_copy_descriptors(struct usb_descriptor_header **src)”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjXEh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjTEh²hh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´K9ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjfEh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjTEh²hh³jeEh´K9ubh)�”}”(hhh]”jñ)�”}”(hŒusb_descriptor_header”h]”hŒusb_descriptor_header”…”�”}”(hjwEh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjtEubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jyEŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–Œusb_copy_descriptors”sbŒc.usb_copy_descriptors”†”asbuh1hhjTEh²hh³jeEh´K9ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj˜Eh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjTEh²hh³jeEh´K9ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj¦Eh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjTEh²hh³jeEh´K9ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj³Eh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjTEh²hh³jeEh´K9ubjë)�”}”(hŒusb_copy_descriptors”h]”jñ)�”}”(hj•Eh]”hŒusb_copy_descriptors”…”�”}”(hjÄEh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÀEubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjTEh²hh³jeEh´K9ubjW)�”}”(hŒ$(struct usb_descriptor_header **src)”h]”j])�”}”(hŒ"struct usb_descriptor_header **src”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjßEh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÛEubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjìEh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÛEubh)�”}”(hhh]”jñ)�”}”(hŒusb_descriptor_header”h]”hŒusb_descriptor_header”…”�”}”(hjýEh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjúEubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jÿEŒmodname”NŒ classname”Njšj�)�”}”j ]”j“EŒc.usb_copy_descriptors”†”asbuh1hhjÛEubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÛEubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj)Fh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÛEubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj6Fh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÛEubjñ)�”}”(hŒsrc”h]”hŒsrc”…”�”}”(hjCFh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÛEubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj×Eubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjTEh²hh³jeEh´K9ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjPEh²hh³jeEh´K9ubah}”(h]”jKEah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jeEh´K9hjMEh²hubj )�”}”(hhh]”hì)�”}”(hŒ copy a vector of USB descriptors”h]”hŒ copy a vector of USB descriptors”…”�”}”(hjmFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´K9hjjFh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjMEh²hh³jeEh´K9ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j…FjA j…FjB ‰jC ‰jD ‰uh1j¶h²hhjŽ>h³Nh´NubjF )�”}”(hX **Parameters** ``struct usb_descriptor_header **src`` null-terminated vector to copy **Context** initialization code, which may sleep **Description** This makes a copy of a vector of USB descriptors. Its primary use is to support usb_function objects which can have multiple copies, each needing different descriptors. Functions may have static tables of descriptors, which are used as templates and customized with identifiers (for interfaces, strings, endpoints, and more) as needed by a given function instance.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj�Fh]”hŒ Parameters”…”�”}”(hj‘Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj�Fubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´K=hj‰Fubj…)�”}”(hhh]”jŠ)�”}”(hŒF``struct usb_descriptor_header **src`` null-terminated vector to copy ”h]”(j�)�”}”(hŒ&``struct usb_descriptor_header **src``”h]”j)�”}”(hj®Fh]”hŒ"struct usb_descriptor_header **src”…”�”}”(hj°Fh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬Fubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´K:hj¨Fubj©)�”}”(hhh]”hì)�”}”(hŒnull-terminated vector to copy”h]”hŒnull-terminated vector to copy”…”�”}”(hjÇFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÃFh´K:hjÄFubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¨Fubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÃFh´K:hj¥Fubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj‰Fubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjéFh]”hŒContext”…”�”}”(hjëFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjçFubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œb/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:330: ./drivers/usb/gadget/config.c”h´Kh²hh³Nh´Nubeh}”(h]”Œoptional-utilities”ah ]”h"]”Œoptional utilities”ah$]”h&]”uh1hµhjÁh²hh³hÊh´MAubh¶)�”}”(hhh]”(h»)�”}”(hŒComposite Device Framework”h]”hŒComposite Device Framework”…”�”}”(hjGGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjDGh²hh³hÊh´MNubhì)�”}”(hXTThe core API is sufficient for writing drivers for composite USB devices (with more than one function in a given configuration), and also multi-configuration devices (also more than one function, but not necessarily sharing a given configuration). There is however an optional framework which makes it easier to reuse and combine functions.”h]”hXTThe core API is sufficient for writing drivers for composite USB devices (with more than one function in a given configuration), and also multi-configuration devices (also more than one function, but not necessarily sharing a given configuration). There is however an optional framework which makes it easier to reuse and combine functions.”…”�”}”(hjUGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MPhjDGh²hubhì)�”}”(hXsDevices using this framework provide a struct usb_composite_driver, which in turn provides one or more struct usb_configuration instances. Each such configuration includes at least one struct :c:type:`usb_function`, which packages a user visible role such as "network link" or "mass storage device". Management functions may also exist, such as "Device Firmware Upgrade".”h]”(hŒÀDevices using this framework provide a struct usb_composite_driver, which in turn provides one or more struct usb_configuration instances. Each such configuration includes at least one struct ”…”�”}”(hjcGh²hh³Nh´Nubh)�”}”(hŒ:c:type:`usb_function`”h]”j)�”}”(hjmGh]”hŒ usb_function”…”�”}”(hjoGh²hh³Nh´Nubah}”(h]”h ]”(jèjéŒc-type”eh"]”h$]”h&]”uh1jhjkGubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jõŒ refdomain”jéŒreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰jšj�)�”}”j ]”sbjûŒ usb_function”uh1hh³hÊh´MVhjcGubhŒ©, which packages a user visible role such as “network linkâ€� or “mass storage deviceâ€�. Management functions may also exist, such as “Device Firmware Upgradeâ€�.”…”�”}”(hjcGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MVhjDGh²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_os_desc_ext_prop (C struct)”Œc.usb_os_desc_ext_prop”hNt”auh1j¥hjDGh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_os_desc_ext_prop”h]”jÂ)�”}”(hŒstruct usb_os_desc_ext_prop”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj±Gh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj­Gh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¿Gh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj­Gh²hh³j¾Gh´Kubjë)�”}”(hŒusb_os_desc_ext_prop”h]”jñ)�”}”(hj«Gh]”hŒusb_os_desc_ext_prop”…”�”}”(hjÑGh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÍGubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj­Gh²hh³j¾Gh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj©Gh²hh³j¾Gh´Kubah}”(h]”j£Gah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j¾Gh´Khj¦Gh²hubj )�”}”(hhh]”hì)�”}”(hŒ!describes one "Extended Property"”h]”hŒ%describes one “Extended Propertyâ€�”…”�”}”(hjóGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K;hjðGh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¦Gh²hh³j¾Gh´Kubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j HjA j HjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hXd**Definition**:: struct usb_os_desc_ext_prop { struct list_head entry; u8 type; int name_len; char *name; int data_len; char *data; struct config_item item; }; **Members** ``entry`` used to keep a list of extended properties ``type`` Extended Property type ``name_len`` Extended Property unicode name length, including terminating '\0' ``name`` Extended Property name ``data_len`` Length of Extended Property blob (for unicode store double len) ``data`` Extended Property blob ``item`` Represents this Extended Property in configfs”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjHubhŒ:”…”�”}”(hjHh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K?hjHubjk )�”}”(hŒ¶struct usb_os_desc_ext_prop { struct list_head entry; u8 type; int name_len; char *name; int data_len; char *data; struct config_item item; };”h]”hŒ¶struct usb_os_desc_ext_prop { struct list_head entry; u8 type; int name_len; char *name; int data_len; char *data; struct config_item item; };”…”�”}”hj0Hsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KAhjHubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjAHh]”hŒMembers”…”�”}”(hjCHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj?Hubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KKhjHubj…)�”}”(hhh]”(jŠ)�”}”(hŒ5``entry`` used to keep a list of extended properties ”h]”(j�)�”}”(hŒ ``entry``”h]”j)�”}”(hj`Hh]”hŒentry”…”�”}”(hjbHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj^Hubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K=hjZHubj©)�”}”(hhh]”hì)�”}”(hŒ*used to keep a list of extended properties”h]”hŒ*used to keep a list of extended properties”…”�”}”(hjyHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³juHh´K=hjvHubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjZHubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³juHh´K=hjWHubjŠ)�”}”(hŒ ``type`` Extended Property type ”h]”(j�)�”}”(hŒ``type``”h]”j)�”}”(hj™Hh]”hŒtype”…”�”}”(hj›Hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj—Hubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K>hj“Hubj©)�”}”(hhh]”hì)�”}”(hŒExtended Property type”h]”hŒExtended Property type”…”�”}”(hj²Hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j®Hh´K>hj¯Hubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj“Hubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j®Hh´K>hjWHubjŠ)�”}”(hŒO``name_len`` Extended Property unicode name length, including terminating '\0' ”h]”(j�)�”}”(hŒ ``name_len``”h]”j)�”}”(hjÒHh]”hŒname_len”…”�”}”(hjÔHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÐHubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K?hjÌHubj©)�”}”(hhh]”hì)�”}”(hŒAExtended Property unicode name length, including terminating '\0'”h]”hŒEExtended Property unicode name length, including terminating ‘0’”…”�”}”(hjëHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jçHh´K?hjèHubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÌHubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jçHh´K?hjWHubjŠ)�”}”(hŒ ``name`` Extended Property name ”h]”(j�)�”}”(hŒ``name``”h]”j)�”}”(hj Ih]”hŒname”…”�”}”(hj Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj Iubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K@hjIubj©)�”}”(hhh]”hì)�”}”(hŒExtended Property name”h]”hŒExtended Property name”…”�”}”(hj$Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j Ih´K@hj!Iubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjIubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j Ih´K@hjWHubjŠ)�”}”(hŒM``data_len`` Length of Extended Property blob (for unicode store double len) ”h]”(j�)�”}”(hŒ ``data_len``”h]”j)�”}”(hjDIh]”hŒdata_len”…”�”}”(hjFIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBIubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KAhj>Iubj©)�”}”(hhh]”hì)�”}”(hŒ?Length of Extended Property blob (for unicode store double len)”h]”hŒ?Length of Extended Property blob (for unicode store double len)”…”�”}”(hj]Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jYIh´KAhjZIubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj>Iubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jYIh´KAhjWHubjŠ)�”}”(hŒ ``data`` Extended Property blob ”h]”(j�)�”}”(hŒ``data``”h]”j)�”}”(hj}Ih]”hŒdata”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{Iubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KBhjwIubj©)�”}”(hhh]”hì)�”}”(hŒExtended Property blob”h]”hŒExtended Property blob”…”�”}”(hj–Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j’Ih´KBhj“Iubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjwIubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j’Ih´KBhjWHubjŠ)�”}”(hŒ6``item`` Represents this Extended Property in configfs”h]”(j�)�”}”(hŒ``item``”h]”j)�”}”(hj¶Ih]”hŒitem”…”�”}”(hj¸Ih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj´Iubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KBhj°Iubj©)�”}”(hhh]”hì)�”}”(hŒ-Represents this Extended Property in configfs”h]”hŒ-Represents this Extended Property in configfs”…”�”}”(hjÏIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KChjÌIubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj°Iubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jËIh´KBhjWHubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjHubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_os_desc (C struct)”Œ c.usb_os_desc”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ usb_os_desc”h]”jÂ)�”}”(hŒstruct usb_os_desc”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj Jh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KIubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj Jh²hh³jJh´KIubjë)�”}”(hŒ usb_os_desc”h]”jñ)�”}”(hj Jh]”hŒ usb_os_desc”…”�”}”(hj0Jh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj,Jubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj Jh²hh³jJh´KIubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjJh²hh³jJh´KIubah}”(h]”jJah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jJh´KIhjJh²hubj )�”}”(hhh]”hì)�”}”(hŒ6describes OS descriptors associated with one interface”h]”hŒ6describes OS descriptors associated with one interface”…”�”}”(hjRJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KOhjOJh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjJh²hh³jJh´KIubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jjJjA jjJjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hXâ**Definition**:: struct usb_os_desc { char *ext_compat_id; struct list_head ext_prop; int ext_prop_len; int ext_prop_count; struct mutex *opts_mutex; struct config_group group; struct module *owner; }; **Members** ``ext_compat_id`` 16 bytes of "Compatible ID" and "Subcompatible ID" ``ext_prop`` Extended Properties list ``ext_prop_len`` Total length of Extended Properties blobs ``ext_prop_count`` Number of Extended Properties ``opts_mutex`` Optional mutex protecting config data of a usb_function_instance ``group`` Represents OS descriptors associated with an interface in configfs ``owner`` Module associated with this OS descriptor”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjvJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjrJubhŒ:”…”�”}”(hjrJh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KShjnJubjk )�”}”(hŒôstruct usb_os_desc { char *ext_compat_id; struct list_head ext_prop; int ext_prop_len; int ext_prop_count; struct mutex *opts_mutex; struct config_group group; struct module *owner; };”h]”hŒôstruct usb_os_desc { char *ext_compat_id; struct list_head ext_prop; int ext_prop_len; int ext_prop_count; struct mutex *opts_mutex; struct config_group group; struct module *owner; };”…”�”}”hj�Jsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KUhjnJubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj Jh]”hŒMembers”…”�”}”(hj¢Jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjžJubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K_hjnJubj…)�”}”(hhh]”(jŠ)�”}”(hŒE``ext_compat_id`` 16 bytes of "Compatible ID" and "Subcompatible ID" ”h]”(j�)�”}”(hŒ``ext_compat_id``”h]”j)�”}”(hj¿Jh]”hŒ ext_compat_id”…”�”}”(hjÁJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj½Jubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KQhj¹Jubj©)�”}”(hhh]”hì)�”}”(hŒ216 bytes of "Compatible ID" and "Subcompatible ID"”h]”hŒ:16 bytes of “Compatible IDâ€� and “Subcompatible IDâ€�”…”�”}”(hjØJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÔJh´KQhjÕJubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¹Jubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÔJh´KQhj¶JubjŠ)�”}”(hŒ&``ext_prop`` Extended Properties list ”h]”(j�)�”}”(hŒ ``ext_prop``”h]”j)�”}”(hjøJh]”hŒext_prop”…”�”}”(hjúJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjöJubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KRhjòJubj©)�”}”(hhh]”hì)�”}”(hŒExtended Properties list”h]”hŒExtended Properties list”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j Kh´KRhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjòJubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j Kh´KRhj¶JubjŠ)�”}”(hŒ;``ext_prop_len`` Total length of Extended Properties blobs ”h]”(j�)�”}”(hŒ``ext_prop_len``”h]”j)�”}”(hj1Kh]”hŒ ext_prop_len”…”�”}”(hj3Kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj/Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KShj+Kubj©)�”}”(hhh]”hì)�”}”(hŒ)Total length of Extended Properties blobs”h]”hŒ)Total length of Extended Properties blobs”…”�”}”(hjJKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jFKh´KShjGKubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj+Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jFKh´KShj¶JubjŠ)�”}”(hŒ1``ext_prop_count`` Number of Extended Properties ”h]”(j�)�”}”(hŒ``ext_prop_count``”h]”j)�”}”(hjjKh]”hŒext_prop_count”…”�”}”(hjlKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhKubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KThjdKubj©)�”}”(hhh]”hì)�”}”(hŒNumber of Extended Properties”h]”hŒNumber of Extended Properties”…”�”}”(hjƒKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jKh´KThj€Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjdKubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jKh´KThj¶JubjŠ)�”}”(hŒP``opts_mutex`` Optional mutex protecting config data of a usb_function_instance ”h]”(j�)�”}”(hŒ``opts_mutex``”h]”j)�”}”(hj£Kh]”hŒ opts_mutex”…”�”}”(hj¥Kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¡Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KUhj�Kubj©)�”}”(hhh]”hì)�”}”(hŒ@Optional mutex protecting config data of a usb_function_instance”h]”hŒ@Optional mutex protecting config data of a usb_function_instance”…”�”}”(hj¼Kh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¸Kh´KUhj¹Kubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj�Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¸Kh´KUhj¶JubjŠ)�”}”(hŒM``group`` Represents OS descriptors associated with an interface in configfs ”h]”(j�)�”}”(hŒ ``group``”h]”j)�”}”(hjÜKh]”hŒgroup”…”�”}”(hjÞKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÚKubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KVhjÖKubj©)�”}”(hhh]”hì)�”}”(hŒBRepresents OS descriptors associated with an interface in configfs”h]”hŒBRepresents OS descriptors associated with an interface in configfs”…”�”}”(hjõKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jñKh´KVhjòKubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÖKubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jñKh´KVhj¶JubjŠ)�”}”(hŒ3``owner`` Module associated with this OS descriptor”h]”(j�)�”}”(hŒ ``owner``”h]”j)�”}”(hjLh]”hŒowner”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjLubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KVhjLubj©)�”}”(hhh]”hì)�”}”(hŒ)Module associated with this OS descriptor”h]”hŒ)Module associated with this OS descriptor”…”�”}”(hj.Lh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KWhj+Lubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j*Lh´KVhj¶Jubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjnJubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_os_desc_table (C struct)”Œc.usb_os_desc_table”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_os_desc_table”h]”jÂ)�”}”(hŒstruct usb_os_desc_table”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjoLh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjkLh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K]ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj}Lh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjkLh²hh³j|Lh´K]ubjë)�”}”(hŒusb_os_desc_table”h]”jñ)�”}”(hjiLh]”hŒusb_os_desc_table”…”�”}”(hj�Lh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj‹Lubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjkLh²hh³j|Lh´K]ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjgLh²hh³j|Lh´K]ubah}”(h]”jbLah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j|Lh´K]hjdLh²hubj )�”}”(hhh]”hì)�”}”(hŒHdescribes OS descriptors associated with one interface of a usb_function”h]”hŒHdescribes OS descriptors associated with one interface of a usb_function”…”�”}”(hj±Lh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kchj®Lh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjdLh²hh³j|Lh´K]ubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jÉLjA jÉLjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hŒë**Definition**:: struct usb_os_desc_table { int if_id; struct usb_os_desc *os_desc; }; **Members** ``if_id`` Interface id ``os_desc`` "Extended Compatibility ID" and "Extended Properties" of the interface”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjÕLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÑLubhŒ:”…”�”}”(hjÑLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KghjÍLubjk )�”}”(hŒRstruct usb_os_desc_table { int if_id; struct usb_os_desc *os_desc; };”h]”hŒRstruct usb_os_desc_table { int if_id; struct usb_os_desc *os_desc; };”…”�”}”hjîLsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KihjÍLubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjÿLh]”hŒMembers”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjýLubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KnhjÍLubj…)�”}”(hhh]”(jŠ)�”}”(hŒ``if_id`` Interface id ”h]”(j�)�”}”(hŒ ``if_id``”h]”j)�”}”(hjMh]”hŒif_id”…”�”}”(hj Mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KfhjMubj©)�”}”(hhh]”hì)�”}”(hŒ Interface id”h]”hŒ Interface id”…”�”}”(hj7Mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j3Mh´Kfhj4Mubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjMubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j3Mh´KfhjMubjŠ)�”}”(hŒR``os_desc`` "Extended Compatibility ID" and "Extended Properties" of the interface”h]”(j�)�”}”(hŒ ``os_desc``”h]”j)�”}”(hjWMh]”hŒos_desc”…”�”}”(hjYMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjUMubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KghjQMubj©)�”}”(hhh]”hì)�”}”(hŒF"Extended Compatibility ID" and "Extended Properties" of the interface”h]”hŒN“Extended Compatibility IDâ€� and “Extended Propertiesâ€� of the interface”…”�”}”(hjpMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jlMh´KghjmMubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjQMubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jlMh´KghjMubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjÍLubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj™Mh]”hŒ Description”…”�”}”(hj›Mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj—Mubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KkhjDGh²hubhì)�”}”(hŒfEach interface can have at most one "Extended Compatibility ID" and a number of "Extended Properties".”h]”hŒnEach interface can have at most one “Extended Compatibility IDâ€� and a number of “Extended Propertiesâ€�.”…”�”}”(hj¯Mh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KhhjDGh²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_function (C struct)”Œc.usb_function”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ usb_function”h]”jÂ)�”}”(hŒstruct usb_function”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj×Mh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÓMh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KnubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjåMh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÓMh²hh³jäMh´Knubjë)�”}”(hŒ usb_function”h]”jñ)�”}”(hjÑMh]”hŒ usb_function”…”�”}”(hj÷Mh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjóMubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÓMh²hh³jäMh´Knubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjÏMh²hh³jäMh´Knubah}”(h]”jÊMah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jäMh´KnhjÌMh²hubj )�”}”(hhh]”hì)�”}”(hŒ)describes one function of a configuration”h]”hŒ)describes one function of a configuration”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KrhjNh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÌMh²hh³jäMh´Knubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ j1NjA j1NjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hXŒ**Definition**:: struct usb_function { const char *name; struct usb_gadget_strings **strings; struct usb_descriptor_header **fs_descriptors; struct usb_descriptor_header **hs_descriptors; struct usb_descriptor_header **ss_descriptors; struct usb_descriptor_header **ssp_descriptors; struct usb_configuration *config; struct usb_os_desc_table *os_desc_table; unsigned os_desc_n; int (*bind)(struct usb_configuration *, struct usb_function *); void (*unbind)(struct usb_configuration *, struct usb_function *); void (*free_func)(struct usb_function *f); struct module *mod; int (*set_alt)(struct usb_function *, unsigned interface, unsigned alt); int (*get_alt)(struct usb_function *, unsigned interface); void (*disable)(struct usb_function *); int (*setup)(struct usb_function *, const struct usb_ctrlrequest *); bool (*req_match)(struct usb_function *, const struct usb_ctrlrequest *, bool config0); void (*suspend)(struct usb_function *); void (*resume)(struct usb_function *); int (*get_status)(struct usb_function *); int (*func_suspend)(struct usb_function *, u8 suspend_opt); bool func_suspended; bool func_wakeup_armed; }; **Members** ``name`` For diagnostics, identifies the function. ``strings`` tables of strings, keyed by identifiers assigned during bind() and by language IDs provided in control requests ``fs_descriptors`` Table of full (or low) speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at full speed (or at low speed). ``hs_descriptors`` Table of high speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at high speed. ``ss_descriptors`` Table of super speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed. ``ssp_descriptors`` Table of super speed plus descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed plus. ``config`` assigned when **usb_add_function\(\)** is called; this is the configuration with which this function is associated. ``os_desc_table`` Table of (interface id, os descriptors) pairs. The function can expose more than one interface. If an interface is a member of an IAD, only the first interface of IAD has its entry in the table. ``os_desc_n`` Number of entries in os_desc_table ``bind`` Before the gadget can register, all of its functions bind() to the available resources including string and interface identifiers used in interface or class descriptors; endpoints; I/O buffers; and so on. ``unbind`` Reverses **bind**; called as a side effect of unregistering the driver which added this function. ``free_func`` free the struct usb_function. ``mod`` (internal) points to the module that created this structure. ``set_alt`` (REQUIRED) Reconfigures altsettings; function drivers may initialize usb_ep.driver data at this time (when it is used). Note that setting an interface to its current altsetting resets interface state, and that all interfaces have a disabled state. ``get_alt`` Returns the active altsetting. If this is not provided, then only altsetting zero is supported. ``disable`` (REQUIRED) Indicates the function should be disabled. Reasons include host resetting or reconfiguring the gadget, and disconnection. ``setup`` Used for interface-specific control requests. ``req_match`` Tests if a given class request can be handled by this function. ``suspend`` Notifies functions when the host stops sending USB traffic. ``resume`` Notifies functions when the host restarts USB traffic. ``get_status`` Returns function status as a reply to GetStatus() request when the recipient is Interface. ``func_suspend`` callback to be called when SetFeature(FUNCTION_SUSPEND) is reseived ``func_suspended`` Indicates whether the function is in function suspend state. ``func_wakeup_armed`` Indicates whether the function is armed by the host for wakeup signaling.”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj=Nh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj9NubhŒ:”…”�”}”(hj9Nh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kvhj5Nubjk )�”}”(hX÷struct usb_function { const char *name; struct usb_gadget_strings **strings; struct usb_descriptor_header **fs_descriptors; struct usb_descriptor_header **hs_descriptors; struct usb_descriptor_header **ss_descriptors; struct usb_descriptor_header **ssp_descriptors; struct usb_configuration *config; struct usb_os_desc_table *os_desc_table; unsigned os_desc_n; int (*bind)(struct usb_configuration *, struct usb_function *); void (*unbind)(struct usb_configuration *, struct usb_function *); void (*free_func)(struct usb_function *f); struct module *mod; int (*set_alt)(struct usb_function *, unsigned interface, unsigned alt); int (*get_alt)(struct usb_function *, unsigned interface); void (*disable)(struct usb_function *); int (*setup)(struct usb_function *, const struct usb_ctrlrequest *); bool (*req_match)(struct usb_function *, const struct usb_ctrlrequest *, bool config0); void (*suspend)(struct usb_function *); void (*resume)(struct usb_function *); int (*get_status)(struct usb_function *); int (*func_suspend)(struct usb_function *, u8 suspend_opt); bool func_suspended; bool func_wakeup_armed; };”h]”hX÷struct usb_function { const char *name; struct usb_gadget_strings **strings; struct usb_descriptor_header **fs_descriptors; struct usb_descriptor_header **hs_descriptors; struct usb_descriptor_header **ss_descriptors; struct usb_descriptor_header **ssp_descriptors; struct usb_configuration *config; struct usb_os_desc_table *os_desc_table; unsigned os_desc_n; int (*bind)(struct usb_configuration *, struct usb_function *); void (*unbind)(struct usb_configuration *, struct usb_function *); void (*free_func)(struct usb_function *f); struct module *mod; int (*set_alt)(struct usb_function *, unsigned interface, unsigned alt); int (*get_alt)(struct usb_function *, unsigned interface); void (*disable)(struct usb_function *); int (*setup)(struct usb_function *, const struct usb_ctrlrequest *); bool (*req_match)(struct usb_function *, const struct usb_ctrlrequest *, bool config0); void (*suspend)(struct usb_function *); void (*resume)(struct usb_function *); int (*get_status)(struct usb_function *); int (*func_suspend)(struct usb_function *, u8 suspend_opt); bool func_suspended; bool func_wakeup_armed; };”…”�”}”hjVNsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kxhj5Nubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjgNh]”hŒMembers”…”�”}”(hjiNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjeNubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K“hj5Nubj…)�”}”(hhh]”(jŠ)�”}”(hŒ3``name`` For diagnostics, identifies the function. ”h]”(j�)�”}”(hŒ``name``”h]”j)�”}”(hj†Nh]”hŒname”…”�”}”(hjˆNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj„Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kthj€Nubj©)�”}”(hhh]”hì)�”}”(hŒ)For diagnostics, identifies the function.”h]”hŒ)For diagnostics, identifies the function.”…”�”}”(hjŸNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j›Nh´KthjœNubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj€Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j›Nh´Kthj}NubjŠ)�”}”(hŒ|``strings`` tables of strings, keyed by identifiers assigned during bind() and by language IDs provided in control requests ”h]”(j�)�”}”(hŒ ``strings``”h]”j)�”}”(hj¿Nh]”hŒstrings”…”�”}”(hjÁNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj½Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kvhj¹Nubj©)�”}”(hhh]”hì)�”}”(hŒotables of strings, keyed by identifiers assigned during bind() and by language IDs provided in control requests”h]”hŒotables of strings, keyed by identifiers assigned during bind() and by language IDs provided in control requests”…”�”}”(hjØNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KuhjÕNubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¹Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÔNh´Kvhj}NubjŠ)�”}”(hŒà``fs_descriptors`` Table of full (or low) speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at full speed (or at low speed). ”h]”(j�)�”}”(hŒ``fs_descriptors``”h]”j)�”}”(hjùNh]”hŒfs_descriptors”…”�”}”(hjûNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj÷Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KyhjóNubj©)�”}”(hhh]”hì)�”}”(hŒÌTable of full (or low) speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at full speed (or at low speed).”h]”(hŒaTable of full (or low) speed descriptors, using interface and string identifiers assigned during ”…”�”}”(hjOh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjOubhŒ_. If this pointer is null, the function will not be available at full speed (or at low speed).”…”�”}”(hjOh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KwhjOubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjóNubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jOh´Kyhj}NubjŠ)�”}”(hŒÅ``hs_descriptors`` Table of high speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at high speed. ”h]”(j�)�”}”(hŒ``hs_descriptors``”h]”j)�”}”(hjEOh]”hŒhs_descriptors”…”�”}”(hjGOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjCOubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K|hj?Oubj©)�”}”(hhh]”hì)�”}”(hŒ±Table of high speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null, the function will not be available at high speed.”h]”(hŒXTable of high speed descriptors, using interface and string identifiers assigned during ”…”�”}”(hj^Oh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjfOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj^OubhŒM. If this pointer is null, the function will not be available at high speed.”…”�”}”(hj^Oh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Kzhj[Oubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj?Oubeh}”(h•µ]”h ]”h"]”h$]”h&]”uh1j‰h³jZOh´K|hj}NubjŠ)�”}”(hŒ×``ss_descriptors`` Table of super speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed. ”h]”(j�)�”}”(hŒ``ss_descriptors``”h]”j)�”}”(hj‘Oh]”hŒss_descriptors”…”�”}”(hj“Oh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�Oubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K€hj‹Oubj©)�”}”(hhh]”hì)�”}”(hŒÃTable of super speed descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed.”h]”(hŒYTable of super speed descriptors, using interface and string identifiers assigned during ”…”�”}”(hjªOh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hj²Oh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjªOubhŒ^. If this pointer is null after initiation, the function will not be available at super speed.”…”�”}”(hjªOh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K}hj§Oubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj‹Oubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¦Oh´K€hj}NubjŠ)�”}”(hŒâ``ssp_descriptors`` Table of super speed plus descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed plus. ”h]”(j�)�”}”(hŒ``ssp_descriptors``”h]”j)�”}”(hjÝOh]”hŒssp_descriptors”…”�”}”(hjßOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÛOubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K„hj×Oubj©)�”}”(hhh]”hì)�”}”(hŒÍTable of super speed plus descriptors, using interface and string identifiers assigned during **bind\(\)**. If this pointer is null after initiation, the function will not be available at super speed plus.”h]”(hŒ^Table of super speed plus descriptors, using interface and string identifiers assigned during ”…”�”}”(hjöOh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjþOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjöOubhŒc. If this pointer is null after initiation, the function will not be available at super speed plus.”…”�”}”(hjöOh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K�hjóOubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj×Oubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jòOh´K„hj}NubjŠ)�”}”(hŒ``config`` assigned when **usb_add_function\(\)** is called; this is the configuration with which this function is associated. ”h]”(j�)�”}”(hŒ ``config``”h]”j)�”}”(hj)Ph]”hŒconfig”…”�”}”(hj+Ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj'Pubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K†hj#Pubj©)�”}”(hhh]”hì)�”}”(hŒsassigned when **usb_add_function\(\)** is called; this is the configuration with which this function is associated.”h]”(hŒassigned when ”…”�”}”(hjBPh²hh³Nh´NubjP )�”}”(hŒ**usb_add_function\(\)**”h]”hŒusb_add_function()”…”�”}”(hjJPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjBPubhŒM is called; this is the configuration with which this function is associated.”…”�”}”(hjBPh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K…hj?Pubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj#Pubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j>Ph´K†hj}NubjŠ)�”}”(hŒÕ``os_desc_table`` Table of (interface id, os descriptors) pairs. The function can expose more than one interface. If an interface is a member of an IAD, only the first interface of IAD has its entry in the table. ”h]”(j�)�”}”(hŒ``os_desc_table``”h]”j)�”}”(hjuPh]”hŒ os_desc_table”…”�”}”(hjwPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjsPubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K‰hjoPubj©)�”}”(hhh]”hì)�”}”(hŒÂTable of (interface id, os descriptors) pairs. The function can expose more than one interface. If an interface is a member of an IAD, only the first interface of IAD has its entry in the table.”h]”hŒÂTable of (interface id, os descriptors) pairs. The function can expose more than one interface. If an interface is a member of an IAD, only the first interface of IAD has its entry in the table.”…”�”}”(hjŽPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K‡hj‹Pubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjoPubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jŠPh´K‰hj}NubjŠ)�”}”(hŒ1``os_desc_n`` Number of entries in os_desc_table ”h]”(j�)�”}”(hŒ ``os_desc_n``”h]”j)�”}”(hj¯Ph]”hŒ os_desc_n”…”�”}”(hj±Ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj­Pubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KŠhj©Pubj©)�”}”(hhh]”hì)�”}”(hŒ"Number of entries in os_desc_table”h]”hŒ"Number of entries in os_desc_table”…”�”}”(hjÈPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÄPh´KŠhjÅPubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj©Pubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÄPh´KŠhj}NubjŠ)�”}”(hŒÖ``bind`` Before the gadget can register, all of its functions bind() to the available resources including string and interface identifiers used in interface or class descriptors; endpoints; I/O buffers; and so on. ”h]”(j�)�”}”(hŒ``bind``”h]”j)�”}”(hjèPh]”hŒbind”…”�”}”(hjêPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjæPubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K�hjâPubj©)�”}”(hhh]”hì)�”}”(hŒÌBefore the gadget can register, all of its functions bind() to the available resources including string and interface identifiers used in interface or class descriptors; endpoints; I/O buffers; and so on.”h]”hŒÌBefore the gadget can register, all of its functions bind() to the available resources including string and interface identifiers used in interface or class descriptors; endpoints; I/O buffers; and so on.”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K‹hjþPubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjâPubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jýPh´K�hj}NubjŠ)�”}”(hŒm``unbind`` Reverses **bind**; called as a side effect of unregistering the driver which added this function. ”h]”(j�)�”}”(hŒ ``unbind``”h]”j)�”}”(hj"Qh]”hŒunbind”…”�”}”(hj$Qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj Qubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K�hjQubj©)�”}”(hhh]”hì)�”}”(hŒaReverses **bind**; called as a side effect of unregistering the driver which added this function.”h]”(hŒ Reverses ”…”�”}”(hj;Qh²hh³Nh´NubjP )�”}”(hŒ**bind**”h]”hŒbind”…”�”}”(hjCQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj;QubhŒP; called as a side effect of unregistering the driver which added this function.”…”�”}”(hj;Qh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KŽhj8Qubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjQubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j7Qh´K�hj}NubjŠ)�”}”(hŒ,``free_func`` free the struct usb_function. ”h]”(j�)�”}”(hŒ ``free_func``”h]”j)�”}”(hjnQh]”hŒ free_func”…”�”}”(hjpQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjlQubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K�hjhQubj©)�”}”(hhh]”hì)�”}”(hŒfree the struct usb_function.”h]”hŒfree the struct usb_function.”…”�”}”(hj‡Qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jƒQh´K�hj„Qubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjhQubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jƒQh´K�hj}NubjŠ)�”}”(hŒE``mod`` (internal) points to the module that created this structure. ”h]”(j�)�”}”(hŒ``mod``”h]”j)�”}”(hj§Qh]”hŒmod”…”�”}”(hj©Qh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¥Qubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K‘hj¡Qubj©)�”}”(hhh]”hì)�”}”(hŒ<(internal) points to the module that created this structure.”h]”hŒ<(internal) points to the module that created this structure.”…”�”}”(hjÀQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¼Qh´K‘hj½Qubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¡Qubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¼Qh´K‘hj}NubjŠ)�”}”(hX``set_alt`` (REQUIRED) Reconfigures altsettings; function drivers may initialize usb_ep.driver data at this time (when it is used). Note that setting an interface to its current altsetting resets interface state, and that all interfaces have a disabled state. ”h]”(j�)�”}”(hŒ ``set_alt``”h]”j)�”}”(hjàQh]”hŒset_alt”…”�”}”(hjâQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞQubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K•hjÚQubj©)�”}”(hhh]”hì)�”}”(hŒ÷(REQUIRED) Reconfigures altsettings; function drivers may initialize usb_ep.driver data at this time (when it is used). Note that setting an interface to its current altsetting resets interface state, and that all interfaces have a disabled state.”h]”hŒ÷(REQUIRED) Reconfigures altsettings; function drivers may initialize usb_ep.driver data at this time (when it is used). Note that setting an interface to its current altsetting resets interface state, and that all interfaces have a disabled state.”…”�”}”(hjùQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K’hjöQubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÚQubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jõQh´K•hj}NubjŠ)�”}”(hŒm``get_alt`` Returns the active altsetting. If this is not provided, then only altsetting zero is supported. ”h]”(j�)�”}”(hŒ ``get_alt``”h]”j)�”}”(hjRh]”hŒget_alt”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K—hjRubj©)�”}”(hhh]”hì)�”}”(hŒ`Returns the active altsetting. If this is not provided, then only altsetting zero is supported.”h]”hŒ`Returns the active altsetting. If this is not provided, then only altsetting zero is supported.”…”�”}”(hj3Rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K–hj0Rubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j/Rh´K—hj}NubjŠ)�”}”(hŒ’``disable`` (REQUIRED) Indicates the function should be disabled. Reasons include host resetting or reconfiguring the gadget, and disconnection. ”h]”(j�)�”}”(hŒ ``disable``”h]”j)�”}”(hjTRh]”hŒdisable”…”�”}”(hjVRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjRRubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K™hjNRubj©)�”}”(hhh]”hì)�”}”(hŒ…(REQUIRED) Indicates the function should be disabled. Reasons include host resetting or reconfiguring the gadget, and disconnection.”h]”hŒ…(REQUIRED) Indicates the function should be disabled. Reasons include host resetting or reconfiguring the gadget, and disconnection.”…”�”}”(hjmRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K˜hjjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjNRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jiRh´K™hj}NubjŠ)�”}”(hŒ8``setup`` Used for interface-specific control requests. ”h]”(j�)�”}”(hŒ ``setup``”h]”j)�”}”(hjŽRh]”hŒsetup”…”�”}”(hj�Rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjŒRubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KšhjˆRubj©)�”}”(hhh]”hì)�”}”(hŒ-Used for interface-specific control requests.”h]”hŒ-Used for interface-specific control requests.”…”�”}”(hj§Rh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j£Rh´Kšhj¤Rubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjˆRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j£Rh´Kšhj}NubjŠ)�”}”(hŒN``req_match`` Tests if a given class request can be handled by this function. ”h]”(j�)�”}”(hŒ ``req_match``”h]”j)�”}”(hjÇRh]”hŒ req_match”…”�”}”(hjÉRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÅRubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K›hjÁRubj©)�”}”(hhh]”hì)�”}”(hŒ?Tests if a given class request can be handled by this function.”h]”hŒ?Tests if a given class request can be handled by this function.”…”�”}”(hjàRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÜRh´K›hjÝRubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÁRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÜRh´K›hj}NubjŠ)�”}”(hŒH``suspend`` Notifies functions when the host stops sending USB traffic. ”h]”(j�)�”}”(hŒ ``suspend``”h]”j)�”}”(hjSh]”hŒsuspend”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjþRubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KœhjúRubj©)�”}”(hhh]”hì)�”}”(hŒ;Notifies functions when the host stops sending USB traffic.”h]”hŒ;Notifies functions when the host stops sending USB traffic.”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jSh´KœhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjúRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jSh´Kœhj}NubjŠ)�”}”(hŒB``resume`` Notifies functions when the host restarts USB traffic. ”h]”(j�)�”}”(hŒ ``resume``”h]”j)�”}”(hj9Sh]”hŒresume”…”�”}”(hj;Sh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj7Subah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K�hj3Subj©)�”}”(hhh]”hì)�”}”(hŒ6Notifies functions when the host restarts USB traffic.”h]”hŒ6Notifies functions when the host restarts USB traffic.”…”�”}”(hjRSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jNSh´K�hjOSubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj3Subeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jNSh´K�hj}NubjŠ)�”}”(hŒj``get_status`` Returns function status as a reply to GetStatus() request when the recipient is Interface. ”h]”(j�)�”}”(hŒ``get_status``”h]”j)�”}”(hjrSh]”hŒ get_status”…”�”}”(hjtSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpSubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KŸhjlSubj©)�”}”(hhh]”hì)�”}”(hŒZReturns function status as a reply to GetStatus() request when the recipient is Interface.”h]”hŒZReturns function status as a reply to GetStatus() request when the recipient is Interface.”…”�”}”(hj‹Sh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´KžhjˆSubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjlSubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‡Sh´KŸhj}NubjŠ)�”}”(hŒU``func_suspend`` callback to be called when SetFeature(FUNCTION_SUSPEND) is reseived ”h]”(j�)�”}”(hŒ``func_suspend``”h]”j)�”}”(hj¬Sh]”hŒ func_suspend”…”�”}”(hj®Sh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjªSubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K¡hj¦Subj©)�”}”(hhh]”hì)�”}”(hŒCcallback to be called when SetFeature(FUNCTION_SUSPEND) is reseived”h]”hŒCcallback to be called when SetFeature(FUNCTION_SUSPEND) is reseived”…”�”}”(hjÅSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K hjÂSubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¦Subeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÁSh´K¡hj}NubjŠ)�”}”(hŒP``func_suspended`` Indicates whether the function is in function suspend state. ”h]”(j�)�”}”(hŒ``func_suspended``”h]”j)�”}”(hjæSh]”hŒfunc_suspended”…”�”}”(hjèSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjäSubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´K¢hjàSubj©)�”}”(hhh]”hì)�”}”(hŒ``bConfigurationValue`` Copied into configuration descriptor. ”h]”(j�)�”}”(hŒ``bConfigurationValue``”h]”j)�”}”(hjWh]”hŒbConfigurationValue”…”�”}”(hj Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjWubj©)�”}”(hhh]”hì)�”}”(hŒ%Copied into configuration descriptor.”h]”hŒ%Copied into configuration descriptor.”…”�”}”(hj!Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jWh´MhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjWubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jWh´MhjºUubjŠ)�”}”(hŒ9``iConfiguration`` Copied into configuration descriptor. ”h]”(j�)�”}”(hŒ``iConfiguration``”h]”j)�”}”(hjAWh]”hŒiConfiguration”…”�”}”(hjCWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj?Wubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mhj;Wubj©)�”}”(hhh]”hì)�”}”(hŒ%Copied into configuration descriptor.”h]”hŒ%Copied into configuration descriptor.”…”�”}”(hjZWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jVWh´MhjWWubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj;Wubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jVWh´MhjºUubjŠ)�”}”(hŒ7``bmAttributes`` Copied into configuration descriptor. ”h]”(j�)�”}”(hŒ``bmAttributes``”h]”j)�”}”(hjzWh]”hŒ bmAttributes”…”�”}”(hj|Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjxWubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjtWubj©)�”}”(hhh]”hì)�”}”(hŒ%Copied into configuration descriptor.”h]”hŒ%Copied into configuration descriptor.”…”�”}”(hj“Wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�Wh´Mhj�Wubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjtWubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�Wh´MhjºUubjŠ)�”}”(hŒ�``MaxPower`` Power consumption in mA. Used to compute bMaxPower in the configuration descriptor after considering the bus speed. ”h]”(j�)�”}”(hŒ ``MaxPower``”h]”j)�”}”(hj³Wh]”hŒMaxPower”…”�”}”(hjµWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj±Wubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mhj­Wubj©)�”}”(hhh]”hì)�”}”(hŒsPower consumption in mA. Used to compute bMaxPower in the configuration descriptor after considering the bus speed.”h]”hŒsPower consumption in mA. Used to compute bMaxPower in the configuration descriptor after considering the bus speed.”…”�”}”(hjÌWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjÉWubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj­Wubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÈWh´MhjºUubjŠ)�”}”(hŒ``cdev`` assigned by **usb_add_config\(\)** before calling **bind\(\)**; this is the device associated with this configuration.”h]”(j�)�”}”(hŒ``cdev``”h]”j)�”}”(hjíWh]”hŒcdev”…”�”}”(hjïWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjëWubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjçWubj©)�”}”(hhh]”hì)�”}”(hŒvassigned by **usb_add_config\(\)** before calling **bind\(\)**; this is the device associated with this configuration.”h]”(hŒ assigned by ”…”�”}”(hjXh²hh³Nh´NubjP )�”}”(hŒ**usb_add_config\(\)**”h]”hŒusb_add_config()”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjXubhŒ before calling ”…”�”}”(hjXh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hj Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjXubhŒ8; this is the device associated with this configuration.”…”�”}”(hjXh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jXh´MhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjçWubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jXh´MhjºUubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjrUubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjSXh]”hŒ Description”…”�”}”(hjUXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjQXubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjDGh²hubhì)�”}”(hXƒConfigurations are building blocks for gadget drivers structured around function drivers. Simple USB gadgets require only one function and one configuration, and handle dual-speed hardware by always providing the same functionality. Slightly more complex gadgets may have more than one single-function configuration at a given speed; or have configurations that only work at one speed.”h]”hXƒConfigurations are building blocks for gadget drivers structured around function drivers. Simple USB gadgets require only one function and one configuration, and handle dual-speed hardware by always providing the same functionality. Slightly more complex gadgets may have more than one single-function configuration at a given speed; or have configurations that only work at one speed.”…”�”}”(hjiXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjDGh²hubhì)�”}”(hŒdComposite devices are, by definition, ones with configurations which include more than one function.”h]”hŒdComposite devices are, by definition, ones with configurations which include more than one function.”…”�”}”(hjxXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MhjDGh²hubhì)�”}”(hXKThe lifecycle of a usb_configuration includes allocation, initialization of the fields described above, and calling **usb_add_config\(\)** to set up internal data and bind it to a specific device. The configuration's **bind\(\)** method is then used to initialize all the functions and then call **usb_add_function\(\)** for them.”h]”(hŒtThe lifecycle of a usb_configuration includes allocation, initialization of the fields described above, and calling ”…”�”}”(hj‡Xh²hh³Nh´NubjP )�”}”(hŒ**usb_add_config\(\)**”h]”hŒusb_add_config()”…”�”}”(hj�Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‡XubhŒR to set up internal data and bind it to a specific device. The configuration’s ”…”�”}”(hj‡Xh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hj¡Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‡XubhŒC method is then used to initialize all the functions and then call ”…”�”}”(hj‡Xh²hh³Nh´NubjP )�”}”(hŒ**usb_add_function\(\)**”h]”hŒusb_add_function()”…”�”}”(hj³Xh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‡XubhŒ for them.”…”�”}”(hj‡Xh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M!hjDGh²hubhì)�”}”(hXnThose functions would normally be independent of each other, but that's not mandatory. CDC WMC devices are an example where functions often depend on other functions, with some functions subsidiary to others. Such interdependency may be managed in any way, so long as all of the descriptors complete by the time the composite driver returns from its bind() routine.”h]”hXpThose functions would normally be independent of each other, but that’s not mandatory. CDC WMC devices are an example where functions often depend on other functions, with some functions subsidiary to others. Such interdependency may be managed in any way, so long as all of the descriptors complete by the time the composite driver returns from its bind() routine.”…”�”}”(hjÌXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M'hjDGh²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_composite_driver (C struct)”Œc.usb_composite_driver”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_composite_driver”h]”jÂ)�”}”(hŒstruct usb_composite_driver”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjôXh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjðXh²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M1ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjðXh²hh³jYh´M1ubjë)�”}”(hŒusb_composite_driver”h]”jñ)�”}”(hjîXh]”hŒusb_composite_driver”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjYubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjðXh²hh³jYh´M1ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjìXh²hh³jYh´M1ubah}”(h]”jçXah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jYh´M1hjéXh²hubj )�”}”(hhh]”hì)�”}”(hŒ#groups configurations into a gadget”h]”hŒ#groups configurations into a gadget”…”�”}”(hj6Yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M_hj3Yh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjéXh²hh³jYh´M1ubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jNYjA jNYjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hXU**Definition**:: struct usb_composite_driver { const char *name; const struct usb_device_descriptor *dev; struct usb_gadget_strings **strings; enum usb_device_speed max_speed; unsigned needs_serial:1; int (*bind)(struct usb_composite_dev *cdev); int (*unbind)(struct usb_composite_dev *); void (*disconnect)(struct usb_composite_dev *); void (*suspend)(struct usb_composite_dev *); void (*resume)(struct usb_composite_dev *); struct usb_gadget_driver gadget_driver; }; **Members** ``name`` For diagnostics, identifies the driver. ``dev`` Template descriptor for the device, including default device identifiers. ``strings`` tables of strings, keyed by identifiers assigned during **bind** and language IDs provided in control requests. Note: The first entries are predefined. The first entry that may be used is USB_GADGET_FIRST_AVAIL_IDX ``max_speed`` Highest speed the driver supports. ``needs_serial`` set to 1 if the gadget needs userspace to provide a serial number. If one is not provided, warning will be printed. ``bind`` (REQUIRED) Used to allocate resources that are shared across the whole device, such as string IDs, and add its configurations using **usb_add_config\(\)**. This may fail by returning a negative errno value; it should return zero on successful initialization. ``unbind`` Reverses **bind**; called as a side effect of unregistering this driver. ``disconnect`` optional driver disconnect method ``suspend`` Notifies when the host stops sending USB traffic, after function notifications ``resume`` Notifies configuration when the host restarts USB traffic, before function notifications ``gadget_driver`` Gadget driver controlling this driver”h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjZYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjVYubhŒ:”…”�”}”(hjVYh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MchjRYubjk )�”}”(hX@struct usb_composite_driver { const char *name; const struct usb_device_descriptor *dev; struct usb_gadget_strings **strings; enum usb_device_speed max_speed; unsigned needs_serial:1; int (*bind)(struct usb_composite_dev *cdev); int (*unbind)(struct usb_composite_dev *); void (*disconnect)(struct usb_composite_dev *); void (*suspend)(struct usb_composite_dev *); void (*resume)(struct usb_composite_dev *); struct usb_gadget_driver gadget_driver; };”h]”hX@struct usb_composite_driver { const char *name; const struct usb_device_descriptor *dev; struct usb_gadget_strings **strings; enum usb_device_speed max_speed; unsigned needs_serial:1; int (*bind)(struct usb_composite_dev *cdev); int (*unbind)(struct usb_composite_dev *); void (*disconnect)(struct usb_composite_dev *); void (*suspend)(struct usb_composite_dev *); void (*resume)(struct usb_composite_dev *); struct usb_gadget_driver gadget_driver; };”…”�”}”hjsYsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MehjRYubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hj„Yh]”hŒMembers”…”�”}”(hj†Yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‚Yubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MshjRYubj…)�”}”(hhh]”(jŠ)�”}”(hŒ1``name`` For diagnostics, identifies the driver. ”h]”(j�)�”}”(hŒ``name``”h]”j)�”}”(hj£Yh]”hŒname”…”�”}”(hj¥Yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¡Yubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mahj�Yubj©)�”}”(hhh]”hì)�”}”(hŒ'For diagnostics, identifies the driver.”h]”hŒ'For diagnostics, identifies the driver.”…”�”}”(hj¼Yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¸Yh´Mahj¹Yubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj�Yubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¸Yh´MahjšYubjŠ)�”}”(hŒR``dev`` Template descriptor for the device, including default device identifiers. ”h]”(j�)�”}”(hŒ``dev``”h]”j)�”}”(hjÜYh]”hŒdev”…”�”}”(hjÞYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÚYubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MchjÖYubj©)�”}”(hhh]”hì)�”}”(hŒITemplate descriptor for the device, including default device identifiers.”h]”hŒITemplate descriptor for the device, including default device identifiers.”…”�”}”(hjõYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MbhjòYubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÖYubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jñYh´MchjšYubjŠ)�”}”(hŒã``strings`` tables of strings, keyed by identifiers assigned during **bind** and language IDs provided in control requests. Note: The first entries are predefined. The first entry that may be used is USB_GADGET_FIRST_AVAIL_IDX ”h]”(j�)�”}”(hŒ ``strings``”h]”j)�”}”(hjZh]”hŒstrings”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MghjZubj©)�”}”(hhh]”hì)�”}”(hŒÖtables of strings, keyed by identifiers assigned during **bind** and language IDs provided in control requests. Note: The first entries are predefined. The first entry that may be used is USB_GADGET_FIRST_AVAIL_IDX”h]”(hŒ8tables of strings, keyed by identifiers assigned during ”…”�”}”(hj/Zh²hh³Nh´NubjP )�”}”(hŒ**bind**”h]”hŒbind”…”�”}”(hj7Zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj/ZubhŒ– and language IDs provided in control requests. Note: The first entries are predefined. The first entry that may be used is USB_GADGET_FIRST_AVAIL_IDX”…”�”}”(hj/Zh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mdhj,Zubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j+Zh´MghjšYubjŠ)�”}”(hŒ1``max_speed`` Highest speed the driver supports. ”h]”(j�)�”}”(hŒ ``max_speed``”h]”j)�”}”(hjbZh]”hŒ max_speed”…”�”}”(hjdZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`Zubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mhhj\Zubj©)�”}”(hhh]”hì)�”}”(hŒ"Highest speed the driver supports.”h]”hŒ"Highest speed the driver supports.”…”�”}”(hj{Zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jwZh´MhhjxZubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj\Zubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jwZh´MhhjšYubjŠ)�”}”(hŒ†``needs_serial`` set to 1 if the gadget needs userspace to provide a serial number. If one is not provided, warning will be printed. ”h]”(j�)�”}”(hŒ``needs_serial``”h]”j)�”}”(hj›Zh]”hŒ needs_serial”…”�”}”(hj�Zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™Zubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mjhj•Zubj©)�”}”(hhh]”hì)�”}”(hŒtset to 1 if the gadget needs userspace to provide a serial number. If one is not provided, warning will be printed.”h]”hŒtset to 1 if the gadget needs userspace to provide a serial number. If one is not provided, warning will be printed.”…”�”}”(hj´Zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mihj±Zubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj•Zubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j°Zh´MjhjšYubjŠ)�”}”(hX ``bind`` (REQUIRED) Used to allocate resources that are shared across the whole device, such as string IDs, and add its configurations using **usb_add_config\(\)**. This may fail by returning a negative errno value; it should return zero on successful initialization. ”h]”(j�)�”}”(hŒ``bind``”h]”j)�”}”(hjÕZh]”hŒbind”…”�”}”(hj×Zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÓZubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MnhjÏZubj©)�”}”(hhh]”hì)�”}”(hX(REQUIRED) Used to allocate resources that are shared across the whole device, such as string IDs, and add its configurations using **usb_add_config\(\)**. This may fail by returning a negative errno value; it should return zero on successful initialization.”h]”(hŒ„(REQUIRED) Used to allocate resources that are shared across the whole device, such as string IDs, and add its configurations using ”…”�”}”(hjîZh²hh³Nh´NubjP )�”}”(hŒ**usb_add_config\(\)**”h]”hŒusb_add_config()”…”�”}”(hjöZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjîZubhŒh. This may fail by returning a negative errno value; it should return zero on successful initialization.”…”�”}”(hjîZh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MkhjëZubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÏZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jêZh´MnhjšYubjŠ)�”}”(hŒT``unbind`` Reverses **bind**; called as a side effect of unregistering this driver. ”h]”(j�)�”}”(hŒ ``unbind``”h]”j)�”}”(hj![h]”hŒunbind”…”�”}”(hj#[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mphjbj©)�”}”(hhh]”hì)�”}”(hŒHReverses **bind**; called as a side effect of unregistering this driver.”h]”(hŒ Reverses ”…”�”}”(hj:[h²hh³Nh´NubjP )�”}”(hŒ**bind**”h]”hŒbind”…”�”}”(hjB[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj:[ubhŒ7; called as a side effect of unregistering this driver.”…”�”}”(hj:[h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mohj7[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjbeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j6[h´MphjšYubjŠ)�”}”(hŒ1``disconnect`` optional driver disconnect method ”h]”(j�)�”}”(hŒ``disconnect``”h]”j)�”}”(hjm[h]”hŒ disconnect”…”�”}”(hjo[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjk[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mqhjg[ubj©)�”}”(hhh]”hì)�”}”(hŒ!optional driver disconnect method”h]”hŒ!optional driver disconnect method”…”�”}”(hj†[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j‚[h´Mqhjƒ[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjg[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‚[h´MqhjšYubjŠ)�”}”(hŒ[``suspend`` Notifies when the host stops sending USB traffic, after function notifications ”h]”(j�)�”}”(hŒ ``suspend``”h]”j)�”}”(hj¦[h]”hŒsuspend”…”�”}”(hj¨[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¤[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mshj [ubj©)�”}”(hhh]”hì)�”}”(hŒNNotifies when the host stops sending USB traffic, after function notifications”h]”hŒNNotifies when the host stops sending USB traffic, after function notifications”…”�”}”(hj¿[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mrhj¼[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj [ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j»[h´MshjšYubjŠ)�”}”(hŒd``resume`` Notifies configuration when the host restarts USB traffic, before function notifications ”h]”(j�)�”}”(hŒ ``resume``”h]”j)�”}”(hjà[h]”hŒresume”…”�”}”(hjâ[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÞ[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MuhjÚ[ubj©)�”}”(hhh]”hì)�”}”(hŒXNotifies configuration when the host restarts USB traffic, before function notifications”h]”hŒXNotifies configuration when the host restarts USB traffic, before function notifications”…”�”}”(hjù[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mthjö[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÚ[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jõ[h´MuhjšYubjŠ)�”}”(hŒ7``gadget_driver`` Gadget driver controlling this driver”h]”(j�)�”}”(hŒ``gadget_driver``”h]”j)�”}”(hj\h]”hŒ gadget_driver”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Muhj\ubj©)�”}”(hhh]”hì)�”}”(hŒ%Gadget driver controlling this driver”h]”hŒ%Gadget driver controlling this driver”…”�”}”(hj3\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mvhj0\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj\ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j/\h´MuhjšYubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjRYubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj]\h]”hŒ Description”…”�”}”(hj_\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj[\ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MyhjDGh²hubhì)�”}”(hŒŽDevices default to reporting self powered operation. Devices which rely on bus powered operation should report this in their **bind** method.”h]”(hŒ~Devices default to reporting self powered operation. Devices which rely on bus powered operation should report this in their ”…”�”}”(hjs\h²hh³Nh´NubjP )�”}”(hŒ**bind**”h]”hŒbind”…”�”}”(hj{\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjs\ubhŒ method.”…”�”}”(hjs\h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MvhjDGh²hubhì)�”}”(hXûBefore returning from **bind**, various fields in the template descriptor may be overridden. These include the idVendor/idProduct/bcdDevice values normally to bind the appropriate host side driver, and the three strings (iManufacturer, iProduct, iSerialNumber) normally used to provide user meaningful device identifiers. (The strings will not be defined unless they are defined in **dev** and **strings**.) The correct ep0 maxpacket size is also reported, as defined by the underlying controller driver.”h]”(hŒBefore returning from ”…”�”}”(hj”\h²hh³Nh´NubjP )�”}”(hŒ**bind**”h]”hŒbind”…”�”}”(hjœ\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj”\ubhXb, various fields in the template descriptor may be overridden. These include the idVendor/idProduct/bcdDevice values normally to bind the appropriate host side driver, and the three strings (iManufacturer, iProduct, iSerialNumber) normally used to provide user meaningful device identifiers. (The strings will not be defined unless they are defined in ”…”�”}”(hj”\h²hh³Nh´NubjP )�”}”(hŒ**dev**”h]”hŒdev”…”�”}”(hj®\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj”\ubhŒ and ”…”�”}”(hj”\h²hh³Nh´NubjP )�”}”(hŒ **strings**”h]”hŒstrings”…”�”}”(hjÀ\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj”\ubhŒd.) The correct ep0 maxpacket size is also reported, as defined by the underlying controller driver.”…”�”}”(hj”\h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MyhjDGh²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ%module_usb_composite_driver (C macro)”Œc.module_usb_composite_driver”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒmodule_usb_composite_driver”h]”jÂ)�”}”(hŒmodule_usb_composite_driver”h]”jë)�”}”(hŒmodule_usb_composite_driver”h]”jñ)�”}”(hjì\h]”hŒmodule_usb_composite_driver”…”�”}”(hjö\h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjò\ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjî\h²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M˜ubah}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjê\h²hh³j ]h´M˜ubah}”(h]”jå\ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j ]h´M˜hjç\h²hubj )�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j hjç\h²hh³j ]h´M˜ubeh}”(h]”h ]”(jéŒmacro”eh"]”h$]”h&]”j? jéj@ j"]jA j"]jB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´Nubhì)�”}”(hŒ8``module_usb_composite_driver (__usb_composite_driver)``”h]”j)�”}”(hj(]h]”hŒ4module_usb_composite_driver (__usb_composite_driver)”…”�”}”(hj*]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj&]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MšhjDGh²hubhŒ block_quote”“”)�”}”(hŒ;Helper macro for registering a USB gadget composite driver ”h]”hì)�”}”(hŒ:Helper macro for registering a USB gadget composite driver”h]”hŒ:Helper macro for registering a USB gadget composite driver”…”�”}”(hjD]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M˜hj@]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j>]h³jR]h´M˜hjDGh²hubjF )�”}”(hXF**Parameters** ``__usb_composite_driver`` usb_composite_driver struct **Description** Helper macro for USB gadget composite drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj_]h]”hŒ Parameters”…”�”}”(hja]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj]]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MœhjY]ubj…)�”}”(hhh]”jŠ)�”}”(hŒ7``__usb_composite_driver`` usb_composite_driver struct ”h]”(j�)�”}”(hŒ``__usb_composite_driver``”h]”j)�”}”(hj~]h]”hŒ__usb_composite_driver”…”�”}”(hj€]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj|]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mšhjx]ubj©)�”}”(hhh]”hì)�”}”(hŒusb_composite_driver struct”h]”hŒusb_composite_driver struct”…”�”}”(hj—]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j“]h´Mšhj”]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjx]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j“]h´Mšhju]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjY]ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj¹]h]”hŒ Description”…”�”}”(hj»]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj·]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MœhjY]ubhì)�”}”(hŒëHelper macro for USB gadget composite drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()”h]”hŒëHelper macro for USB gadget composite drivers which do not do anything special in module init/exit. This eliminates a lot of boilerplate. Each module may only use this macro once, and calling it replaces module_init() and module_exit()”…”�”}”(hjÏ]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M›hjY]ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_composite_dev (C struct)”Œc.usb_composite_dev”hNt”auh1j¥hjDGh²hh³j¥Gh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒusb_composite_dev”h]”jÂ)�”}”(hŒstruct usb_composite_dev”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjþ]h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjú]h²hh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M£ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj ^h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjú]h²hh³j ^h´M£ubjë)�”}”(hŒusb_composite_dev”h]”jñ)�”}”(hjø]h]”hŒusb_composite_dev”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj^ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjú]h²hh³j ^h´M£ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjö]h²hh³j ^h´M£ubah}”(h]”jñ]ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j ^h´M£hjó]h²hubj )�”}”(hhh]”hì)�”}”(hŒ#represents one composite usb gadget”h]”hŒ#represents one composite usb gadget”…”�”}”(hj@^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¸hj=^h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjó]h²hh³j ^h´M£ubeh}”(h]”h ]”(jéŒstruct”eh"]”h$]”h&]”j? jéj@ jX^jA jX^jB ‰jC ‰jD ‰uh1j¶h²hhjDGh³j¥Gh´NubjF )�”}”(hXg**Definition**:: struct usb_composite_dev { struct usb_gadget *gadget; struct usb_request *req; struct usb_request *os_desc_req; struct usb_configuration *config; u8 qw_sign[OS_STRING_QW_SIGN_LEN]; u8 b_vendor_code; struct usb_configuration *os_desc_config; unsigned int use_os_string:1; u16 bcd_webusb_version; u8 b_webusb_vendor_code; char landing_page[WEBUSB_URL_RAW_MAX_LENGTH]; unsigned int use_webusb:1; unsigned int setup_pending:1; unsigned int os_desc_pending:1; }; **Members** ``gadget`` read-only, abstracts the gadget's usb peripheral controller ``req`` used for control responses; buffer is pre-allocated ``os_desc_req`` used for OS descriptors responses; buffer is pre-allocated ``config`` the currently active configuration ``qw_sign`` qwSignature part of the OS string ``b_vendor_code`` bMS_VendorCode part of the OS string ``os_desc_config`` the configuration to be used with OS descriptors ``use_os_string`` false by default, interested gadgets set it ``bcd_webusb_version`` 0x0100 by default, WebUSB specification version ``b_webusb_vendor_code`` 0x0 by default, vendor code for WebUSB ``landing_page`` empty by default, landing page to announce in WebUSB ``use_webusb`` false by default, interested gadgets set it ``setup_pending`` true when setup request is queued but not completed ``os_desc_pending`` true when os_desc request is queued but not completed”•h]”(hì)�”}”(hŒ**Definition**::”h]”(jP )�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjd^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj`^ubhŒ:”…”�”}”(hj`^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¼hj\^ubjk )�”}”(hXƒstruct usb_composite_dev { struct usb_gadget *gadget; struct usb_request *req; struct usb_request *os_desc_req; struct usb_configuration *config; u8 qw_sign[OS_STRING_QW_SIGN_LEN]; u8 b_vendor_code; struct usb_configuration *os_desc_config; unsigned int use_os_string:1; u16 bcd_webusb_version; u8 b_webusb_vendor_code; char landing_page[WEBUSB_URL_RAW_MAX_LENGTH]; unsigned int use_webusb:1; unsigned int setup_pending:1; unsigned int os_desc_pending:1; };”h]”hXƒstruct usb_composite_dev { struct usb_gadget *gadget; struct usb_request *req; struct usb_request *os_desc_req; struct usb_configuration *config; u8 qw_sign[OS_STRING_QW_SIGN_LEN]; u8 b_vendor_code; struct usb_configuration *os_desc_config; unsigned int use_os_string:1; u16 bcd_webusb_version; u8 b_webusb_vendor_code; char landing_page[WEBUSB_URL_RAW_MAX_LENGTH]; unsigned int use_webusb:1; unsigned int setup_pending:1; unsigned int os_desc_pending:1; };”…”�”}”hj}^sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1jj h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¾hj\^ubhì)�”}”(hŒ **Members**”h]”jP )�”}”(hjŽ^h]”hŒMembers”…”�”}”(hj�^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjŒ^ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÏhj\^ubj…)�”}”(hhh]”(jŠ)�”}”(hŒG``gadget`` read-only, abstracts the gadget's usb peripheral controller ”h]”(j�)�”}”(hŒ ``gadget``”h]”j)�”}”(hj­^h]”hŒgadget”…”�”}”(hj¯^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj«^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´Mºhj§^ubj©)�”}”(hhh]”hì)�”}”(hŒ;read-only, abstracts the gadget's usb peripheral controller”h]”hŒ=read-only, abstracts the gadget’s usb peripheral controller”…”�”}”(hjÆ^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÂ^h´MºhjÃ^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj§^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÂ^h´Mºhj¤^ubjŠ)�”}”(hŒ<``req`` used for control responses; buffer is pre-allocated ”h]”(j�)�”}”(hŒ``req``”h]”j)�”}”(hjæ^h]”hŒreq”…”�”}”(hjè^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjä^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M»hjà^ubj©)�”}”(hhh]”hì)�”}”(hŒ3used for control responses; buffer is pre-allocated”h]”hŒ3used for control responses; buffer is pre-allocated”…”�”}”(hjÿ^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jû^h´M»hjü^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjà^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jû^h´M»hj¤^ubjŠ)�”}”(hŒK``os_desc_req`` used for OS descriptors responses; buffer is pre-allocated ”h]”(j�)�”}”(hŒ``os_desc_req``”h]”j)�”}”(hj_h]”hŒ os_desc_req”…”�”}”(hj!_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¼hj_ubj©)�”}”(hhh]”hì)�”}”(hŒ:used for OS descriptors responses; buffer is pre-allocated”h]”hŒ:used for OS descriptors responses; buffer is pre-allocated”…”�”}”(hj8_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j4_h´M¼hj5_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j4_h´M¼hj¤^ubjŠ)�”}”(hŒ.``config`` the currently active configuration ”h]”(j�)�”}”(hŒ ``config``”h]”j)�”}”(hjX_h]”hŒconfig”…”�”}”(hjZ_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjV_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M½hjR_ubj©)�”}”(hhh]”hì)�”}”(hŒ"the currently active configuration”h]”hŒ"the currently active configuration”…”�”}”(hjq_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jm_h´M½hjn_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjR_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jm_h´M½hj¤^ubjŠ)�”}”(hŒ.``qw_sign`` qwSignature part of the OS string ”h]”(j�)�”}”(hŒ ``qw_sign``”h]”j)�”}”(hj‘_h]”hŒqw_sign”…”�”}”(hj“_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¾hj‹_ubj©)�”}”(hhh]”hì)�”}”(hŒ!qwSignature part of the OS string”h]”hŒ!qwSignature part of the OS string”…”�”}”(hjª_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¦_h´M¾hj§_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj‹_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¦_h´M¾hj¤^ubjŠ)�”}”(hŒ7``b_vendor_code`` bMS_VendorCode part of the OS string ”h]”(j�)�”}”(hŒ``b_vendor_code``”h]”j)�”}”(hjÊ_h]”hŒ b_vendor_code”…”�”}”(hjÌ_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÈ_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´M¿hjÄ_ubj©)�”}”(hhh]”hì)�”}”(hŒ$bMS_VendorCode part of the OS string”h]”hŒ$bMS_VendorCode part of the OS string”…”�”}”(hjã_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jß_h´M¿hjà_ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÄ_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jß_h´M¿hj¤^ubjŠ)�”}”(hŒD``os_desc_config`` the configuration to be used with OS descriptors ”h]”(j�)�”}”(hŒ``os_desc_config``”h]”j)�”}”(hj`h]”hŒos_desc_config”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÅhjý_ubj©)�”}”(hhh]”hì)�”}”(hŒ0the configuration to be used with OS descriptors”h]”hŒ0the configuration to be used with OS descriptors”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j`h´MÅhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjý_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j`h´MÅhj¤^ubjŠ)�”}”(hŒ>``use_os_string`` false by default, interested gadgets set it ”h]”(j�)�”}”(hŒ``use_os_string``”h]”j)�”}”(hj<`h]”hŒ use_os_string”…”�”}”(hj>`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj:`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÀhj6`ubj©)�”}”(hhh]”hì)�”}”(hŒ+false by default, interested gadgets set it”h]”hŒ+false by default, interested gadgets set it”…”�”}”(hjU`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jQ`h´MÀhjR`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj6`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jQ`h´MÀhj¤^ubjŠ)�”}”(hŒG``bcd_webusb_version`` 0x0100 by default, WebUSB specification version ”h]”(j�)�”}”(hŒ``bcd_webusb_version``”h]”j)�”}”(hju`h]”hŒbcd_webusb_version”…”�”}”(hjw`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjs`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÁhjo`ubj©)�”}”(hhh]”hì)�”}”(hŒ/0x0100 by default, WebUSB specification version”h]”hŒ/0x0100 by default, WebUSB specification version”…”�”}”(hjŽ`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jŠ`h´MÁhj‹`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjo`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jŠ`h´MÁhj¤^ubjŠ)�”}”(hŒ@``b_webusb_vendor_code`` 0x0 by default, vendor code for WebUSB ”h]”(j�)�”}”(hŒ``b_webusb_vendor_code``”h]”j)�”}”(hj®`h]”hŒb_webusb_vendor_code”…”�”}”(hj°`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj¬`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÂhj¨`ubj©)�”}”(hhh]”hì)�”}”(hŒ&0x0 by default, vendor code for WebUSB”h]”hŒ&0x0 by default, vendor code for WebUSB”…”�”}”(hjÇ`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÃ`h´MÂhjÄ`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¨`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÃ`h´MÂhj¤^ubjŠ)�”}”(hŒF``landing_page`` empty by default, landing page to announce in WebUSB ”h]”(j�)�”}”(hŒ``landing_page``”h]”j)�”}”(hjç`h]”hŒ landing_page”…”�”}”(hjé`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjå`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÃhjá`ubj©)�”}”(hhh]”hì)�”}”(hŒ4empty by default, landing page to announce in WebUSB”h]”hŒ4empty by default, landing page to announce in WebUSB”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jü`h´MÃhjý`ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjá`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jü`h´MÃhj¤^ubjŠ)�”}”(hŒ;``use_webusb`` false by default, interested gadgets set it ”h]”(j�)�”}”(hŒ``use_webusb``”h]”j)�”}”(hj ah]”hŒ use_webusb”…”�”}”(hj"ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjaubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÄhjaubj©)�”}”(hhh]”hì)�”}”(hŒ+false by default, interested gadgets set it”h]”hŒ+false by default, interested gadgets set it”…”�”}”(hj9ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j5ah´MÄhj6aubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j5ah´MÄhj¤^ubjŠ)�”}”(hŒF``setup_pending`` true when setup request is queued but not completed ”h]”(j�)�”}”(hŒ``setup_pending``”h]”j)�”}”(hjYah]”hŒ setup_pending”…”�”}”(hj[ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjWaubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÆhjSaubj©)�”}”(hhh]”hì)�”}”(hŒ3true when setup request is queued but not completed”h]”hŒ3true when setup request is queued but not completed”…”�”}”(hjrah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jnah´MÆhjoaubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjSaubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jnah´MÆhj¤^ubjŠ)�”}”(hŒI``os_desc_pending`` true when os_desc request is queued but not completed”h]”(j�)�”}”(hŒ``os_desc_pending``”h]”j)�”}”(hj’ah]”hŒos_desc_pending”…”�”}”(hj”ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj�aubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÆhjŒaubj©)�”}”(hhh]”hì)�”}”(hŒ5true when os_desc request is queued but not completed”h]”hŒ5true when os_desc request is queued but not completed”…”�”}”(hj«ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÇhj¨aubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjŒaubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j§ah´MÆhj¤^ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hj\^ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³j¥Gh´Nubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjÕah]”hŒ Description”…”�”}”(hj×ah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÓaubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÊhjDGh²hubhì)�”}”(hŒiOne of these devices is allocated and initialized before the associated device driver's bind() is called.”h]”hŒkOne of these devices is allocated and initialized before the associated device driver’s bind() is called.”…”�”}”(hjëah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œd/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:349: ./include/linux/usb/composite.h”h´MÇhjDGh²hubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ'config_ep_by_speed_and_alt (C function)”Œc.config_ep_by_speed_and_alt”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒiint config_ep_by_speed_and_alt (struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep, u8 alt)”h]”jÂ)�”}”(hŒhint config_ep_by_speed_and_alt(struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep, u8 alt)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjbh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K…ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj"bh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjbh²hh³j!bh´K…ubjë)�”}”(hŒconfig_ep_by_speed_and_alt”h]”jñ)�”}”(hŒconfig_ep_by_speed_and_alt”h]”hŒconfig_ep_by_speed_and_alt”…”�”}”(hj4bh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj0bubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjbh²hh³j!bh´K…ubjW)�”}”(hŒJ(struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep, u8 alt)”h]”(j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjPbh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjLbubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj]bh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjLbubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjnbh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjkbubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jpbŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j6bsbŒc.config_ep_by_speed_and_alt”†”asbuh1hhjLbubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŽbh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjLbubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjœbh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjLbubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hj©bh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjLbubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjHbubj])�”}”(hŒstruct usb_function *f”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÁbh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj½bubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÎbh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½bubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hjßbh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÜbubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jábŒmodname”NŒ classname”Njšj�)�”}”j ]”jŠbŒc.config_ep_by_speed_and_alt”†”asbuh1hhj½bubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjýbh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj½bubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj ch²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj½bubjñ)�”}”(hŒf”h]”hŒf”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj½bubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjHbubj])�”}”(hŒstruct usb_ep *_ep”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj1ch²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj-cubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj>ch²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj-cubh)�”}”(hhh]”jñ)�”}”(hŒusb_ep”h]”hŒusb_ep”…”�”}”(hjOch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjLcubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jQcŒmodname”NŒ classname”Njšj�)�”}”j ]”jŠbŒc.config_ep_by_speed_and_alt”†”asbuh1hhj-cubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjmch²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj-cubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj{ch²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj-cubjñ)�”}”(hŒ_ep”h]”hŒ_ep”…”�”}”(hjˆch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj-cubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjHbubj])�”}”(hŒu8 alt”h]”(h)�”}”(hhh]”jñ)�”}”(hŒu8”h]”hŒu8”…”�”}”(hj¤ch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¡cubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j¦cŒmodname”NŒ classname”Njšj�)�”}”j ]”jŠbŒc.config_ep_by_speed_and_alt”†”asbuh1hhj�cubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÂch²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj�cubjñ)�”}”(hŒalt”h]”hŒalt”…”�”}”(hjÐch²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj�cubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjHbubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjbh²hh³j!bh´K…ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj bh²hh³j!bh´K…ubah}”(h]”jbah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j!bh´K…hjbh²hubj )�”}”(hhh]”hì)�”}”(hŒ8configures the given endpoint according to gadget speed.”h]”hŒ8configures the given endpoint according to gadget speed.”…”�”}”(hjúch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K…hj÷ch²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjbh²hh³j!bh´K…ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jdjA jdjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX•**Parameters** ``struct usb_gadget *g`` pointer to the gadget ``struct usb_function *f`` usb function ``struct usb_ep *_ep`` the endpoint to configure ``u8 alt`` alternate setting number **Return** error code, 0 on success **Description** This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor. **Note** the supplied function should hold all the descriptors for supported speeds”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjdh]”hŒ Parameters”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjdubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K‰hjdubj…)�”}”(hhh]”(jŠ)�”}”(hŒ/``struct usb_gadget *g`` pointer to the gadget ”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj;dh]”hŒstruct usb_gadget *g”…”�”}”(hj=dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj9dubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K‡hj5dubj©)�”}”(hhh]”hì)�”}”(hŒpointer to the gadget”h]”hŒpointer to the gadget”…”�”}”(hjTdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jPdh´K‡hjQdubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj5dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jPdh´K‡hj2dubjŠ)�”}”(hŒ(``struct usb_function *f`` usb function ”h]”(j�)�”}”(hŒ``struct usb_function *f``”h]”j)�”}”(hjtdh]”hŒstruct usb_function *f”…”�”}”(hjvdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjrdubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Kˆhjndubj©)�”}”(hhh]”hì)�”}”(hŒ usb function”h]”hŒ usb function”…”�”}”(hj�dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j‰dh´KˆhjŠdubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjndubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j‰dh´Kˆhj2dubjŠ)�”}”(hŒ1``struct usb_ep *_ep`` the endpoint to configure ”h]”(j�)�”}”(hŒ``struct usb_ep *_ep``”h]”j)�”}”(hj­dh]”hŒstruct usb_ep *_ep”…”�”}”(hj¯dh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj«dubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K‰hj§dubj©)�”}”(hhh]”hì)�”}”(hŒthe endpoint to configure”h]”hŒthe endpoint to configure”…”�”}”(hjÆdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÂdh´K‰hjÃdubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj§dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÂdh´K‰hj2dubjŠ)�”}”(hŒ$``u8 alt`` alternate setting number ”h]”(j�)�”}”(hŒ ``u8 alt``”h]”j)�”}”(hjædh]”hŒu8 alt”…”�”}”(hjèdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjädubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´KŠhjàdubj©)�”}”(hhh]”hì)�”}”(hŒalternate setting number”h]”hŒalternate setting number”…”�”}”(hjÿdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jûdh´KŠhjüdubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjàdubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jûdh´KŠhj2dubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjdubhì)�”}”(hŒ **Return**”h]”jP )�”}”(hj!eh]”hŒReturn”…”�”}”(hj#eh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´KŒhjdubhì)�”}”(hŒerror code, 0 on success”h]”hŒerror code, 0 on success”…”�”}”(hj7eh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´KŒhjdubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjHeh]”hŒ Description”…”�”}”(hjJeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjFeubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´KŽhjdubhì)�”}”(hX@This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor.”h]”hX@This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor.”…”�”}”(hj^eh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K�hjdubhì)�”}”(hŒ**Note**”h]”jP )�”}”(hjoeh]”hŒNote”…”�”}”(hjqeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjmeubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K”hjdubhì)�”}”(hŒJthe supplied function should hold all the descriptors for supported speeds”h]”hŒJthe supplied function should hold all the descriptors for supported speeds”…”�”}”(hj…eh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´K”hjdubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œconfig_ep_by_speed (C function)”Œc.config_ep_by_speed”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒYint config_ep_by_speed (struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep)”h]”jÂ)�”}”(hŒXint config_ep_by_speed(struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj´eh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj°eh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÃeh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj°eh²hh³jÂeh´Mubjë)�”}”(hŒconfig_ep_by_speed”h]”jñ)�”}”(hŒconfig_ep_by_speed”h]”hŒconfig_ep_by_speed”…”�”}”(hjÕeh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÑeubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj°eh²hh³jÂeh´MubjW)�”}”(hŒB(struct usb_gadget *g, struct usb_function *f, struct usb_ep *_ep)”h]”(j])�”}”(hŒstruct usb_gadget *g”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjñeh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjíeubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjþeh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjíeubh)�”}”(hhh]”jñ)�”}”(hŒ usb_gadget”h]”hŒ usb_gadget”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj fubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jfŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j×esbŒc.config_ep_by_speed”†”asbuh1hhjíeubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj/fh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjíeubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj=fh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjíeubjñ)�”}”(hj×#h]”hŒg”…”�”}”(hjJfh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjíeubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjéeubj])�”}”(hŒstruct usb_function *f”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjbfh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj^fubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjofh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj^fubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hj€fh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj}fubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j‚fŒmodname”NŒ classname”Njšj�)�”}”j ]”j+fŒc.config_ep_by_speed”†”asbuh1hhj^fubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjžfh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj^fubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj¬fh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj^fubjñ)�”}”(hjch]”hŒf”…”�”}”(hj¹fh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj^fubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjéeubj])�”}”(hŒstruct usb_ep *_ep”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÑfh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÍfubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞfh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÍfubh)�”}”(hhh]”jñ)�”}”(hŒusb_ep”h]”hŒusb_ep”…”�”}”(hjïfh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjìfubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jñfŒmodname”NŒ classname”Njšj�)�”}”j ]”j+fŒc.config_ep_by_speed”†”asbuh1hhjÍfubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj gh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÍfubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÍfubjñ)�”}”(hŒ_ep”h]”hŒ_ep”…”�”}”(hj(gh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÍfubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjéeubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj°eh²hh³jÂeh´Mubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj¬eh²hh³jÂeh´Mubah}”(h]”j§eah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jÂeh´Mhj©eh²hubj )�”}”(hhh]”hì)�”}”(hŒ8configures the given endpoint according to gadget speed.”h]”hŒ8configures the given endpoint according to gadget speed.”…”�”}”(hjRgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MhjOgh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj©eh²hh³jÂeh´Mubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jjgjA jjgjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXn**Parameters** ``struct usb_gadget *g`` pointer to the gadget ``struct usb_function *f`` usb function ``struct usb_ep *_ep`` the endpoint to configure **Return** error code, 0 on success **Description** This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor. **Note** the supplied function should hold all the descriptors for supported speeds”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjtgh]”hŒ Parameters”…”�”}”(hjvgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjrgubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubj…)�”}”(hhh]”(jŠ)�”}”(hŒ/``struct usb_gadget *g`` pointer to the gadget ”h]”(j�)�”}”(hŒ``struct usb_gadget *g``”h]”j)�”}”(hj“gh]”hŒstruct usb_gadget *g”…”�”}”(hj•gh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‘gubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhj�gubj©)�”}”(hhh]”hì)�”}”(hŒpointer to the gadget”h]”hŒpointer to the gadget”…”�”}”(hj¬gh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j¨gh´Mhj©gubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj�gubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j¨gh´MhjŠgubjŠ)�”}”(hŒ(``struct usb_function *f`` usb function ”h]”(j�)�”}”(hŒ``struct usb_function *f``”h]”j)�”}”(hjÌgh]”hŒstruct usb_function *f”…”�”}”(hjÎgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÊgubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MhjÆgubj©)�”}”(hhh]”hì)�”}”(hŒ usb function”h]”hŒ usb function”…”�”}”(hjågh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jágh´Mhjâgubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÆgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jágh´MhjŠgubjŠ)�”}”(hŒ1``struct usb_ep *_ep`` the endpoint to configure ”h]”(j�)�”}”(hŒ``struct usb_ep *_ep``”h]”j)�”}”(hjhh]”hŒstruct usb_ep *_ep”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjÿgubj©)�”}”(hhh]”hì)�”}”(hŒthe endpoint to configure”h]”hŒthe endpoint to configure”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jhh´Mhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÿgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jhh´MhjŠgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjngubhì)�”}”(hŒ **Return**”h]”jP )�”}”(hj@hh]”hŒReturn”…”�”}”(hjBhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj>hubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubhì)�”}”(hŒerror code, 0 on success”h]”hŒerror code, 0 on success”…”�”}”(hjVhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjghh]”hŒ Description”…”�”}”(hjihh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjehubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubhì)�”}”(hX@This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor.”h]”hX@This function chooses the right descriptors for a given endpoint according to gadget speed and saves it in the endpoint desc field. If the endpoint already has a descriptor assigned to it - overwrites it with currently corresponding descriptor. The endpoint maxpacket field is updated according to the chosen descriptor.”…”�”}”(hj}hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubhì)�”}”(hŒ**Note**”h]”jP )�”}”(hjŽhh]”hŒNote”…”�”}”(hj�hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjŒhubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubhì)�”}”(hŒJthe supplied function should hold all the descriptors for supported speeds”h]”hŒJthe supplied function should hold all the descriptors for supported speeds”…”�”}”(hj¤hh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhjngubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_add_function (C function)”Œc.usb_add_function”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒVint usb_add_function (struct usb_configuration *config, struct usb_function *function)”h]”jÂ)�”}”(hŒUint usb_add_function(struct usb_configuration *config, struct usb_function *function)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjÓhh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjÏhh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M)ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjâhh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÏhh²hh³jáhh´M)ubjë)�”}”(hŒusb_add_function”h]”jñ)�”}”(hŒusb_add_function”h]”hŒusb_add_function”…”�”}”(hjôhh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjðhubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjÏhh²hh³jáhh´M)ubjW)�”}”(hŒA(struct usb_configuration *config, struct usb_function *function)”h]”(j])�”}”(hŒ struct usb_configuration *config”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj iubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj iubh)�”}”(hhh]”jñ)�”}”(hŒusb_configuration”h]”hŒusb_configuration”…”�”}”(hj.ih²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj+iubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j0iŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jöhsbŒc.usb_add_function”†”asbuh1hhj iubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjNih²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj iubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj\ih²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj iubjñ)�”}”(hŒconfig”h]”hŒconfig”…”�”}”(hjiih²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj iubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjiubj])�”}”(hŒstruct usb_function *function”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj‚ih²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj~iubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�ih²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj~iubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hj ih²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj�iubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j¢iŒmodname”NŒ classname”Njšj�)�”}”j ]”jJiŒc.usb_add_function”†”asbuh1hhj~iubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¾ih²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj~iubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÌih²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj~iubjñ)�”}”(hŒfunction”h]”hŒfunction”…”�”}”(hjÙih²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj~iubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjiubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjÏhh²hh³jáhh´M)ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjËhh²hh³jáhh´M)ubah}”(h]”jÆhah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jáhh´M)hjÈhh²hubj )�”}”(hhh]”hì)�”}”(hŒ!add a function to a configuration”h]”hŒ!add a function to a configuration”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M)hjjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÈhh²hh³jáhh´M)ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jjjA jjjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX**Parameters** ``struct usb_configuration *config`` the configuration ``struct usb_function *function`` the function being added **Context** single threaded during gadget setup **Description** After initialization, each configuration must have one or more functions added to it. Adding a function involves calling its **bind\(\)** method to allocate resources such as interface and string identifiers and endpoints. This function returns the value of the function's bind(), which is zero for success else a negative errno value.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj%jh]”hŒ Parameters”…”�”}”(hj'jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj#jubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M-hjjubj…)�”}”(hhh]”(jŠ)�”}”(hŒ7``struct usb_configuration *config`` the configuration ”h]”(j�)�”}”(hŒ$``struct usb_configuration *config``”h]”j)�”}”(hjDjh]”hŒ struct usb_configuration *config”…”�”}”(hjFjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjBjubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M*hj>jubj©)�”}”(hhh]”hì)�”}”(hŒthe configuration”h]”hŒthe configuration”…”�”}”(hj]jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jYjh´M*hjZjubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj>jubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jYjh´M*hj;jubjŠ)�”}”(hŒ;``struct usb_function *function`` the function being added ”h]”(j�)�”}”(hŒ!``struct usb_function *function``”h]”j)�”}”(hj}jh]”hŒstruct usb_function *function”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj{jubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M+hjwjubj©)�”}”(hhh]”hì)�”}”(hŒthe function being added”h]”hŒthe function being added”…”�”}”(hj–jh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j’jh´M+hj“jubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjwjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j’jh´M+hj;jubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjjubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hj¸jh]”hŒContext”…”�”}”(hjºjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj¶jubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M-hjjubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hjÎjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M,hjjubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjßjh]”hŒ Description”…”�”}”(hjájh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÝjubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M.hjjubhì)�”}”(hŒßAfter initialization, each configuration must have one or more functions added to it. Adding a function involves calling its **bind\(\)** method to allocate resources such as interface and string identifiers and endpoints.”h]”(hŒ~After initialization, each configuration must have one or more functions added to it. Adding a function involves calling its ”…”�”}”(hjõjh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjýjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjõjubhŒU method to allocate resources such as interface and string identifiers and endpoints.”…”�”}”(hjõjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M-hjjubhì)�”}”(hŒpThis function returns the value of the function's bind(), which is zero for success else a negative errno value.”h]”hŒrThis function returns the value of the function’s bind(), which is zero for success else a negative errno value.”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M2hjjubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ$usb_function_deactivate (C function)”Œc.usb_function_deactivate”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ;int usb_function_deactivate (struct usb_function *function)”h]”jÂ)�”}”(hŒ:int usb_function_deactivate(struct usb_function *function)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjEkh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjAkh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjTkh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjAkh²hh³jSkh´M{ubjë)�”}”(hŒusb_function_deactivate”h]”jñ)�”}”(hŒusb_function_deactivate”h]”hŒusb_function_deactivate”…”�”}”(hjfkh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjbkubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjAkh²hh³jSkh´M{ubjW)�”}”(hŒ(struct usb_function *function)”h]”j])�”}”(hŒstruct usb_function *function”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj‚kh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj~kubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�kh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj~kubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hj kh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj�kubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j¢kŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jhksbŒc.usb_function_deactivate”†”asbuh1hhj~kubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÀkh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj~kubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÎkh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj~kubjñ)�”}”(hŒfunction”h]”hŒfunction”…”�”}”(hjÛkh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj~kubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjzkubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjAkh²hh³jSkh´M{ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj=kh²hh³jSkh´M{ubah}”(h]”j8kah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jSkh´M{hj:kh²hubj )�”}”(hhh]”hì)�”}”(hŒ'prevent function and gadget enumeration”h]”hŒ'prevent function and gadget enumeration”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M{hjlh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj:kh²hh³jSkh´M{ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jljA jljB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXº**Parameters** ``struct usb_function *function`` the function that isn't yet ready to respond **Description** Blocks response of the gadget driver to host enumeration by preventing the data line pullup from being activated. This is normally called during **bind\(\)** processing to change from the initial "ready to respond" state, or when a required resource becomes available. For example, drivers that serve as a passthrough to a userspace daemon can block enumeration unless that daemon (such as an OBEX, MTP, or print server) is ready to handle host requests. Not all systems support software control of their USB peripheral data pullups. Returns zero on success, else negative errno.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj'lh]”hŒ Parameters”…”�”}”(hj)lh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj%lubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mhj!lubj…)�”}”(hhh]”jŠ)�”}”(hŒO``struct usb_function *function`` the function that isn't yet ready to respond ”h]”(j�)�”}”(hŒ!``struct usb_function *function``”h]”j)�”}”(hjFlh]”hŒstruct usb_function *function”…”�”}”(hjHlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjDlubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M|hj@lubj©)�”}”(hhh]”hì)�”}”(hŒ,the function that isn't yet ready to respond”h]”hŒ.the function that isn’t yet ready to respond”…”�”}”(hj_lh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j[lh´M|hj\lubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj@lubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j[lh´M|hj=lubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj!lubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj�lh]”hŒ Description”…”�”}”(hjƒlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M~hj!lubhì)�”}”(hX Blocks response of the gadget driver to host enumeration by preventing the data line pullup from being activated. This is normally called during **bind\(\)** processing to change from the initial "ready to respond" state, or when a required resource becomes available.”h]”(hŒ’Blocks response of the gadget driver to host enumeration by preventing the data line pullup from being activated. This is normally called during ”…”�”}”(hj—lh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjŸlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj—lubhŒs processing to change from the initial “ready to respondâ€� state, or when a required resource becomes available.”…”�”}”(hj—lh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M}hj!lubhì)�”}”(hŒ¹For example, drivers that serve as a passthrough to a userspace daemon can block enumeration unless that daemon (such as an OBEX, MTP, or print server) is ready to handle host requests.”h]”hŒ¹For example, drivers that serve as a passthrough to a userspace daemon can block enumeration unless that daemon (such as an OBEX, MTP, or print server) is ready to handle host requests.”…”�”}”(hj¸lh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mƒhj!lubhì)�”}”(hŒNNot all systems support software control of their USB peripheral data pullups.”h]”hŒNNot all systems support software control of their USB peripheral data pullups.”…”�”}”(hjÇlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M‡hj!lubhì)�”}”(hŒ-Returns zero on success, else negative errno.”h]”hŒ-Returns zero on success, else negative errno.”…”�”}”(hjÖlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MŠhj!lubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ"usb_function_activate (C function)”Œc.usb_function_activate”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ9int usb_function_activate (struct usb_function *function)”h]”jÂ)�”}”(hŒ8int usb_function_activate(struct usb_function *function)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjmh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M£ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjmh²hh³jmh´M£ubjë)�”}”(hŒusb_function_activate”h]”jñ)�”}”(hŒusb_function_activate”h]”hŒusb_function_activate”…”�”}”(hj&mh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj"mubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjmh²hh³jmh´M£ubjW)�”}”(hŒ(struct usb_function *function)”h]”j])�”}”(hŒstruct usb_function *function”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjBmh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj>mubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjOmh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj>mubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hj`mh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj]mubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jbmŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j(msbŒc.usb_function_activate”†”asbuh1hhj>mubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj€mh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj>mubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjŽmh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj>mubjñ)�”}”(hŒfunction”h]”hŒfunction”…”�”}”(hj›mh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj>mubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj:mubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjmh²hh³jmh´M£ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjýlh²hh³jmh´M£ubah}”(h]”jølah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jmh´M£hjúlh²hubj )�”}”(hhh]”hì)�”}”(hŒ%allow function and gadget enumeration”h]”hŒ%allow function and gadget enumeration”…”�”}”(hjÅmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M£hjÂmh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjúlh²hh³jmh´M£ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jÝmjA jÝmjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXK**Parameters** ``struct usb_function *function`` function on which usb_function_activate() was called **Description** Reverses effect of usb_function_deactivate(). If no more functions are delaying their activation, the gadget driver will respond to host enumeration procedures. Returns zero on success, else negative errno.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjçmh]”hŒ Parameters”…”�”}”(hjémh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjåmubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M§hjámubj…)�”}”(hhh]”jŠ)�”}”(hŒW``struct usb_function *function`` function on which usb_function_activate() was called ”h]”(j�)�”}”(hŒ!``struct usb_function *function``”h]”j)�”}”(hjnh]”hŒstruct usb_function *function”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjnubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M¤hjnubj©)�”}”(hhh]”hì)�”}”(hŒ4function on which usb_function_activate() was called”h]”hŒ4function on which usb_function_activate() was called”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jnh´M¤hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjnubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jnh´M¤hjýmubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjámubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjAnh]”hŒ Description”…”�”}”(hjCnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj?nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M¦hjámubhì)�”}”(hŒ¡Reverses effect of usb_function_deactivate(). If no more functions are delaying their activation, the gadget driver will respond to host enumeration procedures.”h]”hŒ¡Reverses effect of usb_function_deactivate(). If no more functions are delaying their activation, the gadget driver will respond to host enumeration procedures.”…”�”}”(hjWnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M¥hjámubhì)�”}”(hŒ-Returns zero on success, else negative errno.”h]”hŒ-Returns zero on success, else negative errno.”…”�”}”(hjfnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M©hjámubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_interface_id (C function)”Œc.usb_interface_id”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒVint usb_interface_id (struct usb_configuration *config, struct usb_function *function)”h]”jÂ)�”}”(hŒUint usb_interface_id(struct usb_configuration *config, struct usb_function *function)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj•nh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj‘nh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÅubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¤nh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj‘nh²hh³j£nh´MÅubjë)�”}”(hŒusb_interface_id”h]”jñ)�”}”(hŒusb_interface_id”h]”hŒusb_interface_id”…”�”}”(hj¶nh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj²nubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj‘nh²hh³j£nh´MÅubjW)�”}”(hŒA(struct usb_configuration *config, struct usb_function *function)”h]”(j])�”}”(hŒ struct usb_configuration *config”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÒnh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÎnubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjßnh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÎnubh)�”}”(hhh]”jñ)�”}”(hŒusb_configuration”h]”hŒusb_configuration”…”�”}”(hjðnh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjínubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jònŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j¸nsbŒc.usb_interface_id”†”asbuh1hhjÎnubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÎnubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÎnubjñ)�”}”(hŒconfig”h]”hŒconfig”…”�”}”(hj+oh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÎnubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÊnubj])�”}”(hŒstruct usb_function *function”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjDoh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj@oubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjQoh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj@oubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hjboh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj_oubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jdoŒmodname”NŒ classname”Njšj�)�”}”j ]”j oŒc.usb_interface_id”†”asbuh1hhj@oubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj€oh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj@oubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjŽoh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj@oubjñ)�”}”(hŒfunction”h]”hŒfunction”…”�”}”(hj›oh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj@oubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÊnubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj‘nh²hh³j£nh´MÅubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj�nh²hh³j£nh´MÅubah}”(h]”jˆnah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j£nh´MÅhjŠnh²hubj )�”}”(hhh]”hì)�”}”(hŒallocate an unused interface ID”h]”hŒallocate an unused interface ID”…”�”}”(hjÅoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÅhjÂoh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjŠnh²hh³j£nh´MÅubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jÝojA jÝojB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX_**Parameters** ``struct usb_configuration *config`` configuration associated with the interface ``struct usb_function *function`` function handling the interface **Context** single threaded during gadget setup **Description** usb_interface_id() is called from usb_function.bind() callbacks to allocate new interface IDs. The function driver will then store that ID in interface, association, CDC union, and other descriptors. It will also handle any control requests targeted at that interface, particularly changing its altsetting via set_alt(). There may also be class-specific or vendor-specific requests to handle. All interface identifier should be allocated using this routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier. Note that since interface identifiers are configuration-specific, functions used in more than one configuration (or more than once in a given configuration) need multiple versions of the relevant descriptors. Returns the interface ID which was allocated; or -ENODEV if no more interface IDs can be allocated.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjçoh]”hŒ Parameters”…”�”}”(hjéoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjåoubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÉhjáoubj…)�”}”(hhh]”(jŠ)�”}”(hŒQ``struct usb_configuration *config`` configuration associated with the interface ”h]”(j�)�”}”(hŒ$``struct usb_configuration *config``”h]”j)�”}”(hjph]”hŒ struct usb_configuration *config”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÆhjpubj©)�”}”(hhh]”hì)�”}”(hŒ+configuration associated with the interface”h]”hŒ+configuration associated with the interface”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jph´MÆhjpubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjpubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jph´MÆhjýoubjŠ)�”}”(hŒB``struct usb_function *function`` function handling the interface ”h]”(j�)�”}”(hŒ!``struct usb_function *function``”h]”j)�”}”(hj?ph]”hŒstruct usb_function *function”…”�”}”(hjAph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj=pubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÇhj9pubj©)�”}”(hhh]”hì)�”}”(hŒfunction handling the interface”h]”hŒfunction handling the interface”…”�”}”(hjXph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jTph´MÇhjUpubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj9pubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jTph´MÇhjýoubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjáoubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjzph]”hŒContext”…”�”}”(hj|ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjxpubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÉhjáoubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hj�ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÈhjáoubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj¡ph]”hŒ Description”…”�”}”(hj£ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjŸpubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÊhjáoubhì)�”}”(hX‹usb_interface_id() is called from usb_function.bind() callbacks to allocate new interface IDs. The function driver will then store that ID in interface, association, CDC union, and other descriptors. It will also handle any control requests targeted at that interface, particularly changing its altsetting via set_alt(). There may also be class-specific or vendor-specific requests to handle.”h]”hX‹usb_interface_id() is called from usb_function.bind() callbacks to allocate new interface IDs. The function driver will then store that ID in interface, association, CDC union, and other descriptors. It will also handle any control requests targeted at that interface, particularly changing its altsetting via set_alt(). There may also be class-specific or vendor-specific requests to handle.”…”�”}”(hj·ph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÉhjáoubhì)�”}”(hX�All interface identifier should be allocated using this routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier. Note that since interface identifiers are configuration-specific, functions used in more than one configuration (or more than once in a given configuration) need multiple versions of the relevant descriptors.”h]”hXƒAll interface identifier should be allocated using this routine, to ensure that for example different functions don’t wrongly assign different meanings to the same identifier. Note that since interface identifiers are configuration-specific, functions used in more than one configuration (or more than once in a given configuration) need multiple versions of the relevant descriptors.”…”�”}”(hjÆph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MÐhjáoubhì)�”}”(hŒcReturns the interface ID which was allocated; or -ENODEV if no more interface IDs can be allocated.”h]”hŒcReturns the interface ID which was allocated; or -ENODEV if no more interface IDs can be allocated.”…”�”}”(hjÕph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M×hjáoubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_func_wakeup (C function)”Œc.usb_func_wakeup”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ/int usb_func_wakeup (struct usb_function *func)”h]”jÂ)�”}”(hŒ.int usb_func_wakeup(struct usb_function *func)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjqh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MêubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjqh²hh³jqh´Mêubjë)�”}”(hŒusb_func_wakeup”h]”jñ)�”}”(hŒusb_func_wakeup”h]”hŒusb_func_wakeup”…”�”}”(hj%qh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj!qubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjqh²hh³jqh´MêubjW)�”}”(hŒ(struct usb_function *func)”h]”j])�”}”(hŒstruct usb_function *func”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjAqh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj=qubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjNqh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj=qubh)�”}”(hhh]”jñ)�”}”(hŒ usb_function”h]”hŒ usb_function”…”�”}”(hj_qh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj\qubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jaqŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j'qsbŒc.usb_func_wakeup”†”asbu•ph1hhj=qubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj=qubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj�qh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj=qubjñ)�”}”(hŒfunc”h]”hŒfunc”…”�”}”(hjšqh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj=qubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj9qubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjqh²hh³jqh´Mêubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjüph²hh³jqh´Mêubah}”(h]”j÷pah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jqh´Mêhjùph²hubj )�”}”(hhh]”hì)�”}”(hŒ-sends function wake notification to the host.”h]”hŒ-sends function wake notification to the host.”…”�”}”(hjÄqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MêhjÁqh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjùph²hh³jqh´Mêubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jÜqjA jÜqjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX}**Parameters** ``struct usb_function *func`` function that sends the remote wakeup notification. **Description** Applicable to devices operating at enhanced superspeed when usb functions are put in function suspend state and armed for function remote wakeup. On completion, function wake notification is sent. If the device is in low power state it tries to bring the device to active state before sending the wake notification. Since it is a synchronous call, caller must take care of not calling it in interrupt context. For devices operating at lower speeds returns negative errno. Returns zero on success, else negative errno.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjæqh]”hŒ Parameters”…”�”}”(hjèqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjäqubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mîhjàqubj…)�”}”(hhh]”jŠ)�”}”(hŒR``struct usb_function *func`` function that sends the remote wakeup notification. ”h]”(j�)�”}”(hŒ``struct usb_function *func``”h]”j)�”}”(hjrh]”hŒstruct usb_function *func”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mëhjÿqubj©)�”}”(hhh]”hì)�”}”(hŒ3function that sends the remote wakeup notification.”h]”hŒ3function that sends the remote wakeup notification.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jrh´Mëhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÿqubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jrh´Mëhjüqubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjàqubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj@rh]”hŒ Description”…”�”}”(hjBrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj>rubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Míhjàqubhì)�”}”(hXØApplicable to devices operating at enhanced superspeed when usb functions are put in function suspend state and armed for function remote wakeup. On completion, function wake notification is sent. If the device is in low power state it tries to bring the device to active state before sending the wake notification. Since it is a synchronous call, caller must take care of not calling it in interrupt context. For devices operating at lower speeds returns negative errno.”h]”hXØApplicable to devices operating at enhanced superspeed when usb functions are put in function suspend state and armed for function remote wakeup. On completion, function wake notification is sent. If the device is in low power state it tries to bring the device to active state before sending the wake notification. Since it is a synchronous call, caller must take care of not calling it in interrupt context. For devices operating at lower speeds returns negative errno.”…”�”}”(hjVrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mìhjàqubhì)�”}”(hŒ-Returns zero on success, else negative errno.”h]”hŒ-Returns zero on success, else negative errno.”…”�”}”(hjerh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Môhjàqubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_add_config (C function)”Œc.usb_add_config”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ~int usb_add_config (struct usb_composite_dev *cdev, struct usb_configuration *config, int (*bind)(struct usb_configuration *))”h]”jÂ)�”}”(hŒ|int usb_add_config(struct usb_composite_dev *cdev, struct usb_configuration *config, int (*bind)(struct usb_configuration*))”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj”rh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj�rh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MCubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj£rh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj�rh²hh³j¢rh´MCubjë)�”}”(hŒusb_add_config”h]”jñ)�”}”(hŒusb_add_config”h]”hŒusb_add_config”…”�”}”(hjµrh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj±rubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj�rh²hh³j¢rh´MCubjW)�”}”(hŒj(struct usb_composite_dev *cdev, struct usb_configuration *config, int (*bind)(struct usb_configuration*))”h]”(j])�”}”(hŒstruct usb_composite_dev *cdev”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjÑrh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjÍrubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÞrh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÍrubh)�”}”(hhh]”jñ)�”}”(hŒusb_composite_dev”h]”hŒusb_composite_dev”…”�”}”(hjïrh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjìrubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jñrŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j·rsbŒc.usb_add_config”†”asbuh1hhjÍrubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjÍrubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÍrubjñ)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj*sh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÍrubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÉrubj])�”}”(hŒ struct usb_configuration *config”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjCsh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj?subjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjPsh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj?subh)�”}”(hhh]”jñ)�”}”(hŒusb_configuration”h]”hŒusb_configuration”…”�”}”(hjash²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj^subah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jcsŒmodname”NŒ classname”Njšj�)�”}”j ]”j sŒc.usb_add_config”†”asbuh1hhj?subjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj?subj·)�”}”(hjºh]”hŒ*”…”�”}”(hj�sh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj?subjñ)�”}”(hŒconfig”h]”hŒconfig”…”�”}”(hjšsh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj?subeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÉrubj])�”}”(hŒ&int (*bind)(struct usb_configuration*)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hj³sh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj¯subjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÁsh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¯subj·)�”}”(hŒ(”h]”hŒ(”…”�”}”(hjÏsh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÝsh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subjñ)�”}”(hŒbind”h]”hŒbind”…”�”}”(hjêsh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¯subj·)�”}”(hŒ)”h]”hŒ)”…”�”}”(hjøsh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subj·)�”}”(hjÑsh]”hŒ(”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subjÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj¯subjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj th²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¯subh)�”}”(hhh]”jñ)�”}”(hŒusb_configuration”h]”hŒusb_configuration”…”�”}”(hj1th²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj.tubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j3tŒmodname”NŒ classname”Njšj�)�”}”j ]”j sŒc.usb_add_config”†”asbuh1hhj¯subj·)�”}”(hjºh]”hŒ*”…”�”}”(hjOth²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subj·)�”}”(hjúsh]”hŒ)”…”�”}”(hj\th²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¯subeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÉrubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj�rh²hh³j¢rh´MCubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjŒrh²hh³j¢rh´MCubah}”(h]”j‡rah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j¢rh´MChj‰rh²hubj )�”}”(hhh]”hì)�”}”(hŒ add a configuration to a device.”h]”hŒ add a configuration to a device.”…”�”}”(hj…th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MChj‚th²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj‰rh²hh³j¢rh´MCubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ j�tjA j�tjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXÄ**Parameters** ``struct usb_composite_dev *cdev`` wraps the USB gadget ``struct usb_configuration *config`` the configuration, with bConfigurationValue assigned ``int (*bind)(struct usb_configuration *)`` the configuration's bind function **Context** single threaded during gadget setup **Description** One of the main tasks of a composite **bind\(\)** routine is to add each of the configurations it supports, using this routine. This function returns the value of the configuration's **bind\(\)**, which is zero for success else a negative errno value. Binding configurations assigns global resources including string IDs, and per-configuration resources such as interface IDs and endpoints.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj§th]”hŒ Parameters”…”�”}”(hj©th²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj¥tubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MGhj¡tubj…)�”}”(hhh]”(jŠ)�”}”(hŒ8``struct usb_composite_dev *cdev`` wraps the USB gadget ”h]”(j�)�”}”(hŒ"``struct usb_composite_dev *cdev``”h]”j)�”}”(hjÆth]”hŒstruct usb_composite_dev *cdev”…”�”}”(hjÈth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÄtubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MDhjÀtubj©)�”}”(hhh]”hì)�”}”(hŒwraps the USB gadget”h]”hŒwraps the USB gadget”…”�”}”(hjßth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÛth´MDhjÜtubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÀtubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÛth´MDhj½tubjŠ)�”}”(hŒZ``struct usb_configuration *config`` the configuration, with bConfigurationValue assigned ”h]”(j�)�”}”(hŒ$``struct usb_configuration *config``”h]”j)�”}”(hjÿth]”hŒ struct usb_configuration *config”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjýtubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MEhjùtubj©)�”}”(hhh]”hì)�”}”(hŒ4the configuration, with bConfigurationValue assigned”h]”hŒ4the configuration, with bConfigurationValue assigned”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³juh´MEhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjùtubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³juh´MEhj½tubjŠ)�”}”(hŒN``int (*bind)(struct usb_configuration *)`` the configuration's bind function ”h]”(j�)�”}”(hŒ+``int (*bind)(struct usb_configuration *)``”h]”j)�”}”(hj8uh]”hŒ'int (*bind)(struct usb_configuration *)”…”�”}”(hj:uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj6uubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MFhj2uubj©)�”}”(hhh]”hì)�”}”(hŒ!the configuration's bind function”h]”hŒ#the configuration’s bind function”…”�”}”(hjQuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jMuh´MFhjNuubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj2uubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jMuh´MFhj½tubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hj¡tubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjsuh]”hŒContext”…”�”}”(hjuuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjquubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MHhj¡tubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hj‰uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MGhj¡tubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjšuh]”hŒ Description”…”�”}”(hjœuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj˜uubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MIhj¡tubhì)�”}”(hŒOne of the main tasks of a composite **bind\(\)** routine is to add each of the configurations it supports, using this routine.”h]”(hŒ%One of the main tasks of a composite ”…”�”}”(hj°uh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hj¸uh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj°uubhŒN routine is to add each of the configurations it supports, using this routine.”…”�”}”(hj°uh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MHhj¡tubhì)�”}”(hXThis function returns the value of the configuration's **bind\(\)**, which is zero for success else a negative errno value. Binding configurations assigns global resources including string IDs, and per-configuration resources such as interface IDs and endpoints.”h]”(hŒ9This function returns the value of the configuration’s ”…”�”}”(hjÑuh²hh³Nh´NubjP )�”}”(hŒ **bind\(\)**”h]”hŒbind()”…”�”}”(hjÙuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÑuubhŒÄ, which is zero for success else a negative errno value. Binding configurations assigns global resources including string IDs, and per-configuration resources such as interface IDs and endpoints.”…”�”}”(hjÑuh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MKhj¡tubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_string_id (C function)”Œc.usb_string_id”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ2int usb_string_id (struct usb_composite_dev *cdev)”h]”jÂ)�”}”(hŒ1int usb_string_id(struct usb_composite_dev *cdev)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjvh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MCubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj!vh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjvh²hh³j vh´MCubjë)�”}”(hŒ usb_string_id”h]”jñ)�”}”(hŒ usb_string_id”h]”hŒ usb_string_id”…”�”}”(hj3vh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj/vubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjvh²hh³j vh´MCubjW)�”}”(hŒ (struct usb_composite_dev *cdev)”h]”j])�”}”(hŒstruct usb_composite_dev *cdev”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjOvh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjKvubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj\vh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjKvubh)�”}”(hhh]”jñ)�”}”(hŒusb_composite_dev”h]”hŒusb_composite_dev”…”�”}”(hjmvh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjjvubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jovŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j5vsbŒc.usb_string_id”†”asbuh1hhjKvubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj�vh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjKvubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj›vh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjKvubjñ)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj¨vh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjKvubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjGvubah}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjvh²hh³j vh´MCubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj vh²hh³j vh´MCubah}”(h]”jvah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j vh´MChjvh²hubj )�”}”(hhh]”hì)�”}”(hŒallocate an unused string ID”h]”hŒallocate an unused string ID”…”�”}”(hjÒvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MChjÏvh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjvh²hh³j vh´MCubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jêvjA jêvjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXc**Parameters** ``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated **Context** single threaded during gadget setup **Description** **usb_string_id\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table. All string identifier should be allocated using this, **usb_string_ids_tab\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjôvh]”hŒ Parameters”…”�”}”(hjövh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjòvubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MGhjîvubj…)�”}”(hhh]”jŠ)�”}”(hŒ^``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated ”h]”(j�)�”}”(hŒ"``struct usb_composite_dev *cdev``”h]”j)�”}”(hjwh]”hŒstruct usb_composite_dev *cdev”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MDhj wubj©)�”}”(hhh]”hì)�”}”(hŒ:the device whose string descriptor IDs are being allocated”h]”hŒ:the device whose string descriptor IDs are being allocated”…”�”}”(hj,wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j(wh´MDhj)wubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj wubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j(wh´MDhj wubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hjîvubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjNwh]”hŒContext”…”�”}”(hjPwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjLwubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MFhjîvubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hjdwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MEhjîvubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjuwh]”hŒ Description”…”�”}”(hjwwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjswubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MGhjîvubhì)�”}”(hŒÉ**usb_string_id\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table.”h]”(jP )�”}”(hŒ**usb_string_id\(\)**”h]”hŒusb_string_id()”…”�”}”(hj�wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj‹wubhŒ´ is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table.”…”�”}”(hj‹wh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MFhjîvubhì)�”}”(hŒäAll string identifier should be allocated using this, **usb_string_ids_tab\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hŒ6All string identifier should be allocated using this, ”…”�”}”(hj¨wh²hh³Nh´NubjP )�”}”(hŒ**usb_string_ids_tab\(\)**”h]”hŒusb_string_ids_tab()”…”�”}”(hj°wh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj¨wubhŒ or ”…”�”}”(hj¨wh²hh³Nh´NubjP )�”}”(hŒ**usb_string_ids_n\(\)**”h]”hŒusb_string_ids_n()”…”�”}”(hjÂwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj¨wubhŒz routine, to ensure that for example different functions don’t wrongly assign different meanings to the same identifier.”…”�”}”(hj¨wh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MJhjîvubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_string_ids_tab (C function)”Œc.usb_string_ids_tab”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒOint usb_string_ids_tab (struct usb_composite_dev *cdev, struct usb_string *str)”h]”jÂ)�”}”(hŒNint usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjûwh²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj÷wh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M^ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj xh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj÷wh²hh³j xh´M^ubjë)�”}”(hŒusb_string_ids_tab”h]”jñ)�”}”(hŒusb_string_ids_tab”h]”hŒusb_string_ids_tab”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjxubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj÷wh²hh³j xh´M^ubjW)�”}”(hŒ8(struct usb_composite_dev *cdev, struct usb_string *str)”h]”(j])�”}”(hŒstruct usb_composite_dev *cdev”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj8xh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj4xubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjExh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj4xubh)�”}”(hhh]”jñ)�”}”(hŒusb_composite_dev”h]”hŒusb_composite_dev”…”�”}”(hjVxh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjSxubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jXxŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–jxsbŒc.usb_string_ids_tab”†”asbuh1hhj4xubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjvxh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj4xubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj„xh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj4xubjñ)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj‘xh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj4xubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj0xubj])�”}”(hŒstruct usb_string *str”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjªxh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj¦xubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj·xh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¦xubh)�”}”(hhh]”jñ)�”}”(hŒ usb_string”h]”hŒ usb_string”…”�”}”(hjÈxh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÅxubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jÊxŒmodname”NŒ classname”Njšj�)�”}”j ]”jrxŒc.usb_string_ids_tab”†”asbuh1hhj¦xubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjæxh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj¦xubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjôxh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj¦xubjñ)�”}”(hŒstr”h]”hŒstr”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj¦xubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj0xubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj÷wh²hh³j xh´M^ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjówh²hh³j xh´M^ubah}”(h]”jîwah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j xh´M^hjðwh²hubj )�”}”(hhh]”hì)�”}”(hŒ#allocate unused string IDs in batch”h]”hŒ#allocate unused string IDs in batch”…”�”}”(hj+yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M^hj(yh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjðwh²hh³j xh´M^ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jCyjA jCyjB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hXÖ**Parameters** ``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated ``struct usb_string *str`` an array of usb_string objects to assign numbers to **Context** single threaded during gadget setup **Description** **usb_string_ids\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then copy IDs from the string table to the appropriate descriptors and string table for other languages. All string identifier should be allocated using this, **usb_string_id\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjMyh]”hŒ Parameters”…”�”}”(hjOyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjKyubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MbhjGyubj…)�”}”(hhh]”(jŠ)�”}”(hŒ^``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated ”h]”(j�)�”}”(hŒ"``struct usb_composite_dev *cdev``”h]”j)�”}”(hjlyh]”hŒstruct usb_composite_dev *cdev”…”�”}”(hjnyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjjyubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M_hjfyubj©)�”}”(hhh]”hì)�”}”(hŒ:the device whose string descriptor IDs are being allocated”h]”hŒ:the device whose string descriptor IDs are being allocated”…”�”}”(hj…yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�yh´M_hj‚yubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjfyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�yh´M_hjcyubjŠ)�”}”(hŒO``struct usb_string *str`` an array of usb_string objects to assign numbers to ”h]”(j�)�”}”(hŒ``struct usb_string *str``”h]”j)�”}”(hj¥yh]”hŒstruct usb_string *str”…”�”}”(hj§yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj£yubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M`hjŸyubj©)�”}”(hhh]”hì)�”}”(hŒ3an array of usb_string objects to assign numbers to”h]”hŒ3an array of usb_string objects to assign numbers to”…”�”}”(hj¾yh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jºyh´M`hj»yubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjŸyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jºyh´M`hjcyubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjGyubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjàyh]”hŒContext”…”�”}”(hjâyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjÞyubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MbhjGyubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hjöyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MahjGyubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hjzh]”hŒ Description”…”�”}”(hj zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MchjGyubhì)�”}”(hŒï**usb_string_ids\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then copy IDs from the string table to the appropriate descriptors and string table for other languages.”h]”(jP )�”}”(hŒ**usb_string_ids\(\)**”h]”hŒusb_string_ids()”…”�”}”(hj!zh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjzubhŒÙ is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then copy IDs from the string table to the appropriate descriptors and string table for other languages.”…”�”}”(hjzh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MbhjGyubhì)�”}”(hŒßAll string identifier should be allocated using this, **usb_string_id\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hŒ6All string identifier should be allocated using this, ”…”�”}”(hj:zh²hh³Nh´NubjP )�”}”(hŒ**usb_string_id\(\)**”h]”hŒusb_string_id()”…”�”}”(hjBzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj:zubhŒ or ”…”�”}”(hj:zh²hh³Nh´NubjP )�”}”(hŒ**usb_string_ids_n\(\)**”h]”hŒusb_string_ids_n()”…”�”}”(hjTzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj:zubhŒz routine, to ensure that for example different functions don’t wrongly assign different meanings to the same identifier.”…”�”}”(hj:zh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MghjGyubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ usb_gstrings_attach (C function)”Œc.usb_gstrings_attach”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ|struct usb_string * usb_gstrings_attach (struct usb_composite_dev *cdev, struct usb_gadget_strings **sp, unsigned n_strings)”h]”jÂ)�”}”(hŒzstruct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev, struct usb_gadget_strings **sp, unsigned n_strings)”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj�zh²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj‰zh²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M±ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj›zh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj‰zh²hh³jšzh´M±ubh)�”}”(hhh]”jñ)�”}”(hŒ usb_string”h]”hŒ usb_string”…”�”}”(hj¬zh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj©zubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j®zŒmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–Œusb_gstrings_attach”sbŒc.usb_gstrings_attach”†”asbuh1hhj‰zh²hh³jšzh´M±ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÍzh²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj‰zh²hh³jšzh´M±ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÛzh²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj‰zh²hh³jšzh´M±ubjë)�”}”(hŒusb_gstrings_attach”h]”jñ)�”}”(hjÊzh]”hŒusb_gstrings_attach”…”�”}”(hjìzh²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjèzubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhj‰zh²hh³jšzh´M±ubjW)�”}”(hŒT(struct usb_composite_dev *cdev, struct usb_gadget_strings **sp, unsigned n_strings)”h]”(j])�”}”(hŒstruct usb_composite_dev *cdev”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj{ubh)�”}”(hhh]”jñ)�”}”(hŒusb_composite_dev”h]”hŒusb_composite_dev”…”�”}”(hj%{h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj"{ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j'{Œmodname”NŒ classname”Njšj�)�”}”j ]”jÈzŒc.usb_gstrings_attach”†”asbuh1hhj{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjC{h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj{ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjQ{h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj{ubjñ)�”}”(hŒcdev”h]”hŒcdev”…”�”}”(hj^{h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj{ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÿzubj])�”}”(hŒstruct usb_gadget_strings **sp”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hjw{h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhjs{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„{h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjs{ubh)�”}”(hhh]”jñ)�”}”(hŒusb_gadget_strings”h]”hŒusb_gadget_strings”…”�”}”(hj•{h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj’{ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”j—{Œmodname”NŒ classname”Njšj�)�”}”j ]”jÈzŒc.usb_gstrings_attach”†”asbuh1hhjs{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³{h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjs{ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÁ{h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjs{ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hjÎ{h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjs{ubjñ)�”}”(hŒsp”h]”hŒsp”…”�”}”(hjÛ{h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjs{ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÿzubj])�”}”(hŒunsigned n_strings”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hjô{h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjð{ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjð{ubjñ)�”}”(hŒ n_strings”h]”hŒ n_strings”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjð{ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hjÿzubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhj‰zh²hh³jšzh´M±ubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hj…zh²hh³jšzh´M±ubah}”(h]”j€zah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³jšzh´M±hj‚zh²hubj )�”}”(hhh]”hì)�”}”(hŒ.attach gadget strings to a cdev and assign ids”h]”hŒ.attach gadget strings to a cdev and assign ids”…”�”}”(hj:|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M±hj7|h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj‚zh²hh³jšzh´M±ubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jR|jA jR|jB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX”**Parameters** ``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated and attached. ``struct usb_gadget_strings **sp`` an array of usb_gadget_strings to attach. ``unsigned n_strings`` number of entries in each usb_strings array (sp[]->strings) **Description** This function will create a deep copy of usb_gadget_strings and usb_string and attach it to the cdev. The actual string (usb_string.s) will not be copied but only a referenced will be made. The struct usb_gadget_strings array may contain multiple languages and should be NULL terminated. The ->language pointer of each struct usb_gadget_strings has to contain the same amount of entries. For instance: sp[0] is en-US, sp[1] is es-ES. It is expected that the first usb_string entry of es-ES contains the translation of the first usb_string entry of en-US. Therefore both entries become the same id assign.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hj\|h]”hŒ Parameters”…”�”}”(hj^|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjZ|ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MµhjV|ubj…)�”}”(hhh]”(jŠ)�”}”(hŒl``struct usb_composite_dev *cdev`` the device whose string descriptor IDs are being allocated and attached. ”h]”(j�)�”}”(hŒ"``struct usb_composite_dev *cdev``”h]”j)�”}”(hj{|h]”hŒstruct usb_composite_dev *cdev”…”�”}”(hj}|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjy|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M³hju|ubj©)�”}”(hhh]”hì)�”}”(hŒHthe device whose string descriptor IDs are being allocated and attached.”h]”hŒHthe device whose string descriptor IDs are being allocated and attached.”…”�”}”(hj”|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M²hj‘|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hju|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j�|h´M³hjr|ubjŠ)�”}”(hŒM``struct usb_gadget_strings **sp`` an array of usb_gadget_strings to attach. ”h]”(j�)�”}”(hŒ"``struct usb_gadget_strings **sp``”h]”j)�”}”(hjµ|h]”hŒstruct usb_gadget_strings **sp”…”�”}”(hj·|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj³|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M´hj¯|ubj©)�”}”(hhh]”hì)�”}”(hŒ)an array of usb_gadget_strings to attach.”h]”hŒ)an array of usb_gadget_strings to attach.”…”�”}”(hjÎ|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÊ|h´M´hjË|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj¯|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jÊ|h´M´hjr|ubjŠ)�”}”(hŒS``unsigned n_strings`` number of entries in each usb_strings array (sp[]->strings) ”h]”(j�)�”}”(hŒ``unsigned n_strings``”h]”j)�”}”(hjî|h]”hŒunsigned n_strings”…”�”}”(hjð|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjì|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mµhjè|ubj©)�”}”(hhh]”hì)�”}”(hŒ;number of entries in each usb_strings array (sp[]->strings)”h]”hŒ;number of entries in each usb_strings array (sp[]->strings)”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j}h´Mµhj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjè|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j}h´Mµhjr|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hjV|ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj)}h]”hŒ Description”…”�”}”(hj+}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj'}ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M·hjV|ubhì)�”}”(hX\This function will create a deep copy of usb_gadget_strings and usb_string and attach it to the cdev. The actual string (usb_string.s) will not be copied but only a referenced will be made. The struct usb_gadget_strings array may contain multiple languages and should be NULL terminated. The ->language pointer of each struct usb_gadget_strings has to contain the same amount of entries. For instance: sp[0] is en-US, sp[1] is es-ES. It is expected that the first usb_string entry of es-ES contains the translation of the first usb_string entry of en-US. Therefore both entries become the same id assign.”h]”hX\This function will create a deep copy of usb_gadget_strings and usb_string and attach it to the cdev. The actual string (usb_string.s) will not be copied but only a referenced will be made. The struct usb_gadget_strings array may contain multiple languages and should be NULL terminated. The ->language pointer of each struct usb_gadget_strings has to contain the same amount of entries. For instance: sp[0] is en-US, sp[1] is es-ES. It is expected that the first usb_string entry of es-ES contains the translation of the first usb_string entry of en-US. Therefore both entries become the same id assign.”…”�”}”(hj?}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M¶hjV|ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œusb_string_ids_n (C function)”Œc.usb_string_ids_n”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ>int usb_string_ids_n (struct usb_composite_dev *c, unsigned n)”h]”jÂ)�”}”(hŒ=int usb_string_ids_n(struct usb_composite_dev *c, unsigned n)”h]”(j)�”}”(hŒint”h]”hŒint”…”�”}”(hjn}h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhjj}h²hh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MïubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj}}h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhjj}h²hh³j|}h´Mïubjë)�”}”(hŒusb_string_ids_n”h]”jñ)�”}”(hŒusb_string_ids_n”h]”hŒusb_string_ids_n”…”�”}”(hj�}h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj‹}ubah}”(h]”h ]”(j j eh"]”h$]”h&]”j j uh1jêhjj}h²hh³j|}h´MïubjW)�”}”(hŒ)(struct usb_composite_dev *c, unsigned n)”h]”(j])�”}”(hŒstruct usb_composite_dev *c”h]”(jÈ)�”}”(hjËh]”hŒstruct”…”�”}”(hj«}h²hh³Nh´Nubah}”(h]”h ]”jÔah"]”h$]”h&]”uh1jÇhj§}ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¸}h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj§}ubh)�”}”(hhh]”jñ)�”}”(hŒusb_composite_dev”h]”hŒusb_composite_dev”…”�”}”(hjÉ}h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhjÆ}ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jéŒreftype”j–Œ reftarget”jË}Œmodname”NŒ classname”Njšj�)�”}”j ]”j£)�”}”j–j‘}sbŒc.usb_string_ids_n”†”asbuh1hhj§}ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjé}h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj§}ubj·)�”}”(hjºh]”hŒ*”…”�”}”(hj÷}h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hj§}ubjñ)�”}”(hjéh]”hŒc”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj§}ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj£}ubj])�”}”(hŒ unsigned n”h]”(j)�”}”(hŒunsigned”h]”hŒunsigned”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”j+ah"]”h$]”h&]”uh1jhj~ubjÚ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj*~h²hh³Nh´Nubah}”(h]”h ]”jæah"]”h$]”h&]”uh1jÙhj~ubjñ)�”}”(hjüh]”hŒn”…”�”}”(hj8~h²hh³Nh´Nubah}”(h]”h ]”jüah"]”h$]”h&]”uh1jðhj~ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆj j uh1j\hj£}ubeh}”(h]”h ]”h"]”h$]”h&]”j j uh1jVhjj}h²hh³j|}h´Mïubeh}”(h]”h ]”h"]”h$]”h&]”j j j ˆuh1jÁj j hjf}h²hh³j|}h´Mïubah}”(h]”ja}ah ]”(j j eh"]”h$]”h&]”j ˆj )j huh1j»h³j|}h´Mïhjc}h²hubj )�”}”(hhh]”hì)�”}”(hŒ#allocate unused string IDs in batch”h]”hŒ#allocate unused string IDs in batch”…”�”}”(hja~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mïhj^~h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjc}h²hh³j|}h´Mïubeh}”(h]”h ]”(jéŒfunction”eh"]”h$]”h&]”j? jéj@ jy~jA jy~jB ‰jC ‰jD ‰uh1j¶h²hhjDGh³Nh´NubjF )�”}”(hX_**Parameters** ``struct usb_composite_dev *c`` the device whose string descriptor IDs are being allocated ``unsigned n`` number of string IDs to allocate **Context** single threaded during gadget setup **Description** Returns the first requested ID. This ID and next **n**-1 IDs are now valid IDs. At least provided that **n** is non-zero because if it is, returns last requested ID which is now very useful information. **usb_string_ids_n\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table. All string identifier should be allocated using this, **usb_string_id\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hì)�”}”(hŒ**Parameters**”h]”jP )�”}”(hjƒ~h]”hŒ Parameters”…”�”}”(hj…~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj�~ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Móhj}~ubj…)�”}”(hhh]”(jŠ)�”}”(hŒ[``struct usb_composite_dev *c`` the device whose string descriptor IDs are being allocated ”h]”(j�)�”}”(hŒ``struct usb_composite_dev *c``”h]”j)�”}”(hj¢~h]”hŒstruct usb_composite_dev *c”…”�”}”(hj¤~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mðhjœ~ubj©)�”}”(hhh]”hì)�”}”(hŒ:the device whose string descriptor IDs are being allocated”h]”hŒ:the device whose string descriptor IDs are being allocated”…”�”}”(hj»~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j·~h´Mðhj¸~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjœ~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³j·~h´Mðhj™~ubjŠ)�”}”(hŒ0``unsigned n`` number of string IDs to allocate ”h]”(j�)�”}”(hŒ``unsigned n``”h]”j)�”}”(hjÛ~h]”hŒ unsigned n”…”�”}”(hjÝ~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÙ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�h³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´MñhjÕ~ubj©)�”}”(hhh]”hì)�”}”(hŒ number of string IDs to allocate”h]”hŒ number of string IDs to allocate”…”�”}”(hjô~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jð~h´Mñhjñ~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hjÕ~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jð~h´Mñhj™~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j„hj}~ubhì)�”}”(hŒ **Context**”h]”jP )�”}”(hjh]”hŒContext”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Móhj}~ubhì)�”}”(hŒ#single threaded during gadget setup”h]”hŒ#single threaded during gadget setup”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mòhj}~ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj=h]”hŒ Description”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Môhj}~ubhì)�”}”(hŒÌReturns the first requested ID. This ID and next **n**-1 IDs are now valid IDs. At least provided that **n** is non-zero because if it is, returns last requested ID which is now very useful information.”h]”(hŒ2Returns the first requested ID. This ID and next ”…”�”}”(hjSh²hh³Nh´NubjP )�”}”(hŒ**n**”h]”hŒn”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjSubhŒ2-1 IDs are now valid IDs. At least provided that ”…”�”}”(hjSh²hh³Nh´NubjP )�”}”(hŒ**n**”h]”hŒn”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjSubhŒ^ is non-zero because if it is, returns last requested ID which is now very useful information.”…”�”}”(hjSh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Móhj}~ubhì)�”}”(hŒÌ**usb_string_ids_n\(\)** is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table.”h]”(jP )�”}”(hŒ**usb_string_ids_n\(\)**”h]”hŒusb_string_ids_n()”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj†ubhŒ´ is called from bind() callbacks to allocate string IDs. Drivers for functions, configurations, or gadgets will then store that ID in the appropriate descriptors and string table.”…”�”}”(hj†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M÷hj}~ubhì)�”}”(hŒßAll string identifier should be allocated using this, **usb_string_id\(\)** or **usb_string_ids_n\(\)** routine, to ensure that for example different functions don't wrongly assign different meanings to the same identifier.”h]”(hŒ6All string identifier should be allocated using this, ”…”�”}”(hj£h²hh³Nh´NubjP )�”}”(hŒ**usb_string_id\(\)**”h]”hŒusb_string_id()”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj£ubhŒ or ”…”�”}”(hj£h²hh³Nh´NubjP )�”}”(hŒ**usb_string_ids_n\(\)**”h]”hŒusb_string_ids_n()”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hj£ubhŒz routine, to ensure that for example different functions don’t wrongly assign different meanings to the same identifier.”…”�”}”(hj£h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´Mûhj}~ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubj¦)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j²Œ usb_composite_probe (C function)”Œc.usb_composite_probe”hNt”auh1j¥hjDGh²hh³Nh´Nubj·)�”}”(hhh]”(j¼)�”}”(hŒ=int usb_composite_probe (struct usb_composite_driver *driver)”h]”jÂ)�”}”(hŒthe composite device who’s control transfer was kept waiting”…”�”}”(hjZ„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jV„h´M¥ hjW„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¨hj;„ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j‰h³jV„h´M¥ hj8„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j„hj„ubhì)�”}”(hŒ**Description**”h]”jP )�”}”(hj|„h]”hŒ Description”…”�”}”(hj~„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jO hjz„ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M§ hj„ubhì)�”}”(hXWThis function must be called by the USB function driver to continue with the control transfer's data/status stage in case it had requested to delay the data/status stages. A USB function's setup handler (e.g. set_alt()) can request the composite framework to delay the setup request's data/status stages by returning USB_GADGET_DELAYED_STATUS.”h]”hX]This function must be called by the USB function driver to continue with the control transfer’s data/status stage in case it had requested to delay the data/status stages. A USB function’s setup handler (e.g. set_alt()) can request the composite framework to delay the setup request’s data/status stages by returning USB_GADGET_DELAYED_STATUS.”…”�”}”(hj’„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œe/var/lib/git/docbuild/linux/Documentation/driver-api/usb/gadget:352: ./drivers/usb/gadget/composite.c”h´M¦ hj„ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1jE hjDGh²hh³Nh´Nubeh}”(h]”Œcomposite-device-framework”ah ]”h"]”Œcomposite device framework”ah$]”h&]”uh1hµhjÁh²hh³hÊh´MNubh¶)�”}”(hhh]”(h»)�”}”(hŒComposite Device Functions”h]”hŒComposite Device Functions”…”�”}”(hj³„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj°„h²hh³hÊh´Mdubhì)�”}”(hŒ¤At this writing, a few of the current gadget drivers have been converted to this framework. Near-term plans include converting all of them, except for ``gadgetfs``.”h]”(hŒ—At this writing, a few of the current gadget drivers have been converted to this framework. Near-term plans include converting all of them, except for ”…”�”}”(hjÁ„h²hh³Nh´Nubj)�”}”(hŒ ``gadgetfs``”h]”hŒgadgetfs”…”�”}”(hjÉ„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjÁ„ubhŒ.”…”�”}”(hjÁ„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mfhj°„h²hubeh}”(h]”Œcomposite-device-functions”ah ]”h"]”Œcomposite device functions”ah$]”h&]”uh1hµhjÁh²hh³hÊh´Mdubeh}”(h]”Œkernel-mode-gadget-api”ah ]”h"]”Œkernel mode gadget api”ah$]”h&]”uh1hµhh·h²hh³hÊh´K¯ubh¶)�”}”(hhh]”(h»)�”}”(hŒPeripheral Controller Drivers”h]”hŒPeripheral Controller Drivers”…”�”}”(hjô„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjñ„h²hh³hÊh´Mkubhì)�”}”(hX)The first hardware supporting this API was the NetChip 2280 controller, which supports USB 2.0 high speed and is based on PCI. This is the ``net2280`` driver module. The driver supports Linux kernel versions 2.4 and 2.6; contact NetChip Technologies for development boards and product information.”h]”(hŒ‹The first hardware supporting this API was the NetChip 2280 controller, which supports USB 2.0 high speed and is based on PCI. This is the ”…”�”}”(hj…h²hh³Nh´Nubj)�”}”(hŒ ``net2280``”h]”hŒnet2280”…”�”}”(hj …h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj…ubhŒ“ driver module. The driver supports Linux kernel versions 2.4 and 2.6; contact NetChip Technologies for development boards and product information.”…”�”}”(hj…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mmhjñ„h²hubhì)�”}”(hX¤Other hardware working in the ``gadget`` framework includes: Intel's PXA 25x and IXP42x series processors (``pxa2xx_udc``), Toshiba TC86c001 "Goku-S" (``goku_udc``), Renesas SH7705/7727 (``sh_udc``), MediaQ 11xx (``mq11xx_udc``), Hynix HMS30C7202 (``h7202_udc``), National 9303/4 (``n9604_udc``), Texas Instruments OMAP (``omap_udc``), Sharp LH7A40x (``lh7a40x_udc``), and more. Most of those are full speed controllers.”h]”(hŒOther hardware working in the ”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``gadget``”h]”hŒgadget”…”�”}”(hj*…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒE framework includes: Intel’s PXA 25x and IXP42x series processors (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ``pxa2xx_udc``”h]”hŒ pxa2xx_udc”…”�”}”(hj<…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ"), Toshiba TC86c001 “Goku-Sâ€� (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``goku_udc``”h]”hŒgoku_udc”…”�”}”(hjN…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), Renesas SH7705/7727 (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``sh_udc``”h]”hŒsh_udc”…”�”}”(hj`…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), MediaQ 11xx (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ``mq11xx_udc``”h]”hŒ mq11xx_udc”…”�”}”(hjr…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), Hynix HMS30C7202 (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``h7202_udc``”h]”hŒ h7202_udc”…”�”}”(hj„…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), National 9303/4 (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``n9604_udc``”h]”hŒ n9604_udc”…”�”}”(hj–…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), Texas Instruments OMAP (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ ``omap_udc``”h]”hŒomap_udc”…”�”}”(hj¨…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ), Sharp LH7A40x (”…”�”}”(hj"…h²hh³Nh´Nubj)�”}”(hŒ``lh7a40x_udc``”h]”hŒ lh7a40x_udc”…”�”}”(hjº…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj"…ubhŒ6), and more. Most of those are full speed controllers.”…”�”}”(hj"…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mshjñ„h²hubhì)�”}”(hŒ¥At this writing, there are people at work on drivers in this framework for several other USB device controllers, with plans to make many of them be widely available.”h]”hŒ¥At this writing, there are people at work on drivers in this framework for several other USB device controllers, with plans to make many of them be widely available.”…”�”}”(hjÒ…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mzhjñ„h²hubhì)�”}”(hX¡A partial USB simulator, the ``dummy_hcd`` driver, is available. It can act like a net2280, a pxa25x, or an sa11x0 in terms of available endpoints and device speeds; and it simulates control, bulk, and to some extent interrupt transfers. That lets you develop some parts of a gadget driver on a normal PC, without any special hardware, and perhaps with the assistance of tools such as GDB running with User Mode Linux. At least one person has expressed interest in adapting that approach, hooking it up to a simulator for a microcontroller. Such simulators can help debug subsystems where the runtime hardware is unfriendly to software development, or is not yet available.”h]”(hŒA partial USB simulator, the ”…”�”}”(hjà…h²hh³Nh´Nubj)�”}”(hŒ ``dummy_hcd``”h]”hŒ dummy_hcd”…”�”}”(hjè…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjà…ubhXw driver, is available. It can act like a net2280, a pxa25x, or an sa11x0 in terms of available endpoints and device speeds; and it simulates control, bulk, and to some extent interrupt transfers. That lets you develop some parts of a gadget driver on a normal PC, without any special hardware, and perhaps with the assistance of tools such as GDB running with User Mode Linux. At least one person has expressed interest in adapting that approach, hooking it up to a simulator for a microcontroller. Such simulators can help debug subsystems where the runtime hardware is unfriendly to software development, or is not yet available.”…”�”}”(hjà…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M~hjñ„h²hubhì)�”}”(hŒvSupport for other controllers is expected to be developed and contributed over time, as this driver framework evolves.”h]”hŒvSupport for other controllers is expected to be developed and contributed over time, as this driver framework evolves.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M‰hjñ„h²hubeh}”(h]”Œperipheral-controller-drivers”ah ]”h"]”Œperipheral controller drivers”ah$]”h&]”uh1hµhh·h²hh³hÊh´Mkubh¶)�”}”(hhh]”(h»)�”}”(hŒGadget Drivers”h]”hŒGadget Drivers”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj†h²hh³hÊh´M�ubhì)�”}”(hŒ�In addition to *Gadget Zero* (used primarily for testing and development with drivers for usb controller hardware), other gadget drivers exist.”h]”(hŒIn addition to ”…”�”}”(hj'†h²hh³Nh´Nubj$)�”}”(hŒ *Gadget Zero*”h]”hŒ Gadget Zero”…”�”}”(hj/†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj'†ubhŒs (used primarily for testing and development with drivers for usb controller hardware), other gadget drivers exist.”…”�”}”(hj'†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M�hj†h²hubhì)�”}”(hXÈThere's an ``ethernet`` gadget driver, which implements one of the most useful *Communications Device Class* (CDC) models. One of the standards for cable modem interoperability even specifies the use of this ethernet model as one of two mandatory options. Gadgets using this code look to a USB host as if they're an Ethernet adapter. It provides access to a network where the gadget's CPU is one host, which could easily be bridging, routing, or firewalling access to other networks. Since some hardware can't fully implement the CDC Ethernet requirements, this driver also implements a "good parts only" subset of CDC Ethernet. (That subset doesn't advertise itself as CDC Ethernet, to avoid creating problems.)”h]”(hŒ There’s an ”…”�”}”(hjG†h²hh³Nh´Nubj)�”}”(hŒ ``ethernet``”h]”hŒethernet”…”�”}”(hjO†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjG†ubhŒ8 gadget driver, which implements one of the most useful ”…”�”}”(hjG†h²hh³Nh´Nubj$)�”}”(hŒ*Communications Device Class*”h]”hŒCommunications Device Class”…”�”}”(hja†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjG†ubhXh (CDC) models. One of the standards for cable modem interoperability even specifies the use of this ethernet model as one of two mandatory options. Gadgets using this code look to a USB host as if they’re an Ethernet adapter. It provides access to a network where the gadget’s CPU is one host, which could easily be bridging, routing, or firewalling access to other networks. Since some hardware can’t fully implement the CDC Ethernet requirements, this driver also implements a “good parts onlyâ€� subset of CDC Ethernet. (That subset doesn’t advertise itself as CDC Ethernet, to avoid creating problems.)”…”�”}”(hjG†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M’hj†h²hubhì)�”}”(hX‹Support for Microsoft's ``RNDIS`` protocol has been contributed by Pengutronix and Auerswald GmbH. This is like CDC Ethernet, but it runs on more slightly USB hardware (but less than the CDC subset). However, its main claim to fame is being able to connect directly to recent versions of Windows, using drivers that Microsoft bundles and supports, making it much simpler to network with Windows.”h]”(hŒSupport for Microsoft’s ”…”�”}”(hjy†h²hh³Nh´Nubj)�”}”(hŒ ``RNDIS``”h]”hŒRNDIS”…”�”}”(hj�†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjy†ubhXj protocol has been contributed by Pengutronix and Auerswald GmbH. This is like CDC Ethernet, but it runs on more slightly USB hardware (but less than the CDC subset). However, its main claim to fame is being able to connect directly to recent versions of Windows, using drivers that Microsoft bundles and supports, making it much simpler to network with Windows.”…”�”}”(hjy†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mžhj†h²hubhì)�”}”(hX=There is also support for user mode gadget drivers, using ``gadgetfs``. This provides a *User Mode API* that presents each endpoint as a single file descriptor. I/O is done using normal ``read()`` and ``read()`` calls. Familiar tools like GDB and pthreads can be used to develop and debug user mode drivers, so that once a robust controller driver is available many applications for it won't require new kernel mode software. Linux 2.6 *Async I/O (AIO)* support is available, so that user mode software can stream data with only slightly more overhead than a kernel driver.”h]”(hŒ:There is also support for user mode gadget drivers, using ”…”�”}”(hj™†h²hh³Nh´Nubj)�”}”(hŒ ``gadgetfs``”h]”hŒgadgetfs”…”�”}”(hj¡†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™†ubhŒ. This provides a ”…”�”}”(hj™†h²hh³Nh´Nubj$)�”}”(hŒ*User Mode API*”h]”hŒ User Mode API”…”�”}”(hj³†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj™†ubhŒS that presents each endpoint as a single file descriptor. I/O is done using normal ”…”�”}”(hj™†h²hh³Nh´Nubj)�”}”(hŒ ``read()``”h]”hŒread()”…”�”}”(hjņh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™†ubhŒ and ”…”�”}”(hj™†h²hh³Nh´Nubj)�”}”(hŒ ``read()``”h]”hŒread()”…”�”}”(hj׆h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj™†ubhŒã calls. Familiar tools like GDB and pthreads can be used to develop and debug user mode drivers, so that once a robust controller driver is available many applications for it won’t require new kernel mode software. Linux 2.6 ”…”�”}”(hj™†h²hh³Nh´Nubj$)�”}”(hŒ*Async I/O (AIO)*”h]”hŒAsync I/O (AIO)”…”�”}”(hjé†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj™†ubhŒx support is available, so that user mode software can stream data with only slightly more overhead than a kernel driver.”…”�”}”(hj™†h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M¥hj†h²hubhì)�”}”(hXžThere's a USB Mass Storage class driver, which provides a different solution for interoperability with systems such as MS-Windows and MacOS. That *Mass Storage* driver uses a file or block device as backing store for a drive, like the ``loop`` driver. The USB host uses the BBB, CB, or CBI versions of the mass storage class specification, using transparent SCSI commands to access the data from the backing store.”h]”(hŒ”There’s a USB Mass Storage class driver, which provides a different solution for interoperability with systems such as MS-Windows and MacOS. That ”…”�”}”(hj‡h²hh³Nh´Nubj$)�”}”(hŒ*Mass Storage*”h]”hŒ Mass Storage”…”�”}”(hj ‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hj‡ubhŒK driver uses a file or block device as backing store for a drive, like the ”…”�”}”(hj‡h²hh³Nh´Nubj)�”}”(hŒ``loop``”h]”hŒloop”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhj‡ubhŒ« driver. The USB host uses the BBB, CB, or CBI versions of the mass storage class specification, using transparent SCSI commands to access the data from the backing store.”…”�”}”(hj‡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M®hj†h²hubhì)�”}”(hX~There's a "serial line" driver, useful for TTY style operation over USB. The latest version of that driver supports CDC ACM style operation, like a USB modem, and so on most hardware it can interoperate easily with MS-Windows. One interesting use of that driver is in boot firmware (like a BIOS), which can sometimes use that model with very small systems without real serial lines.”h]”hX„There’s a “serial lineâ€� driver, useful for TTY style operation over USB. The latest version of that driver supports CDC ACM style operation, like a USB modem, and so on most hardware it can interoperate easily with MS-Windows. One interesting use of that driver is in boot firmware (like a BIOS), which can sometimes use that model with very small systems without real serial lines.”…”�”}”(hj3‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mµhj†h²hubhì)�”}”(hŒzSupport for other kinds of gadget is expected to be developed and contributed over time, as this driver framework evolves.”h]”hŒzSupport for other kinds of gadget is expected to be developed and contributed over time, as this driver framework evolves.”…”�”}”(hjA‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M¼hj†h²hubeh}”(h]”Œgadget-drivers”ah ]”h"]”Œgadget drivers”ah$]”h&]”uh1hµhh·h²hh³hÊh´M�ubh¶)�”}”(hhh]”(h»)�”}”(hŒUSB On-The-GO (OTG)”h]”hŒUSB On-The-GO (OTG)”…”�”}”(hjZ‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjW‡h²hh³hÊh´MÀubhì)�”}”(hŒôUSB OTG support on Linux 2.6 was initially developed by Texas Instruments for `OMAP `__ 16xx and 17xx series processors. Other OTG systems should work in similar ways, but the hardware level details could be very different.”h]”(hŒNUSB OTG support on Linux 2.6 was initially developed by Texas Instruments for ”…”�”}”(hjh‡h²hh³Nh´NubhŒ reference”“”)�”}”(hŒ`OMAP `__”h]”hŒOMAP”…”�”}”(hjr‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒOMAP”Œrefuri”Œhttp://www.omap.com”uh1jp‡hjh‡ubhŒˆ 16xx and 17xx series processors. Other OTG systems should work in similar ways, but the hardware level details could be very different.”…”�”}”(hjh‡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MÂhjW‡h²hubhì)�”}”(hX)Systems need specialized hardware support to implement OTG, notably including a special *Mini-AB* jack and associated transceiver to support *Dual-Role* operation: they can act either as a host, using the standard Linux-USB host side driver stack, or as a peripheral, using this ``gadget`` framework. To do that, the system software relies on small additions to those programming interfaces, and on a new internal component (here called an "OTG Controller") affecting which driver stack connects to the OTG port. In each role, the system can reuse the existing pool of hardware-neutral drivers, layered on top of the controller driver interfaces (:c:type:`usb_bus` or :c:type:`usb_gadget`). Such drivers need at most minor changes, and most of the calls added to support OTG can also benefit non-OTG products.”h]”(hŒXSystems need specialized hardware support to implement OTG, notably including a special ”…”�”}”(hjއh²hh³Nh´Nubj$)�”}”(hŒ *Mini-AB*”h]”hŒMini-AB”…”�”}”(hj–‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjއubhŒ, jack and associated transceiver to support ”…”�”}”(hjއh²hh³Nh´Nubj$)�”}”(hŒ *Dual-Role*”h]”hŒ Dual-Role”…”�”}”(hj¨‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjއubhŒ operation: they can act either as a host, using the standard Linux-USB host side driver stack, or as a peripheral, using this ”…”�”}”(hjއh²hh³Nh´Nubj)�”}”(hŒ ``gadget``”h]”hŒgadget”…”�”}”(hjº‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjއubhXj framework. To do that, the system software relies on small additions to those programming interfaces, and on a new internal component (here called an “OTG Controllerâ€�) affecting which driver stack connects to the OTG port. In each role, the system can reuse the existing pool of hardware-neutral drivers, layered on top of the controller driver interfaces (”…”�”}”(hjއh²hh³Nh´Nubh)�”}”(hŒ:c:type:`usb_bus`”h]”j)�”}”(hj·h]”hŒusb_bus”…”�”}”(hjЇh²hh³Nh´Nubah}”(h]”h ]”(jèjéŒc-type”eh"]”h$]”h&]”uh1jhj̇ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jõŒ refdomain”jéŒreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰jšj‰GjûŒusb_bus”uh1hh³hÊh´MÇhjއubhŒ or ”…”�”}”(hjއh²hh³Nh´Nubh)�”}”(hŒ:c:type:`usb_gadget`”h]”j)�”}”(hjñ‡h]”hŒ usb_gadget”…”�”}”(hjó‡h²hh³Nh´Nubah}”(h]”h ]”(jèjéŒc-type”eh"]”h$]”h&]”uh1jhjï‡ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”jõŒ refdomain”jéŒreftype”Œtype”Œ refexplicit”‰Œrefwarn”‰jšj‰GjûŒ usb_gadget”uh1hh³hÊh´MÇhjއubhŒy). Such drivers need at most minor changes, and most of the calls added to support OTG can also benefit non-OTG products.”…”�”}”(hjއh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MÇhjW‡h²hubj[)�”}”(hhh]”(j`)�”}”(hŒŽGadget drivers test the ``is_otg`` flag, and use it to determine whether or not to include an OTG descriptor in each of their configurations. ”h]”hì)�”}”(hŒ�Gadget drivers test the ``is_otg`` flag, and use it to determine whether or not to include an OTG descriptor in each of their configurations.”h]”(hŒGadget drivers test the ”…”�”}”(hjˆh²hh³Nh´Nubj)�”}”(hŒ ``is_otg``”h]”hŒis_otg”…”�”}”(hj'ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjˆubhŒk flag, and use it to determine whether or not to include an OTG descriptor in each of their configurations.”…”�”}”(hjˆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MÔhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjˆh²hh³hÊh´Nubj`)�”}”(hXGadget drivers may need changes to support the two new OTG protocols, exposed in new gadget attributes such as ``b_hnp_enable`` flag. HNP support should be reported through a user interface (two LEDs could suffice), and is triggered in some cases when the host suspends the peripheral. SRP support can be user-initiated just like remote wakeup, probably by pressing the same button. ”h]”hì)�”}”(hX~Gadget drivers may need changes to support the two new OTG protocols, exposed in new gadget attributes such as ``b_hnp_enable`` flag. HNP support should be reported through a user interface (two LEDs could suffice), and is triggered in some cases when the host suspends the peripheral. SRP support can be user-initiated just like remote wakeup, probably by pressing the same button.”h]”(hŒoGadget drivers may need changes to support the two new OTG protocols, exposed in new gadget attributes such as ”…”�”}”(hjIˆh²hh³Nh´Nubj)�”}”(hŒ``b_hnp_enable``”h]”hŒ b_hnp_enable”…”�”}”(hjQˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjIˆubhŒÿ flag. HNP support should be reported through a user interface (two LEDs could suffice), and is triggered in some cases when the host suspends the peripheral. SRP support can be user-initiated just like remote wakeup, probably by pressing the same button.”…”�”}”(hjIˆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MØhjEˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjˆh²hh³hÊh´Nubj`)�”}”(hŒÒOn the host side, USB device drivers need to be taught to trigger HNP at appropriate moments, using ``usb_suspend_device()``. That also conserves battery power, which is useful even for non-OTG configurations. ”h]”hì)�”}”(hŒÑOn the host side, USB device drivers need to be taught to trigger HNP at appropriate moments, using ``usb_suspend_device()``. That also conserves battery power, which is useful even for non-OTG configurations.”h]”(hŒdOn the host side, USB device drivers need to be taught to trigger HNP at appropriate moments, using ”…”�”}”(hjsˆh²hh³Nh´Nubj)�”}”(hŒ``usb_suspend_device()``”h]”hŒusb_suspend_device()”…”�”}”(hj{ˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jhjsˆubhŒU. That also conserves battery power, which is useful even for non-OTG configurations.”…”�”}”(hjsˆh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Mßhjoˆubah}”(h]”h ]”h"]”h$]”h&]”uh1j_hjˆh²hh³hÊh´Nubj`)�”}”(hXXAlso on the host side, a driver must support the OTG "Targeted Peripheral List". That's just a whitelist, used to reject peripherals not supported with a given Linux OTG host. *This whitelist is product-specific; each product must modify* ``otg_whitelist.h`` *to match its interoperability specification.* Non-OTG Linux hosts, like PCs and workstations, normally have some solution for adding drivers, so that peripherals that aren't recognized can eventually be supported. That approach is unreasonable for consumer products that may never have their firmware upgraded, and where it's usually unrealistic to expect traditional PC/workstation/server kinds of support model to work. For example, it's often impractical to change device firmware once the product has been distributed, so driver bugs can't normally be fixed if they're found after shipment. ”h]”(hì)�”}”(hX1Also on the host side, a driver must support the OTG "Targeted Peripheral List". That's just a whitelist, used to reject peripherals not supported with a given Linux OTG host. *This whitelist is product-specific; each product must modify* ``otg_whitelist.h`` *to match its interoperability specification.*”h]”(hŒ¶Also on the host side, a driver must support the OTG “Targeted Peripheral Listâ€�. That’s just a whitelist, used to reject peripherals not supported with a given Linux OTG host. ”…”�”}”(hj�ˆh²hh³Nh´Nubj$)�”}”(hŒ>*This whitelist is product-specific; each product must modify*”h]”hŒjˆ>jAGj>Gj­„jª„jæ„jã„j†j†jT‡jQ‡jb‰j_‰uŒ nametypes”}”(jj‰‰jB‰j¾‰jj$‰jq‰j‹>‰jAG‰j­„‰j愉j†‰jT‡‰jb‰‰uh}”(jg‰h·j?j;j»jEjë„jÁj!jyjnj'jˆ>jtj´j½j™jžj¿jÄjjj¥jªjØ jÝ j#j$#j&j&ji'jn'jÃ(jÈ(j*j"*jw+j|+jÑ,jÖ,j+.j0.j…/jŠ/j1j 1j•5jš5j°8jµ8jX:j]:jÁ;jÆ;j*=j/=j>GjŽ>j¹>j¾>j`AjeAj¹Bj¾BjKEjPEjª„jDGj£Gj©GjJjJjbLjgLjÊMjÏMjUj UjçXjìXjå\jê\jñ]jö]jbj bj§ej¬ejÆhjËhj8kj=kjøljýljˆnj�nj÷pjüpj‡rjŒrjvj vjîwjówj€zj…zja}jf}jéjîj²�j·�j3ƒj8ƒjã„j°„j†jñ„jQ‡j†j_‰jW‡uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.