[alsa-devel] [PATCH 1/2][RFC] ASoC: soc-core: allow no Platform on dai_link

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Wed Jan 30 03:06:48 CET 2019


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

Many drivers are constituting "Platform == CPU",
so it has below settings on current "legacy style".

	dai_link->platform_of_node = dai_link->cpu_of_node;

Because of it, soc_bind_dai_link() will pick-up "CPU component"
as "Platform component", and try to add it to snd_soc_pcm_runtime.
But it will be ignored, because it is already added when CPU bindings.

This kind of "Platform" settings is pointless.
This patch allows "no Platform" for "modern style"
(= snd_soc_dai_link_component).

Unfortunately, there are some sound card drivers which
doesn't have platform_name, platform_of_node for legacy style.
Of course it doesn't have platforms either for modern style.
But, it is assuming that "snd_soc_dummy platform" is automatically
selected by soc-core.
Because of it, we need to judge that dai_link is using "legacy style"
or "modern style" somehow.
no Platform settings on "legacy style" -> select snd_soc_dummy
no Platform settings on "modern style" -> real "no Platform"

If sound card dirver is using "modern style", both codec/platform
are using it. So this patch judges it as "modern style" if
there is no settings for
	codec_name
	codec_of_node
	codec_dai_name
	platform_name
	platform_of_node

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx at renesas.com>
---
 include/sound/soc.h  |  2 +-
 sound/soc/soc-core.c | 71 ++++++++++++++++++++++++++++++++++------------------
 2 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index 9568968..c18e076 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -957,7 +957,7 @@ struct snd_soc_dai_link {
 	/*
 	 * You MAY specify the link's platform/PCM/DMA driver, either by
 	 * device name, or by DT/OF node, but not both. Some forms of link
-	 * do not need a platform.
+	 * do not need a platform. In such case, platforms are not mandatory.
 	 */
 	const char *platform_name;
 	struct device_node *platform_of_node;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d6b5edb..cefd121 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -768,6 +768,9 @@ static int snd_soc_is_matching_component(
 {
 	struct device_node *component_of_node;
 
+	if (!dlc)
+		return 0;
+
 	component_of_node = component->dev->of_node;
 	if (!component_of_node && component->dev->parent)
 		component_of_node = component->dev->parent->of_node;
@@ -1052,6 +1055,15 @@ static int snd_soc_init_platform(struct snd_soc_card *card,
 	 * see
 	 *	soc.h :: struct snd_soc_dai_link
 	 */
+
+	/* it is already using modern style */
+	if (!dai_link->codec_name &&
+	    !dai_link->codec_of_node &&
+	    !dai_link->codec_dai_name &&
+	    !dai_link->platform_name &&
+	    !dai_link->platform_of_node)
+		goto init_end;
+
 	/* convert Legacy platform link */
 	if (!platform || dai_link->legacy_platform) {
 		platform = devm_kzalloc(card->dev,
@@ -1068,6 +1080,7 @@ static int snd_soc_init_platform(struct snd_soc_card *card,
 		platform->dai_name	  = NULL;
 	}
 
+init_end:
 	/* if there's no platform we match on the empty platform */
 	if (!platform->name &&
 	    !platform->of_node)
@@ -1151,32 +1164,38 @@ static int soc_init_dai_link(struct snd_soc_card *card,
 		}
 	}
 
-	/* FIXME */
-	if (link->num_platforms > 1) {
-		dev_err(card->dev,
-			"ASoC: multi platform is not yet supported %s\n",
-			link->name);
-		return -EINVAL;
-	}
-
 	/*
-	 * Platform may be specified by either name or OF node, but
-	 * can be left unspecified, and a dummy platform will be used.
+	 * Platform may be specified by either name or OF node,
+	 * or no Platform.
+	 *
+	 * FIXME
+	 *
+	 * We need multi-platform support
 	 */
-	if (link->platforms->name && link->platforms->of_node) {
-		dev_err(card->dev,
-			"ASoC: Both platform name/of_node are set for %s\n",
-			link->name);
-		return -EINVAL;
-	}
+	if (link->num_platforms > 0) {
 
-	/*
-	 * Defer card registartion if platform dai component is not added to
-	 * component list.
-	 */
-	if ((link->platforms->of_node || link->platforms->name) &&
-	    !soc_find_component(link->platforms->of_node, link->platforms->name))
-		return -EPROBE_DEFER;
+		if (link->num_platforms > 1) {
+			dev_err(card->dev,
+				"ASoC: multi platform is not yet supported %s\n",
+				link->name);
+			return -EINVAL;
+		}
+
+		if (link->platforms->name && link->platforms->of_node) {
+			dev_err(card->dev,
+				"ASoC: Both platform name/of_node are set for %s\n",
+				link->name);
+			return -EINVAL;
+		}
+
+		/*
+		 * Defer card registartion if platform dai component is not added to
+		 * component list.
+		 */
+		if ((link->platforms->of_node || link->platforms->name) &&
+		    !soc_find_component(link->platforms->of_node, link->platforms->name))
+			return -EPROBE_DEFER;
+	}
 
 	/*
 	 * CPU device may be specified by either name or OF node, but
@@ -1975,7 +1994,11 @@ static void soc_check_tplg_fes(struct snd_soc_card *card)
 				dev_err(card->dev, "init platform error");
 				continue;
 			}
-			dai_link->platforms->name = component->name;
+			if (dai_link->platforms)
+				dai_link->platforms->name = component->name;
+			else
+				dev_err(card->dev, "no platform was selected %s\n",
+					dai_link->name);
 
 			/* convert non BE into BE */
 			dai_link->no_pcm = 1;
-- 
2.7.4



More information about the Alsa-devel mailing list