Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit c89ff03a authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown
Browse files

ASoC: audio-graph-scu-card: care link / dai count



In DPCM case, it uses CPU-dummy / dummy-Codec dai links.
If sound card is caring only DPCM, link count = dai count,
but, if non DPCM case, link count != dai count.
Now, we want to merge audio-graph-card and audio-graph-scu-card,
then, we need to care both link / dai count more carefly
This patch cares it, and prepare for merging audio card

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b6f3fc00
Loading
Loading
Loading
Loading
+62 −14
Original line number Diff line number Diff line
@@ -277,7 +277,10 @@ static int asoc_graph_card_parse_of(struct graph_card_data *priv)
	return ret;
}

static int asoc_graph_get_dais_count(struct device *dev)
static void asoc_graph_get_dais_count(struct device *dev,
				      int *link_num,
				      int *dais_num,
				      int *ccnf_num)
{
	struct of_phandle_iterator it;
	struct device_node *node = dev->of_node;
@@ -286,10 +289,48 @@ static int asoc_graph_get_dais_count(struct device *dev)
	struct device_node *codec_ep;
	struct device_node *codec_port;
	struct device_node *codec_port_old;
	int count = 0;
	struct device_node *codec_port_old2;
	int rc;

	/*
	 * link_num :	number of links.
	 *		CPU-Codec / CPU-dummy / dummy-Codec
	 * dais_num :	number of DAIs
	 * ccnf_num :	number of codec_conf
	 *		same number for dummy-Codec
	 *
	 * ex1)
	 * CPU0 --- Codec0	link : 5
	 * CPU1 --- Codec1	dais : 7
	 * CPU2 -/		ccnf : 1
	 * CPU3 --- Codec2
	 *
	 *	=> 5 links = 2xCPU-Codec + 2xCPU-dummy + 1xdummy-Codec
	 *	=> 7 DAIs  = 4xCPU + 3xCodec
	 *	=> 1 ccnf  = 1xdummy-Codec
	 *
	 * ex2)
	 * CPU0 --- Codec0	link : 5
	 * CPU1 --- Codec1	dais : 6
	 * CPU2 -/		ccnf : 1
	 * CPU3 -/
	 *
	 *	=> 5 links = 1xCPU-Codec + 3xCPU-dummy + 1xdummy-Codec
	 *	=> 6 DAIs  = 4xCPU + 2xCodec
	 *	=> 1 ccnf  = 1xdummy-Codec
	 *
	 * ex3)
	 * CPU0 --- Codec0	link : 6
	 * CPU1 -/		dais : 6
	 * CPU2 --- Codec1	ccnf : 2
	 * CPU3 -/
	 *
	 *	=> 6 links = 0xCPU-Codec + 4xCPU-dummy + 2xdummy-Codec
	 *	=> 6 DAIs  = 4xCPU + 2xCodec
	 *	=> 2 ccnf  = 2xdummy-Codec
	 */
	codec_port_old = NULL;
	codec_port_old2 = NULL;
	of_for_each_phandle(&it, rc, node, "dais", NULL, 0) {
		cpu_port = it.node;
		cpu_ep   = of_get_next_child(cpu_port, NULL);
@@ -300,16 +341,22 @@ static int asoc_graph_get_dais_count(struct device *dev)
		of_node_put(codec_ep);
		of_node_put(codec_port);

		count++;
		(*link_num)++;
		(*dais_num)++;

		if (codec_port_old == codec_port)
		if (codec_port_old == codec_port) {
			if (codec_port_old2 != codec_port_old) {
				(*link_num)++;
				(*ccnf_num)++;
			}

			codec_port_old2 = codec_port_old;
			continue;
		}

		count++;
		(*dais_num)++;
		codec_port_old = codec_port;
	}

	return count;
}

static int asoc_graph_card_probe(struct platform_device *pdev)
@@ -319,19 +366,20 @@ static int asoc_graph_card_probe(struct platform_device *pdev)
	struct graph_dai_props *dai_props;
	struct device *dev = &pdev->dev;
	struct snd_soc_card *card;
	int num, ret, i;
	int lnum = 0, dnum = 0, cnum = 0;
	int ret, i;

	/* Allocate the private data and the DAI link array */
	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	num = asoc_graph_get_dais_count(dev);
	if (num == 0)
	asoc_graph_get_dais_count(dev, &lnum, &dnum, &cnum);
	if (!lnum || !dnum)
		return -EINVAL;

	dai_props = devm_kcalloc(dev, num, sizeof(*dai_props), GFP_KERNEL);
	dai_link  = devm_kcalloc(dev, num, sizeof(*dai_link), GFP_KERNEL);
	dai_props = devm_kcalloc(dev, lnum, sizeof(*dai_props), GFP_KERNEL);
	dai_link  = devm_kcalloc(dev, lnum, sizeof(*dai_link),  GFP_KERNEL);
	if (!dai_props || !dai_link)
		return -ENOMEM;

@@ -341,7 +389,7 @@ static int asoc_graph_card_probe(struct platform_device *pdev)
	 * see
	 *	soc-core.c :: snd_soc_init_multicodec()
	 */
	for (i = 0; i < num; i++) {
	for (i = 0; i < lnum; i++) {
		dai_link[i].codecs	= &dai_props[i].codecs;
		dai_link[i].num_codecs	= 1;
		dai_link[i].platform	= &dai_props[i].platform;
@@ -355,7 +403,7 @@ static int asoc_graph_card_probe(struct platform_device *pdev)
	card->owner		= THIS_MODULE;
	card->dev		= dev;
	card->dai_link		= priv->dai_link;
	card->num_links		= num;
	card->num_links		= lnum;
	card->codec_conf	= &priv->codec_conf;
	card->num_configs	= 1;