ASoC: check channel mismatch between cpu_dai and codec_dai
PATCH 1/2 ASoC: check channel mismatch between cpu_dai and codec_dai
Suppose we have:
cpu_dai
channels_min = 1
channels_max = 1
codec_dai
channels_min = 2
channels_max = 2
This is a mismatch that should not happen, however according to the current code, the result of runtime->hw will be:
channels_min = 2
channels_max = 1
We better spot it early. This patch checks this mismatch.
--- sound/soc/soc-core.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
sound/soc/soc-core.c +2 -1
@@ -640,7 +640,8 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) codec_dai->name, cpu_dai->name); goto config_err; } -if (!runtime->hw.channels_min || !runtime->hw.channels_max) { +if (!runtime->hw.channels_min || !runtime->hw.channels_max || + runtime->hw.channels_min > runtime->hw.channels_max) {printk (KERN_ERR "asoc: %s <-> %s No matching channels\n" , codec_dai->name, cpu_dai->name); goto config_err;
PATCH 2/2 ASoC: fix config error path
initialize ret to invalid value so that when we reach the config error path in soc_pcm_open, it will return the correct error code. without this patch, though config error path is executed, soc_pcm_open will return 0 in snd_pcm_open_substream and then cause double release of substream.
--- sound/soc/soc-core.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
sound/soc/soc-core.c +1 -0
@@ -629,6 +629,7 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) runtime->hw.rates |= codec_dai_drv->capture.rates; } + ret = -EINVAL ;snd_pcm_limit_hw_rates (runtime);if (!runtime->hw.rates) { printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
Mark Brown
AppliedQuoted 5 lines · Lu Guanqun
Suppose we have:
cpu_dai
channels_min= 1
channels_max= 1
Applied both, thanks.