Skip to contentSkip to conversation

ASoC: check channel mismatch between cpu_dai and codec_dai

PATCH Applied Lu Guanqun 2 participants 3 messages Apr 6, 2011

Subsystems (2)
lore
Share & tools
lore

Lu Guanqun

author
#0 lore raw

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
index 0cf6997..88bb206 100644
@@ -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;
author
#1 lore raw

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
index 88bb206..b8e69f2 100644
@@ -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",