From: Juhyung Park <qkrwngud825@gmail.com>
To: stable@vger.kernel.org, Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Richard Fitzgerald <rf@opensource.cirrus.com>,
broonie@kernel.org, linux-sound@vger.kernel.org,
linux-kernel@vger.kernel.org, patches@opensource.cirrus.com
Subject: Re: [PATCH 1/2] ASoC: cs35l56: Add DAI for SDCA OT25 stream
Date: Sat, 17 Oct 2026 03:18:40 +0900 [thread overview]
Message-ID: <e4cd86b2-6975-43e2-9812-daf8e4207583@gmail.com> (raw)
In-Reply-To: <20261005155235.1386525-2-rf@opensource.cirrus.com>
Hi,
v7.2.11 includes bf7a3ce1d563 ("ASoC: sdw_utils: Switch CS35L56/57/62/63
to use OT25 DAI")
[ Upstream commit 4b7f393a01f88e8d03cba94cf4948652de14789b ]
but not this preceding patch from the same series, which adds the DAI it
switches to.
sof_sdw tries to bind a DAI that the cs35l56 codec driver never
registers, and card creation fails:
sof_sdw sof_sdw: ASoC: CODEC DAI cs35l56-ot25 not registered
On my Galaxy Book6 Pro with CS35L57, this breaks sound.
Please apply this commit 86c8360c97f6 ("ASoC: cs35l56: Add DAI for SDCA
OT25 stream") to stable too.
Thanks,
Juhyung
On 10/6/26 12:52 AM, Richard Fitzgerald wrote:
> Add a DAI for the SDCA OT25 stream on SoundWire DP4.
>
> The SDCA-defined OT25 stream is an amp reference feedback, typically used
> for AEC. The firmware outputs this on DP4. The firmware owns all control
> registers for this stream so there are no mixer controls or any other
> configuration options.
>
> Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
> ---
> include/sound/cs35l56.h | 1 +
> sound/soc/codecs/cs35l56-sdw.c | 9 ++++--
> sound/soc/codecs/cs35l56.c | 54 ++++++++++++++++++++++++++++++++++
> 3 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/include/sound/cs35l56.h b/include/sound/cs35l56.h
> index 45a5df574aa6d..747e10ec1a274 100644
> --- a/include/sound/cs35l56.h
> +++ b/include/sound/cs35l56.h
> @@ -312,6 +312,7 @@ struct snd_ctl_elem_value;
>
> #define CS35L56_SDW1_PLAYBACK_PORT 1
> #define CS35L56_SDW1_CAPTURE_PORT 3
> +#define CS35L56_OT25_CAPTURE_PORT 4
>
> #define CS35L56_NUM_BULK_SUPPLIES 3
> #define CS35L56_NUM_DSP_REGIONS 5
> diff --git a/sound/soc/codecs/cs35l56-sdw.c b/sound/soc/codecs/cs35l56-sdw.c
> index 98bb4542b9143..e10f04d677f4d 100644
> --- a/sound/soc/codecs/cs35l56-sdw.c
> +++ b/sound/soc/codecs/cs35l56-sdw.c
> @@ -265,11 +265,11 @@ static int cs35l56_sdw_read_prop(struct sdw_slave *peripheral)
> if (ret == 0)
> prop->clk_stop_mode1 = !!clock_stop_1;
>
> - ports = devm_kcalloc(cs35l56->base.dev, 2, sizeof(*ports), GFP_KERNEL);
> + ports = devm_kcalloc(cs35l56->base.dev, 3, sizeof(*ports), GFP_KERNEL);
> if (!ports)
> return -ENOMEM;
>
> - prop->source_ports = BIT(CS35L56_SDW1_CAPTURE_PORT);
> + prop->source_ports = BIT(CS35L56_SDW1_CAPTURE_PORT) | BIT(CS35L56_OT25_CAPTURE_PORT);
> prop->sink_ports = BIT(CS35L56_SDW1_PLAYBACK_PORT);
> prop->paging_support = true;
> prop->use_domain_irq = true;
> @@ -286,6 +286,11 @@ static int cs35l56_sdw_read_prop(struct sdw_slave *peripheral)
> ports[1].num = CS35L56_SDW1_CAPTURE_PORT;
> ports[1].type = SDW_DPN_FULL;
> ports[1].ch_prep_timeout = 10;
> +
> + /* DP4 - capture */
> + ports[2].num = CS35L56_OT25_CAPTURE_PORT;
> + ports[2].type = SDW_DPN_FULL;
> + ports[2].ch_prep_timeout = 10;
> prop->src_dpn_prop = &ports[1];
>
> dev_dbg(&peripheral->dev, "clock stop mode 1 supported: %s\n",
> diff --git a/sound/soc/codecs/cs35l56.c b/sound/soc/codecs/cs35l56.c
> index 74129fcc79dce..dd264c310e1eb 100644
> --- a/sound/soc/codecs/cs35l56.c
> +++ b/sound/soc/codecs/cs35l56.c
> @@ -32,6 +32,7 @@
> #include <sound/cs-amp-lib.h>
> #include <sound/pcm.h>
> #include <sound/pcm_params.h>
> +#include <sound/sdw.h>
> #include <sound/soc.h>
> #include <sound/soc-dapm.h>
> #include <sound/tlv.h>
> @@ -324,6 +325,7 @@ static const struct snd_soc_dapm_widget cs35l56_dapm_widgets[] = {
> SND_SOC_DAPM_SIGGEN("VDDBMON ADC"),
> SND_SOC_DAPM_SIGGEN("VBSTMON ADC"),
> SND_SOC_DAPM_SIGGEN("TEMPMON ADC"),
> + SND_SOC_DAPM_SIGGEN("OT25 Reference"),
>
> SND_SOC_DAPM_INPUT("Calibrate"),
> };
> @@ -388,6 +390,8 @@ static const struct snd_soc_dapm_route cs35l56_audio_map[] = {
> { "SDW1 Capture", NULL, "SDW1 TX2 Source" },
> { "SDW1 Capture", NULL, "SDW1 TX3 Source" },
> { "SDW1 Capture", NULL, "SDW1 TX4 Source" },
> +
> + { "OT25", NULL, "OT25 Reference" },
> };
>
> static int cs35l56_dsp_event(struct snd_soc_dapm_widget *w,
> @@ -722,6 +726,37 @@ static int cs35l56_sdw_dai_set_stream(struct snd_soc_dai *dai,
> return 0;
> }
>
> +static int cs35l56_ot25_dai_hw_params(struct snd_pcm_substream *substream,
> + struct snd_pcm_hw_params *params,
> + struct snd_soc_dai *dai)
> +{
> + struct cs35l56_private *cs35l56 = snd_soc_component_get_drvdata(dai->component);
> + struct sdw_stream_runtime *sdw_stream = snd_soc_dai_get_dma_data(dai, substream);
> + struct sdw_stream_config sconfig = { };
> + struct sdw_port_config pconfig = { };
> + int ret;
> +
> + dev_dbg(cs35l56->base.dev, "%s: rate %d\n", __func__, params_rate(params));
> +
> + if (!cs35l56->base.init_done)
> + return -ENODEV;
> +
> + if (!sdw_stream)
> + return -EINVAL;
> +
> + snd_sdw_params_to_config(substream, params, &sconfig, &pconfig);
> + pconfig.num = CS35L56_OT25_CAPTURE_PORT;
> +
> + ret = sdw_stream_add_slave(cs35l56->sdw_peripheral, &sconfig, &pconfig,
> + 1, sdw_stream);
> + if (ret) {
> + dev_err(dai->dev, "Failed to add OT25 stream: %d\n", ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> static const struct snd_soc_dai_ops cs35l56_sdw_dai_ops = {
> .set_tdm_slot = cs35l56_sdw_dai_set_tdm_slot,
> .shutdown = cs35l56_sdw_dai_shutdown,
> @@ -730,6 +765,13 @@ static const struct snd_soc_dai_ops cs35l56_sdw_dai_ops = {
> .set_stream = cs35l56_sdw_dai_set_stream,
> };
>
> +static const struct snd_soc_dai_ops cs35l56_ot25_dai_ops = {
> + .shutdown = cs35l56_sdw_dai_shutdown,
> + .hw_params = cs35l56_ot25_dai_hw_params,
> + .hw_free = cs35l56_sdw_dai_hw_free,
> + .set_stream = cs35l56_sdw_dai_set_stream,
> +};
> +
> static struct snd_soc_dai_driver cs35l56_dai[] = {
> {
> .name = "cs35l56-asp1",
> @@ -778,6 +820,18 @@ static struct snd_soc_dai_driver cs35l56_dai[] = {
> .symmetric_rate = 1,
> .ops = &cs35l56_sdw_dai_ops,
> },
> + {
> + .name = "cs35l56-ot25",
> + .id = 3,
> + .capture = {
> + .stream_name = "OT25",
> + .channels_min = 1,
> + .channels_max = 2,
> + .rates = CS35L56_RATES,
> + .formats = CS35L56_TX_FORMATS,
> + },
> + .ops = &cs35l56_ot25_dai_ops,
> + },
> };
>
> static int cs35l56_write_cal(struct cs35l56_private *cs35l56)
next prev parent reply other threads:[~2026-10-16 18:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-05 15:52 [PATCH 0/2] ASoC: cs35l56/57/62/63: Use the correct SoundWire DP for feedback Richard Fitzgerald
2026-10-05 15:52 ` [PATCH 1/2] ASoC: cs35l56: Add DAI for SDCA OT25 stream Richard Fitzgerald
2026-10-16 18:18 ` Juhyung Park [this message]
2026-10-17 3:00 ` Sasha Levin
2026-10-05 15:52 ` [PATCH 2/2] ASoC: sdw_utils: Switch CS35L56/57/62/63 to use OT25 DAI Richard Fitzgerald
2026-10-05 18:33 ` [PATCH 0/2] ASoC: cs35l56/57/62/63: Use the correct SoundWire DP for feedback Pierre-Louis Bossart
2026-10-06 9:53 ` Richard Fitzgerald
2026-10-07 15:57 ` Pierre-Louis Bossart
2026-10-07 11:21 ` Mark Brown
2026-10-07 15:57 ` Pierre-Louis Bossart
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=e4cd86b2-6975-43e2-9812-daf8e4207583@gmail.com \
--to=qkrwngud825@gmail.com \
--cc=broonie@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=patches@opensource.cirrus.com \
--cc=rf@opensource.cirrus.com \
--cc=stable@vger.kernel.org \
/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®