[alsa-devel] [PATCH 09/13] ASoC: simple-card: add 1 CPU : 1 Codec support again

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Thu Dec 20 02:46:47 CET 2018


From: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>

simple-card is now supporting normal sound and DPCM sound.
For DPCM sound, original sound card (= simple-scu-card) had been
supported 1 CPU : 1 Codec connection which uses hw_params_fixup()
for convert-rate/channel.
But, merged simple-card is completely forgeting about it.

This patch re-support it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 sound/soc/generic/simple-card.c | 32 ++++++++++++++++++++++++++++----
 1 file changed, 28 insertions(+), 4 deletions(-)

diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 5204806..b156514 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -453,6 +453,7 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
 	struct device_node *node;
 	struct device_node *np;
 	struct device_node *codec;
+	struct asoc_simple_card_data adata;
 	bool is_fe;
 	int ret, loop;
 	int dai_idx, link_idx, conf_idx;
@@ -480,8 +481,13 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
 	}
 
 	do  {
+		memset(&adata, 0, sizeof(adata));
+		for_each_child_of_node(node, np)
+			asoc_simple_card_get_conversion(dev, np, &adata);
+
 		/* DPCM */
-		if (of_get_child_count(node) > 2) {
+		if (of_get_child_count(node) > 2 ||
+		    adata.convert_rate || adata.convert_channels) {
 			for_each_child_of_node(node, np) {
 				codec = of_get_child_by_name(node,
 							loop ?	"codec" :
@@ -495,14 +501,16 @@ static int asoc_simple_card_parse_of(struct simple_card_data *priv)
 						top, node, np, codec, priv,
 						&dai_idx, link_idx++, &conf_idx,
 						is_fe, !loop);
+				if (ret < 0)
+					return ret;
 			}
 		} else {
 			ret = asoc_simple_card_dai_link_of(
 						top, node, priv,
 						&dai_idx, link_idx++, !loop);
+			if (ret < 0)
+				return ret;
 		}
-		if (ret < 0)
-			return ret;
 
 		node = of_get_next_child(top, node);
 	} while (loop && node);
@@ -523,6 +531,8 @@ static void asoc_simple_card_get_dais_count(struct device *dev,
 {
 	struct device_node *top = dev->of_node;
 	struct device_node *node;
+	struct device_node *np;
+	struct asoc_simple_card_data adata;
 	int loop;
 	int num;
 
@@ -562,6 +572,15 @@ static void asoc_simple_card_get_dais_count(struct device *dev,
 	 *	=> 6 links = 0xCPU-Codec + 4xCPU-dummy + 2xdummy-Codec
 	 *	=> 6 DAIs  = 4xCPU + 2xCodec
 	 *	=> 2 ccnf  = 2xdummy-Codec
+	 *
+	 * ex4)
+	 * CPU0 --- Codec0 (convert-rate)	link : 3
+	 * CPU1 --- Codec1			dais : 4
+	 *					ccnf : 1
+	 *
+	 *	=> 3 links = 1xCPU-Codec + 1xCPU-dummy + 1xdummy-Codec
+	 *	=> 4 DAIs  = 2xCPU + 2xCodec
+	 *	=> 1 ccnf  = 1xdummy-Codec
 	 */
 	if (!top) {
 		(*link_num) = 1;
@@ -578,9 +597,14 @@ static void asoc_simple_card_get_dais_count(struct device *dev,
 	}
 
 	do {
+		memset(&adata, 0, sizeof(adata));
+		for_each_child_of_node(node, np)
+			asoc_simple_card_get_conversion(dev, np, &adata);
+
 		num = of_get_child_count(node);
 		(*dais_num) += num;
-		if (num > 2) {
+		if (num > 2 ||
+		    adata.convert_rate || adata.convert_channels) {
 			(*link_num) += num;
 			(*ccnf_num)++;
 		} else {
-- 
2.7.4



More information about the Alsa-devel mailing list