ASoC: es9356: add missing DAI rates and formats

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>
Link: https://patch.msgid.link/179145019931.16888.9682263186729943710@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Zachary Huang 2026-10-08 17:03:19 +08:00 committed by Mark Brown
parent bcff584bd2
commit ea83a1103b
No known key found for this signature in database
GPG Key ID: 2FEF73B0B3D03889

View File

@ -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,
},