[alsa-devel] regression: bad sound card type detection in audio graph

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Fri Mar 29 03:03:38 CET 2019


Hi Arnaud

> Thanks for your answer and my apologize. I found the issue: it was
> located between my keyboard and my seat...

OK, no problem.

> ports {
> 	#address-cells = <1>;
>         #size-cells = <0>;
> 	wm8994_tx_endpoint: endpoint at 0 {
> 		reg = <0>;
>                 remote-endpoint = <&sai2a_endpoint>;
>        };
>        wm8994_rx_endpoint: endpoint at 1 {
> 		reg = <1>;
>                 remote-endpoint = <&sai2b_endpoint>;
>        };
> };

Not a big deal, but I think you want to use "port" not "ports" here.

> This trig me an extra question: how to manage a configuration using only
> one codec DAI (bidir) connected to 2 unidirectional CPU-DAI?
>   Playback: CPU-DAI (slave)-> (master)CODEC-DAI/port0
>   Record: CPU-DAI (slave)<- (master)CODEC-DAI/port0

A little bit confused.

	// 1 CPU, 1 Codec
	Playback: CPU-DAI(slave) -> (master)CODEC-DAI/port0
	Record:   CPU-DAI(slave) <- (master)CODEC-DAI/port0
or
	// 2 CPU, 1 Codec
	Playback: CPU-A-DAI(slave) -> (master)CODEC-DAI/port0
	Record:   CPU-B-DAI(slave) <- (master)CODEC-DAI/port0

1st one is very normal at ALSA SoC I think.
1 endpoint is 1 DAI, and it has 1 playback and 1 capture.
2nd one is indeed special case.

> In this case it seems logic to declare for the codec, one port with 2
> endpoints so this imply to use DPCM mechanism... right?

So far, yes

> In this case we should use a static routing to conncet FE and BE...?
> Do you know if this kind of configuration has been tested?

I assume it is above "2nd" case,
unfortunately, this case is not assumed on audio-graph-card so far.

> FYi, This configuration is available on the stm32mp157c-dk2 board. Today
> we have not an upstreamable solution (we have hacked the codec to
> duplicate the DAI to create 2 ports with one endpoint, instead of one
> port with 2 endpoints).

I'm not sure, but if we can judge
"it has multi endpoints, but it is not a DPCM connection" somehow,
we can solve your issue ?
The issue here is this judgment should be DT acceptable.

Hmm...
Easy solution I noticed now is that compatible = "audio-graph-card" case
should only select non DPCM case, same as before.
compatible = "audio-graph-scu-card" can be both "non DPCM" and "DPCM".
I think only user of "audio-graph-scu-card" is me, and it is local use.
I think it is still DT backward compatible (?)
I didn't test this patch, but maybe similar can be solution ?

------------------
diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c
index b75b0f1..0b39d85 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -402,6 +402,7 @@ static int graph_for_each_link(struct asoc_simple_priv *priv,
 	struct device_node *codec_port_old = NULL;
 	struct asoc_simple_data adata;
 	int rc, ret;
+	int dpcm_selectable = (int)of_device_get_match_data(dev);
 
 	/* loop for all listed CPU port */
 	of_for_each_phandle(&it, rc, node, "dais", NULL, 0) {
@@ -431,7 +432,8 @@ static int graph_for_each_link(struct asoc_simple_priv *priv,
 			 * if Codec port has many endpoints,
 			 * or has convert-xxx property
 			 */
-			if ((of_get_child_count(codec_port) > 1) ||
+			if ((dpcm_selectable &&
+			     of_get_child_count(codec_port) > 1) ||
 			    adata.convert_rate || adata.convert_channels)
 				ret = func_dpcm(priv, cpu_ep, codec_ep, li,
 						(codec_port_old == codec_port));
@@ -664,8 +666,8 @@ static int graph_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id graph_of_match[] = {
-	{ .compatible = "audio-graph-card", },
-	{ .compatible = "audio-graph-scu-card", },
+	{ .compatible = "audio-graph-card",	.data = 0 },
+	{ .compatible = "audio-graph-scu-card",	.data = 1 },
 	{},
 };
 MODULE_DEVICE_TABLE(of, graph_of_match);
------------------

Best regards
---
Kuninori Morimoto


More information about the Alsa-devel mailing list