From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
To: Wesley Cheng <quic_wcheng@quicinc.com>,
srinivas.kandagatla@linaro.org, mathias.nyman@intel.com,
perex@perex.cz, conor+dt@kernel.org, dmitry.torokhov@gmail.com,
corbet@lwn.net, broonie@kernel.org, lgirdwood@gmail.com,
tiwai@suse.com, krzk+dt@kernel.org, Thinh.Nguyen@synopsys.com,
bgoswami@quicinc.com, robh@kernel.org,
gregkh@linuxfoundation.org
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-sound@vger.kernel.org, linux-input@vger.kernel.org,
linux-usb@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-doc@vger.kernel.org, alsa-devel@alsa-project.org
Subject: Re: [PATCH v26 23/33] ASoC: qcom: qdsp6: Fetch USB offload mapped card and PCM device
Date: Fri, 30 Aug 2024 11:34:10 +0200 [thread overview]
Message-ID: <87b06b92-8e58-414d-ba53-db7c88ac525a@linux.intel.com> (raw)
In-Reply-To: <20240829194105.1504814-24-quic_wcheng@quicinc.com>
On 8/29/24 21:40, Wesley Cheng wrote:
> The USB SND path may need to know how the USB offload path is routed, so
> that applications can open the proper sound card and PCM device. The
> implementation for the QC ASoC design has a "USB Mixer" kcontrol for each
> possible FE (Q6ASM) DAI, which can be utilized to know which front end link
> is enabled.
>
> When an application/userspace queries for the mapped offload devices, the
> logic will lookup the USB mixer status though the following path:
>
> MultiMedia* <-> MM_DL* <-> USB Mixer*
>
> The "USB Mixer" is a DAPM widget, and the q6routing entity will set the
> DAPM connect status accordingly if the USB mixer is enabled. If enabled,
> the Q6USB backend link can fetch the PCM device number from the FE DAI
> link (Multimedia*). With respects to the card number, that is
> straightforward, as the ASoC components have direct references to the ASoC
> platform sound card.
>
> An example output can be shown below:
>
> Number of controls: 9
> name value
> Capture Channel Map 0, 0 (range 0->36)
> Playback Channel Map 0, 0 (range 0->36)
> Headset Capture Switch On
> Headset Capture Volume 1 (range 0->4)
> Sidetone Playback Switch On
> Sidetone Playback Volume 4096 (range 0->8192)
> Headset Playback Switch On
> Headset Playback Volume 20, 20 (range 0->24)
> USB Offload Playback Route PCM#0 0, 1 (range -1->255)
>
> The "USB Offload Playback Route PCM#*" kcontrol will signify the
> corresponding card and pcm device it is offload to. (card#0 pcm - device#1)
> If the USB SND device supports multiple audio interfaces, then it will
> contain several PCM streams, hence in those situations, it is expected
> that there will be multiple playback route kcontrols created.
>
> Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
> ---
> sound/soc/qcom/qdsp6/q6usb.c | 104 +++++++++++++++++++++++++++++++++++
> 1 file changed, 104 insertions(+)
>
> diff --git a/sound/soc/qcom/qdsp6/q6usb.c b/sound/soc/qcom/qdsp6/q6usb.c
> index 10337d70eb27..c2fc0dedf430 100644
> --- a/sound/soc/qcom/qdsp6/q6usb.c
> +++ b/sound/soc/qcom/qdsp6/q6usb.c
> @@ -132,6 +132,109 @@ static int q6usb_audio_ports_of_xlate_dai_name(struct snd_soc_component *compone
> return ret;
> }
>
> +static int q6usb_get_pcm_id_from_widget(struct snd_soc_dapm_widget *w)
> +{
> + struct snd_soc_pcm_runtime *rtd;
> + struct snd_soc_dai *dai;
> +
> + for_each_card_rtds(w->dapm->card, rtd) {
> + dai = snd_soc_rtd_to_cpu(rtd, 0);
> + /*
> + * Only look for playback widget. RTD number carries the assigned
> + * PCM index.
> + */
> + if (dai->stream[0].widget == w)
> + return rtd->num;
> + }
> +
> + return -1;
> +}
> +
> +static int q6usb_usb_mixer_enabled(struct snd_soc_dapm_widget *w)
> +{
> + struct snd_soc_dapm_path *p;
> +
> + /* Checks to ensure USB path is enabled/connected */
> + snd_soc_dapm_widget_for_each_sink_path(w, p)
> + if (!strcmp(p->sink->name, "USB Mixer") && p->connect)
> + return 1;
> +
> + return 0;
> +}
> +
> +static int q6usb_get_pcm_id(struct snd_soc_component *component)
> +{
> + struct snd_soc_dapm_widget *w;
> + struct snd_soc_dapm_path *p;
> + int pidx;
> +
> + /*
> + * Traverse widgets to find corresponding FE widget. The DAI links are
> + * built like the following:
> + * MultiMedia* <-> MM_DL* <-> USB Mixer*
> + */
> + for_each_card_widgets(component->card, w) {
> + if (!strncmp(w->name, "MultiMedia", 10)) {
> + /*
> + * Look up all paths associated with the FE widget to see if
> + * the USB BE is enabled. The sink widget is responsible to
> + * link with the USB mixers.
> + */
> + snd_soc_dapm_widget_for_each_sink_path(w, p) {
> + if (q6usb_usb_mixer_enabled(p->sink)) {
> + pidx = q6usb_get_pcm_id_from_widget(w);
> + return pidx;
> + }
> + }
Humm, there should be a note that the design assumes that the USB
offload path exposes a single PCM per endpoints - same as the
non-offloaded path. If the ASoC card has multiple PCMs for each
endpoint, possibly with different processing on each PCM, then the
mapping would fail.
The other question is whether you need to walk in the DAPM graph, in
theory DPCM has helpers to find which FEs are connected to which BE.
next prev parent reply other threads:[~2024-08-30 10:12 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-29 19:40 [PATCH v26 00/33] Introduce QC USB SND audio offloading support Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 01/33] xhci: add helper to stop endpoint and wait for completion Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 02/33] usb: host: xhci: Repurpose event handler for skipping interrupter events Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 03/33] xhci: sideband: add initial api to register a sideband entity Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 04/33] usb: xhci: Allow for secondary interrupter to set IMOD Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 05/33] usb: host: xhci-mem: Cleanup pending secondary event ring events Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 06/33] usb: host: xhci-mem: Allow for interrupter clients to choose specific index Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 07/33] usb: host: xhci-plat: Set XHCI max interrupters if property is present Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 08/33] usb: dwc3: Specify maximum number of XHCI interrupters Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 09/33] ALSA: Add USB audio device jack type Wesley Cheng
2024-08-30 8:28 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 10/33] ALSA: usb-audio: Export USB SND APIs for modules Wesley Cheng
2024-08-30 8:33 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 11/33] ALSA: usb-audio: Check for support for requested audio format Wesley Cheng
2024-08-30 8:34 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 12/33] ASoC: Add SOC USB APIs for adding an USB backend Wesley Cheng
2024-08-30 8:40 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 13/33] ASoC: usb: Add PCM format check API for " Wesley Cheng
2024-08-30 8:41 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 14/33] ASoC: usb: Create SOC USB SND jack kcontrol Wesley Cheng
2024-08-30 8:46 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 15/33] ASoC: usb: Fetch ASoC card and pcm device information Wesley Cheng
2024-08-30 8:50 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 16/33] ASoC: doc: Add documentation for SOC USB Wesley Cheng
2024-08-30 9:03 ` Pierre-Louis Bossart
2024-08-31 1:49 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 17/33] ASoC: dt-bindings: qcom,q6dsp-lpass-ports: Add USB_RX port Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 18/33] ASoC: dt-bindings: Update example for enabling USB offload on SM8250 Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 19/33] ASoC: qcom: qdsp6: Introduce USB AFE port to q6dsp Wesley Cheng
2024-08-30 9:12 ` Pierre-Louis Bossart
2024-08-31 2:11 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 20/33] ASoC: qcom: qdsp6: q6afe: Increase APR timeout Wesley Cheng
2024-08-30 9:13 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 21/33] ASoC: qcom: qdsp6: Add USB backend ASoC driver for Q6 Wesley Cheng
2024-08-30 9:21 ` Pierre-Louis Bossart
2024-09-03 21:18 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 22/33] ASoC: qcom: qdsp6: Add headphone jack for offload connection status Wesley Cheng
2024-08-30 9:27 ` Pierre-Louis Bossart
2024-09-03 21:41 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 23/33] ASoC: qcom: qdsp6: Fetch USB offload mapped card and PCM device Wesley Cheng
2024-08-30 9:34 ` Pierre-Louis Bossart [this message]
2024-09-03 21:49 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 24/33] ALSA: usb-audio: Introduce USB SND platform op callbacks Wesley Cheng
2024-08-30 9:38 ` Pierre-Louis Bossart
2024-09-03 23:20 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 25/33] ALSA: usb-audio: Save UAC sample size information Wesley Cheng
2024-08-30 9:42 ` Pierre-Louis Bossart
2024-08-29 19:40 ` [PATCH v26 26/33] ALSA: usb-audio: Prevent starting of audio stream if in use Wesley Cheng
2024-08-30 9:45 ` Pierre-Louis Bossart
2024-09-03 23:21 ` Wesley Cheng
2024-08-29 19:40 ` [PATCH v26 27/33] ALSA: usb-audio: qcom: Add USB QMI definitions Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 28/33] ALSA: usb-audio: qcom: Introduce QC USB SND offloading support Wesley Cheng
2024-08-30 9:52 ` Pierre-Louis Bossart
2024-09-03 23:41 ` Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 29/33] ALSA: usb-audio: qcom: Don't allow USB offload path if PCM device is in use Wesley Cheng
2024-08-30 9:55 ` Pierre-Louis Bossart
2024-09-03 23:43 ` Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 30/33] ALSA: usb-audio: qcom: Use card and PCM index from QMI request Wesley Cheng
2024-08-30 9:58 ` Pierre-Louis Bossart
2024-09-04 19:46 ` Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 31/33] ALSA: usb-audio: Add USB offload route kcontrol Wesley Cheng
2024-08-30 10:05 ` Pierre-Louis Bossart
2024-09-03 23:52 ` Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 32/33] ALSA: usb-audio: Allow for rediscovery of connected USB SND devices Wesley Cheng
2024-08-29 19:41 ` [PATCH v26 33/33] ASoC: usb: Rediscover USB SND devices on USB port add Wesley Cheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87b06b92-8e58-414d-ba53-db7c88ac525a@linux.intel.com \
--to=pierre-louis.bossart@linux.intel.com \
--cc=Thinh.Nguyen@synopsys.com \
--cc=alsa-devel@alsa-project.org \
--cc=bgoswami@quicinc.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=dmitry.torokhov@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=krzk+dt@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=perex@perex.cz \
--cc=quic_wcheng@quicinc.com \
--cc=robh@kernel.org \
--cc=srinivas.kandagatla@linaro.org \
--cc=tiwai@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).