mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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:
parent
bcff584bd2
commit
ea83a1103b
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user