€•FŒ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/sound/soc/usb”Œ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/sound/soc/usb”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/it_IT/sound/soc/usb”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ja_JP/sound/soc/usb”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ!/translations/ko_KR/sound/soc/usb”Œ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/sound/soc/usb”Œ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/sound/soc/usb”Œ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ŒASoC USB support”h]”hŒASoC USB support”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ;/var/lib/git/docbuild/linux/Documentation/sound/soc/usb.rst”h´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒOverview”h]”hŒOverview”…”�”}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)�”}”(hŒ£In order to leverage the existing USB sound device support in ALSA, the ASoC USB APIs are introduced to allow the subsystems to exchange configuration information.”h]”hŒ£In order to leverage the existing USB sound device support in ALSA, the ASoC USB APIs are introduced to allow the subsystems to exchange configuration information.”…”�”}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)�”}”(hXŸOne potential use case would be to support USB audio offloading, which is an implementation that allows for an alternate power-optimized path in the audio subsystem to handle the transfer of audio data over the USB bus. This would let the main processor to stay in lower power modes for longer duration. The following is an example design of how the ASoC and ALSA pieces can be connected together to achieve this:”h]”hXŸOne potential use case would be to support USB audio offloading, which is an implementation that allows for an alternate power-optimized path in the audio subsystem to handle the transfer of audio data over the USB bus. This would let the main processor to stay in lower power modes for longer duration. The following is an example design of how the ASoC and ALSA pieces can be connected together to achieve this:”…”�”}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hhËh²hubhŒ literal_block”“”)�”}”(hX USB | ASoC | _________________________ | | ASoC Platform card | | |_________________________| | | | | ___V____ ____V____ | |ASoC BE | |ASoC FE | | |DAI LNK | |DAI LNK | | |________| |_________| | ^ ^ ^ | | |________| | ___V____ | | |SoC-USB | | ________ ________ | | | |USB SND |<--->|USBSND |<------------>|________| | |(card.c)| |offld |<---------- | |________| |________|___ | | | ^ ^ | | | ____________V_________ | | | | | |IPC | __ V_______________V_____ | | | |______________________| |USB SND (endpoint.c) | | | | ^ |_________________________| | | | | ^ | | | ___________V___________ | | | |->|audio DSP | ___________V_____________ | | |_______________________| |XHCI HCD |<- | |_________________________| |”h]”hX USB | ASoC | _________________________ | | ASoC Platform card | | |_________________________| | | | | ___V____ ____V____ | |ASoC BE | |ASoC FE | | |DAI LNK | |DAI LNK | | |________| |_________| | ^ ^ ^ | | |________| | ___V____ | | |SoC-USB | | ________ ________ | | | |USB SND |<--->|USBSND |<------------>|________| | |(card.c)| |offld |<---------- | |________| |________|___ | | | ^ ^ | | | ____________V_________ | | | | | |IPC | __ V_______________V_____ | | | |______________________| |USB SND (endpoint.c) | | | | ^ |_________________________| | | | | ^ | | | ___________V___________ | | | |->|audio DSP | ___________V_____________ | | |_______________________| |XHCI HCD |<- | |_________________________| |”…”�”}”hhüsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1húh³hÊh´KhhËh²hubeh}”(h]”Œoverview”ah ]”h"]”Œoverview”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)�”}”(hhh]”(h»)�”}”(hŒSoC USB driver”h]”hŒSoC USB driver”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K2ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Structures”h]”hŒ Structures”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj%h²hh³hÊh´K4ubhÝ)�”}”(hŒ``struct snd_soc_usb``”h]”hŒliteral”“”)�”}”(hj8h]”hŒstruct snd_soc_usb”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K5hj%h²hubhŒ block_quote”“”)�”}”(hX- ``list``: list head for SND SoC struct list - ``component``: reference to ASoC component - ``connection_status_cb``: callback to notify connection events - ``update_offload_route_info``: callback to fetch selected USB sound card/PCM device - ``priv_data``: driver data ”h]”hŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ+``list``: list head for SND SoC struct list”h]”hÝ)�”}”(hj^h]”(j;)�”}”(hŒ``list``”h]”hŒlist”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj`ubhŒ#: list head for SND SoC struct list”…”�”}”(hj`h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K7hj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjWubj[)�”}”(hŒ*``component``: reference to ASoC component”h]”hÝ)�”}”(hjƒh]”(j;)�”}”(hŒ ``component``”h]”hŒ component”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj…ubhŒ: reference to ASoC component”…”�”}”(hj…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K8hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjWubj[)�”}”(hŒ>``connection_status_cb``: callback to notify connection events”h]”hÝ)�”}”(hj¨h]”(j;)�”}”(hŒ``connection_status_cb``”h]”hŒconnection_status_cb”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjªubhŒ&: callback to notify connection events”…”�”}”(hjªh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K9hj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjWubj[)�”}”(hŒS``update_offload_route_info``: callback to fetch selected USB sound card/PCM device”h]”hÝ)�”}”(hŒS``update_offload_route_info``: callback to fetch selected USB sound card/PCM device”h]”(j;)�”}”(hŒ``update_offload_route_info``”h]”hŒupdate_offload_route_info”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjÏubhŒ6: callback to fetch selected USB sound card/PCM device”…”�”}”(hjÏh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K:hjËubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjWubj[)�”}”(hŒ``priv_data``: driver data ”h]”hÝ)�”}”(hŒ``priv_data``: driver data”h]”(j;)�”}”(hŒ ``priv_data``”h]”hŒ priv_data”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjõubhŒ : driver data”…”�”}”(hjõh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kdev). This is created by the ASoC BE DAI link, and the USB sound entity will be able to pass information to the ASoC BE DAI link using this structure.”h]”hŒÿThe snd_soc_usb structure can be referenced using the ASoC platform card device, or a USB device (udev->dev). This is created by the ASoC BE DAI link, and the USB sound entity will be able to pass information to the ASoC BE DAI link using this structure.”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K>hj%h²hubhÝ)�”}”(hŒ``struct snd_soc_usb_device``”h]”j;)�”}”(hj5h]”hŒstruct snd_soc_usb_device”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KChj%h²hubjP)�”}”(hXž- ``card_idx``: sound card index associated with USB sound device - ``chip_idx``: USB sound chip array index - ``cpcm_idx``: capture pcm device indexes associated with the USB sound device - ``ppcm_idx``: playback pcm device indexes associated with the USB sound device - ``num_playback``: number of playback streams - ``num_capture``: number of capture streams - ``list``: list head for the USB sound device list ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ?``card_idx``: sound card index associated with USB sound device”h]”hÝ)�”}”(hjSh]”(j;)�”}”(hŒ ``card_idx``”h]”hŒcard_idx”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjUubhŒ3: sound card index associated with USB sound device”…”�”}”(hjUh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KEhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒ(``chip_idx``: USB sound chip array index”h]”hÝ)�”}”(hjxh]”(j;)�”}”(hŒ ``chip_idx``”h]”hŒchip_idx”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjzubhŒ: USB sound chip array index”…”�”}”(hjzh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KFhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒM``cpcm_idx``: capture pcm device indexes associated with the USB sound device”h]”hÝ)�”}”(hj�h]”(j;)�”}”(hŒ ``cpcm_idx``”h]”hŒcpcm_idx”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjŸubhŒA: capture pcm device indexes associated with the USB sound device”…”�”}”(hjŸh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KGhj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒN``ppcm_idx``: playback pcm device indexes associated with the USB sound device”h]”hÝ)�”}”(hjÂh]”(j;)�”}”(hŒ ``ppcm_idx``”h]”hŒppcm_idx”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjÄubhŒB: playback pcm device indexes associated with the USB sound device”…”�”}”(hjÄh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KHhjÀubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒ,``num_playback``: number of playback streams”h]”hÝ)�”}”(hjçh]”(j;)�”}”(hŒ``num_playback``”h]”hŒ num_playback”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjéubhŒ: number of playback streams”…”�”}”(hjéh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KIhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒ*``num_capture``: number of capture streams”h]”hÝ)�”}”(hj h]”(j;)�”}”(hŒ``num_capture``”h]”hŒ num_capture”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjubhŒ: number of capture streams”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KJhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubj[)�”}”(hŒ2``list``: list head for the USB sound device list ”h]”hÝ)�”}”(hŒ1``list``: list head for the USB sound device list”h]”(j;)�”}”(hŒ``list``”h]”hŒlist”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj3ubhŒ): list head for the USB sound device list”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KKhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjNubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´KEhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KEhj%h²hubhÝ)�”}”(hŒÎThe struct snd_soc_usb_device is created by the USB sound offload driver. This will carry basic parameters/limitations that will be used to determine the possible offloading paths for this USB audio device.”h]”hŒÎThe struct snd_soc_usb_device is created by the USB sound offload driver. This will carry basic parameters/limitations that will be used to determine the possible offloading paths for this USB audio device.”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KMhj%h²hubeh}”(h]”Œ structures”ah ]”h"]”Œ structures”ah$]”h&]”uh1hµhjh²hh³hÊh´K4ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Functions”h]”hŒ Functions”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjwh²hh³hÊh´KRubhû)�”}”(hŒtint snd_soc_usb_find_supported_format(int card_idx, struct snd_pcm_hw_params *params, int direction)”h]”hŒtint snd_soc_usb_find_supported_format(int card_idx, struct snd_pcm_hw_params *params, int direction)”…”�”}”hjˆsbah}”(h]”h ]”h"]”h$]”h&]”j j Œforce”‰Œlanguage”Œrst”Œhighlight_args”}”uh1húh³hÊh´KShjwh²hubhŒcomment”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KWubjP)�”}”(hŒ£- ``card_idx``: the index into the USB sound chip array. - ``params``: Requested PCM parameters from the USB DPCM BE DAI link - ``direction``: capture or playback ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ6``card_idx``: the index into the USB sound chip array.”h]”hÝ)�”}”(hj¯h]”(j;)�”}”(hŒ ``card_idx``”h]”hŒcard_idx”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj±ubhŒ*: the index into the USB sound chip array.”…”�”}”(hj±h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KYhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjªubj[)�”}”(hŒB``params``: Requested PCM parameters from the USB DPCM BE DAI link”h]”hÝ)�”}”(hjÔh]”(j;)�”}”(hŒ ``params``”h]”hŒparams”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjÖubhŒ8: Requested PCM parameters from the USB DPCM BE DAI link”…”�”}”(hjÖh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KZhjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjªubj[)�”}”(hŒ#``direction``: capture or playback ”h]”hÝ)�”}”(hŒ"``direction``: capture or playback”h]”(j;)�”}”(hŒ ``direction``”h]”hŒ direction”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjûubhŒ: capture or playback”…”�”}”(hjûh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K[hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjªubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´KYhj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KYhjwh²hubhÝ)�”}”(hŒ”**snd_soc_usb_find_supported_format()** ensures that the requested audio profile being requested by the external DSP is supported by the USB device.”h]”(hŒstrong”“”)�”}”(hŒ'**snd_soc_usb_find_supported_format()**”h]”hŒ#snd_soc_usb_find_supported_format()”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj)ubhŒm ensures that the requested audio profile being requested by the external DSP is supported by the USB device.”…”�”}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K]hjwh²hubhÝ)�”}”(hŒ1Returns 0 on success, and -EOPNOTSUPP on failure.”h]”hŒ1Returns 0 on success, and -EOPNOTSUPP on failure.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K`hjwh²hubhû)�”}”(hŒOint snd_soc_usb_connect(struct device *usbdev, struct snd_soc_usb_device *sdev)”h]”hŒOint snd_soc_usb_connect(struct device *usbdev, struct snd_soc_usb_device *sdev)”…”�”}”hjUsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´Kbhjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KeubjP)�”}”(hŒX- ``usbdev``: the usb device that was discovered - ``sdev``: capabilities of the device ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ.``usbdev``: the usb device that was discovered”h]”hÝ)�”}”(hjwh]”(j;)�”}”(hŒ ``usbdev``”h]”hŒusbdev”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjyubhŒ$: the usb device that was discovered”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kghjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjrubj[)�”}”(hŒ%``sdev``: capabilities of the device ”h]”hÝ)�”}”(hŒ$``sdev``: capabilities of the device”h]”(j;)�”}”(hŒ``sdev``”h]”hŒsdev”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjžubhŒ: capabilities of the device”…”�”}”(hjžh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Khhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjrubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´Kghjnubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kghjwh²hubhÝ)�”}”(hX**snd_soc_usb_connect()** notifies the ASoC USB DPCM BE DAI link of a USB audio device detection. This can be utilized in the BE DAI driver to keep track of available USB audio devices. This is intended to be called by the USB offload driver residing in USB SND.”h]”(j.)�”}”(hŒ**snd_soc_usb_connect()**”h]”hŒsnd_soc_usb_connect()”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjÌubhŒï notifies the ASoC USB DPCM BE DAI link of a USB audio device detection. This can be utilized in the BE DAI driver to keep track of available USB audio devices. This is intended to be called by the USB offload driver residing in USB SND.”…”�”}”(hjÌh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kjhjwh²hubhÝ)�”}”(hŒ5Returns 0 on success, negative error code on failure.”h]”hŒ5Returns 0 on success, negative error code on failure.”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kohjwh²hubhû)�”}”(hŒRint snd_soc_usb_disconnect(struct device *usbdev, struct snd_soc_usb_device *sdev)”h]”hŒRint snd_soc_usb_disconnect(struct device *usbdev, struct snd_soc_usb_device *sdev)”…”�”}”hjösbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´Kqhjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KtubjP)�”}”(hŒO- ``usbdev``: the usb device that was removed - ``sdev``: capabilities to free ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ+``usbdev``: the usb device that was removed”h]”hÝ)�”}”(hjh]”(j;)�”}”(hŒ ``usbdev``”h]”hŒusbdev”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjubhŒ!: the usb device that was removed”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kvhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjubj[)�”}”(hŒ``sdev``: capabilities to free ”h]”hÝ)�”}”(hŒ``sdev``: capabilities to free”h]”(j;)�”}”(hŒ``sdev``”h]”hŒsdev”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj?ubhŒ: capabilities to free”…”�”}”(hj?h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kwhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´Kvhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Kvhjwh²hubhÝ)�”}”(hŒ´**snd_soc_usb_disconnect()** notifies the ASoC USB DPCM BE DAI link of a USB audio device removal. This is intended to be called by the USB offload driver that resides in USB SND.”h]”(j.)�”}”(hŒ**snd_soc_usb_disconnect()**”h]”hŒsnd_soc_usb_disconnect()”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjmubhŒ˜ notifies the ASoC USB DPCM BE DAI link of a USB audio device removal. This is intended to be called by the USB offload driver that resides in USB SND.”…”�”}”(hjmh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kyhjwh²hubhû)�”}”(hŒ7void *snd_soc_usb_find_priv_data(struct device *usbdev)”h]”hŒ7void *snd_soc_usb_find_priv_data(struct device *usbdev)”…”�”}”hj‰sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´K}hjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´K€ubjP)�”}”(hŒ?- ``usbdev``: the usb device to reference to find private data ”h]”jV)�”}”(hhh]”j[)�”}”(hŒ=``usbdev``: the usb device to reference to find private data ”h]”hÝ)�”}”(hŒ<``usbdev``: the usb device to reference to find private data”h]”(j;)�”}”(hŒ ``usbdev``”h]”hŒusbdev”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj­ubhŒ2: the usb device to reference to find private data”…”�”}”(hj­h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K‚hj©ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj¦ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´K‚hj¢ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K‚hjwh²hubhÝ)�”}”(hŒV**snd_soc_usb_find_priv_data()** fetches the private data saved to the SoC USB device.”h]”(j.)�”}”(hŒ **snd_soc_usb_find_priv_data()**”h]”hŒsnd_soc_usb_find_priv_data()”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjÛubhŒ6 fetches the private data saved to the SoC USB device.”…”�”}”(hjÛh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K„hjwh²hubhÝ)�”}”(hŒ9Returns pointer to priv_data on success, NULL on failure.”h]”hŒ9Returns pointer to priv_data on success, NULL on failure.”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K‡hjwh²hubhû)�”}”(hŒ‚int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component, struct snd_soc_jack *jack)”h]”hŒ‚int snd_soc_usb_setup_offload_jack(struct snd_soc_component *component, struct snd_soc_jack *jack)”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´K‰hjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´K�ubjP)�”}”(hŒW- ``component``: ASoC component to add the jack - ``jack``: jack component to populate ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ-``component``: ASoC component to add the jack”h]”hÝ)�”}”(hj'h]”(j;)�”}”(hŒ ``component``”h]”hŒ component”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj)ubhŒ : ASoC component to add the jack”…”�”}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj"ubj[)�”}”(hŒ%``jack``: jack component to populate ”h]”hÝ)�”}”(hŒ$``jack``: jack component to populate”h]”(j;)�”}”(hŒ``jack``”h]”hŒjack”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjNubhŒ: jack component to populate”…”�”}”(hjNh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K�hjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj"ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´K�hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K�hjwh²hubhÝ)�”}”(hX**snd_soc_usb_setup_offload_jack()** is a helper to add a sound jack control to the platform sound card. This will allow for consistent naming to be used on designs that support USB audio offloading. Additionally, this will enable the jack to notify of changes.”h]”(j.)�”}”(hŒ$**snd_soc_usb_setup_offload_jack()**”h]”hŒ snd_soc_usb_setup_offload_jack()”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj|ubhŒã is a helper to add a sound jack control to the platform sound card. This will allow for consistent naming to be used on designs that support USB audio offloading. Additionally, this will enable the jack to notify of changes.”…”�”}”(hj|h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K’hjwh²hubhÝ)�”}”(hŒ)Returns 0 on success, negative otherwise.”h]”hŒ)Returns 0 on success, negative otherwise.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K—hjwh²hubhû)�”}”(hŒÍint snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm, int direction, enum snd_soc_usb_kctl path, long *route)”h]”hŒÍint snd_soc_usb_update_offload_route(struct device *dev, int card, int pcm, int direction, enum snd_soc_usb_kctl path, long *route)”…”�”}”hj¦sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´K™hjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KžubjP)�”}”(hX- ``dev``: USB device to look up offload path mapping - ``card``: USB sound card index - ``pcm``: USB sound PCM device index - ``direction``: direction to fetch offload routing information - ``path``: kcontrol selector - pcm device or card index - ``route``: mapping of sound card and pcm indexes for the offload path. This is an array of two integers that will carry the card and pcm device indexes in that specific order. This can be used as the array for the kcontrol output. ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ3``dev``: USB device to look up offload path mapping”h]”hÝ)�”}”(hjÈh]”(j;)�”}”(hŒ``dev``”h]”hŒdev”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjÊubhŒ,: USB device to look up offload path mapping”…”�”}”(hjÊh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K hjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubj[)�”}”(hŒ``card``: USB sound card index”h]”hÝ)�”}”(hjíh]”(j;)�”}”(hŒ``card``”h]”hŒcard”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjïubhŒ: USB sound card index”…”�”}”(hjïh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¡hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubj[)�”}”(hŒ#``pcm``: USB sound PCM device index”h]”hÝ)�”}”(hjh]”(j;)�”}”(hŒ``pcm``”h]”hŒpcm”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjubhŒ: USB sound PCM device index”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¢hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubj[)�”}”(hŒ=``direction``: direction to fetch offload routing information”h]”hÝ)�”}”(hj7h]”(j;)�”}”(hŒ ``direction``”h]”hŒ direction”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj9ubhŒ0: direction to fetch offload routing information”…”�”}”(hj9h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K£hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubj[)�”}”(hŒ6``path``: kcontrol selector - pcm device or card index”h]”hÝ)�”}”(hj\h]”(j;)�”}”(hŒ``path``”h]”hŒpath”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj^ubhŒ.: kcontrol selector - pcm device or card index”…”�”}”(hj^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¤hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubj[)�”}”(hX ``route``: mapping of sound card and pcm indexes for the offload path. This is an array of two integers that will carry the card and pcm device indexes in that specific order. This can be used as the array for the kcontrol output. ”h]”hŒdefinition_list”“”)�”}”(hhh]”hŒdefinition_list_item”“”)�”}”(hŒé``route``: mapping of sound card and pcm indexes for the offload path. This is an array of two integers that will carry the card and pcm device indexes in that specific order. This can be used as the array for the kcontrol output. ”h]”(hŒterm”“”)�”}”(hŒO``route``: mapping of sound card and pcm indexes for the offload path. This is”h]”(j;)�”}”(hŒ ``route``”h]”hŒroute”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj�ubhŒF: mapping of sound card and pcm indexes for the offload path. This is”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´K¨hjŠubhŒ definition”“”)�”}”(hhh]”hÝ)�”}”(hŒ˜an array of two integers that will carry the card and pcm device indexes in that specific order. This can be used as the array for the kcontrol output.”h]”hŒ˜an array of two integers that will carry the card and pcm device indexes in that specific order. This can be used as the array for the kcontrol output.”…”�”}”(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&]”uh1jˆh³hÊh´K¨hj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jƒhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÃubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´K hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K hjwh²hubhÝ)�”}”(hX-**snd_soc_usb_update_offload_route()** calls a registered callback to the USB BE DAI link to fetch the information about the mapped ASoC devices for executing USB audio offload for the device. ``route`` may be a pointer to a kcontrol value output array, which carries values when the kcontrol is read.”h]”(j.)�”}”(hŒ&**snd_soc_usb_update_offload_route()**”h]”hŒ"snd_soc_usb_update_offload_route()”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjãubhŒ› calls a registered callback to the USB BE DAI link to fetch the information about the mapped ASoC devices for executing USB audio offload for the device. ”…”�”}”(hjãh²hh³Nh´Nubj;)�”}”(hŒ ``route``”h]”hŒroute”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjãubhŒc may be a pointer to a kcontrol value output array, which carries values when the kcontrol is read.”…”�”}”(hjãh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kªhjwh²hubhÝ)�”}”(hŒ)Returns 0 on success, negative otherwise.”h]”hŒ)Returns 0 on success, negative otherwise.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¯hjwh²hubhû)�”}”(hŒostruct snd_soc_usb *snd_soc_usb_allocate_port(struct snd_soc_component *component, void *data);”h]”hŒostruct snd_soc_usb *snd_soc_usb_allocate_port(struct snd_soc_component *component, void *data);”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´K±hjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KµubjP)�”}”(hŒE- ``component``: DPCM BE DAI link component - ``data``: private data ”h]”jV)�”}”(hhh]”(j[)�”}”(hŒ)``component``: DPCM BE DAI link component”h]”hÝ)�”}”(hjAh]”(j;)�”}”(hŒ ``component``”h]”hŒ component”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjCubhŒ: DPCM BE DAI link component”…”�”}”(hjCh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K·hj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj<ubj[)�”}”(hŒ``data``: private data ”h]”hÝ)�”}”(hŒ``data``: private data”h]”(j;)�”}”(hŒ``data``”h]”hŒdata”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjhubhŒ: private data”…”�”}”(hjhh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¸hjdubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj<ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´K·hj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K·hjwh²hubhÝ)�”}”(hŒ�**snd_soc_usb_allocate_port()** allocates a SoC USB device and populates standard parameters that is used for further operations.”h]”(j.)�”}”(hŒ**snd_soc_usb_allocate_port()**”h]”hŒsnd_soc_usb_allocate_port()”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj–ubhŒb allocates a SoC USB device and populates standard parameters that is used for further operations.”…”�”}”(hj–h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kºhjwh²hubhÝ)�”}”(hŒBReturns a pointer to struct soc_usb on success, negative on error.”h]”hŒBReturns a pointer to struct soc_usb on success, negative on error.”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K½hjwh²hubhû)�”}”(hŒ4void snd_soc_usb_free_port(struct snd_soc_usb *usb);”h]”hŒ4void snd_soc_usb_free_port(struct snd_soc_usb *usb);”…”�”}”hjÀsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´K¿hjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KÂubjP)�”}”(hŒ"- ``usb``: SoC USB device to free ”h]”jV)�”}”(hhh]”j[)�”}”(hŒ ``usb``: SoC USB device to free ”h]”hÝ)�”}”(hŒ``usb``: SoC USB device to free”h]”(j;)�”}”(hŒ``usb``”h]”hŒusb”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjäubhŒ: SoC USB device to free”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÄhjàubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjÝubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´KÄhjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÄhjwh²hubhÝ)�”}”(hŒ3**snd_soc_usb_free_port()** frees a SoC USB device.”h]”(j.)�”}”(hŒ**snd_soc_usb_free_port()**”h]”hŒsnd_soc_usb_free_port()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubhŒ frees a SoC USB device.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÆhjwh²hubhû)�”}”(hŒ3void snd_soc_usb_add_port(struct snd_soc_usb *usb);”h]”hŒ3void snd_soc_usb_add_port(struct snd_soc_usb *usb);”…”�”}”hj. sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´KÈhjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KËubjP)�”}”(hŒ!- ``usb``: SoC USB device to add ”h]”jV)�”}”(hhh]”j[)�”}”(hŒ``usb``: SoC USB device to add ”h]”hÝ)�”}”(hŒ``usb``: SoC USB device to add”h]”(j;)�”}”(hŒ``usb``”h]”hŒusb”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjR ubhŒ: SoC USB device to add”…”�”}”(hjR h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÍhjN ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhjK ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´KÍhjG ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´KÍhjwh²hubhÝ)�”}”(hŒ•**snd_soc_usb_add_port()** add an allocated SoC USB device to the SOC USB framework. Once added, this device can be referenced by further operations.”h]”(j.)�”}”(hŒ**snd_soc_usb_add_port()**”h]”hŒsnd_soc_usb_add_port()”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj€ ubhŒ{ add an allocated SoC USB device to the SOC USB framework. Once added, this device can be referenced by further operations.”…”�”}”(hj€ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÏhjwh²hubhû)�”}”(hŒ6void snd_soc_usb_remove_port(struct snd_soc_usb *usb);”h]”hŒ6void snd_soc_usb_remove_port(struct snd_soc_usb *usb);”…”�”}”hjœ sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´KÒhjwh²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hjwh²hh³hÊh´KÕubjP)�”}”(hŒ$- ``usb``: SoC USB device to remove ”h]”jV)�”}”(hhh]”j[)�”}”(hŒ"``usb``: SoC USB device to remove ”h]”hÝ)�”}”(hŒ!``usb``: SoC USB device to remove”h]”(j;)�”}”(hŒ``usb``”h]”hŒusb”…”�”}”(hjÄ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjÀ ubhŒ: SoC USB device to remove”…”�”}”(hjÀ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K×hj¼ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj¹ ubah}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´K×hjµ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´K×hjwh²hubhÝ)�”}”(hŒµ**snd_soc_usb_remove_port()** removes a SoC USB device from the SoC USB framework. After removing a device, any SOC USB operations would not be able to reference the device removed.”h]”(j.)�”}”(hŒ**snd_soc_usb_remove_port()**”h]”hŒsnd_soc_usb_remove_port()”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjî ubhŒ˜ removes a SoC USB device from the SoC USB framework. After removing a device, any SOC USB operations would not be able to reference the device removed.”…”�”}”(hjî h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÙhjwh²hubeh}”(h]”Œ functions”ah ]”h"]”Œ functions”ah$]”h&]”uh1hµhjh²hh³hÊh´KRubh¶)�”}”(hhh]”(h»)�”}”(hŒHow to Register to SoC USB”h]”hŒHow to Register to SoC USB”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj h²hh³hÊh´KÞubhÝ)�”}”(hŒìThe ASoC DPCM USB BE DAI link is the entity responsible for allocating and registering the SoC USB device on the component bind. Likewise, it will also be responsible for freeing the allocated resources. An example can be shown below:”h]”hŒìThe ASoC DPCM USB BE DAI link is the entity responsible for allocating and registering the SoC USB device on the component bind. Likewise, it will also be responsible for freeing the allocated resources. An example can be shown below:”…”�”}”(hj# h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kßhj h²hubhû)�”}”(hXNstatic int q6usb_component_probe(struct snd_soc_component *component) { ... data->usb = snd_soc_usb_allocate_port(component, 1, &data->priv); if (!data->usb) return -ENOMEM; usb->connection_status_cb = q6usb_alsa_connection_cb; ret = snd_soc_usb_add_port(usb); if (ret < 0) { dev_err(component->dev, "failed to add usb port\n"); goto free_usb; } ... } static void q6usb_component_remove(struct snd_soc_component *component) { ... snd_soc_usb_remove_port(data->usb); snd_soc_usb_free_port(data->usb); } static const struct snd_soc_component_driver q6usb_dai_component = { .probe = q6usb_component_probe, .remove = q6usb_component_remove, .name = "q6usb-dai-component", ... };”h]”hXNstatic int q6usb_component_probe(struct snd_soc_component *component) { ... data->usb = snd_soc_usb_allocate_port(component, 1, &data->priv); if (!data->usb) return -ENOMEM; usb->connection_status_cb = q6usb_alsa_connection_cb; ret = snd_soc_usb_add_port(usb); if (ret < 0) { dev_err(component->dev, "failed to add usb port\n"); goto free_usb; } ... } static void q6usb_component_remove(struct snd_soc_component *component) { ... snd_soc_usb_remove_port(data->usb); snd_soc_usb_free_port(data->usb); } static const struct snd_soc_component_driver q6usb_dai_component = { .probe = q6usb_component_probe, .remove = q6usb_component_remove, .name = "q6usb-dai-component", ... };”…”�”}”hj1 sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´Kähj h²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hj h²hh³hÊh´MubhÝ)�”}”(hŒåBE DAI links can pass along vendor specific information as part of the call to allocate the SoC USB device. This will allow any BE DAI link parameters or settings to be accessed by the USB offload driver that resides in USB SND.”h]”hŒåBE DAI links can pass along vendor specific information as part of the call to allocate the SoC USB device. This will allow any BE DAI link parameters or settings to be accessed by the USB offload driver that resides in USB SND.”…”�”}”(hjJ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj h²hubeh}”(h]”Œhow-to-register-to-soc-usb”ah ]”h"]”Œhow to register to soc usb”ah$]”h&]”uh1hµhjh²hh³hÊh´KÞubh¶)�”}”(hhh]”(h»)�”}”(hŒ USB Audio Device Connection Flow”h]”hŒ USB Audio Device Connection Flow”…”�”}”(hjc h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj` h²hh³hÊh´M ubhÝ)�”}”(hX&USB devices can be hotplugged into the USB ports at any point in time. The BE DAI link should be aware of the current state of the physical USB port, i.e. if there are any USB devices with audio interface(s) connected. connection_status_cb() can be used to notify the BE DAI link of any change.”h]”hX&USB devices can be hotplugged into the USB ports at any point in time. The BE DAI link should be aware of the current state of the physical USB port, i.e. if there are any USB devices with audio interface(s) connected. connection_status_cb() can be used to notify the BE DAI link of any change.”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hj` h²hubhÝ)�”}”(hŒƒThis is called whenever there is a USB SND interface bind or remove event, using snd_soc_usb_connect() or snd_soc_usb_disconnect():”h]”hŒƒThis is called whenever there is a USB SND interface bind or remove event, using snd_soc_usb_connect() or snd_soc_usb_disconnect():”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhj` h²hubhû)�”}”(hXLstatic void qc_usb_audio_offload_probe(struct snd_usb_audio *chip) { ... snd_soc_usb_connect(usb_get_usb_backend(udev), sdev); ... } static void qc_usb_audio_offload_disconnect(struct snd_usb_audio *chip) { ... snd_soc_usb_disconnect(usb_get_usb_backend(chip->dev), dev->sdev); ... }”h]”hXLstatic void qc_usb_audio_offload_probe(struct snd_usb_audio *chip) { ... snd_soc_usb_connect(usb_get_usb_backend(udev), sdev); ... } static void qc_usb_audio_offload_disconnect(struct snd_usb_audio *chip) { ... snd_soc_usb_disconnect(usb_get_usb_backend(chip->dev), dev->sdev); ... }”…”�”}”hj� sbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´Mhj` h²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hj` h²hh³hÊh´M$ubhÝ)�”}”(hŒðIn order to account for conditions where driver or device existence is not guaranteed, USB SND exposes snd_usb_rediscover_devices() to resend the connect events for any identified USB audio interfaces. Consider the the following situation:”h]”hŒðIn order to account for conditions where driver or device existence is not guaranteed, USB SND exposes snd_usb_rediscover_devices() to resend the connect events for any identified USB audio interfaces. Consider the the following situation:”…”�”}”(hj¦ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M&hj` h²hubjP)�”}”(hXf**usb_audio_probe()** | --> USB audio streams allocated and saved to usb_chip[] | --> Propagate connect event to USB offload driver in USB SND | --> **snd_soc_usb_connect()** exits as USB BE DAI link is not ready BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> The USB audio device connect event is missed ”h]”j„)�”}”(hhh]”(j‰)�”}”(hŒÕ**usb_audio_probe()** | --> USB audio streams allocated and saved to usb_chip[] | --> Propagate connect event to USB offload driver in USB SND | --> **snd_soc_usb_connect()** exits as USB BE DAI link is not ready ”h]”(j�)�”}”(hŒ**usb_audio_probe()**”h]”j.)�”}”(hjÁ h]”hŒusb_audio_probe()”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj¿ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´M.hj» ubj­)�”}”(hhh]”hŒ line_block”“”)�”}”(hhh]”(hh´“”)�”}”(hŒ7--> USB audio streams allocated and saved to usb_chip[]”h]”hŒ7--> USB audio streams allocated and saved to usb_chip[]”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´Œindent”KhjÛ h³hÊh´KubjÞ )�”}”(hŒ<--> Propagate connect event to USB offload driver in USB SND”h]”hŒ<--> Propagate connect event to USB offload driver in USB SND”…”�”}”(hjî h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí KhjÛ h³hÊh´KubjÞ )�”}”(hŒC--> **snd_soc_usb_connect()** exits as USB BE DAI link is not ready”h]”(hŒ--> ”…”�”}”(hjü h²hh³Nh´Nubj.)�”}”(hŒ**snd_soc_usb_connect()**”h]”hŒsnd_soc_usb_connect()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjü ubhŒ& exits as USB BE DAI link is not ready”…”�”}”(hjü h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h´jí KhjÛ h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hjÖ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hj» ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´M.hj¸ ubj‰)�”}”(hŒ†BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> The USB audio device connect event is missed ”h]”(j�)�”}”(hŒBE DAI link component probe”h]”hŒBE DAI link component probe”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´M2hj. ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ4--> DAI link is probed and SoC USB port is allocated”h]”hŒ4--> DAI link is probed and SoC USB port is allocated”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí KhjC h³hÊh´KubjÞ )�”}”(hŒ0--> The USB audio device connect event is missed”h]”hŒ0--> The USB audio device connect event is missed”…”�”}”(hjT h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí KhjC h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj@ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hj. ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´M2hj¸ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jƒhj´ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M+hj` h²hubhÝ)�”}”(hŒÙTo ensure connection events are not missed, **snd_usb_rediscover_devices()** is executed when the SoC USB device is registered. Now, when the BE DAI link component probe occurs, the following highlights the sequence:”h]”(hŒ,To ensure connection events are not missed, ”…”�”}”(hj€ h²hh³Nh´Nubj.)�”}”(hŒ **snd_usb_rediscover_devices()**”h]”hŒsnd_usb_rediscover_devices()”…”�”}”(hjˆ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj€ ubhŒ� is executed when the SoC USB device is registered. Now, when the BE DAI link component probe occurs, the following highlights the sequence:”…”�”}”(hj€ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M4hj` h²hubjP)�”}”(hX&BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> SoC USB device added, and **snd_usb_rediscover_devices()** runs **snd_usb_rediscover_devices()** | --> Traverses through usb_chip[] and for non-NULL entries issue | **connection_status_cb()** ”h]”j„)�”}”(hhh]”(j‰)�”}”(hŒ™BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> SoC USB device added, and **snd_usb_rediscover_devices()** runs ”h]”(j�)�”}”(hŒBE DAI link component probe”h]”hŒBE DAI link component probe”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´M:hj§ ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ4--> DAI link is probed and SoC USB port is allocated”h]”hŒ4--> DAI link is probed and SoC USB port is allocated”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj¼ h³hÊh´KubjÞ )�”}”(hŒC--> SoC USB device added, and **snd_usb_rediscover_devices()** runs”h]”(hŒ--> SoC USB device added, and ”…”�”}”(hjÍ h²hh³Nh´Nubj.)�”}”(hŒ **snd_usb_rediscover_devices()**”h]”hŒsnd_usb_rediscover_devices()”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjÍ ubhŒ runs”…”�”}”(hjÍ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj¼ h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj¹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hj§ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´M:hj¤ ubj‰)�”}”(hŒ„**snd_usb_rediscover_devices()** | --> Traverses through usb_chip[] and for non-NULL entries issue | **connection_status_cb()** ”h]”(j�)�”}”(hŒ **snd_usb_rediscover_devices()**”h]”j.)�”}”(hj h]”hŒsnd_usb_rediscover_devices()”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´M>hjÿ ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ?--> Traverses through usb_chip[] and for non-NULL entries issue”h]”hŒ?--> Traverses through usb_chip[] and for non-NULL entries issue”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj h³hÊh´KubjÚ )�”}”(hhh]”jÞ )�”}”(hŒ**connection_status_cb()**”h]”j.)�”}”(hj3 h]”hŒconnection_status_cb()”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj1 ubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj. h³hÊh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hjÿ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´M>hj¤ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jƒhj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M8hj` h²hubhÝ)�”}”(hŒàIn the case where the USB offload driver is unbound, while USB SND is ready, the **snd_usb_rediscover_devices()** is called during module init. This allows for the offloading path to also be enabled with the following flow:”h]”(hŒQIn the case where the USB offload driver is unbound, while USB SND is ready, the ”…”�”}”(hjl h²hh³Nh´Nubj.)�”}”(hŒ **snd_usb_rediscover_devices()**”h]”hŒsnd_usb_rediscover_devices()”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjl ubhŒo is called during module init. This allows for the offloading path to also be enabled with the following flow:”…”�”}”(hjl h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M@hj` h²hubjP)�”}”(hXØ**usb_audio_probe()** | --> USB audio streams allocated and saved to usb_chip[] | --> Propagate connect event to USB offload driver in USB SND | --> USB offload driver **NOT** ready! BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> No USB connect event due to missing USB offload driver USB offload driver probe | --> **qc_usb_audio_offload_init()** | --> Calls **snd_usb_rediscover_devices()** to notify of devices ”h]”j„)�”}”(hhh]”(j‰)�”}”(hŒ·**usb_audio_probe()** | --> USB audio streams allocated and saved to usb_chip[] | --> Propagate connect event to USB offload driver in USB SND | --> USB offload driver **NOT** ready! ”h]”(j�)�”}”(hŒ**usb_audio_probe()**”h]”j.)�”}”(hj™ h]”hŒusb_audio_probe()”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj— ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´MGhj“ ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ7--> USB audio streams allocated and saved to usb_chip[]”h]”hŒ7--> USB audio streams allocated and saved to usb_chip[]”…”�”}”(hj´ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj± h³hÊh´KubjÞ )�”}”(hŒ<--> Propagate connect event to USB offload driver in USB SND”h]”hŒ<--> Propagate connect event to USB offload driver in USB SND”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj± h³hÊh´KubjÞ )�”}”(hŒ%--> USB offload driver **NOT** ready!”h]”(hŒ--> USB offload driver ”…”�”}”(hjÐ h²hh³Nh´Nubj.)�”}”(hŒ**NOT**”h]”hŒNOT”…”�”}”(hjØ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjÐ ubhŒ ready!”…”�”}”(hjÐ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj± h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj® ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hj“ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´MGhj� ubj‰)�”}”(hŒ�BE DAI link component probe | --> DAI link is probed and SoC USB port is allocated | --> No USB connect event due to missing USB offload driver ”h]”(j�)�”}”(hŒBE DAI link component probe”h]”hŒBE DAI link component probe”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´MKhj ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ4--> DAI link is probed and SoC USB port is allocated”h]”hŒ4--> DAI link is probed and SoC USB port is allocated”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj h³hÊh´KubjÞ )�”}”(hŒ:--> No USB connect event due to missing USB offload driver”h]”hŒ:--> No USB connect event due to missing USB offload driver”…”�”}”(hj( h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´MKhj� ubj‰)�”}”(hŒ�USB offload driver probe | --> **qc_usb_audio_offload_init()** | --> Calls **snd_usb_rediscover_devices()** to notify of devices ”h]”(j�)�”}”(hŒUSB offload driver probe”h]”hŒUSB offload driver probe”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³hÊh´MOhjH ubj­)�”}”(hhh]”jÚ )�”}”(hhh]”(jÞ )�”}”(hŒ#--> **qc_usb_audio_offload_init()**”h]”(hŒ--> ”…”�”}”(hj` h²hh³Nh´Nubj.)�”}”(hŒ**qc_usb_audio_offload_init()**”h]”hŒqc_usb_audio_offload_init()”…”�”}”(hjh h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj` ubeh}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj] h³hÊh´KubjÞ )�”}”(hŒ?--> Calls **snd_usb_rediscover_devices()** to notify of devices”h]”(hŒ --> Calls ”…”�”}”(hj| h²hh³Nh´Nubj.)�”}”(hŒ **snd_usb_rediscover_devices()**”h]”hŒsnd_usb_rediscover_devices()”…”�”}”(hj„ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj| ubhŒ to notify of devices”…”�”}”(hj| h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1h´jí Khj] h³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÙ hjZ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¬hjH ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³hÊh´MOhj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jƒhjŒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´MDhj` h²hubeh}”(h]”Œ usb-audio-device-connection-flow”ah ]”h"]”Œ usb audio device connection flow”ah$]”h&]”uh1hµhjh²hh³hÊh´M ubeh}”(h]”Œsoc-usb-driver”ah ]”h"]”Œsoc usb driver”ah$]”h&]”uh1hµhh·h²hh³hÊh´K2ubh¶)�”}”(hhh]”(h»)�”}”(hŒUSB Offload Related Kcontrols”h]”hŒUSB Offload Related Kcontrols”…”�”}”(hjÍ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÊ h²hh³hÊh´MRubh¶)�”}”(hhh]”(h»)�”}”(hŒDetails”h]”hŒDetails”…”�”}”(hjÞ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÛ h²hh³hÊh´MTubhÝ)�”}”(hXA set of kcontrols can be utilized by applications to help select the proper sound devices to enable USB audio offloading. SoC USB exposes the get_offload_dev() callback that designs can use to ensure that the proper indices are returned to the application.”h]”hXA set of kcontrols can be utilized by applications to help select the proper sound devices to enable USB audio offloading. SoC USB exposes the get_offload_dev() callback that designs can use to ensure that the proper indices are returned to the application.”…”�”}”(hjì h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MUhjÛ h²hubeh}”(h]”Œdetails”ah ]”h"]”Œdetails”ah$]”h&]”uh1hµhjÊ h²hh³hÊh´MTubh¶)�”}”(hhh]”(h»)�”}”(hŒImplementation”h]”hŒImplementation”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´M[ubhÝ)�”}”(hŒ **Example:**”h]”j.)�”}”(hjh]”hŒExample:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M]hjh²hubjP)�”}”(hX3**Sound Cards**: :: 0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D SM8250-MTP-WCD9380-WSA8810-VA-DMIC 1 [Seri ]: USB-Audio - Plantronics Blackwire 3225 Seri Plantronics Plantronics Blackwire 3225 Seri at usb-xhci-hcd.1.auto-1.1, full sp 2 [C320M ]: USB-Audio - Plantronics C320-M Plantronics Plantronics C320-M at usb-xhci-hcd.1.auto-1.2, full speed **PCM Devices**: :: card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 0: MultiMedia1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 1: MultiMedia2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Seri [Plantronics Blackwire 3225 Seri], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: C320M [Plantronics C320-M], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 **USB Sound Card** - card#1: :: USB Offload Playback Card Route PCM#0 -1 (range -1->32) USB Offload Playback PCM Route PCM#0 -1 (range -1->255) **USB Sound Card** - card#2: :: USB Offload Playback Card Route PCM#0 0 (range -1->32) USB Offload Playback PCM Route PCM#0 1 (range -1->255) ”h]”(hÝ)�”}”(hŒ**Sound Cards**:”h]”(j.)�”}”(hŒ**Sound Cards**”h]”hŒ Sound Cards”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj.ubhŒ:”…”�”}”(hj.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M_hj*ubjP)�”}”(hX$:: 0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D SM8250-MTP-WCD9380-WSA8810-VA-DMIC 1 [Seri ]: USB-Audio - Plantronics Blackwire 3225 Seri Plantronics Plantronics Blackwire 3225 Seri at usb-xhci-hcd.1.auto-1.1, full sp 2 [C320M ]: USB-Audio - Plantronics C320-M Plantronics Plantronics C320-M at usb-xhci-hcd.1.auto-1.2, full speed ”h]”hû)�”}”(hX0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D SM8250-MTP-WCD9380-WSA8810-VA-DMIC 1 [Seri ]: USB-Audio - Plantronics Blackwire 3225 Seri Plantronics Plantronics Blackwire 3225 Seri at usb-xhci-hcd.1.auto-1.1, full sp 2 [C320M ]: USB-Audio - Plantronics C320-M Plantronics Plantronics C320-M at usb-xhci-hcd.1.auto-1.2, full speed”h]”hX0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D SM8250-MTP-WCD9380-WSA8810-VA-DMIC 1 [Seri ]: USB-Audio - Plantronics Blackwire 3225 Seri Plantronics Plantronics Blackwire 3225 Seri at usb-xhci-hcd.1.auto-1.1, full sp 2 [C320M ]: USB-Audio - Plantronics C320-M Plantronics Plantronics C320-M at usb-xhci-hcd.1.auto-1.2, full speed”…”�”}”hjNsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´MchjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Mahj*ubhÝ)�”}”(hŒ**PCM Devices**:”h]”(j.)�”}”(hŒ**PCM Devices**”h]”hŒ PCM Devices”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjbubhŒ:”…”�”}”(hjbh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mlhj*ubjP)�”}”(hX :: card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 0: MultiMedia1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 1: MultiMedia2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Seri [Plantronics Blackwire 3225 Seri], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: C320M [Plantronics C320-M], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 ”h]”hû)�”}”(hXïcard 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 0: MultiMedia1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 1: MultiMedia2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Seri [Plantronics Blackwire 3225 Seri], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: C320M [Plantronics C320-M], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0”h]”hXïcard 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 0: MultiMedia1 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: SM8250MTPWCD938 [SM8250-MTP-WCD9380-WSA8810-VA-D], device 1: MultiMedia2 (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: Seri [Plantronics Blackwire 3225 Seri], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: C320M [Plantronics C320-M], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0”…”�”}”hj‚sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´Mphj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Mnhj*ubhÝ)�”}”(hŒ**USB Sound Card** - card#1:”h]”(j.)�”}”(hŒ**USB Sound Card**”h]”hŒUSB Sound Card”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj–ubhŒ - card#1:”…”�”}”(hj–h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M}hj*ubjP)�”}”(hŒ}:: USB Offload Playback Card Route PCM#0 -1 (range -1->32) USB Offload Playback PCM Route PCM#0 -1 (range -1->255) ”h]”hû)�”}”(hŒtUSB Offload Playback Card Route PCM#0 -1 (range -1->32) USB Offload Playback PCM Route PCM#0 -1 (range -1->255)”h]”hŒtUSB Offload Playback Card Route PCM#0 -1 (range -1->32) USB Offload Playback PCM Route PCM#0 -1 (range -1->255)”…”�”}”hj¶sbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´M�hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´Mhj*ubhÝ)�”}”(hŒ**USB Sound Card** - card#2:”h]”(j.)�”}”(hŒ**USB Sound Card**”h]”hŒUSB Sound Card”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjÊubhŒ - card#2:”…”�”}”(hjÊh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M„hj*ubjP)�”}”(hŒ{:: USB Offload Playback Card Route PCM#0 0 (range -1->32) USB Offload Playback PCM Route PCM#0 1 (range -1->255) ”h]”hû)�”}”(hŒrUSB Offload Playback Card Route PCM#0 0 (range -1->32) USB Offload Playback PCM Route PCM#0 1 (range -1->255)”h]”hŒrUSB Offload Playback Card Route PCM#0 0 (range -1->32) USB Offload Playback PCM Route PCM#0 1 (range -1->255)”…”�”}”hjêsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´Mˆhjæubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M†hj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M_hjh²hubhÝ)�”}”(hX;The above example shows a scenario where the system has one ASoC platform card (card#0) and two USB sound devices connected (card#1 and card#2). When reading the available kcontrols for each USB audio device, the following kcontrols lists the mapped offload card and pcm device indexes for the specific USB device:”h]”hX;The above example shows a scenario where the system has one ASoC platform card (card#0) and two USB sound devices connected (card#1 and card#2). When reading the available kcontrols for each USB audio device, the following kcontrols lists the mapped offload card and pcm device indexes for the specific USB device:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M‹hjh²hubjP)�”}”(hŒT``USB Offload Playback Card Route PCM#*`` ``USB Offload Playback PCM Route PCM#*`` ”h]”(hÝ)�”}”(hŒ)``USB Offload Playback Card Route PCM#*``”h]”j;)�”}”(hjh]”hŒ%USB Offload Playback Card Route PCM#*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M�hjubhÝ)�”}”(hŒ(``USB Offload Playback PCM Route PCM#*``”h]”j;)�”}”(hj/h]”hŒ$USB Offload Playback PCM Route PCM#*”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj-ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M’hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M�hjh²hubhÝ)�”}”(hŒ„The kcontrol is indexed, because a USB audio device could potentially have several PCM devices. The above kcontrols are defined as:”h]”hŒ„The kcontrol is indexed, because a USB audio device could potentially have several PCM devices. The above kcontrols are defined as:”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M”hjh²hubjP)�”}”(hX[- ``USB Offload Playback Card Route PCM#`` **(R)**: Returns the ASoC platform sound card index for a mapped offload path. The output **"0"** (card index) signifies that there is an available offload path for the USB SND device through card#0. If **"-1"** is seen, then no offload path is available for the USB SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for the kcontrol along with the PCM route kcontrol. - ``USB Offload Playback PCM Route PCM#`` **(R)**: Returns the ASoC platform sound PCM device index for a mapped offload path. The output **"1"** (PCM device index) signifies that there is an available offload path for the USB SND device through PCM device#0. If **"-1"** is seen, then no offload path is available for the USB\ SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for this kcontrol, in addition to the card route kcontrol. ”•¶:h]”jV)�”}”(hhh]”(j[)�”}”(hX``USB Offload Playback Card Route PCM#`` **(R)**: Returns the ASoC platform sound card index for a mapped offload path. The output **"0"** (card index) signifies that there is an available offload path for the USB SND device through card#0. If **"-1"** is seen, then no offload path is available for the USB SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for the kcontrol along with the PCM route kcontrol. ”h]”hÝ)�”}”(hX``USB Offload Playback Card Route PCM#`` **(R)**: Returns the ASoC platform sound card index for a mapped offload path. The output **"0"** (card index) signifies that there is an available offload path for the USB SND device through card#0. If **"-1"** is seen, then no offload path is available for the USB SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for the kcontrol along with the PCM route kcontrol.”h]”(j;)�”}”(hŒ(``USB Offload Playback Card Route PCM#``”h]”hŒ$USB Offload Playback Card Route PCM#”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hjcubhŒ ”…”�”}”(hjch²hh³Nh´Nubj.)�”}”(hŒ**(R)**”h]”hŒ(R)”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjcubhŒT: Returns the ASoC platform sound card index for a mapped offload path. The output ”…”�”}”(hjch²hh³Nh´Nubj.)�”}”(hŒ**"0"**”h]”hŒ“0â€�”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjcubhŒj (card index) signifies that there is an available offload path for the USB SND device through card#0. If ”…”�”}”(hjch²hh³Nh´Nubj.)�”}”(hŒ**"-1"**”h]”hŒ“-1â€�”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjcubhX is seen, then no offload path is available for the USB SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for the kcontrol along with the PCM route kcontrol.”…”�”}”(hjch²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M—hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj\ubj[)�”}”(hX,``USB Offload Playback PCM Route PCM#`` **(R)**: Returns the ASoC platform sound PCM device index for a mapped offload path. The output **"1"** (PCM device index) signifies that there is an available offload path for the USB SND device through PCM device#0. If **"-1"** is seen, then no offload path is available for the USB\ SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for this kcontrol, in addition to the card route kcontrol. ”h]”hÝ)�”}”(hX+``USB Offload Playback PCM Route PCM#`` **(R)**: Returns the ASoC platform sound PCM device index for a mapped offload path. The output **"1"** (PCM device index) signifies that there is an available offload path for the USB SND device through PCM device#0. If **"-1"** is seen, then no offload path is available for the USB\ SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for this kcontrol, in addition to the card route kcontrol.”h]”(j;)�”}”(hŒ'``USB Offload Playback PCM Route PCM#``”h]”hŒ#USB Offload Playback PCM Route PCM#”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j:hj¿ubhŒ ”…”�”}”(hj¿h²hh³Nh´Nubj.)�”}”(hŒ**(R)**”h]”hŒ(R)”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj¿ubhŒZ: Returns the ASoC platform sound PCM device index for a mapped offload path. The output ”…”�”}”(hj¿h²hh³Nh´Nubj.)�”}”(hŒ**"1"**”h]”hŒ“1â€�”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj¿ubhŒv (PCM device index) signifies that there is an available offload path for the USB SND device through PCM device#0. If ”…”�”}”(hj¿h²hh³Nh´Nubj.)�”}”(hŒ**"-1"**”h]”hŒ“-1â€�”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj¿ubhX is seen, then no offload path is available for the USB SND device. This kcontrol exists for each USB audio device that exists in the system, and its expected to derive the current status of offload based on the output value for this kcontrol, in addition to the card route kcontrol.”…”�”}”(hj¿h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MŸhj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1jZhj\ubeh}”(h]”h ]”h"]”h$]”h&]”jjuh1jUh³hÊh´M—hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´M—hjh²hubeh}”(h]”Œimplementation”ah ]”h"]”Œimplementation”ah$]”h&]”uh1hµhjÊ h²hh³hÊh´M[ubh¶)�”}”(hhh]”(h»)�”}”(hŒ#USB Offload Playback Route Kcontrol”h]”hŒ#USB Offload Playback Route Kcontrol”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj+h²hh³hÊh´M¨ubhÝ)�”}”(hŒ„In order to allow for vendor specific implementations on audio offloading device selection, the SoC USB layer exposes the following:”h]”hŒ„In order to allow for vendor specific implementations on audio offloading device selection, the SoC USB layer exposes the following:”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M©hj+h²hubhû)�”}”(hŒóint (*update_offload_route_info)(struct snd_soc_component *component, int card, int pcm, int direction, enum snd_soc_usb_kctl path, long *route)”h]”hŒóint (*update_offload_route_info)(struct snd_soc_component *component, int card, int pcm, int direction, enum snd_soc_usb_kctl path, long *route)”…”�”}”hjJsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´M¬hj+h²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hj+h²hh³hÊh´M²ubhÝ)�”}”(hŒqThese are specific for the **USB Offload Playback Card Route PCM#** and **USB Offload PCM Route PCM#** kcontrols.”h]”(hŒThese are specific for the ”…”�”}”(hjch²hh³Nh´Nubj.)�”}”(hŒ(**USB Offload Playback Card Route PCM#**”h]”hŒ$USB Offload Playback Card Route PCM#”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjcubhŒ and ”…”�”}”(hjch²hh³Nh´Nubj.)�”}”(hŒ**USB Offload PCM Route PCM#**”h]”hŒUSB Offload PCM Route PCM#”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hjcubhŒ kcontrols.”…”�”}”(hjch²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M´hj+h²hubhÝ)�”}”(hŒ�When users issue get calls to the kcontrol, the registered SoC USB callbacks will execute the registered function calls to the DPCM BE DAI link.”h]”hŒ�When users issue get calls to the kcontrol, the registered SoC USB callbacks will execute the registered function calls to the DPCM BE DAI link.”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M·hj+h²hubhÝ)�”}”(hŒ**Callback Registration:**”h]”j.)�”}”(hj¥h]”hŒCallback Registration:”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j-hj£ubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mºhj+h²hubhû)�”}”(hXAstatic int q6usb_component_probe(struct snd_soc_component *component) { ... usb = snd_soc_usb_allocate_port(component, 1, &data->priv); if (IS_ERR(usb)) return -ENOMEM; usb->connection_status_cb = q6usb_alsa_connection_cb; usb->update_offload_route_info = q6usb_get_offload_dev; ret = snd_soc_usb_add_port(usb);”h]”hXAstatic int q6usb_component_probe(struct snd_soc_component *component) { ... usb = snd_soc_usb_allocate_port(component, 1, &data->priv); if (IS_ERR(usb)) return -ENOMEM; usb->connection_status_cb = q6usb_alsa_connection_cb; usb->update_offload_route_info = q6usb_get_offload_dev; ret = snd_soc_usb_add_port(usb);”…”�”}”hjºsbah}”(h]”h ]”h"]”h$]”h&]”j j j–‰j—Œrst”j™}”uh1húh³hÊh´M¼hj+h²hubjœ)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”j j uh1j›hj+h²hh³hÊh´MÉubeh}”(h]”Œ#usb-offload-playback-route-kcontrol”ah ]”h"]”Œ#usb offload playback route kcontrol”ah$]”h&]”uh1hµhjÊ h²hh³hÊh´M¨ubh¶)�”}”(hhh]”(h»)�”}”(hŒExisting USB Sound Kcontrol”h]”hŒExisting USB Sound Kcontrol”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÛh²hh³hÊh´MÌubhÝ)�”}”(hX With the introduction of USB offload support, the above USB offload kcontrol will be added to the pre existing list of kcontrols identified by the USB sound framework. These kcontrols are still the main controls that are used to modify characteristics pertaining to the USB audio device.”h]”hX With the introduction of USB offload support, the above USB offload kcontrol will be added to the pre existing list of kcontrols identified by the USB sound framework. These kcontrols are still the main controls that are used to modify characteristics pertaining to the USB audio device.”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MÍhjÛh²hubjP)�”}”(hX…:: Number of controls: 9 ctl type num name value 0 INT 2 Capture Channel Map 0, 0 (range 0->36) 1 INT 2 Playback Channel Map 0, 0 (range 0->36) 2 BOOL 1 Headset Capture Switch On 3 INT 1 Headset Capture Volume 10 (range 0->13) 4 BOOL 1 Sidetone Playback Switch On 5 INT 1 Sidetone Playback Volume 4096 (range 0->8192) 6 BOOL 1 Headset Playback Switch On 7 INT 2 Headset Playback Volume 20, 20 (range 0->24) 8 INT 1 USB Offload Playback Card Route PCM#0 0 (range -1->32) 9 INT 1 USB Offload Playback PCM Route PCM#0 1 (range -1->255) ”h]”hû)�”}”(hXhNumber of controls: 9 ctl type num name value 0 INT 2 Capture Channel Map 0, 0 (range 0->36) 1 INT 2 Playback Channel Map 0, 0 (range 0->36) 2 BOOL 1 Headset Capture Switch On 3 INT 1 Headset Capture Volume 10 (range 0->13) 4 BOOL 1 Sidetone Playback Switch On 5 INT 1 Sidetone Playback Volume 4096 (range 0->8192) 6 BOOL 1 Headset Playback Switch On 7 INT 2 Headset Playback Volume 20, 20 (range 0->24) 8 INT 1 USB Offload Playback Card Route PCM#0 0 (range -1->32) 9 INT 1 USB Offload Playback PCM Route PCM#0 1 (range -1->255)”h]”hXhNumber of controls: 9 ctl type num name value 0 INT 2 Capture Channel Map 0, 0 (range 0->36) 1 INT 2 Playback Channel Map 0, 0 (range 0->36) 2 BOOL 1 Headset Capture Switch On 3 INT 1 Headset Capture Volume 10 (range 0->13) 4 BOOL 1 Sidetone Playback Switch On 5 INT 1 Sidetone Playback Volume 4096 (range 0->8192) 6 BOOL 1 Headset Playback Switch On 7 INT 2 Headset Playback Volume 20, 20 (range 0->24) 8 INT 1 USB Offload Playback Card Route PCM#0 0 (range -1->32) 9 INT 1 USB Offload Playback PCM Route PCM#0 1 (range -1->255)”…”�”}”hjþsbah}”(h]”h ]”h"]”h$]”h&]”j j uh1húh³hÊh´MÔhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1jOh³hÊh´MÒhjÛh²hubhÝ)�”}”(hŒ¢Since USB audio device controls are handled over the USB control endpoint, use the existing mechanisms present in the USB mixer to set parameters, such as volume.”h]”hŒ¢Since USB audio device controls are handled over the USB control endpoint, use the existing mechanisms present in the USB mixer to set parameters, such as volume.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MáhjÛh²hubeh}”(h]”Œexisting-usb-sound-kcontrol”ah ]”h"]”Œexisting usb sound kcontrol”ah$]”h&]”uh1hµhjÊ h²hh³hÊh´MÌubeh}”(h]”Œusb-offload-related-kcontrols”ah ]”h"]”Œusb offload related kcontrols”ah$]”h&]”uh1hµhh·h²hh³hÊh´MRubeh}”(h]”Œasoc-usb-support”ah ]”h"]”Œasoc usb support”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j[Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j5j2jjjÇ jÄ jtjqj j j] jZ j¿ j¼ j-j*jÿ jü j(j%jØjÕj%j"uŒ nametypes”}”(j5‰j‰jÇ ‰jt‰j ‰j] ‰j¿ ‰j-‰jÿ ‰j(‰j؉j%‰uh}”(j2h·jhËjÄ jjqj%j jwjZ j j¼ j` j*jÊ jü jÛ j%jjÕj+j"jÛ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.