Message ID | 20241011000650.2585600-1-quic_wcheng@quicinc.com |
---|---|
Headers | show |
Series | Introduce QC USB SND audio offloading support | expand |
Hi Chris, On 10/11/2024 4:08 AM, Christopher Snowhill wrote: > Comment posted below, after the commit listing. > > On Thu Oct 10, 2024 at 5:05 PM PDT, Wesley Cheng wrote: >> Requesting to see if we can get some Acked-By tags, and merge on usb-next. >> >> Several Qualcomm based chipsets can support USB audio offloading to a >> dedicated audio DSP, which can take over issuing transfers to the USB >> host controller. The intention is to reduce the load on the main >> processors in the SoC, and allow them to be placed into lower power modes. >> There are several parts to this design: >> 1. Adding ASoC binding layer >> 2. Create a USB backend for Q6DSP >> 3. Introduce XHCI interrupter support >> 4. Create vendor ops for the USB SND driver >> >> USB | ASoC >> -------------------------------------------------------------------- >> | _________________________ >> | |sm8250 platform card | >> | |_________________________| >> | | | >> | ___V____ ____V____ >> | |Q6USB | |Q6AFE | >> | |"codec" | |"cpu" | >> | |________| |_________| >> | ^ ^ ^ >> | | |________| >> | ___V____ | >> | |SOC-USB | | >> ________ ________ | | | >> |USB SND |<--->|QC offld|<------------>|________| | >> |(card.c)| | |<---------- | >> |________| |________|___ | | | >> ^ ^ | | | ____________V_________ >> | | | | | |APR/GLINK | >> __ V_______________V_____ | | | |______________________| >> |USB SND (endpoint.c) | | | | ^ >> |_________________________| | | | | >> ^ | | | ___________V___________ >> | | | |->|audio DSP | >> ___________V_____________ | | |_______________________| >> |XHCI HCD |<- | >> |_________________________| | >> >> >> Adding ASoC binding layer >> ========================= >> soc-usb: Intention is to treat a USB port similar to a headphone jack. >> The port is always present on the device, but cable/pin status can be >> enabled/disabled. Expose mechanisms for USB backend ASoC drivers to >> communicate with USB SND. >> >> Create a USB backend for Q6DSP >> ============================== >> q6usb: Basic backend driver that will be responsible for maintaining the >> resources needed to initiate a playback stream using the Q6DSP. Will >> be the entity that checks to make sure the connected USB audio device >> supports the requested PCM format. If it does not, the PCM open call will >> fail, and userspace ALSA can take action accordingly. >> >> Introduce XHCI interrupter support >> ================================== >> XHCI HCD supports multiple interrupters, which allows for events to be routed >> to different event rings. This is determined by "Interrupter Target" field >> specified in Section "6.4.1.1 Normal TRB" of the XHCI specification. >> >> Events in the offloading case will be routed to an event ring that is assigned >> to the audio DSP. >> >> Create vendor ops for the USB SND driver >> ======================================== >> qc_audio_offload: This particular driver has several components associated >> with it: >> - QMI stream request handler >> - XHCI interrupter and resource management >> - audio DSP memory management >> >> When the audio DSP wants to enable a playback stream, the request is first >> received by the ASoC platform sound card. Depending on the selected route, >> ASoC will bring up the individual DAIs in the path. The Q6USB backend DAI >> will send an AFE port start command (with enabling the USB playback path), and >> the audio DSP will handle the request accordingly. >> >> Part of the AFE USB port start handling will have an exchange of control >> messages using the QMI protocol. The qc_audio_offload driver will populate the >> buffer information: >> - Event ring base address >> - EP transfer ring base address >> >> and pass it along to the audio DSP. All endpoint management will now be handed >> over to the DSP, and the main processor is not involved in transfers. >> >> Overall, implementing this feature will still expose separate sound card and PCM >> devices for both the platform card and USB audio device: >> 0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D >> SM8250-MTP-WCD9380-WSA8810-VA-DMIC >> 1 [Audio ]: USB-Audio - USB Audio >> Generic USB Audio at usb-xhci-hcd.1.auto-1.4, high speed >> >> This is to ensure that userspace ALSA entities can decide which route to take >> when executing the audio playback. In the above, if card#1 is selected, then >> USB audio data will take the legacy path over the USB PCM drivers, etc... >> >> The current limitation is that the latest USB audio device that is identified >> will be automatically selected by the Q6USB BE DAI for offloading. Future >> patches can be added to possibly add for more flexibility, but until the userpace >> applications can be better defined, having these mechanisms will complicate the >> overall implementation. >> >> USB offload Kcontrols >> ===================== >> Part of the vendor offload package will have a mixer driver associated with it >> (mixer_usb_offload.c). This entity will be responsible for coordinating with >> SOC USB and the Q6USB backend DAI to fetch information about the sound card >> and PCM device indices associated with the offload path. The logic is done >> based on the current implementation of how paths are controlled within the QC >> ASoC implementation. >> >> QC ASoC Q6Routing >> ----------------- >> Within the Q6 ASOC design, the registered ASoC platform card will expose a set >> of kcontrols for enabling the BE DAI links to the FE DAI link. For example: >> >> tinymix -D 0 contents >> Number of controls: 1033 >> ctl type num name value >> ... >> 1025 BOOL 1 USB Mixer MultiMedia1 Off >> 1026 BOOL 1 USB Mixer MultiMedia2 Off >> 1027 BOOL 1 USB Mixer MultiMedia3 Off >> 1028 BOOL 1 USB Mixer MultiMedia4 Off >> 1029 BOOL 1 USB Mixer MultiMedia5 Off >> 1030 BOOL 1 USB Mixer MultiMedia6 Off >> 1031 BOOL 1 USB Mixer MultiMedia7 Off >> 1032 BOOL 1 USB Mixer MultiMedia8 Off >> >> Each of these kcontrols will enable the USB BE DAI link (q6usb) to be connected >> to a FE DAI link (q6asm). Since each of these controls are DAPM widgets, when >> it is enabled, the DAPM widget's "connect" flag is updated accordingly. >> >> USB Offload Mapping >> ------------------- >> Based on the Q6routing, the USB BE DAI link can determine which sound card and >> PCM device is enabled for offloading. Fetching the ASoC platform sound card's >> information is fairly straightforward, and the bulk of the work goes to finding >> the corresponding PCM device index. As mentioned above, the USB BE DAI can >> traverse the DAPM widgets to find the DAPM path that is related to the control >> for the "USB Mixer." Based on which "USB Mixer" is enabled, it can find the >> corresponding DAPM widget associated w/ the FE DAI link (Multimedia*). From there >> it can find the PCM device created for the Multimedia* stream. >> >> Only one BE DAI link can be enabled per FE DAI. For example, if the HDMI path is >> enabled for Multimedia1, the USB Mixer will be disabled and switched over. >> >> Examples of kcontrol >> -------------------- >> tinymix -D 0 contents >> Number of controls: 1033 >> ctl type num name >> ... >> 1025 BOOL 1 USB Mixer MultiMedia1 Off >> 1026 BOOL 1 USB Mixer MultiMedia2 On >> 1027 BOOL 1 USB Mixer MultiMedia3 Off >> 1028 BOOL 1 USB Mixer MultiMedia4 Off >> 1029 BOOL 1 USB Mixer MultiMedia5 Off >> 1030 BOOL 1 USB Mixer MultiMedia6 Off >> 1031 BOOL 1 USB Mixer MultiMedia7 Off >> 1032 BOOL 1 USB Mixer MultiMedia8 Off >> >> tinymix -D 2 contents >> Number of controls: 7 >> ctl type num name value >> 0 INT 2 Playback Channel Map 0, 0 (range 0->36) >> 1 BOOL 2 MDR-1ADAC Playback Switch On, On >> 2 BOOL 1 MDR-1ADAC Playback Switch On >> 3 INT 2 MDR-1ADAC Playback Volume 127, 127 (range 0->127) >> 4 INT 1 MDR-1ADAC Playback Volume 127 (range 0->127) >> 5 BOOL 1 Sony Internal Clock Validity On >> 6 INT 2 USB Offload Playback Route PCM#0 0, 1 (range -1->255) >> >> The example highlights that the userspace/application can utilize the offload path >> for the USB device on card#0 PCM device#1. >> >> When dealing with multiple USB audio devices, only the latest USB device identified >> is going to be selected for offload capable. >> >> tinymix -D 1 contents >> 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 1 (range 0->4) >> 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 2 USB Offload Playback Route PCM#0 -1, -1 (range -1->255) >> >> "-1, -1" shows that this device has no route to the offload path. >> >> This feature was validated using: >> - tinymix: set/enable the multimedia path to route to USB backend >> - tinyplay: issue playback on platform card >> >> Changelog >> -------------------------------------------- >> Changes in v28: >> - Fixed some phrases/wording within the SOC USB documentation, and also added an output >> with aplay -l for the example output. >> - Fixed allocated string buffer for creating the USB SND offload mixer, and added >> a PCM index check to ensure that the pcm index is less than the expected number. >> - Added a complement enable jack call if USB backend DAI link drivers need access >> to it. >> >> Changes in v27: >> - Added some comments and notes about the offload design. Enforcing the q6routing >> to only allow one USB mixer (PCM device) to be enabled at a time. >> - Modified SND_JACK_USB notifications for all USB audio offloadable devices plugged >> in >> - Rebased on latest XHCI secondary interrupter IMOD changes upstream. Modified the >> change in this series to allow for XHCI sideband to set the IMOD for sideband >> clients. >> - Updated documentation on how USB SND kcontrols are involved in the overall design. >> - Remove mutex locking from suspend/resume platform ops, as USB core ensures that the >> interface and device are in the RPM_ACTIVE state while disconnect is handled. >> >> Changes in v26: >> - Cleaned up drivers based on errors from checkpatch >> - Fixed several typos using codespell >> - Removed any vendor specific notation from USB SND offload mixer patch >> >> Changes in v25: >> - Cleanups on typos mentioned within the xHCI layers >> - Modified the xHCI interrupter search if clients specify interrupter index >> - Moved mixer_usb_offload into its own module, so that other vendor offload USB >> modules can utilize it also. >> - Added support for USB audio devices that may have multiple PCM streams, as >> previous implementation only assumed a single PCM device. SOC USB will be >> able to handle an array of PCM indexes supported by the USB audio device. >> - Added some additional checks in the QC USB offload driver to check that device >> has at least one playback stream before allowing to bind >> - Reordered DT bindings to fix the error found by Rob's bot. The patch that >> added USB_RX was after the example was updated. >> - Updated comments within SOC USB to clarify terminology and to keep it consistent >> - Added SND_USB_JACK type for notifying of USB device audio connections >> >> Changes in v24: >> - Simplified the kcontrols involved in determining how to utilize the offload >> path. >> - There is one kcontrol registered to each USB audio device that will >> output which card/pcm device it is mapped to for the offload route. >> - Removed kcontrols to track offload status and device selection. >> - Default to last USB audio device plugged in as offload capable. >> - kcontrol will reside on USB SND device. >> - Reworked the tracking of connected USB devices from the Q6USB BE DAI link. >> Previously, it was convoluted by doing it over an array, but moved to using >> a list made it much simpler. Logic is still unchanged in that the last USB >> headset plugged in will be selected for offloading. >> - Updated the USB SOC RST documentation accordingly with new kcontrol updates. >> - Added logic to fetch mapped ASoC card and pcm device index that the offload >> path is mapped to for the USB SND kcontrol (for offload route). >> - Re-ordered series to hopefully make reviews more readable by combining >> patches based on the layer modified (ie QC ASoC, ASoC, USB sound, and USB XHCI). >> >> Changes in v23: >> - Added MODULE_DESCRIPTION() fields to drivers that needed it. >> >> Changes in v22: >> - Removed components tag for the ASoC platform card, as the USB SND kcontrol for >> notifying userspace of offload capable card achieves similar results. >> - Due to the above, had to remove the review-by tag for the RST documentation, >> as changes were made to remove the components tag section. >> - Took in feedback to make the SOC USB add/remove ports void. >> - Fixed an issue w/ the USB SND kcontrol management for devices that have multi >> UAC interfaces. (would attempt to create the kcontrol more than once) >> - Modified SOC USB card and PCM index select to be based off the num_supported >> streams that is specified by the USB BE DAI. >> - Modified comments on selecting the latest USB headset for offloading. >> >> Changes in v21: >> - Added an offload jack disable path from the ASoC platform driver and SOC USB. >> - Refactored some of the existing SOC USB context look up APIs and created some >> new helpers to search for the USB context. >> - Renamed snd_soc_usb_find_format to snd_soc_usb_find_supported_format >> - Removed some XHCI sideband calls that would allow clients to actually enable >> the IRQ line associated w/ the secondary interrupter. This is removed because >> there are other dependencies that are required for that to happen, which are not >> covered as part of this series, and to avoid confusion. >> - Due to the above, removed the need to export IMOD setting, and enable/disable >> interrupter APIs. >> >> Changes in v20: >> - Fixed up some formatting changes pointed out in the usb.rst >> - Added SB null check during XHCI sideband unregister in case caller passes >> improper argument (xhci_sideband_unregister()) >> >> Changes in v19: >> - Rebased to usb-next to account for some new changes in dependent drivers. >> >> Changes in v18: >> - Rebased to usb-next, which merged in part of the series. Removed these patches. >> - Reworked Kconfigs for the ASoC USB related components from QCOM Q6DSP drivers >> to keep dependencies in place for SoC USB and USB SND. >> - Removed the repurposing of the stop ep sync API into existing XHCI operations. >> This will be solely used by the XHCI sideband for now. >> >> Changes in v17: >> - Fixed an issue where one patch was squashed into another. >> - Re-added some kconfig checks for helpers exposed in USB SND for the soc usb >> driver, after running different kconfigs. >> >> Changes in v16: >> - Modified some code layer dependencies so that soc usb can be split as a separate >> module. >> - Split the kcontrols from ASoC QCOM common layer into a separate driver >> - Reworked SOC USB kcontrols for controlling card + pcm offload routing and status >> so that there are individual controls for card and pcm devices. >> - Added a kcontrol remove API in SOC USB to remove the controls on the fly. This >> required to add some kcontrol management to SOC USB. >> - Removed the disconnect work and workqueue for the QC USB offload as it is not >> required, since QMI interface driver ensures events are handled in its own WQ. >> >> Changes in v15: >> - Removed some already merged XHCI changes >> - Separated SOC USB driver from being always compiled into SOC core. Now >> configurable from kconfig. >> - Fixed up ASoC kcontrol naming to fit guidelines. >> - Removed some unnecessary dummy ifdefs. >> - Moved usb snd offload capable kcontrol to be initialized by the platform offloading >> driver. >> >> Changes in v14: >> - Cleaned up some USB SND related feedback: >> - Renamed SNDUSB OFFLD playback available --> USB offload capable card >> - Fixed locking while checking if stream is in use >> - Replaced some mutex pairs with guard(mutex) >> >> Changes in v13: >> - Pulled in secondary/primary interrupter rework from Mathias from: >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/drivers/usb/host?h=fix_eventhandling >> - Did some cleanup and commit message updates, and tested on current code base. >> - Added mutex locking to xhci sideband to help prevent any race conditions, esp. for when accessing shared >> references. >> - Addressed concerns from Hillf about gfp_flags and locking used in qc_usb_audio_offload. >> - Rebased onto usb-next >> >> Changes in v12: >> - Updated copyright year to 2024. Happy new years! >> - Fixed newline format on mixer offload driver. >> >> Changes in v11: >> - Modified QMI format structures to be const >> >> Changes in v10: >> - Added new mixer for exposing kcontrol for sound card created by USB SND. This >> allows for applications to know which platform sound card has offload support. >> Will return the card number. >> - Broke down and cleaned up some functions/APIs within qc_audio_offload driver. >> - Exported xhci_initialize_ring_info(), and modified XHCI makefile to allow for >> the XHCI sideband to exist as a module. >> - Reworked the jack registration and moved it to the QCOM platform card driver, >> ie sm8250. >> - Added an SOC USB API to fetch a standard component tag that can be appended to >> the platform sound card. Added this tag to sm8250 if any USB path exists within >> the DT node. >> - Moved kcontrols that existed in the Q6USB driver, and made it a bit more generic, >> so that naming can be standardized across solutions. SOC USB is now responsible >> for creation of these kcontrols. >> - Added a SOC USB RST document explaining some code flows and implementation details >> so that other vendors can utilize the framework. >> - Addressed a case where USB device connection events are lost if usb offload driver >> (qc_audio_offload) is not probed when everything else has been initialized, ie >> USB SND, SOC USB and ASoC sound card. Add a rediscover device call during module >> init, to ensure that connection events will be propagated. >> - Rebased to usb-next. >> >> Changes in v9: >> - Fixed the dt binding check issue with regards to num-hc-interrupters. >> >> Changes in v8: >> - Cleaned up snd_soc_usb_find_priv_data() based on Mark's feedback. Removed some of >> the duplicate looping code that was present on previous patches. Also renamed the API. >> - Integrated Mathias' suggestions on his new sideband changes: >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters >> - Addressed some of Mathias' fixme tags, such as: >> - Resetting transfer ring dequeue/enqueue pointers >> - Issuing stop endpoint command during ep removal >> - Reset ERDP properly to first segment ring during interrupter removal. (this is currently >> just being cleared to 0, but should be pointing to a valid segment if controller is still >> running. >> >> Changes in v7: >> - Fixed dt check error for q6usb bindings >> - Updated q6usb property from qcom,usb-audio-intr-num --> qcom,usb-audio-intr-idx >> - Removed separate DWC3 HC interrupters num property, and place limits to XHCI one. >> - Modified xhci_ring_to_sgtable() to use assigned IOVA/DMA address to fetch pages, as >> it is not ensured event ring allocated is always done in the vmalloc range. >> >> Changes in v6: >> - Fixed limits and description on several DT bindings (XHCI and Q6USB) >> - Fixed patch subjects to follow other ALSA/ASoC notations. >> >> USB SND >> - Addressed devices which expose multiple audio (UAC) interfaces. These devices will >> create a single USB sound card with multiple audio streams, and receive multiple >> interface probe routines. QC offload was not properly considering cases with multiple >> probe calls. >> - Renamed offload module name and kconfig to fit within the SND domain. >> - Renamed attach/detach endpoint API to keep the hw_params notation. >> >> Changes in v5: >> - Removed some unnecessary files that were included >> - Fixed some typos mentioned >> - Addressed dt-binding issues and added hc-interrupters definition to usb-xhci.yaml >> >> XHCI: >> - Moved secondary skip events API to xhci-ring and updated implementation >> - Utilized existing XHCI APIs, such as inc_deq and xhci_update_erst_dequeue() >> >> USB SND >> - Renamed and reworked the APIs in "sound: usb: Export USB SND APIs for modules" patch to >> include suggestions to utilize snd_usb_hw_params/free and to avoid generic naming. >> - Added a resume_cb() op for completion sake. >> - Addressed some locking concerns with regards to when registering for platform hooks. >> - Added routine to disconnect all offloaded devices during module unbind. >> >> ASoC >> - Replaced individual PCM parameter arguments in snd_soc_usb_connect() with new >> snd_soc_usb_device structure to pass along PCM info. >> - Modified snd_jack set report to notify HEADPHONE event, as we do not support record path. >> >> Changes in v4: >> - Rebased to xhci/for-usb-next >> - Addressed some dt-bindings comments >> >> XHCI: >> - Pulled in latest changes from Mathias' feature_interrupters branch: >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters >> >> - Fixed commit text and signage for the XHCI sideband/interrupter related changes >> - Added some logic to address the FIXME tags mentioned throughout the commits, such >> as handling multi segment rings and building the SGT, locking concerns, and ep >> cleanup operations. >> - Removed some fixme tags for conditions that may not be needed/addressed. >> - Repurposed the new endpoint stop sync API to be utilized in other places. >> - Fixed potential compile issue if XHCI sideband config is not defined. >> >> ASoC: >> - Added sound jack control into the Q6USB driver. Allows for userspsace to know when >> an offload capable device is connected. >> >> USB SND: >> - Avoided exporting _snd_pcm_hw_param_set based on Takashi's recommendation. >> - Split USB QMI packet header definitions into a separate commit. This is used to >> properly allow the QMI interface driver to parse and route QMI packets accordingly >> - Added a "depends on" entry when enabling QC audio offload to avoid compile time >> issues. >> >> Changes in v3: >> - Changed prefix from RFC to PATCH >> - Rebased entire series to usb-next >> - Updated copyright years >> >> XHCI: >> - Rebased changes on top of XHCI changes merged into usb-next, and only added >> changes that were still under discussion. >> - Added change to read in the "num-hc-interrupters" device property. >> >> ASoC: >> - qusb6 USB backend >> - Incorporated suggestions to fetch iommu information with existing APIs >> - Added two new sound kcontrols to fetch offload status and offload device >> selection. >> - offload status - will return the card and pcm device in use >> tinymix -D 0 get 1 --> 1, 0 (offload in progress on card#1 pcm#0) >> >> - device selection - set the card and pcm device to enable offload on. Ex.: >> tinymix -D 0 set 1 2 0 --> sets offload on card#2 pcm#0 >> (this should be the USB card) >> >> USB SND: >> - Fixed up some locking related concerns for registering platform ops. >> - Moved callbacks under the register_mutex, so that >> - Modified APIs to properly pass more information about the USB SND device, so >> that the Q6USB backend can build a device list/map, in order to monitor offload >> status and device selection. >> >> Changes in v2: >> >> XHCI: >> - Replaced XHCI and HCD changes with Mathias' XHCI interrupter changes >> in his tree: >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters >> >> Adjustments made to Mathias' changes: >> - Created xhci-intr.h to export/expose interrupter APIs versus exposing xhci.h. >> Moved dependent structures to this file as well. (so clients can parse out >> information from "struct xhci_interrupter") >> - Added some basic locking when requesting interrupters. >> - Fixed up some sanity checks. >> - Removed clearing of the ERSTBA during freeing of the interrupter. (pending >> issue where SMMU fault occurs if DMA addr returned is 64b - TODO) >> >> - Clean up pending events in the XHCI secondary interrupter. While testing USB >> bus suspend, it was seen that on bus resume, the xHCI HC would run into a command >> timeout. >> - Added offloading APIs to xHCI to fetch transfer and event ring information. >> >> ASoC: >> - Modified soc-usb to allow for multiple USB port additions. For this to work, >> the USB offload driver has to have a reference to the USB backend by adding >> a "usb-soc-be" DT entry to the device saved into XHCI sysdev. >> - Created separate dt-bindings for defining USB_RX port. >> - Increased APR timeout to accommodate the situation where the AFE port start >> command could be delayed due to having to issue a USB bus resume while >> handling the QMI stream start command. >> >> Mathias Nyman (3): >> xhci: support setting interrupt moderation IMOD for secondary >> interrupters >> xhci: add helper to stop endpoint and wait for completion >> xhci: sideband: add initial api to register a sideband entity >> >> Wesley Cheng (30): >> usb: host: xhci: Repurpose event handler for skipping interrupter >> events >> usb: xhci: xhci-sideband: Set IMOD for xHCI sideband clients >> usb: host: xhci-mem: Cleanup pending secondary event ring events >> usb: host: xhci-mem: Allow for interrupter clients to choose specific >> index >> usb: host: xhci-plat: Set XHCI max interrupters if property is present >> usb: dwc3: Specify maximum number of XHCI interrupters >> ALSA: Add USB audio device jack type >> ALSA: usb-audio: Export USB SND APIs for modules >> ALSA: usb-audio: Check for support for requested audio format >> ALSA: usb-audio: Save UAC sample size information >> ALSA: usb-audio: Prevent starting of audio stream if in use >> ASoC: Add SOC USB APIs for adding an USB backend >> ASoC: usb: Add PCM format check API for USB backend >> ASoC: usb: Create SOC USB SND jack kcontrol >> ASoC: usb: Fetch ASoC card and pcm device information >> ASoC: doc: Add documentation for SOC USB >> ASoC: dt-bindings: qcom,q6dsp-lpass-ports: Add USB_RX port >> ASoC: dt-bindings: Update example for enabling USB offload on SM8250 >> ASoC: qcom: qdsp6: Introduce USB AFE port to q6dsp >> ASoC: qcom: qdsp6: q6afe: Increase APR timeout >> ASoC: qcom: qdsp6: Add USB backend ASoC driver for Q6 >> ASoC: qcom: qdsp6: Add headphone jack for offload connection status >> ASoC: qcom: qdsp6: Fetch USB offload mapped card and PCM device >> ALSA: usb-audio: Introduce USB SND platform op callbacks >> ALSA: usb-audio: qcom: Add USB QMI definitions >> ALSA: usb-audio: qcom: Introduce QC USB SND offloading support >> ALSA: usb-audio: qcom: Don't allow USB offload path if PCM device is >> in use >> ALSA: usb-audio: Add USB offload route kcontrol >> ALSA: usb-audio: Allow for rediscovery of connected USB SND devices >> ASoC: usb: Rediscover USB SND devices on USB port add > Maybe increment your patch version before reposting next time? At least > you gave an interesting test case for Aerc's threading. It managed to > confuse your 01-32 series with the 00-33 series, and interleaved the > whole lot under the one cover letter. I wonder what lore thinks of it, > heh. > Ah...I lost track of my revisions on my end, sorry for the mix up. In these cases, should I resubmit this series as v29? Thanks for the advice in advanced. Thanks Wesley Cheng >> .../bindings/sound/qcom,sm8250.yaml | 15 + >> Documentation/sound/soc/index.rst | 1 + >> Documentation/sound/soc/usb.rst | 491 ++++ >> drivers/usb/dwc3/core.c | 12 + >> drivers/usb/dwc3/core.h | 2 + >> drivers/usb/dwc3/host.c | 3 + >> drivers/usb/host/Kconfig | 9 + >> drivers/usb/host/Makefile | 2 + >> drivers/usb/host/xhci-mem.c | 37 +- >> drivers/usb/host/xhci-plat.c | 2 + >> drivers/usb/host/xhci-ring.c | 54 +- >> drivers/usb/host/xhci-sideband.c | 425 ++++ >> drivers/usb/host/xhci.c | 51 +- >> drivers/usb/host/xhci.h | 19 +- >> .../sound/qcom,q6dsp-lpass-ports.h | 1 + >> include/linux/mod_devicetable.h | 2 +- >> include/linux/usb/xhci-sideband.h | 70 + >> include/sound/jack.h | 4 +- >> include/sound/q6usboffload.h | 20 + >> include/sound/soc-usb.h | 147 ++ >> include/uapi/linux/input-event-codes.h | 3 +- >> sound/core/jack.c | 6 +- >> sound/soc/Kconfig | 10 + >> sound/soc/Makefile | 2 + >> sound/soc/qcom/Kconfig | 15 + >> sound/soc/qcom/Makefile | 2 + >> sound/soc/qcom/qdsp6/Makefile | 1 + >> sound/soc/qcom/qdsp6/q6afe-dai.c | 60 + >> sound/soc/qcom/qdsp6/q6afe.c | 194 +- >> sound/soc/qcom/qdsp6/q6afe.h | 36 +- >> sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c | 23 + >> sound/soc/qcom/qdsp6/q6dsp-lpass-ports.h | 1 + >> sound/soc/qcom/qdsp6/q6routing.c | 32 +- >> sound/soc/qcom/qdsp6/q6usb.c | 391 ++++ >> sound/soc/qcom/sm8250.c | 24 +- >> sound/soc/qcom/usb_offload_utils.c | 56 + >> sound/soc/qcom/usb_offload_utils.h | 30 + >> sound/soc/soc-usb.c | 369 +++ >> sound/usb/Kconfig | 25 + >> sound/usb/Makefile | 4 +- >> sound/usb/card.c | 106 + >> sound/usb/card.h | 17 + >> sound/usb/endpoint.c | 1 + >> sound/usb/format.c | 1 + >> sound/usb/helper.c | 1 + >> sound/usb/mixer_usb_offload.c | 102 + >> sound/usb/mixer_usb_offload.h | 17 + >> sound/usb/pcm.c | 104 +- >> sound/usb/pcm.h | 11 + >> sound/usb/qcom/Makefile | 2 + >> sound/usb/qcom/qc_audio_offload.c | 1974 +++++++++++++++++ >> sound/usb/qcom/usb_audio_qmi_v01.c | 863 +++++++ >> sound/usb/qcom/usb_audio_qmi_v01.h | 164 ++ >> 53 files changed, 5957 insertions(+), 57 deletions(-) >> create mode 100644 Documentation/sound/soc/usb.rst >> create mode 100644 drivers/usb/host/xhci-sideband.c >> create mode 100644 include/linux/usb/xhci-sideband.h >> create mode 100644 include/sound/q6usboffload.h >> create mode 100644 include/sound/soc-usb.h >> create mode 100644 sound/soc/qcom/qdsp6/q6usb.c >> create mode 100644 sound/soc/qcom/usb_offload_utils.c >> create mode 100644 sound/soc/qcom/usb_offload_utils.h >> create mode 100644 sound/soc/soc-usb.c >> create mode 100644 sound/usb/mixer_usb_offload.c >> create mode 100644 sound/usb/mixer_usb_offload.h >> create mode 100644 sound/usb/qcom/Makefile >> create mode 100644 sound/usb/qcom/qc_audio_offload.c >> create mode 100644 sound/usb/qcom/usb_audio_qmi_v01.c >> create mode 100644 sound/usb/qcom/usb_audio_qmi_v01.h
On Mon Oct 14, 2024 at 10:08 AM PDT, Wesley Cheng wrote: > Hi Chris, > > On 10/11/2024 4:08 AM, Christopher Snowhill wrote: > > Comment posted below, after the commit listing. > > > > On Thu Oct 10, 2024 at 5:05 PM PDT, Wesley Cheng wrote: > >> Requesting to see if we can get some Acked-By tags, and merge on usb-next. > >> > >> Several Qualcomm based chipsets can support USB audio offloading to a > >> dedicated audio DSP, which can take over issuing transfers to the USB > >> host controller. The intention is to reduce the load on the main > >> processors in the SoC, and allow them to be placed into lower power modes. > >> There are several parts to this design: > >> 1. Adding ASoC binding layer > >> 2. Create a USB backend for Q6DSP > >> 3. Introduce XHCI interrupter support > >> 4. Create vendor ops for the USB SND driver > >> > >> USB | ASoC > >> -------------------------------------------------------------------- > >> | _________________________ > >> | |sm8250 platform card | > >> | |_________________________| > >> | | | > >> | ___V____ ____V____ > >> | |Q6USB | |Q6AFE | > >> | |"codec" | |"cpu" | > >> | |________| |_________| > >> | ^ ^ ^ > >> | | |________| > >> | ___V____ | > >> | |SOC-USB | | > >> ________ ________ | | | > >> |USB SND |<--->|QC offld|<------------>|________| | > >> |(card.c)| | |<---------- | > >> |________| |________|___ | | | > >> ^ ^ | | | ____________V_________ > >> | | | | | |APR/GLINK | > >> __ V_______________V_____ | | | |______________________| > >> |USB SND (endpoint.c) | | | | ^ > >> |_________________________| | | | | > >> ^ | | | ___________V___________ > >> | | | |->|audio DSP | > >> ___________V_____________ | | |_______________________| > >> |XHCI HCD |<- | > >> |_________________________| | > >> > >> > >> Adding ASoC binding layer > >> ========================= > >> soc-usb: Intention is to treat a USB port similar to a headphone jack. > >> The port is always present on the device, but cable/pin status can be > >> enabled/disabled. Expose mechanisms for USB backend ASoC drivers to > >> communicate with USB SND. > >> > >> Create a USB backend for Q6DSP > >> ============================== > >> q6usb: Basic backend driver that will be responsible for maintaining the > >> resources needed to initiate a playback stream using the Q6DSP. Will > >> be the entity that checks to make sure the connected USB audio device > >> supports the requested PCM format. If it does not, the PCM open call will > >> fail, and userspace ALSA can take action accordingly. > >> > >> Introduce XHCI interrupter support > >> ================================== > >> XHCI HCD supports multiple interrupters, which allows for events to be routed > >> to different event rings. This is determined by "Interrupter Target" field > >> specified in Section "6.4.1.1 Normal TRB" of the XHCI specification. > >> > >> Events in the offloading case will be routed to an event ring that is assigned > >> to the audio DSP. > >> > >> Create vendor ops for the USB SND driver > >> ======================================== > >> qc_audio_offload: This particular driver has several components associated > >> with it: > >> - QMI stream request handler > >> - XHCI interrupter and resource management > >> - audio DSP memory management > >> > >> When the audio DSP wants to enable a playback stream, the request is first > >> received by the ASoC platform sound card. Depending on the selected route, > >> ASoC will bring up the individual DAIs in the path. The Q6USB backend DAI > >> will send an AFE port start command (with enabling the USB playback path), and > >> the audio DSP will handle the request accordingly. > >> > >> Part of the AFE USB port start handling will have an exchange of control > >> messages using the QMI protocol. The qc_audio_offload driver will populate the > >> buffer information: > >> - Event ring base address > >> - EP transfer ring base address > >> > >> and pass it along to the audio DSP. All endpoint management will now be handed > >> over to the DSP, and the main processor is not involved in transfers. > >> > >> Overall, implementing this feature will still expose separate sound card and PCM > >> devices for both the platform card and USB audio device: > >> 0 [SM8250MTPWCD938]: sm8250 - SM8250-MTP-WCD9380-WSA8810-VA-D > >> SM8250-MTP-WCD9380-WSA8810-VA-DMIC > >> 1 [Audio ]: USB-Audio - USB Audio > >> Generic USB Audio at usb-xhci-hcd.1.auto-1.4, high speed > >> > >> This is to ensure that userspace ALSA entities can decide which route to take > >> when executing the audio playback. In the above, if card#1 is selected, then > >> USB audio data will take the legacy path over the USB PCM drivers, etc... > >> > >> The current limitation is that the latest USB audio device that is identified > >> will be automatically selected by the Q6USB BE DAI for offloading. Future > >> patches can be added to possibly add for more flexibility, but until the userpace > >> applications can be better defined, having these mechanisms will complicate the > >> overall implementation. > >> > >> USB offload Kcontrols > >> ===================== > >> Part of the vendor offload package will have a mixer driver associated with it > >> (mixer_usb_offload.c). This entity will be responsible for coordinating with > >> SOC USB and the Q6USB backend DAI to fetch information about the sound card > >> and PCM device indices associated with the offload path. The logic is done > >> based on the current implementation of how paths are controlled within the QC > >> ASoC implementation. > >> > >> QC ASoC Q6Routing > >> ----------------- > >> Within the Q6 ASOC design, the registered ASoC platform card will expose a set > >> of kcontrols for enabling the BE DAI links to the FE DAI link. For example: > >> > >> tinymix -D 0 contents > >> Number of controls: 1033 > >> ctl type num name value > >> ... > >> 1025 BOOL 1 USB Mixer MultiMedia1 Off > >> 1026 BOOL 1 USB Mixer MultiMedia2 Off > >> 1027 BOOL 1 USB Mixer MultiMedia3 Off > >> 1028 BOOL 1 USB Mixer MultiMedia4 Off > >> 1029 BOOL 1 USB Mixer MultiMedia5 Off > >> 1030 BOOL 1 USB Mixer MultiMedia6 Off > >> 1031 BOOL 1 USB Mixer MultiMedia7 Off > >> 1032 BOOL 1 USB Mixer MultiMedia8 Off > >> > >> Each of these kcontrols will enable the USB BE DAI link (q6usb) to be connected > >> to a FE DAI link (q6asm). Since each of these controls are DAPM widgets, when > >> it is enabled, the DAPM widget's "connect" flag is updated accordingly. > >> > >> USB Offload Mapping > >> ------------------- > >> Based on the Q6routing, the USB BE DAI link can determine which sound card and > >> PCM device is enabled for offloading. Fetching the ASoC platform sound card's > >> information is fairly straightforward, and the bulk of the work goes to finding > >> the corresponding PCM device index. As mentioned above, the USB BE DAI can > >> traverse the DAPM widgets to find the DAPM path that is related to the control > >> for the "USB Mixer." Based on which "USB Mixer" is enabled, it can find the > >> corresponding DAPM widget associated w/ the FE DAI link (Multimedia*). From there > >> it can find the PCM device created for the Multimedia* stream. > >> > >> Only one BE DAI link can be enabled per FE DAI. For example, if the HDMI path is > >> enabled for Multimedia1, the USB Mixer will be disabled and switched over. > >> > >> Examples of kcontrol > >> -------------------- > >> tinymix -D 0 contents > >> Number of controls: 1033 > >> ctl type num name > >> ... > >> 1025 BOOL 1 USB Mixer MultiMedia1 Off > >> 1026 BOOL 1 USB Mixer MultiMedia2 On > >> 1027 BOOL 1 USB Mixer MultiMedia3 Off > >> 1028 BOOL 1 USB Mixer MultiMedia4 Off > >> 1029 BOOL 1 USB Mixer MultiMedia5 Off > >> 1030 BOOL 1 USB Mixer MultiMedia6 Off > >> 1031 BOOL 1 USB Mixer MultiMedia7 Off > >> 1032 BOOL 1 USB Mixer MultiMedia8 Off > >> > >> tinymix -D 2 contents > >> Number of controls: 7 > >> ctl type num name value > >> 0 INT 2 Playback Channel Map 0, 0 (range 0->36) > >> 1 BOOL 2 MDR-1ADAC Playback Switch On, On > >> 2 BOOL 1 MDR-1ADAC Playback Switch On > >> 3 INT 2 MDR-1ADAC Playback Volume 127, 127 (range 0->127) > >> 4 INT 1 MDR-1ADAC Playback Volume 127 (range 0->127) > >> 5 BOOL 1 Sony Internal Clock Validity On > >> 6 INT 2 USB Offload Playback Route PCM#0 0, 1 (range -1->255) > >> > >> The example highlights that the userspace/application can utilize the offload path > >> for the USB device on card#0 PCM device#1. > >> > >> When dealing with multiple USB audio devices, only the latest USB device identified > >> is going to be selected for offload capable. > >> > >> tinymix -D 1 contents > >> 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 1 (range 0->4) > >> 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 2 USB Offload Playback Route PCM#0 -1, -1 (range -1->255) > >> > >> "-1, -1" shows that this device has no route to the offload path. > >> > >> This feature was validated using: > >> - tinymix: set/enable the multimedia path to route to USB backend > >> - tinyplay: issue playback on platform card > >> > >> Changelog > >> -------------------------------------------- > >> Changes in v28: > >> - Fixed some phrases/wording within the SOC USB documentation, and also added an output > >> with aplay -l for the example output. > >> - Fixed allocated string buffer for creating the USB SND offload mixer, and added > >> a PCM index check to ensure that the pcm index is less than the expected number. > >> - Added a complement enable jack call if USB backend DAI link drivers need access > >> to it. > >> > >> Changes in v27: > >> - Added some comments and notes about the offload design. Enforcing the q6routing > >> to only allow one USB mixer (PCM device) to be enabled at a time. > >> - Modified SND_JACK_USB notifications for all USB audio offloadable devices plugged > >> in > >> - Rebased on latest XHCI secondary interrupter IMOD changes upstream. Modified the > >> change in this series to allow for XHCI sideband to set the IMOD for sideband > >> clients. > >> - Updated documentation on how USB SND kcontrols are involved in the overall design. > >> - Remove mutex locking from suspend/resume platform ops, as USB core ensures that the > >> interface and device are in the RPM_ACTIVE state while disconnect is handled. > >> > >> Changes in v26: > >> - Cleaned up drivers based on errors from checkpatch > >> - Fixed several typos using codespell > >> - Removed any vendor specific notation from USB SND offload mixer patch > >> > >> Changes in v25: > >> - Cleanups on typos mentioned within the xHCI layers > >> - Modified the xHCI interrupter search if clients specify interrupter index > >> - Moved mixer_usb_offload into its own module, so that other vendor offload USB > >> modules can utilize it also. > >> - Added support for USB audio devices that may have multiple PCM streams, as > >> previous implementation only assumed a single PCM device. SOC USB will be > >> able to handle an array of PCM indexes supported by the USB audio device. > >> - Added some additional checks in the QC USB offload driver to check that device > >> has at least one playback stream before allowing to bind > >> - Reordered DT bindings to fix the error found by Rob's bot. The patch that > >> added USB_RX was after the example was updated. > >> - Updated comments within SOC USB to clarify terminology and to keep it consistent > >> - Added SND_USB_JACK type for notifying of USB device audio connections > >> > >> Changes in v24: > >> - Simplified the kcontrols involved in determining how to utilize the offload > >> path. > >> - There is one kcontrol registered to each USB audio device that will > >> output which card/pcm device it is mapped to for the offload route. > >> - Removed kcontrols to track offload status and device selection. > >> - Default to last USB audio device plugged in as offload capable. > >> - kcontrol will reside on USB SND device. > >> - Reworked the tracking of connected USB devices from the Q6USB BE DAI link. > >> Previously, it was convoluted by doing it over an array, but moved to using > >> a list made it much simpler. Logic is still unchanged in that the last USB > >> headset plugged in will be selected for offloading. > >> - Updated the USB SOC RST documentation accordingly with new kcontrol updates. > >> - Added logic to fetch mapped ASoC card and pcm device index that the offload > >> path is mapped to for the USB SND kcontrol (for offload route). > >> - Re-ordered series to hopefully make reviews more readable by combining > >> patches based on the layer modified (ie QC ASoC, ASoC, USB sound, and USB XHCI). > >> > >> Changes in v23: > >> - Added MODULE_DESCRIPTION() fields to drivers that needed it. > >> > >> Changes in v22: > >> - Removed components tag for the ASoC platform card, as the USB SND kcontrol for > >> notifying userspace of offload capable card achieves similar results. > >> - Due to the above, had to remove the review-by tag for the RST documentation, > >> as changes were made to remove the components tag section. > >> - Took in feedback to make the SOC USB add/remove ports void. > >> - Fixed an issue w/ the USB SND kcontrol management for devices that have multi > >> UAC interfaces. (would attempt to create the kcontrol more than once) > >> - Modified SOC USB card and PCM index select to be based off the num_supported > >> streams that is specified by the USB BE DAI. > >> - Modified comments on selecting the latest USB headset for offloading. > >> > >> Changes in v21: > >> - Added an offload jack disable path from the ASoC platform driver and SOC USB. > >> - Refactored some of the existing SOC USB context look up APIs and created some > >> new helpers to search for the USB context. > >> - Renamed snd_soc_usb_find_format to snd_soc_usb_find_supported_format > >> - Removed some XHCI sideband calls that would allow clients to actually enable > >> the IRQ line associated w/ the secondary interrupter. This is removed because > >> there are other dependencies that are required for that to happen, which are not > >> covered as part of this series, and to avoid confusion. > >> - Due to the above, removed the need to export IMOD setting, and enable/disable > >> interrupter APIs. > >> > >> Changes in v20: > >> - Fixed up some formatting changes pointed out in the usb.rst > >> - Added SB null check during XHCI sideband unregister in case caller passes > >> improper argument (xhci_sideband_unregister()) > >> > >> Changes in v19: > >> - Rebased to usb-next to account for some new changes in dependent drivers. > >> > >> Changes in v18: > >> - Rebased to usb-next, which merged in part of the series. Removed these patches. > >> - Reworked Kconfigs for the ASoC USB related components from QCOM Q6DSP drivers > >> to keep dependencies in place for SoC USB and USB SND. > >> - Removed the repurposing of the stop ep sync API into existing XHCI operations. > >> This will be solely used by the XHCI sideband for now. > >> > >> Changes in v17: > >> - Fixed an issue where one patch was squashed into another. > >> - Re-added some kconfig checks for helpers exposed in USB SND for the soc usb > >> driver, after running different kconfigs. > >> > >> Changes in v16: > >> - Modified some code layer dependencies so that soc usb can be split as a separate > >> module. > >> - Split the kcontrols from ASoC QCOM common layer into a separate driver > >> - Reworked SOC USB kcontrols for controlling card + pcm offload routing and status > >> so that there are individual controls for card and pcm devices. > >> - Added a kcontrol remove API in SOC USB to remove the controls on the fly. This > >> required to add some kcontrol management to SOC USB. > >> - Removed the disconnect work and workqueue for the QC USB offload as it is not > >> required, since QMI interface driver ensures events are handled in its own WQ. > >> > >> Changes in v15: > >> - Removed some already merged XHCI changes > >> - Separated SOC USB driver from being always compiled into SOC core. Now > >> configurable from kconfig. > >> - Fixed up ASoC kcontrol naming to fit guidelines. > >> - Removed some unnecessary dummy ifdefs. > >> - Moved usb snd offload capable kcontrol to be initialized by the platform offloading > >> driver. > >> > >> Changes in v14: > >> - Cleaned up some USB SND related feedback: > >> - Renamed SNDUSB OFFLD playback available --> USB offload capable card > >> - Fixed locking while checking if stream is in use > >> - Replaced some mutex pairs with guard(mutex) > >> > >> Changes in v13: > >> - Pulled in secondary/primary interrupter rework from Mathias from: > >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/drivers/usb/host?h=fix_eventhandling > >> - Did some cleanup and commit message updates, and tested on current code base. > >> - Added mutex locking to xhci sideband to help prevent any race conditions, esp. for when accessing shared > >> references. > >> - Addressed concerns from Hillf about gfp_flags and locking used in qc_usb_audio_offload. > >> - Rebased onto usb-next > >> > >> Changes in v12: > >> - Updated copyright year to 2024. Happy new years! > >> - Fixed newline format on mixer offload driver. > >> > >> Changes in v11: > >> - Modified QMI format structures to be const > >> > >> Changes in v10: > >> - Added new mixer for exposing kcontrol for sound card created by USB SND. This > >> allows for applications to know which platform sound card has offload support. > >> Will return the card number. > >> - Broke down and cleaned up some functions/APIs within qc_audio_offload driver. > >> - Exported xhci_initialize_ring_info(), and modified XHCI makefile to allow for > >> the XHCI sideband to exist as a module. > >> - Reworked the jack registration and moved it to the QCOM platform card driver, > >> ie sm8250. > >> - Added an SOC USB API to fetch a standard component tag that can be appended to > >> the platform sound card. Added this tag to sm8250 if any USB path exists within > >> the DT node. > >> - Moved kcontrols that existed in the Q6USB driver, and made it a bit more generic, > >> so that naming can be standardized across solutions. SOC USB is now responsible > >> for creation of these kcontrols. > >> - Added a SOC USB RST document explaining some code flows and implementation details > >> so that other vendors can utilize the framework. > >> - Addressed a case where USB device connection events are lost if usb offload driver > >> (qc_audio_offload) is not probed when everything else has been initialized, ie > >> USB SND, SOC USB and ASoC sound card. Add a rediscover device call during module > >> init, to ensure that connection events will be propagated. > >> - Rebased to usb-next. > >> > >> Changes in v9: > >> - Fixed the dt binding check issue with regards to num-hc-interrupters. > >> > >> Changes in v8: > >> - Cleaned up snd_soc_usb_find_priv_data() based on Mark's feedback. Removed some of > >> the duplicate looping code that was present on previous patches. Also renamed the API. > >> - Integrated Mathias' suggestions on his new sideband changes: > >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters > >> - Addressed some of Mathias' fixme tags, such as: > >> - Resetting transfer ring dequeue/enqueue pointers > >> - Issuing stop endpoint command during ep removal > >> - Reset ERDP properly to first segment ring during interrupter removal. (this is currently > >> just being cleared to 0, but should be pointing to a valid segment if controller is still > >> running. > >> > >> Changes in v7: > >> - Fixed dt check error for q6usb bindings > >> - Updated q6usb property from qcom,usb-audio-intr-num --> qcom,usb-audio-intr-idx > >> - Removed separate DWC3 HC interrupters num property, and place limits to XHCI one. > >> - Modified xhci_ring_to_sgtable() to use assigned IOVA/DMA address to fetch pages, as > >> it is not ensured event ring allocated is always done in the vmalloc range. > >> > >> Changes in v6: > >> - Fixed limits and description on several DT bindings (XHCI and Q6USB) > >> - Fixed patch subjects to follow other ALSA/ASoC notations. > >> > >> USB SND > >> - Addressed devices which expose multiple audio (UAC) interfaces. These devices will > >> create a single USB sound card with multiple audio streams, and receive multiple > >> interface probe routines. QC offload was not properly considering cases with multiple > >> probe calls. > >> - Renamed offload module name and kconfig to fit within the SND domain. > >> - Renamed attach/detach endpoint API to keep the hw_params notation. > >> > >> Changes in v5: > >> - Removed some unnecessary files that were included > >> - Fixed some typos mentioned > >> - Addressed dt-binding issues and added hc-interrupters definition to usb-xhci.yaml > >> > >> XHCI: > >> - Moved secondary skip events API to xhci-ring and updated implementation > >> - Utilized existing XHCI APIs, such as inc_deq and xhci_update_erst_dequeue() > >> > >> USB SND > >> - Renamed and reworked the APIs in "sound: usb: Export USB SND APIs for modules" patch to > >> include suggestions to utilize snd_usb_hw_params/free and to avoid generic naming. > >> - Added a resume_cb() op for completion sake. > >> - Addressed some locking concerns with regards to when registering for platform hooks. > >> - Added routine to disconnect all offloaded devices during module unbind. > >> > >> ASoC > >> - Replaced individual PCM parameter arguments in snd_soc_usb_connect() with new > >> snd_soc_usb_device structure to pass along PCM info. > >> - Modified snd_jack set report to notify HEADPHONE event, as we do not support record path. > >> > >> Changes in v4: > >> - Rebased to xhci/for-usb-next > >> - Addressed some dt-bindings comments > >> > >> XHCI: > >> - Pulled in latest changes from Mathias' feature_interrupters branch: > >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters > >> > >> - Fixed commit text and signage for the XHCI sideband/interrupter related changes > >> - Added some logic to address the FIXME tags mentioned throughout the commits, such > >> as handling multi segment rings and building the SGT, locking concerns, and ep > >> cleanup operations. > >> - Removed some fixme tags for conditions that may not be needed/addressed. > >> - Repurposed the new endpoint stop sync API to be utilized in other places. > >> - Fixed potential compile issue if XHCI sideband config is not defined. > >> > >> ASoC: > >> - Added sound jack control into the Q6USB driver. Allows for userspsace to know when > >> an offload capable device is connected. > >> > >> USB SND: > >> - Avoided exporting _snd_pcm_hw_param_set based on Takashi's recommendation. > >> - Split USB QMI packet header definitions into a separate commit. This is used to > >> properly allow the QMI interface driver to parse and route QMI packets accordingly > >> - Added a "depends on" entry when enabling QC audio offload to avoid compile time > >> issues. > >> > >> Changes in v3: > >> - Changed prefix from RFC to PATCH > >> - Rebased entire series to usb-next > >> - Updated copyright years > >> > >> XHCI: > >> - Rebased changes on top of XHCI changes merged into usb-next, and only added > >> changes that were still under discussion. > >> - Added change to read in the "num-hc-interrupters" device property. > >> > >> ASoC: > >> - qusb6 USB backend > >> - Incorporated suggestions to fetch iommu information with existing APIs > >> - Added two new sound kcontrols to fetch offload status and offload device > >> selection. > >> - offload status - will return the card and pcm device in use > >> tinymix -D 0 get 1 --> 1, 0 (offload in progress on card#1 pcm#0) > >> > >> - device selection - set the card and pcm device to enable offload on. Ex.: > >> tinymix -D 0 set 1 2 0 --> sets offload on card#2 pcm#0 > >> (this should be the USB card) > >> > >> USB SND: > >> - Fixed up some locking related concerns for registering platform ops. > >> - Moved callbacks under the register_mutex, so that > >> - Modified APIs to properly pass more information about the USB SND device, so > >> that the Q6USB backend can build a device list/map, in order to monitor offload > >> status and device selection. > >> > >> Changes in v2: > >> > >> XHCI: > >> - Replaced XHCI and HCD changes with Mathias' XHCI interrupter changes > >> in his tree: > >> https://git.kernel.org/pub/scm/linux/kernel/git/mnyman/xhci.git/log/?h=feature_interrupters > >> > >> Adjustments made to Mathias' changes: > >> - Created xhci-intr.h to export/expose interrupter APIs versus exposing xhci.h. > >> Moved dependent structures to this file as well. (so clients can parse out > >> information from "struct xhci_interrupter") > >> - Added some basic locking when requesting interrupters. > >> - Fixed up some sanity checks. > >> - Removed clearing of the ERSTBA during freeing of the interrupter. (pending > >> issue where SMMU fault occurs if DMA addr returned is 64b - TODO) > >> > >> - Clean up pending events in the XHCI secondary interrupter. While testing USB > >> bus suspend, it was seen that on bus resume, the xHCI HC would run into a command > >> timeout. > >> - Added offloading APIs to xHCI to fetch transfer and event ring information. > >> > >> ASoC: > >> - Modified soc-usb to allow for multiple USB port additions. For this to work, > >> the USB offload driver has to have a reference to the USB backend by adding > >> a "usb-soc-be" DT entry to the device saved into XHCI sysdev. > >> - Created separate dt-bindings for defining USB_RX port. > >> - Increased APR timeout to accommodate the situation where the AFE port start > >> command could be delayed due to having to issue a USB bus resume while > >> handling the QMI stream start command. > >> > >> Mathias Nyman (3): > >> xhci: support setting interrupt moderation IMOD for secondary > >> interrupters > >> xhci: add helper to stop endpoint and wait for completion > >> xhci: sideband: add initial api to register a sideband entity > >> > >> Wesley Cheng (30): > >> usb: host: xhci: Repurpose event handler for skipping interrupter > >> events > >> usb: xhci: xhci-sideband: Set IMOD for xHCI sideband clients > >> usb: host: xhci-mem: Cleanup pending secondary event ring events > >> usb: host: xhci-mem: Allow for interrupter clients to choose specific > >> index > >> usb: host: xhci-plat: Set XHCI max interrupters if property is present > >> usb: dwc3: Specify maximum number of XHCI interrupters > >> ALSA: Add USB audio device jack type > >> ALSA: usb-audio: Export USB SND APIs for modules > >> ALSA: usb-audio: Check for support for requested audio format > >> ALSA: usb-audio: Save UAC sample size information > >> ALSA: usb-audio: Prevent starting of audio stream if in use > >> ASoC: Add SOC USB APIs for adding an USB backend > >> ASoC: usb: Add PCM format check API for USB backend > >> ASoC: usb: Create SOC USB SND jack kcontrol > >> ASoC: usb: Fetch ASoC card and pcm device information > >> ASoC: doc: Add documentation for SOC USB > >> ASoC: dt-bindings: qcom,q6dsp-lpass-ports: Add USB_RX port > >> ASoC: dt-bindings: Update example for enabling USB offload on SM8250 > >> ASoC: qcom: qdsp6: Introduce USB AFE port to q6dsp > >> ASoC: qcom: qdsp6: q6afe: Increase APR timeout > >> ASoC: qcom: qdsp6: Add USB backend ASoC driver for Q6 > >> ASoC: qcom: qdsp6: Add headphone jack for offload connection status > >> ASoC: qcom: qdsp6: Fetch USB offload mapped card and PCM device > >> ALSA: usb-audio: Introduce USB SND platform op callbacks > >> ALSA: usb-audio: qcom: Add USB QMI definitions > >> ALSA: usb-audio: qcom: Introduce QC USB SND offloading support > >> ALSA: usb-audio: qcom: Don't allow USB offload path if PCM device is > >> in use > >> ALSA: usb-audio: Add USB offload route kcontrol > >> ALSA: usb-audio: Allow for rediscovery of connected USB SND devices > >> ASoC: usb: Rediscover USB SND devices on USB port add > > Maybe increment your patch version before reposting next time? At least > > you gave an interesting test case for Aerc's threading. It managed to > > confuse your 01-32 series with the 00-33 series, and interleaved the > > whole lot under the one cover letter. I wonder what lore thinks of it, > > heh. > > > Ah...I lost track of my revisions on my end, sorry for the mix up. In these cases, should I resubmit this series as v29? Thanks for the advice in advanced. Since I cannot tell which set of v28 is the correct set, perhaps it is best for the list that you repost the latest revision as v29. Sorry about that. -Christopher > > Thanks > > Wesley Cheng > > >> .../bindings/sound/qcom,sm8250.yaml | 15 + > >> Documentation/sound/soc/index.rst | 1 + > >> Documentation/sound/soc/usb.rst | 491 ++++ > >> drivers/usb/dwc3/core.c | 12 + > >> drivers/usb/dwc3/core.h | 2 + > >> drivers/usb/dwc3/host.c | 3 + > >> drivers/usb/host/Kconfig | 9 + > >> drivers/usb/host/Makefile | 2 + > >> drivers/usb/host/xhci-mem.c | 37 +- > >> drivers/usb/host/xhci-plat.c | 2 + > >> drivers/usb/host/xhci-ring.c | 54 +- > >> drivers/usb/host/xhci-sideband.c | 425 ++++ > >> drivers/usb/host/xhci.c | 51 +- > >> drivers/usb/host/xhci.h | 19 +- > >> .../sound/qcom,q6dsp-lpass-ports.h | 1 + > >> include/linux/mod_devicetable.h | 2 +- > >> include/linux/usb/xhci-sideband.h | 70 + > >> include/sound/jack.h | 4 +- > >> include/sound/q6usboffload.h | 20 + > >> include/sound/soc-usb.h | 147 ++ > >> include/uapi/linux/input-event-codes.h | 3 +- > >> sound/core/jack.c | 6 +- > >> sound/soc/Kconfig | 10 + > >> sound/soc/Makefile | 2 + > >> sound/soc/qcom/Kconfig | 15 + > >> sound/soc/qcom/Makefile | 2 + > >> sound/soc/qcom/qdsp6/Makefile | 1 + > >> sound/soc/qcom/qdsp6/q6afe-dai.c | 60 + > >> sound/soc/qcom/qdsp6/q6afe.c | 194 +- > >> sound/soc/qcom/qdsp6/q6afe.h | 36 +- > >> sound/soc/qcom/qdsp6/q6dsp-lpass-ports.c | 23 + > >> sound/soc/qcom/qdsp6/q6dsp-lpass-ports.h | 1 + > >> sound/soc/qcom/qdsp6/q6routing.c | 32 +- > >> sound/soc/qcom/qdsp6/q6usb.c | 391 ++++ > >> sound/soc/qcom/sm8250.c | 24 +- > >> sound/soc/qcom/usb_offload_utils.c | 56 + > >> sound/soc/qcom/usb_offload_utils.h | 30 + > >> sound/soc/soc-usb.c | 369 +++ > >> sound/usb/Kconfig | 25 + > >> sound/usb/Makefile | 4 +- > >> sound/usb/card.c | 106 + > >> sound/usb/card.h | 17 + > >> sound/usb/endpoint.c | 1 + > >> sound/usb/format.c | 1 + > >> sound/usb/helper.c | 1 + > >> sound/usb/mixer_usb_offload.c | 102 + > >> sound/usb/mixer_usb_offload.h | 17 + > >> sound/usb/pcm.c | 104 +- > >> sound/usb/pcm.h | 11 + > >> sound/usb/qcom/Makefile | 2 + > >> sound/usb/qcom/qc_audio_offload.c | 1974 +++++++++++++++++ > >> sound/usb/qcom/usb_audio_qmi_v01.c | 863 +++++++ > >> sound/usb/qcom/usb_audio_qmi_v01.h | 164 ++ > >> 53 files changed, 5957 insertions(+), 57 deletions(-) > >> create mode 100644 Documentation/sound/soc/usb.rst > >> create mode 100644 drivers/usb/host/xhci-sideband.c > >> create mode 100644 include/linux/usb/xhci-sideband.h > >> create mode 100644 include/sound/q6usboffload.h > >> create mode 100644 include/sound/soc-usb.h > >> create mode 100644 sound/soc/qcom/qdsp6/q6usb.c > >> create mode 100644 sound/soc/qcom/usb_offload_utils.c > >> create mode 100644 sound/soc/qcom/usb_offload_utils.h > >> create mode 100644 sound/soc/soc-usb.c > >> create mode 100644 sound/usb/mixer_usb_offload.c > >> create mode 100644 sound/usb/mixer_usb_offload.h > >> create mode 100644 sound/usb/qcom/Makefile > >> create mode 100644 sound/usb/qcom/qc_audio_offload.c > >> create mode 100644 sound/usb/qcom/usb_audio_qmi_v01.c > >> create mode 100644 sound/usb/qcom/usb_audio_qmi_v01.h