From: Wesley Cheng <quic_wcheng@quicinc.com>
To: <srinivas.kandagatla@linaro.org>, <mathias.nyman@intel.com>,
<perex@perex.cz>, <conor+dt@kernel.org>, <corbet@lwn.net>,
<gregkh@linuxfoundation.org>, <lgirdwood@gmail.com>,
<andersson@kernel.org>, <krzysztof.kozlowski+dt@linaro.org>,
<konrad.dybcio@linaro.org>, <Thinh.Nguyen@synopsys.com>,
<broonie@kernel.org>, <bgoswami@quicinc.com>, <tiwai@suse.com>,
<robh+dt@kernel.org>, <agross@kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-sound@vger.kernel.org>, <linux-usb@vger.kernel.org>,
<linux-arm-msm@vger.kernel.org>, <linux-doc@vger.kernel.org>,
<alsa-devel@alsa-project.org>,
Wesley Cheng <quic_wcheng@quicinc.com>
Subject: [PATCH v10 29/41] ASoC: Introduce SND kcontrols to select sound card and PCM device
Date: Fri, 15 Dec 2023 13:49:43 -0800 [thread overview]
Message-ID: <20231215214955.12110-30-quic_wcheng@quicinc.com> (raw)
In-Reply-To: <20231215214955.12110-1-quic_wcheng@quicinc.com>
Add SND kcontrol to SOC USB, which will allow for userpsace to determine
which USB card number and PCM device to offload. This allows for userspace
to potentially tag an alternate path for a specific USB SND card and PCM
device. Previously, control was absent, and the offload path would be
enabled on the last USB SND device which was connected. This logic will
continue to be applicable if no mixer input is received for specific device
selection.
An example to configure the offload device using tinymix:
tinymix -D 0 set 'SNDUSB OFFLD device select' 1 0
The above command will configure the offload path to utilize card#1 and PCM
stream#0.
Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
---
include/sound/soc-usb.h | 7 ++++-
sound/soc/soc-usb.c | 65 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/include/sound/soc-usb.h b/include/sound/soc-usb.h
index f42e7f224549..195300510acc 100644
--- a/include/sound/soc-usb.h
+++ b/include/sound/soc-usb.h
@@ -26,14 +26,19 @@ struct snd_soc_usb_device {
* @dev - USB backend device reference
* @component - reference to ASoC component
* @connection_status_cb - callback to notify connection events
+ * @put_offload_dev - callback to select USB sound card/PCM device
+ * @get_offload_dev - callback to fetch selected USB sound card/PCM device
* @priv_data - driver data
**/
struct snd_soc_usb {
struct list_head list;
- struct device *dev;
struct snd_soc_component *component;
int (*connection_status_cb)(struct snd_soc_usb *usb,
struct snd_soc_usb_device *sdev, bool connected);
+ int (*put_offload_dev)(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol);
+ int (*get_offload_dev)(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol);
void *priv_data;
};
diff --git a/sound/soc/soc-usb.c b/sound/soc/soc-usb.c
index d62a51d9196c..622916a82b77 100644
--- a/sound/soc/soc-usb.c
+++ b/sound/soc/soc-usb.c
@@ -15,6 +15,9 @@ static struct device_node *snd_soc_find_phandle(struct device *dev)
{
struct device_node *node;
+ if (!dev)
+ return ERR_PTR(-ENODEV);
+
node = of_parse_phandle(dev->of_node, "usb-soc-be", 0);
if (!node)
return ERR_PTR(-ENODEV);
@@ -38,6 +41,64 @@ static struct snd_soc_usb *snd_soc_find_usb_ctx(struct device_node *node)
return NULL;
}
+/* SOC USB sound kcontrols */
+static int soc_usb_put_offload_dev(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct snd_soc_usb *ctx = snd_soc_usb_find_priv_data(component->dev);
+ int ret = 0;
+
+ mutex_lock(&ctx_mutex);
+ if (ctx && ctx->put_offload_dev)
+ ret = ctx->put_offload_dev(kcontrol, ucontrol);
+ mutex_unlock(&ctx_mutex);
+
+ return ret;
+}
+
+static int soc_usb_get_offload_dev(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+ struct snd_soc_usb *ctx = snd_soc_usb_find_priv_data(component->dev);
+ int ret = 0;
+
+ mutex_lock(&ctx_mutex);
+ if (ctx && ctx->get_offload_dev)
+ ret = ctx->get_offload_dev(kcontrol, ucontrol);
+ mutex_unlock(&ctx_mutex);
+
+ return ret;
+
+}
+
+static int soc_usb_offload_dev_info(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_info *uinfo)
+{
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+ uinfo->count = 2;
+ uinfo->value.integer.min = -1;
+ uinfo->value.integer.max = SNDRV_CARDS;
+
+ return 0;
+}
+
+static const struct snd_kcontrol_new soc_usb_dev_ctrl = {
+ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
+ .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+ .name = "SNDUSB OFFLD device select",
+ .info = soc_usb_offload_dev_info,
+ .get = soc_usb_get_offload_dev,
+ .put = soc_usb_put_offload_dev,
+};
+
+static int snd_soc_usb_control_init(struct snd_soc_component *component)
+{
+ return snd_ctl_add(component->card->snd_card,
+ snd_ctl_new1(&soc_usb_dev_ctrl, component));
+}
+
/**
* snd_soc_usb_get_components_tag() - Retrieve SOC USB component tag
* @playback: direction of audio stream
@@ -157,7 +218,11 @@ EXPORT_SYMBOL_GPL(snd_soc_usb_free_port);
*/
int snd_soc_usb_add_port(struct snd_soc_usb *usb)
{
+ int ret;
+ ret = snd_soc_usb_control_init(usb->component);
+ if (ret < 0)
+ return ret;
mutex_lock(&ctx_mutex);
list_add_tail(&usb->list, &usb_ctx_list);
next prev parent reply other threads:[~2023-12-15 21:50 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-15 21:49 [PATCH v10 00/41] Introduce QC USB SND audio offloading support Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 01/41] xhci: add support to allocate several interrupters Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 02/41] xhci: add helper to stop endpoint and wait for completion Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 03/41] xhci: sideband: add initial api to register a sideband entity Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 04/41] usb: host: xhci-mem: Cleanup pending secondary event ring events Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 05/41] usb: host: xhci-mem: Allow for interrupter clients to choose specific index Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 06/41] ASoC: Add SOC USB APIs for adding an USB backend Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 07/41] ASoC: dt-bindings: qcom,q6dsp-lpass-ports: Add USB_RX port Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 08/41] ASoC: qcom: qdsp6: Introduce USB AFE port to q6dsp Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 09/41] ASoC: qdsp6: q6afe: Increase APR timeout Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 10/41] ASoC: qcom: qdsp6: Add USB backend ASoC driver for Q6 Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 11/41] ALSA: usb-audio: Introduce USB SND platform op callbacks Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 12/41] ALSA: usb-audio: Export USB SND APIs for modules Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 13/41] ALSA: usb-audio: Save UAC sample size information Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 14/41] dt-bindings: usb: xhci: Add num-hc-interrupters definition Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 15/41] dt-bindings: usb: dwc3: Limit " Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 16/41] usb: dwc3: Specify maximum number of XHCI interrupters Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 17/41] usb: host: xhci-plat: Set XHCI max interrupters if property is present Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 18/41] ALSA: usb-audio: qcom: Add USB QMI definitions Wesley Cheng
2023-12-15 22:38 ` Jeff Johnson
2023-12-18 19:58 ` Wesley Cheng
2023-12-19 12:01 ` Konrad Dybcio
2023-12-19 12:01 ` Konrad Dybcio
2023-12-15 21:49 ` [PATCH v10 19/41] ALSA: usb-audio: qcom: Introduce QC USB SND offloading support Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 20/41] ALSA: usb-audio: Check for support for requested audio format Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 21/41] ASoC: usb: Add PCM format check API for USB backend Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 22/41] ASoC: qcom: qdsp6: Ensure PCM format is supported by USB audio device Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 23/41] ALSA: usb-audio: Prevent starting of audio stream if in use Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 24/41] ALSA: usb-audio: Do not allow USB offload path if PCM device is " Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 25/41] ASoC: dt-bindings: Add Q6USB backend Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 26/41] ASoC: dt-bindings: Update example for enabling USB offload on SM8250 Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 27/41] ALSA: usb-audio: qcom: Populate PCM and USB chip information Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 28/41] ASoC: qcom: qdsp6: Add support to track available USB PCM devices Wesley Cheng
2023-12-15 21:49 ` Wesley Cheng [this message]
2023-12-15 21:49 ` [PATCH v10 30/41] ASoC: qcom: qdsp6: Add SOC USB offload select get/put callbacks Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 31/41] ASoC: Add SND kcontrol for fetching USB offload status Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 32/41] ASoC: qcom: qdsp6: Add PCM ops to track current state Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 33/41] ASoC: usb: Create SOC USB SND jack kcontrol Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 34/41] ASoC: qcom: qdsp6: Add headphone jack for offload connection status Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 35/41] ASoC: usb: Fetch ASoC sound card information Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 36/41] ALSA: usb-audio: mixer: Add USB offloading mixer control Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 37/41] ALSA: usb-audio: qcom: Use card and PCM index from QMI request Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 38/41] ALSA: usb-audio: Allow for rediscovery of connected USB SND devices Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 39/41] ASoC: usb: Rediscover USB SND devices on USB port add Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 40/41] ASoC: qcom: Populate SoC components string Wesley Cheng
2023-12-15 21:49 ` [PATCH v10 41/41] ASoC: doc: Add documentation for SOC USB 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=20231215214955.12110-30-quic_wcheng@quicinc.com \
--to=quic_wcheng@quicinc.com \
--cc=Thinh.Nguyen@synopsys.com \
--cc=agross@kernel.org \
--cc=alsa-devel@alsa-project.org \
--cc=andersson@kernel.org \
--cc=bgoswami@quicinc.com \
--cc=broonie@kernel.org \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-doc@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=robh+dt@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
all inboxes | Powered by JetHome®