Linux Sound subsystem development
 help / color / mirror / Atom feed
* [PATCH] ASoC: es9356: add missing DAI rates and formats
@ 2026-10-08  9:03 Zachary Huang
  0 siblings, 0 replies; only message in thread
From: Zachary Huang @ 2026-10-08  9:03 UTC (permalink / raw)
  To: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai
  Cc: linux-sound, Mario Limonciello, Vijendar Mukunda, zhangyi

The ES9356 DAI definitions only describe the channel count. Since
snd_soc_runtime_calc_hw() derives hw->rates and hw->formats by intersecting
the capabilities of the CPU and codec DAIs, an empty mask on the codec side
leaves the whole PCM with no usable configuration, and soc_hw_sanity_check()
fails every open with -EINVAL:

    ASoC error (-22): es9356-sdp-aif1 <-> SDW0 Pin0 No matching rates

es9356_sdw_pcm_hw_params() already programs 16 kHz, 44.1 kHz, 48 kHz and
96 kHz, so advertise that set, plus the formats used by the other SDCA codecs.
Verified on a MECHREVO WUJIE 14SAH (AMD ACP6.3, ES9356 on SoundWire link 0):
with this change the PCMs open and speaker playback, headset playback,
internal DMIC capture and headset mic capture all work.

Link: https://lore.kernel.org/linux-sound/20261007193038.2473068-1-mario.limonciello@amd.com/
Link: https://bugzilla.kernel.org/show_bug.cgi?id=222092
Assisted-by: LLM
Signed-off-by: Zachary Huang <zuzhenhuang365@gmail.com>
---

Zachary writes:

This is the separate ES9356 codec change that Mario mentioned in the machine
entry patch linked above. Both changes are needed for audio on this board;
with both applied the internal speakers, the internal DMIC, the 3.5 mm jack
and desktop playback (PipeWire) all work.

Tested on: MECHREVO WUJIE 14SAH, AMD Ryzen 7 H 255, ACP6.3 (rev 63),
ES9356 as sdw:0:0:04b3:9356:01 on link 0, kernel 7.2.9 + the machine entry
patch above (localversion -es9356test). The corresponding alsa-ucm-conf
change (no ES9356 UCM profile exists yet, so PipeWire only exposes the jack
PCM) will be sent separately.

 sound/soc/codecs/es9356.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/sound/soc/codecs/es9356.c b/sound/soc/codecs/es9356.c
index 80db0f2..b8b3ffc 100644
--- a/sound/soc/codecs/es9356.c
+++ b/sound/soc/codecs/es9356.c
@@ -26,6 +26,20 @@
 #include <sound/sdca_asoc.h>
 #include "es9356.h"
 
+/*
+ * The DAI stream capabilities were never filled in. snd_soc_runtime_calc_hw()
+ * intersects the capabilities of the CPU and codec DAIs to derive hw->rates
+ * and hw->formats, so an empty mask on the codec side leaves the PCM with no
+ * usable configuration and soc_hw_sanity_check() fails every open with -EINVAL
+ * ("No matching rates"). es9356_sdw_pcm_hw_params() already programs 16 kHz,
+ * 44.1 kHz, 48 kHz and 96 kHz, so advertise exactly that set, with the formats
+ * used by the other SDCA codecs in the tree.
+ */
+#define ES9356_RATES (SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_44100 | \
+		      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
+#define ES9356_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE | \
+			SNDRV_PCM_FMTBIT_S32_LE)
+
 struct  es9356_sdw_priv {
 	struct sdw_slave *slave;
 	struct device *dev;
@@ -617,6 +631,8 @@ static struct snd_soc_dai_driver es9356_sdw_dai[] = {
 		.id = ES9356_DMIC,
 		.capture = {
 			.stream_name = "DP1 Capture",
+			.rates = ES9356_RATES,
+			.formats = ES9356_FORMATS,
 			.channels_min = 1,
 			.channels_max = 2,
 		},
@@ -627,6 +643,8 @@ static struct snd_soc_dai_driver es9356_sdw_dai[] = {
 		.id = ES9356_JACK_IN,
 		.capture = {
 			.stream_name = "DP2 Capture",
+			.rates = ES9356_RATES,
+			.formats = ES9356_FORMATS,
 			.channels_min = 1,
 			.channels_max = 2,
 		},
@@ -637,6 +655,8 @@ static struct snd_soc_dai_driver es9356_sdw_dai[] = {
 		.id = ES9356_AMP,
 		.playback = {
 			.stream_name = "DP3 Playback",
+			.rates = ES9356_RATES,
+			.formats = ES9356_FORMATS,
 			.channels_min = 1,
 			.channels_max = 2,
 		},
@@ -647,6 +667,8 @@ static struct snd_soc_dai_driver es9356_sdw_dai[] = {
 		.id = ES9356_JACK_OUT,
 		.playback = {
 			.stream_name = "DP4 Playback",
+			.rates = ES9356_RATES,
+			.formats = ES9356_FORMATS,
 			.channels_min = 1,
 			.channels_max = 2,
 		},
-- 
2.53.0




^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-10-08  9:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-08  9:03 [PATCH] ASoC: es9356: add missing DAI rates and formats Zachary Huang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox