[alsa-devel] [PATCH 8/8] ASoC: add snd-soc-dummy DT support

Kuninori Morimoto kuninori.morimoto.gx at gmail.com
Tue Aug 26 10:34:21 CEST 2014


Hi Mark, Lars

> > > That's something we need to fix, but I don't think removing the stream names 
> > > is the right way to do this. In a multi CODEC environment you'll quite 
> > > likely end up with widgets of the same name. Ideally a route endpoint would 
> > > be expressed by a tuple of DT node and pin name. But I don't think it is 
> > > possible to mix integer and string elements in a property.
> 
> It's not.  Now that we have preprocessor support it's a lot easier to
> just use numbers though - the legibility problems from just using raw
> numbers in big tables don't apply so much any more.
> 
> > Thank you for your advice.
> > "DT node and name" seems nice idea, but it works on DT case only ?
> > Anyway, I re-consider about this too.
> > It can be trial and error...
> 
> I think that for hardware which has fairly monolithic audio blocks using
> DPCM it might be worth thinking about providing a way for the DT to look
> like the DT for a simple I2S DAI with the driver for the IP in the SoC
> filling in all the structure needed by DPCM.

I expended route setting method like below, but what do you think ? 
I guess it can use not only DT case, and it is readable ?


--------------------------
Subject: [PATCH] ASoC: dapm: enable DAI name on DAPM route

DAPM route setting is using name matching.
but, it can't match correctly if codec/platform
driver have same name.
This can be very serious issue on DAPM.

    FE CPU   (ec500000.rcar_sound): "DAI0 Playback"
       Codec (snd-soc-dummy-dai):   "Playback"

    BE CPU   (snd-soc-dummy-dai):   "Playback"
       Codec (ak4642-hifi):         "Playback"

This patch expand route setting by using DAI name.
You can select "ak4642-hifi" side "Playback" by below.

DT
	simple-audio-card,routing =
		"ak4642-hifi Playback", "DAI0 Playback";

non DT
	struct snd_soc_dapm_route route[] = {
		{ "ak4642-hifi Playback", NULL, "DAI0 Playback"},
	}

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 sound/soc/soc-dapm.c |   47 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 37 insertions(+), 10 deletions(-)

diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index b24f70a..084f15b 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -2395,6 +2395,30 @@ err:
 	return ret;
 }
 
+static void snd_soc_dapm_route_scan(struct snd_soc_dapm_widget *w,
+				    struct snd_soc_dapm_widget **wsource,
+				    struct snd_soc_dapm_widget **wsink,
+				    struct snd_soc_dapm_widget **wtsource,
+				    struct snd_soc_dapm_widget **wtsink,
+				    struct snd_soc_dapm_context *dapm,
+				    const char *sink,
+				    const char *source,
+				    const char *name)
+{
+	if (!*wsink && !(strcmp(name, sink))) {
+		*wtsink = w;
+		if (w->dapm == dapm)
+			*wsink = w;
+		return;
+	}
+
+	if (!*wsource && !(strcmp(name, source))) {
+		*wtsource = w;
+		if (w->dapm == dapm)
+			*wsource = w;
+	}
+}
+
 static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
 				  const struct snd_soc_dapm_route *route)
 {
@@ -2425,17 +2449,20 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm,
 	 * current DAPM context
 	 */
 	list_for_each_entry(w, &dapm->card->widgets, list) {
-		if (!wsink && !(strcmp(w->name, sink))) {
-			wtsink = w;
-			if (w->dapm == dapm)
-				wsink = w;
-			continue;
-		}
-		if (!wsource && !(strcmp(w->name, source))) {
-			wtsource = w;
-			if (w->dapm == dapm)
-				wsource = w;
+		if (w->dai) {
+			char w_name[80];
+
+			snprintf(w_name, sizeof(w_name), "%s %s",
+				 w->dai->name, w->name);
+
+			snd_soc_dapm_route_scan(w, &wsource, &wsink,
+						&wtsource, &wtsink, dapm,
+						sink, source, w_name);
 		}
+
+		snd_soc_dapm_route_scan(w, &wsource, &wsink,
+					&wtsource, &wtsink, dapm,
+					sink, source, w->name);
 	}
 	/* use widget from another DAPM context if not found from this */
 	if (!wsink)


Best regards
---
Kuninori Morimoto


More information about the Alsa-devel mailing list