[alsa-devel] [PATCH] ASoC: core: refine of node id parse of cpu/codec dai

Qiao Zhou zhouqiao at marvell.com
Wed Jun 18 13:01:59 CEST 2014


refine cpu_dai/codec_dai of_node checking by checking either name
or dai_id matches.

Signed-off-by: Qiao Zhou <zhouqiao at marvell.com>
---
 include/sound/soc.h  |    2 ++
 sound/soc/soc-core.c |   32 +++++++++++++++++++++++---------
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index ed9e2d7..782f7a0 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -888,12 +888,14 @@ struct snd_soc_dai_link {
 	 * only, which only works well when that device exposes a single DAI.
 	 */
 	const char *cpu_dai_name;
+	unsigned int cpu_dai_id;
 	/*
 	 * You MUST specify the link's codec, either by device name, or by
 	 * DT/OF node, but not both.
 	 */
 	const char *codec_name;
 	const struct device_node *codec_of_node;
+	unsigned int codec_dai_id;
 	/* You MUST specify the DAI name within the codec */
 	const char *codec_dai_name;
 	/*
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index b87d7d8..777237d 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -868,14 +868,16 @@ static struct snd_soc_codec *soc_find_codec(const struct device_node *codec_of_n
 }
 
 static struct snd_soc_dai *soc_find_codec_dai(struct snd_soc_codec *codec,
-					      const char *codec_dai_name)
+					      struct snd_soc_dai_link *dai_link)
 {
 	struct snd_soc_dai *codec_dai;
 
 	list_for_each_entry(codec_dai, &codec->component.dai_list, list) {
-		if (!strcmp(codec_dai->name, codec_dai_name)) {
+		if (dai_link->codec_dai_name
+		    && !strcmp(codec_dai->name, dai_link->codec_dai_name))
+			return codec_dai;
+		else if (codec_dai->id == dai_link->codec_dai_id)
 			return codec_dai;
-		}
 	}
 
 	return NULL;
@@ -904,6 +906,9 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
 			if (dai_link->cpu_dai_name &&
 				strcmp(cpu_dai->name, dai_link->cpu_dai_name))
 				continue;
+			if (!dai_link->cpu_dai_name &&
+				cpu_dai->id != dai_link->cpu_dai_id)
+				continue;
 
 			rtd->cpu_dai = cpu_dai;
 		}
@@ -919,17 +924,26 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
 	rtd->codec = soc_find_codec(dai_link->codec_of_node,
 				    dai_link->codec_name);
 	if (!rtd->codec) {
-		dev_err(card->dev, "ASoC: CODEC %s not registered\n",
-			dai_link->codec_name);
+		if (dai_link->codec_name)
+			dev_err(card->dev, "ASoC: CODEC %s not registered\n",
+				dai_link->codec_name);
+		else if (dai_link->codec_of_node)
+			dev_err(card->dev, "ASoC: CODEC %s not registered\n",
+				dai_link->codec_of_node->name);
 		return -EPROBE_DEFER;
 	}
 
 	/* Find CODEC DAI from registered list */
-	rtd->codec_dai = soc_find_codec_dai(rtd->codec,
-					    dai_link->codec_dai_name);
+	rtd->codec_dai = soc_find_codec_dai(rtd->codec, dai_link);
 	if (!rtd->codec_dai) {
-		dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
-			dai_link->codec_dai_name);
+		if (dai_link->codec_dai_name)
+			dev_err(card->dev,
+				"ASoC: CODEC DAI %s not registered\n",
+				dai_link->codec_dai_name);
+		else
+			dev_err(card->dev,
+				"ASoC: CODEC DAI %d not registered\n",
+				dai_link->codec_dai_id);
 		return -EPROBE_DEFER;
 	}
 
-- 
1.7.9.5



More information about the Alsa-devel mailing list