All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] ASoC: soc-core: cleanup and platform
@ 2019-01-21  0:32 Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link Kuninori Morimoto
                   ` (5 more replies)
  0 siblings, 6 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

I merged my posted patches into 1 patch-set,
and arranged patch order.
2) - 6) are not yet reviewed.

Kuninori Morimoto (6):
  1) ASoC: soc-core: add .num_platform for dai_link
  2) ASoC: soc-core: add new snd_soc_flush_all_delayed_work()
  3) ASoC: soc-core: merge card resources cleanup method
  4) ASoC: soc-core: reduce if/else nest on soc_probe_link_dais
  5) ASoC: soc-core: add soc_cleanup_component()
  6) ASoC: soc-core: use for_each_link_codecs() for dai_link codecs

 include/sound/simple_card_utils.h     |   2 +-
 include/sound/soc.h                   |   3 +-
 sound/soc/generic/audio-graph-card.c  |   5 +-
 sound/soc/generic/simple-card-utils.c |   4 +-
 sound/soc/generic/simple-card.c       |   7 +-
 sound/soc/soc-core.c                  | 211 ++++++++++++++++------------------
 6 files changed, 114 insertions(+), 118 deletions(-)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21 19:20   ` Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree Mark Brown
  2019-01-21  0:32 ` [PATCH 2/6] ASoC: soc-core: add new snd_soc_flush_all_delayed_work() Kuninori Morimoto
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


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

Current snd_soc_dai_link is starting to use snd_soc_dai_link_component
(= modern) style for Platform, but it is still assuming single Platform
so far. We will need to have multi Platform support in the not far
future.

Currently only simple card is using it as sound card driver,
and other drivers are converted to it from legacy style by
snd_soc_init_platform().
To avoid future problem of multi Platform support, let's add
num_platforms before it is too late.

In the same time, to make it same naming mothed, "platform" should
be "platforms". This patch fixup it too.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/simple_card_utils.h     |  2 +-
 include/sound/soc.h                   |  3 ++-
 sound/soc/generic/audio-graph-card.c  |  5 +++--
 sound/soc/generic/simple-card-utils.c |  4 ++--
 sound/soc/generic/simple-card.c       |  7 ++++---
 sound/soc/soc-core.c                  | 23 ++++++++++++++++-------
 6 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index 6d69ed2..ab5a2ba 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -75,7 +75,7 @@ void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
 				   &dai_link->codec_dai_name,			\
 				   list_name, cells_name, NULL)
 #define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name)	\
-	asoc_simple_card_parse_dai(node, dai_link->platform,					\
+	asoc_simple_card_parse_dai(node, dai_link->platforms,			\
 		&dai_link->platform_of_node,					\
 		NULL, list_name, cells_name, NULL)
 int asoc_simple_card_parse_dai(struct device_node *node,
diff --git a/include/sound/soc.h b/include/sound/soc.h
index c31b6d1..3089257 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -961,7 +961,8 @@ struct snd_soc_dai_link {
 	 */
 	const char *platform_name;
 	struct device_node *platform_of_node;
-	struct snd_soc_dai_link_component *platform;
+	struct snd_soc_dai_link_component *platforms;
+	unsigned int num_platforms;
 
 	int id;	/* optional ID for machine driver link identification */
 
diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c
index 3ec96cd..42b077c 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -26,7 +26,7 @@ struct graph_priv {
 		struct asoc_simple_dai *cpu_dai;
 		struct asoc_simple_dai *codec_dai;
 		struct snd_soc_dai_link_component codecs; /* single codec */
-		struct snd_soc_dai_link_component platform;
+		struct snd_soc_dai_link_component platforms;
 		struct asoc_simple_card_data adata;
 		struct snd_soc_codec_conf *codec_conf;
 		unsigned int mclk_fs;
@@ -687,7 +687,8 @@ static int graph_probe(struct platform_device *pdev)
 	for (i = 0; i < li.link; i++) {
 		dai_link[i].codecs	= &dai_props[i].codecs;
 		dai_link[i].num_codecs	= 1;
-		dai_link[i].platform	= &dai_props[i].platform;
+		dai_link[i].platforms	= &dai_props[i].platforms;
+		dai_link[i].num_platforms = 1;
 	}
 
 	priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 336895f..3c0901d 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -397,8 +397,8 @@ EXPORT_SYMBOL_GPL(asoc_simple_card_init_dai);
 int asoc_simple_card_canonicalize_dailink(struct snd_soc_dai_link *dai_link)
 {
 	/* Assumes platform == cpu */
-	if (!dai_link->platform->of_node)
-		dai_link->platform->of_node = dai_link->cpu_of_node;
+	if (!dai_link->platforms->of_node)
+		dai_link->platforms->of_node = dai_link->cpu_of_node;
 
 	return 0;
 
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 479de23..d8a0d1e 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -21,7 +21,7 @@ struct simple_priv {
 		struct asoc_simple_dai *cpu_dai;
 		struct asoc_simple_dai *codec_dai;
 		struct snd_soc_dai_link_component codecs; /* single codec */
-		struct snd_soc_dai_link_component platform;
+		struct snd_soc_dai_link_component platforms;
 		struct asoc_simple_card_data adata;
 		struct snd_soc_codec_conf *codec_conf;
 		unsigned int mclk_fs;
@@ -732,7 +732,8 @@ static int simple_probe(struct platform_device *pdev)
 	for (i = 0; i < li.link; i++) {
 		dai_link[i].codecs	= &dai_props[i].codecs;
 		dai_link[i].num_codecs	= 1;
-		dai_link[i].platform	= &dai_props[i].platform;
+		dai_link[i].platforms	= &dai_props[i].platforms;
+		dai_link[i].num_platforms = 1;
 	}
 
 	priv->dai_props		= dai_props;
@@ -782,7 +783,7 @@ static int simple_probe(struct platform_device *pdev)
 		codecs->name		= cinfo->codec;
 		codecs->dai_name	= cinfo->codec_dai.name;
 
-		platform		= dai_link->platform;
+		platform		= dai_link->platforms;
 		platform->name		= cinfo->platform;
 
 		card->name		= (cinfo->card) ? cinfo->card : cinfo->name;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index de2851f..2c63921 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -915,7 +915,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 
 	/* find one from the set of registered platforms */
 	for_each_component(component) {
-		if (!snd_soc_is_matching_component(dai_link->platform,
+		if (!snd_soc_is_matching_component(dai_link->platforms,
 						   component))
 			continue;
 
@@ -1026,7 +1026,7 @@ static void soc_remove_dai_links(struct snd_soc_card *card)
 static int snd_soc_init_platform(struct snd_soc_card *card,
 				 struct snd_soc_dai_link *dai_link)
 {
-	struct snd_soc_dai_link_component *platform = dai_link->platform;
+	struct snd_soc_dai_link_component *platform = dai_link->platforms;
 
 	/*
 	 * REMOVE ME
@@ -1046,7 +1046,8 @@ static int snd_soc_init_platform(struct snd_soc_card *card,
 		if (!platform)
 			return -ENOMEM;
 
-		dai_link->platform	  = platform;
+		dai_link->platforms	  = platform;
+		dai_link->num_platforms	  = 1;
 		dai_link->legacy_platform = 1;
 		platform->name		  = dai_link->platform_name;
 		platform->of_node	  = dai_link->platform_of_node;
@@ -1136,11 +1137,19 @@ 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.
 	 */
-	if (link->platform->name && link->platform->of_node) {
+	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);
@@ -1151,8 +1160,8 @@ static int soc_init_dai_link(struct snd_soc_card *card,
 	 * Defer card registartion if platform dai component is not added to
 	 * component list.
 	 */
-	if ((link->platform->of_node || link->platform->name) &&
-	    !soc_find_component(link->platform->of_node, link->platform->name))
+	if ((link->platforms->of_node || link->platforms->name) &&
+	    !soc_find_component(link->platforms->of_node, link->platforms->name))
 		return -EPROBE_DEFER;
 
 	/*
@@ -1956,7 +1965,7 @@ static void soc_check_tplg_fes(struct snd_soc_card *card)
 				dev_err(card->dev, "init platform error");
 				continue;
 			}
-			dai_link->platform->name = component->name;
+			dai_link->platforms->name = component->name;
 
 			/* convert non BE into BE */
 			dai_link->no_pcm = 1;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 2/6] ASoC: soc-core: add new snd_soc_flush_all_delayed_work()
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 3/6] ASoC: soc-core: merge card resources cleanup method Kuninori Morimoto
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


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

soc-core is calling flush_delayed_work() many times for same purpose.
Same code in many places makes code un-understandable.
This patch adds new snd_soc_flush_all_delayed_work() for it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 2c63921..eeb794d 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -425,6 +425,14 @@ struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
 }
 EXPORT_SYMBOL_GPL(snd_soc_get_pcm_runtime);
 
+static void snd_soc_flush_all_delayed_work(struct snd_soc_card *card)
+{
+	struct snd_soc_pcm_runtime *rtd;
+
+	for_each_card_rtds(card, rtd)
+		flush_delayed_work(&rtd->delayed_work);
+}
+
 static void codec2codec_close_delayed_work(struct work_struct *work)
 {
 	/*
@@ -494,8 +502,7 @@ int snd_soc_suspend(struct device *dev)
 	}
 
 	/* close any waiting streams */
-	for_each_card_rtds(card, rtd)
-		flush_delayed_work(&rtd->delayed_work);
+	snd_soc_flush_all_delayed_work(card);
 
 	for_each_card_rtds(card, rtd) {
 
@@ -2228,11 +2235,8 @@ static int soc_probe(struct platform_device *pdev)
 
 static int soc_cleanup_card_resources(struct snd_soc_card *card)
 {
-	struct snd_soc_pcm_runtime *rtd;
-
 	/* make sure any delayed work runs */
-	for_each_card_rtds(card, rtd)
-		flush_delayed_work(&rtd->delayed_work);
+	snd_soc_flush_all_delayed_work(card);
 
 	/* free the ALSA card at first; this syncs with pending operations */
 	snd_card_free(card->snd_card);
@@ -2275,8 +2279,7 @@ int snd_soc_poweroff(struct device *dev)
 	 * Flush out pmdown_time work - we actually do want to run it
 	 * now, we're shutting down so no imminent restart.
 	 */
-	for_each_card_rtds(card, rtd)
-		flush_delayed_work(&rtd->delayed_work);
+	snd_soc_flush_all_delayed_work(card);
 
 	snd_soc_dapm_shutdown(card);
 
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 3/6] ASoC: soc-core: merge card resources cleanup method
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 2/6] ASoC: soc-core: add new snd_soc_flush_all_delayed_work() Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 4/6] ASoC: soc-core: reduce if/else nest on soc_probe_link_dais Kuninori Morimoto
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


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

We need to cleanup card resources when snd_soc_instantiate_card() was
failed, or when snd_soc_unbind_card() was called.
But they are cleanuping card resources on each way.
Same code in many places makes code un-understandable.

This patch reuses soc_cleanup_card_resources() for cleanuping code
resource. Then, it makes avoiding cleanup order.
It will be called from snd_soc_instantiate_card() and
snd_soc_unbind_card().

Then, original soc_cleanup_card_resources() included
snd_soc_flush_all_delayed_work(), but it is now separated.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 103 +++++++++++++++++++++------------------------------
 1 file changed, 43 insertions(+), 60 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index eeb794d..d59b5ea 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2008,6 +2008,29 @@ static void soc_check_tplg_fes(struct snd_soc_card *card)
 	}
 }
 
+static int soc_cleanup_card_resources(struct snd_soc_card *card)
+{
+	/* free the ALSA card at first; this syncs with pending operations */
+	if (card->snd_card)
+		snd_card_free(card->snd_card);
+
+	/* remove and free each DAI */
+	soc_remove_dai_links(card);
+	soc_remove_pcm_runtimes(card);
+
+	/* remove auxiliary devices */
+	soc_remove_aux_devices(card);
+
+	snd_soc_dapm_free(&card->dapm);
+	soc_cleanup_card_debugfs(card);
+
+	/* remove the card */
+	if (card->remove)
+		card->remove(card);
+
+	return 0;
+}
+
 static int snd_soc_instantiate_card(struct snd_soc_card *card)
 {
 	struct snd_soc_pcm_runtime *rtd;
@@ -2017,6 +2040,11 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 	mutex_lock(&client_mutex);
 	mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_INIT);
 
+	card->dapm.bias_level = SND_SOC_BIAS_OFF;
+	card->dapm.dev = card->dev;
+	card->dapm.card = card;
+	list_add(&card->dapm.list, &card->dapm_list);
+
 	/* check whether any platform is ignore machine FE and using topology */
 	soc_check_tplg_fes(card);
 
@@ -2024,14 +2052,14 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 	for_each_card_prelinks(card, i, dai_link) {
 		ret = soc_bind_dai_link(card, dai_link);
 		if (ret != 0)
-			goto base_error;
+			goto probe_end;
 	}
 
 	/* bind aux_devs too */
 	for (i = 0; i < card->num_aux_devs; i++) {
 		ret = soc_bind_aux_dev(card, i);
 		if (ret != 0)
-			goto base_error;
+			goto probe_end;
 	}
 
 	/* add predefined DAI links to the list */
@@ -2045,16 +2073,11 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 		dev_err(card->dev,
 			"ASoC: can't create sound card for card %s: %d\n",
 			card->name, ret);
-		goto base_error;
+		goto probe_end;
 	}
 
 	soc_init_card_debugfs(card);
 
-	card->dapm.bias_level = SND_SOC_BIAS_OFF;
-	card->dapm.dev = card->dev;
-	card->dapm.card = card;
-	list_add(&card->dapm.list, &card->dapm_list);
-
 #ifdef CONFIG_DEBUG_FS
 	snd_soc_dapm_debugfs_init(&card->dapm, card->debugfs_card_root);
 #endif
@@ -2076,7 +2099,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 	if (card->probe) {
 		ret = card->probe(card);
 		if (ret < 0)
-			goto card_probe_error;
+			goto probe_end;
 	}
 
 	/* probe all components used by DAI links on this card */
@@ -2087,7 +2110,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 				dev_err(card->dev,
 					"ASoC: failed to instantiate card %d\n",
 					ret);
-				goto probe_dai_err;
+				goto probe_end;
 			}
 		}
 	}
@@ -2095,7 +2118,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 	/* probe auxiliary components */
 	ret = soc_probe_aux_devices(card);
 	if (ret < 0)
-		goto probe_dai_err;
+		goto probe_end;
 
 	/*
 	 * Find new DAI links added during probing components and bind them.
@@ -2107,10 +2130,10 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 
 		ret = soc_init_dai_link(card, dai_link);
 		if (ret)
-			goto probe_dai_err;
+			goto probe_end;
 		ret = soc_bind_dai_link(card, dai_link);
 		if (ret)
-			goto probe_dai_err;
+			goto probe_end;
 	}
 
 	/* probe all DAI links on this card */
@@ -2121,7 +2144,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 				dev_err(card->dev,
 					"ASoC: failed to instantiate card %d\n",
 					ret);
-				goto probe_dai_err;
+				goto probe_end;
 			}
 		}
 	}
@@ -2168,7 +2191,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 		if (ret < 0) {
 			dev_err(card->dev, "ASoC: %s late_probe() failed: %d\n",
 				card->name, ret);
-			goto probe_aux_dev_err;
+			goto probe_end;
 		}
 	}
 
@@ -2178,33 +2201,17 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
 	if (ret < 0) {
 		dev_err(card->dev, "ASoC: failed to register soundcard %d\n",
 				ret);
-		goto probe_aux_dev_err;
+		goto probe_end;
 	}
 
 	card->instantiated = 1;
 	dapm_mark_endpoints_dirty(card);
 	snd_soc_dapm_sync(&card->dapm);
-	mutex_unlock(&card->mutex);
-	mutex_unlock(&client_mutex);
-
-	return 0;
 
-probe_aux_dev_err:
-	soc_remove_aux_devices(card);
-
-probe_dai_err:
-	soc_remove_dai_links(card);
-
-card_probe_error:
-	if (card->remove)
-		card->remove(card);
-
-	snd_soc_dapm_free(&card->dapm);
-	soc_cleanup_card_debugfs(card);
-	snd_card_free(card->snd_card);
+probe_end:
+	if (ret < 0)
+		soc_cleanup_card_resources(card);
 
-base_error:
-	soc_remove_pcm_runtimes(card);
 	mutex_unlock(&card->mutex);
 	mutex_unlock(&client_mutex);
 
@@ -2233,31 +2240,6 @@ static int soc_probe(struct platform_device *pdev)
 	return snd_soc_register_card(card);
 }
 
-static int soc_cleanup_card_resources(struct snd_soc_card *card)
-{
-	/* make sure any delayed work runs */
-	snd_soc_flush_all_delayed_work(card);
-
-	/* free the ALSA card at first; this syncs with pending operations */
-	snd_card_free(card->snd_card);
-
-	/* remove and free each DAI */
-	soc_remove_dai_links(card);
-	soc_remove_pcm_runtimes(card);
-
-	/* remove auxiliary devices */
-	soc_remove_aux_devices(card);
-
-	snd_soc_dapm_free(&card->dapm);
-	soc_cleanup_card_debugfs(card);
-
-	/* remove the card */
-	if (card->remove)
-		card->remove(card);
-
-	return 0;
-}
-
 /* removes a socdev */
 static int soc_remove(struct platform_device *pdev)
 {
@@ -2823,6 +2805,7 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister)
 	if (card->instantiated) {
 		card->instantiated = false;
 		snd_soc_dapm_shutdown(card);
+		snd_soc_flush_all_delayed_work(card);
 		soc_cleanup_card_resources(card);
 		if (!unregister)
 			list_add(&card->list, &unbind_card_list);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 4/6] ASoC: soc-core: reduce if/else nest on soc_probe_link_dais
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
                   ` (2 preceding siblings ...)
  2019-01-21  0:32 ` [PATCH 3/6] ASoC: soc-core: merge card resources cleanup method Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 5/6] ASoC: soc-core: add soc_cleanup_component() Kuninori Morimoto
  2019-01-21  0:32 ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Kuninori Morimoto
  5 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

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

Deep nested codec is not readable.
Let's reduce if/else nest.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 37 +++++++++++++++++--------------------
 1 file changed, 17 insertions(+), 20 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index d59b5ea..7fc10a4 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1612,27 +1612,24 @@ static int soc_probe_link_dais(struct snd_soc_card *card,
 					 dai_link->stream_name);
 			return ret;
 		}
-	} else {
-
-		if (!dai_link->params) {
-			/* create the pcm */
-			ret = soc_new_pcm(rtd, num);
-			if (ret < 0) {
-				dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
-					dai_link->stream_name, ret);
-				return ret;
-			}
-			ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
-			if (ret < 0)
-				return ret;
-			ret = soc_link_dai_pcm_new(rtd->codec_dais,
-						   rtd->num_codecs, rtd);
-			if (ret < 0)
-				return ret;
-		} else {
-			INIT_DELAYED_WORK(&rtd->delayed_work,
-						codec2codec_close_delayed_work);
+	} else if (!dai_link->params) {
+		/* create the pcm */
+		ret = soc_new_pcm(rtd, num);
+		if (ret < 0) {
+			dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
+				dai_link->stream_name, ret);
+			return ret;
 		}
+		ret = soc_link_dai_pcm_new(&cpu_dai, 1, rtd);
+		if (ret < 0)
+			return ret;
+		ret = soc_link_dai_pcm_new(rtd->codec_dais,
+					   rtd->num_codecs, rtd);
+		if (ret < 0)
+			return ret;
+	} else {
+		INIT_DELAYED_WORK(&rtd->delayed_work,
+				  codec2codec_close_delayed_work);
 	}
 
 	return 0;
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 5/6] ASoC: soc-core: add soc_cleanup_component()
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
                   ` (3 preceding siblings ...)
  2019-01-21  0:32 ` [PATCH 4/6] ASoC: soc-core: reduce if/else nest on soc_probe_link_dais Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21 19:20   ` Applied "ASoC: soc-core: add soc_cleanup_component()" to the asoc tree Mark Brown
  2019-01-21  0:32 ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Kuninori Morimoto
  5 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


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

We need to cleanup component when soc_probe_component() was
failed, or when soc_remove_component() was called.
But they are cleanuping component on each way.
(And soc_probe_component() doesn't call snd_soc_dapm_free(),
but it should).
Same code in many places makes code un-understandable.

This patch adds new soc_cleanup_component() and call it from
snd_probe_component() and snd_remove_component().

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 7fc10a4..8a58fa8 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -937,21 +937,24 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	return -EPROBE_DEFER;
 }
 
+static void soc_cleanup_component(struct snd_soc_component *component)
+{
+	list_del(&component->card_list);
+	snd_soc_dapm_free(snd_soc_component_get_dapm(component));
+	soc_cleanup_component_debugfs(component);
+	component->card = NULL;
+	module_put(component->dev->driver->owner);
+}
+
 static void soc_remove_component(struct snd_soc_component *component)
 {
 	if (!component->card)
 		return;
 
-	list_del(&component->card_list);
-
 	if (component->driver->remove)
 		component->driver->remove(component);
 
-	snd_soc_dapm_free(snd_soc_component_get_dapm(component));
-
-	soc_cleanup_component_debugfs(component);
-	component->card = NULL;
-	module_put(component->dev->driver->owner);
+	soc_cleanup_component(component);
 }
 
 static void soc_remove_dai(struct snd_soc_dai *dai, int order)
@@ -1360,6 +1363,8 @@ static int soc_probe_component(struct snd_soc_card *card,
 
 	component->card = card;
 	dapm->card = card;
+	INIT_LIST_HEAD(&component->card_list);
+	INIT_LIST_HEAD(&dapm->list);
 	soc_set_name_prefix(card, component);
 
 	soc_init_component_debugfs(component);
@@ -1422,12 +1427,9 @@ static int soc_probe_component(struct snd_soc_card *card,
 	/* see for_each_card_components */
 	list_add(&component->card_list, &card->component_dev_list);
 
-	return 0;
-
 err_probe:
-	soc_cleanup_component_debugfs(component);
-	component->card = NULL;
-	module_put(component->dev->driver->owner);
+	if (ret < 0)
+		soc_cleanup_component(component);
 
 	return ret;
 }
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
                   ` (4 preceding siblings ...)
  2019-01-21  0:32 ` [PATCH 5/6] ASoC: soc-core: add soc_cleanup_component() Kuninori Morimoto
@ 2019-01-21  0:32 ` Kuninori Morimoto
  2019-01-21 19:20   ` Applied "ASoC: soc-core: use for_each_link_codecs() for dai_link codecs" to the asoc tree Mark Brown
  2019-01-22 15:43   ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Sylwester Nawrocki
  5 siblings, 2 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-21  0:32 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA

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

We can use for_each_link_codecs() without waiting
for_each_rtd_codec_dai() on soc_bind_dai_link().
Let's use for_each macro

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 8a58fa8..1c92b4a 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -870,7 +870,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	struct snd_soc_dai_link *dai_link)
 {
 	struct snd_soc_pcm_runtime *rtd;
-	struct snd_soc_dai_link_component *codecs = dai_link->codecs;
+	struct snd_soc_dai_link_component *codecs;
 	struct snd_soc_dai_link_component cpu_dai_component;
 	struct snd_soc_component *component;
 	struct snd_soc_dai **codec_dais;
@@ -905,9 +905,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	rtd->num_codecs = dai_link->num_codecs;
 
 	/* Find CODEC from registered CODECs */
-	/* we can use for_each_rtd_codec_dai() after this */
 	codec_dais = rtd->codec_dais;
-	for (i = 0; i < rtd->num_codecs; i++) {
+	for_each_link_codecs(dai_link, i, codecs) {
 		codec_dais[i] = snd_soc_find_dai(&codecs[i]);
 		if (!codec_dais[i]) {
 			dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Applied "ASoC: soc-core: use for_each_link_codecs() for dai_link codecs" to the asoc tree
  2019-01-21  0:32 ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Kuninori Morimoto
@ 2019-01-21 19:20   ` Mark Brown
  2019-01-22 15:43   ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Sylwester Nawrocki
  1 sibling, 0 replies; 18+ messages in thread
From: Mark Brown @ 2019-01-21 19:20 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: alsa-devel, Mark Brown

The patch

   ASoC: soc-core: use for_each_link_codecs() for dai_link codecs

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 10dff9b0ddf70bebe9523fc311ec77a872ce0a9c Mon Sep 17 00:00:00 2001
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date: Mon, 21 Jan 2019 09:32:59 +0900
Subject: [PATCH] ASoC: soc-core: use for_each_link_codecs() for dai_link
 codecs

We can use for_each_link_codecs() without waiting
for_each_rtd_codec_dai() on soc_bind_dai_link().
Let's use for_each macro

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/soc-core.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 8a58fa86675a..1c92b4aff57b 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -870,7 +870,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	struct snd_soc_dai_link *dai_link)
 {
 	struct snd_soc_pcm_runtime *rtd;
-	struct snd_soc_dai_link_component *codecs = dai_link->codecs;
+	struct snd_soc_dai_link_component *codecs;
 	struct snd_soc_dai_link_component cpu_dai_component;
 	struct snd_soc_component *component;
 	struct snd_soc_dai **codec_dais;
@@ -905,9 +905,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	rtd->num_codecs = dai_link->num_codecs;
 
 	/* Find CODEC from registered CODECs */
-	/* we can use for_each_rtd_codec_dai() after this */
 	codec_dais = rtd->codec_dais;
-	for (i = 0; i < rtd->num_codecs; i++) {
+	for_each_link_codecs(dai_link, i, codecs) {
 		codec_dais[i] = snd_soc_find_dai(&codecs[i]);
 		if (!codec_dais[i]) {
 			dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Applied "ASoC: soc-core: add soc_cleanup_component()" to the asoc tree
  2019-01-21  0:32 ` [PATCH 5/6] ASoC: soc-core: add soc_cleanup_component() Kuninori Morimoto
@ 2019-01-21 19:20   ` Mark Brown
  0 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2019-01-21 19:20 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: alsa-devel, Mark Brown

The patch

   ASoC: soc-core: add soc_cleanup_component()

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 22d1423187e5b4d9d5a9851f24466fc0f585a36f Mon Sep 17 00:00:00 2001
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date: Mon, 21 Jan 2019 09:32:55 +0900
Subject: [PATCH] ASoC: soc-core: add soc_cleanup_component()

We need to cleanup component when soc_probe_component() was
failed, or when soc_remove_component() was called.
But they are cleanuping component on each way.
(And soc_probe_component() doesn't call snd_soc_dapm_free(),
but it should).
Same code in many places makes code un-understandable.

This patch adds new soc_cleanup_component() and call it from
snd_probe_component() and snd_remove_component().

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/soc-core.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 7fc10a41e0e9..8a58fa86675a 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -937,21 +937,24 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	return -EPROBE_DEFER;
 }
 
+static void soc_cleanup_component(struct snd_soc_component *component)
+{
+	list_del(&component->card_list);
+	snd_soc_dapm_free(snd_soc_component_get_dapm(component));
+	soc_cleanup_component_debugfs(component);
+	component->card = NULL;
+	module_put(component->dev->driver->owner);
+}
+
 static void soc_remove_component(struct snd_soc_component *component)
 {
 	if (!component->card)
 		return;
 
-	list_del(&component->card_list);
-
 	if (component->driver->remove)
 		component->driver->remove(component);
 
-	snd_soc_dapm_free(snd_soc_component_get_dapm(component));
-
-	soc_cleanup_component_debugfs(component);
-	component->card = NULL;
-	module_put(component->dev->driver->owner);
+	soc_cleanup_component(component);
 }
 
 static void soc_remove_dai(struct snd_soc_dai *dai, int order)
@@ -1360,6 +1363,8 @@ static int soc_probe_component(struct snd_soc_card *card,
 
 	component->card = card;
 	dapm->card = card;
+	INIT_LIST_HEAD(&component->card_list);
+	INIT_LIST_HEAD(&dapm->list);
 	soc_set_name_prefix(card, component);
 
 	soc_init_component_debugfs(component);
@@ -1422,12 +1427,9 @@ static int soc_probe_component(struct snd_soc_card *card,
 	/* see for_each_card_components */
 	list_add(&component->card_list, &card->component_dev_list);
 
-	return 0;
-
 err_probe:
-	soc_cleanup_component_debugfs(component);
-	component->card = NULL;
-	module_put(component->dev->driver->owner);
+	if (ret < 0)
+		soc_cleanup_component(component);
 
 	return ret;
 }
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree
  2019-01-21  0:32 ` [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link Kuninori Morimoto
@ 2019-01-21 19:20   ` Mark Brown
  2019-01-22  2:10     ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2019-01-21 19:20 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: alsa-devel, Mark Brown

The patch

   ASoC: soc-core: add .num_platform for dai_link

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 910fdcabedd2354d161b1beab6ad7dc7e859651d Mon Sep 17 00:00:00 2001
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date: Mon, 21 Jan 2019 09:32:32 +0900
Subject: [PATCH] ASoC: soc-core: add .num_platform for dai_link

Current snd_soc_dai_link is starting to use snd_soc_dai_link_component
(= modern) style for Platform, but it is still assuming single Platform
so far. We will need to have multi Platform support in the not far
future.

Currently only simple card is using it as sound card driver,
and other drivers are converted to it from legacy style by
snd_soc_init_platform().
To avoid future problem of multi Platform support, let's add
num_platforms before it is too late.

In the same time, to make it same naming mothed, "platform" should
be "platforms". This patch fixup it too.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 include/sound/simple_card_utils.h     |  2 +-
 include/sound/soc.h                   |  3 ++-
 sound/soc/generic/audio-graph-card.c  |  5 +++--
 sound/soc/generic/simple-card-utils.c |  4 ++--
 sound/soc/generic/simple-card.c       |  7 ++++---
 sound/soc/soc-core.c                  | 23 ++++++++++++++++-------
 6 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index 6d69ed2bd7b1..ab5a2ba09c07 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -75,7 +75,7 @@ void asoc_simple_card_clk_disable(struct asoc_simple_dai *dai);
 				   &dai_link->codec_dai_name,			\
 				   list_name, cells_name, NULL)
 #define asoc_simple_card_parse_platform(node, dai_link, list_name, cells_name)	\
-	asoc_simple_card_parse_dai(node, dai_link->platform,					\
+	asoc_simple_card_parse_dai(node, dai_link->platforms,			\
 		&dai_link->platform_of_node,					\
 		NULL, list_name, cells_name, NULL)
 int asoc_simple_card_parse_dai(struct device_node *node,
diff --git a/include/sound/soc.h b/include/sound/soc.h
index c31b6d122ff6..3089257ead95 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -961,7 +961,8 @@ struct snd_soc_dai_link {
 	 */
 	const char *platform_name;
 	struct device_node *platform_of_node;
-	struct snd_soc_dai_link_component *platform;
+	struct snd_soc_dai_link_component *platforms;
+	unsigned int num_platforms;
 
 	int id;	/* optional ID for machine driver link identification */
 
diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c
index 3ec96cdc683b..42b077c6be4c 100644
--- a/sound/soc/generic/audio-graph-card.c
+++ b/sound/soc/generic/audio-graph-card.c
@@ -26,7 +26,7 @@ struct graph_priv {
 		struct asoc_simple_dai *cpu_dai;
 		struct asoc_simple_dai *codec_dai;
 		struct snd_soc_dai_link_component codecs; /* single codec */
-		struct snd_soc_dai_link_component platform;
+		struct snd_soc_dai_link_component platforms;
 		struct asoc_simple_card_data adata;
 		struct snd_soc_codec_conf *codec_conf;
 		unsigned int mclk_fs;
@@ -687,7 +687,8 @@ static int graph_probe(struct platform_device *pdev)
 	for (i = 0; i < li.link; i++) {
 		dai_link[i].codecs	= &dai_props[i].codecs;
 		dai_link[i].num_codecs	= 1;
-		dai_link[i].platform	= &dai_props[i].platform;
+		dai_link[i].platforms	= &dai_props[i].platforms;
+		dai_link[i].num_platforms = 1;
 	}
 
 	priv->pa_gpio = devm_gpiod_get_optional(dev, "pa", GPIOD_OUT_LOW);
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 336895f7fd1e..3c0901df5796 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -397,8 +397,8 @@ EXPORT_SYMBOL_GPL(asoc_simple_card_init_dai);
 int asoc_simple_card_canonicalize_dailink(struct snd_soc_dai_link *dai_link)
 {
 	/* Assumes platform == cpu */
-	if (!dai_link->platform->of_node)
-		dai_link->platform->of_node = dai_link->cpu_of_node;
+	if (!dai_link->platforms->of_node)
+		dai_link->platforms->of_node = dai_link->cpu_of_node;
 
 	return 0;
 
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 479de236e694..d8a0d1ec256e 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -21,7 +21,7 @@ struct simple_priv {
 		struct asoc_simple_dai *cpu_dai;
 		struct asoc_simple_dai *codec_dai;
 		struct snd_soc_dai_link_component codecs; /* single codec */
-		struct snd_soc_dai_link_component platform;
+		struct snd_soc_dai_link_component platforms;
 		struct asoc_simple_card_data adata;
 		struct snd_soc_codec_conf *codec_conf;
 		unsigned int mclk_fs;
@@ -732,7 +732,8 @@ static int simple_probe(struct platform_device *pdev)
 	for (i = 0; i < li.link; i++) {
 		dai_link[i].codecs	= &dai_props[i].codecs;
 		dai_link[i].num_codecs	= 1;
-		dai_link[i].platform	= &dai_props[i].platform;
+		dai_link[i].platforms	= &dai_props[i].platforms;
+		dai_link[i].num_platforms = 1;
 	}
 
 	priv->dai_props		= dai_props;
@@ -782,7 +783,7 @@ static int simple_probe(struct platform_device *pdev)
 		codecs->name		= cinfo->codec;
 		codecs->dai_name	= cinfo->codec_dai.name;
 
-		platform		= dai_link->platform;
+		platform		= dai_link->platforms;
 		platform->name		= cinfo->platform;
 
 		card->name		= (cinfo->card) ? cinfo->card : cinfo->name;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index de2851f1b3df..2c63921675d5 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -915,7 +915,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 
 	/* find one from the set of registered platforms */
 	for_each_component(component) {
-		if (!snd_soc_is_matching_component(dai_link->platform,
+		if (!snd_soc_is_matching_component(dai_link->platforms,
 						   component))
 			continue;
 
@@ -1026,7 +1026,7 @@ static void soc_remove_dai_links(struct snd_soc_card *card)
 static int snd_soc_init_platform(struct snd_soc_card *card,
 				 struct snd_soc_dai_link *dai_link)
 {
-	struct snd_soc_dai_link_component *platform = dai_link->platform;
+	struct snd_soc_dai_link_component *platform = dai_link->platforms;
 
 	/*
 	 * REMOVE ME
@@ -1046,7 +1046,8 @@ static int snd_soc_init_platform(struct snd_soc_card *card,
 		if (!platform)
 			return -ENOMEM;
 
-		dai_link->platform	  = platform;
+		dai_link->platforms	  = platform;
+		dai_link->num_platforms	  = 1;
 		dai_link->legacy_platform = 1;
 		platform->name		  = dai_link->platform_name;
 		platform->of_node	  = dai_link->platform_of_node;
@@ -1136,11 +1137,19 @@ 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.
 	 */
-	if (link->platform->name && link->platform->of_node) {
+	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);
@@ -1151,8 +1160,8 @@ static int soc_init_dai_link(struct snd_soc_card *card,
 	 * Defer card registartion if platform dai component is not added to
 	 * component list.
 	 */
-	if ((link->platform->of_node || link->platform->name) &&
-	    !soc_find_component(link->platform->of_node, link->platform->name))
+	if ((link->platforms->of_node || link->platforms->name) &&
+	    !soc_find_component(link->platforms->of_node, link->platforms->name))
 		return -EPROBE_DEFER;
 
 	/*
@@ -1956,7 +1965,7 @@ static void soc_check_tplg_fes(struct snd_soc_card *card)
 				dev_err(card->dev, "init platform error");
 				continue;
 			}
-			dai_link->platform->name = component->name;
+			dai_link->platforms->name = component->name;
 
 			/* convert non BE into BE */
 			dai_link->no_pcm = 1;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree
  2019-01-21 19:20   ` Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree Mark Brown
@ 2019-01-22  2:10     ` Kuninori Morimoto
  2019-01-22 20:36       ` Mark Brown
  0 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-22  2:10 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

> Current snd_soc_dai_link is starting to use snd_soc_dai_link_component
> (= modern) style for Platform, but it is still assuming single Platform
> so far. We will need to have multi Platform support in the not far
> future.

In my understanding, if Intel / Pierre-Louis supported multi-CPU /
CPU modern style, we can switch to modern style for all drivers,
and remove legacy style code.

Then, I want to suggest 2 things for platform if possible.

1) Many sound driver is assuming "Platform == CPU",
   so, many driver have this code on current legacy style.

	dai_link->platforms->of_node = dai_link->cpu_of_node;

   Because of this settings, soc_bind_dai_link() will pick-up
   platform component, and try to add it to pcm_runtime.
   But this component will be ignored because it is already
   added when CPU bindings, I think.
   I think "platform" settings is not mandatory in this case.
   So we can allow "no platform" in modern style.
   But what do you think ?

2) On legacy style, if sound card dirver doesn't indicate specific "platform",
   then, "snd-soc-dummy" platform will be selected automatically.
   It is implemented on snd_soc_init_platform() today.
   In modern style, we can force to indicate necessary platform,
   or, not allow implicit snd-soc-dummy platform selection.
   But what do you think ?

If these are OK, we can add/modify such code on current glue code somehow,
and all driver follows this new rule when switching to modern style.

Good things is that driver code will be more simple/clear,
Bad  things is that switching to modern will be tough work.

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-21  0:32 ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Kuninori Morimoto
  2019-01-21 19:20   ` Applied "ASoC: soc-core: use for_each_link_codecs() for dai_link codecs" to the asoc tree Mark Brown
@ 2019-01-22 15:43   ` Sylwester Nawrocki
  2019-01-22 17:39     ` Mark Brown
  1 sibling, 1 reply; 18+ messages in thread
From: Sylwester Nawrocki @ 2019-01-22 15:43 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Mark Brown, Marek Szyprowski

Hi Morimoto-san,

On 1/21/19 01:32, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> We can use for_each_link_codecs() without waiting
> for_each_rtd_codec_dai() on soc_bind_dai_link().
> Let's use for_each macro
> 
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> ---
>  sound/soc/soc-core.c | 5 ++---
>  1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index 8a58fa8..1c92b4a 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -870,7 +870,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
>  	struct snd_soc_dai_link *dai_link)
>  {
>  	struct snd_soc_pcm_runtime *rtd;
> -	struct snd_soc_dai_link_component *codecs = dai_link->codecs;
> +	struct snd_soc_dai_link_component *codecs;
>  	struct snd_soc_dai_link_component cpu_dai_component;
>  	struct snd_soc_component *component;
>  	struct snd_soc_dai **codec_dais;
> @@ -905,9 +905,8 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
>  	rtd->num_codecs = dai_link->num_codecs;
>  
>  	/* Find CODEC from registered CODECs */
> -	/* we can use for_each_rtd_codec_dai() after this */
>  	codec_dais = rtd->codec_dais;
> -	for (i = 0; i < rtd->num_codecs; i++) {
> +	for_each_link_codecs(dai_link, i, codecs) {
>  		codec_dais[i] = snd_soc_find_dai(&codecs[i]);
>  		if (!codec_dais[i]) {
>  			dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
 
It seems this patch causes card registration failure in multicodec 
configuration. When I revert the patch there is no error as below 
on Odroid boards:

-------------------8<----------------------------
[    3.059519] odroid-audio sound: multicodec <-> samsung-i2s mapping ok
[    3.060819] ------------[ cut here ]------------
[    3.065113] WARNING: CPU: 2 PID: 92 at sound/core/pcm_lib.c:2446 snd_pcm_add_chmap_ctls+0x158/0x180
[    3.074019] Modules linked in:
[    3.083838] CPU: 2 PID: 92 Comm: kworker/2:1 Not tainted 5.0.0-rc3-next-20190122-00002-gfce9abe78abf #162
[    3.093334] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[    3.099424] Workqueue: events deferred_probe_work_func
[    3.104557] [<c0111ad4>] (unwind_backtrace) from [<c010d974>] (show_stack+0x10/0x14)
[    3.112275] [<c010d974>] (show_stack) from [<c09f51c4>] (dump_stack+0x90/0xc8)
[    3.119472] [<c09f51c4>] (dump_stack) from [<c0125a1c>] (__warn+0xf8/0x124)
[    3.126412] [<c0125a1c>] (__warn) from [<c0125a88>] (warn_slowpath_null+0x40/0x48)
[    3.133960] [<c0125a88>] (warn_slowpath_null) from [<c0741e1c>] (snd_pcm_add_chmap_ctls+0x158/0x180)
[    3.143083] [<c0741e1c>] (snd_pcm_add_chmap_ctls) from [<c0760ed8>] (hdmi_codec_pcm_new+0xb4/0x150)
[    3.152113] [<c0760ed8>] (hdmi_codec_pcm_new) from [<c07480d8>] (soc_link_dai_pcm_new+0x4c/0x84)
[    3.160873] [<c07480d8>] (soc_link_dai_pcm_new) from [<c074c0d0>] (snd_soc_instantiate_card+0xbbc/0xc78)
[    3.170329] [<c074c0d0>] (snd_soc_instantiate_card) from [<c074c2f0>] (snd_soc_register_card+0x164/0x19c)
[    3.179886] [<c074c2f0>] (snd_soc_register_card) from [<c075b1a8>] (devm_snd_soc_register_card+0x34/0x70)
[    3.189430] [<c075b1a8>] (devm_snd_soc_register_card) from [<c076e128>] (odroid_audio_probe+0x170/0x200)
[    3.198888] [<c076e128>] (odroid_audio_probe) from [<c05517c4>] (platform_drv_probe+0x48/0x98)
[    3.207481] [<c05517c4>] (platform_drv_probe) from [<c054f348>] (really_probe+0x224/0x3f4)
[    3.215724] [<c054f348>] (really_probe) from [<c054f76c>] (driver_probe_device+0x70/0x1c4)
[    3.223984] [<c054f76c>] (driver_probe_device) from [<c054d51c>] (bus_for_each_drv+0x44/0x8c)
[    3.232477] [<c054d51c>] (bus_for_each_drv) from [<c054f604>] (__device_attach+0xa0/0x138)
[    3.240722] [<c054f604>] (__device_attach) from [<c054e47c>] (bus_probe_device+0x88/0x90)
[    3.248882] [<c054e47c>] (bus_probe_device) from [<c054e9f4>] (deferred_probe_work_func+0x6c/0xbc)
[    3.257830] [<c054e9f4>] (deferred_probe_work_func) from [<c0144254>] (process_one_work+0x200/0x738)
[    3.266938] [<c0144254>] (process_one_work) from [<c01447f0>] (worker_thread+0x2c/0x4c8)
[    3.275014] [<c01447f0>] (worker_thread) from [<c014af94>] (kthread+0x128/0x164)
[    3.275025] [<c014af94>] (kthread) from [<c01010b4>] (ret_from_fork+0x14/0x20)
[    3.290546] Exception stack(0xee2a9fb0 to 0xee2a9ff8)
[    3.304866] 9fa0:                                     00000000 00000000 00000000 00000000
[    3.304873] 9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[    3.304879] 9fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[    3.304973] irq event stamp: 10295
[    3.313685] hardirqs last  enabled at (10313): [<c0101a8c>] __irq_svc+0x8c/0xb0
[    3.351230] hardirqs last disabled at (10360): [<c018bb30>] console_unlock+0xc0/0x700
[    3.359077] softirqs last  enabled at (10376): [<c0102564>] __do_softirq+0x3a4/0x66c
[    3.366806] softirqs last disabled at (10387): [<c012d7c4>] irq_exit+0x140/0x168
[    3.374169] ---[ end trace 61e0cb0fbe08773c ]---
[    3.378743] hdmi-audio-codec hdmi-audio-codec.0.auto: ASoC: Failed to bind i2s-hifi with pcm device
[    3.387801] odroid-audio sound: ASoC: failed to instantiate card -16
[    3.396693] odroid-audio sound: snd_soc_register_card() failed: -16
[    3.400432] odroid-audio: probe of sound failed with error -16

[    3.537534] ALSA device list:
[    3.538439]   No soundcards found.
-------------------8<----------------------------

-- 
Regards,
Sylwester

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-22 15:43   ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Sylwester Nawrocki
@ 2019-01-22 17:39     ` Mark Brown
  2019-01-24  2:55       ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2019-01-22 17:39 UTC (permalink / raw)
  To: Sylwester Nawrocki; +Cc: Linux-ALSA, Kuninori Morimoto, Marek Szyprowski


[-- Attachment #1.1: Type: text/plain, Size: 269 bytes --]

On Tue, Jan 22, 2019 at 04:43:08PM +0100, Sylwester Nawrocki wrote:

> It seems this patch causes card registration failure in multicodec 
> configuration. When I revert the patch there is no error as below 
> on Odroid boards:

OK, I'll drop the patch for now.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree
  2019-01-22  2:10     ` Kuninori Morimoto
@ 2019-01-22 20:36       ` Mark Brown
  2019-01-24  2:14         ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Mark Brown @ 2019-01-22 20:36 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA


[-- Attachment #1.1: Type: text/plain, Size: 1045 bytes --]

On Tue, Jan 22, 2019 at 11:10:09AM +0900, Kuninori Morimoto wrote:

>    I think "platform" settings is not mandatory in this case.
>    So we can allow "no platform" in modern style.
>    But what do you think ?

Yes, I think that's fine especially when you start looking at things
like CODEC<->CODEC links.

> 2) On legacy style, if sound card dirver doesn't indicate specific "platform",
>    then, "snd-soc-dummy" platform will be selected automatically.
>    It is implemented on snd_soc_init_platform() today.
>    In modern style, we can force to indicate necessary platform,
>    or, not allow implicit snd-soc-dummy platform selection.
>    But what do you think ?

IIRC the goal with dummy was twofold.  One was to avoid having to list
dummy in things like DT bindings where we don't want platform specifics
(but I'm sure we could arrange something there).  The other was to
ensure that we always have something there so we don't need to test for
platform operations being there outside of init which again we could
deal with I think.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree
  2019-01-22 20:36       ` Mark Brown
@ 2019-01-24  2:14         ` Kuninori Morimoto
  0 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-24  2:14 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA


Hi Mark

> >    I think "platform" settings is not mandatory in this case.
> >    So we can allow "no platform" in modern style.
> >    But what do you think ?
> 
> Yes, I think that's fine especially when you start looking at things
> like CODEC<->CODEC links.

Yeah, indeed.
I will investigate it

> > 2) On legacy style, if sound card dirver doesn't indicate specific "platform",
> >    then, "snd-soc-dummy" platform will be selected automatically.
> >    It is implemented on snd_soc_init_platform() today.
> >    In modern style, we can force to indicate necessary platform,
> >    or, not allow implicit snd-soc-dummy platform selection.
> >    But what do you think ?
> 
> IIRC the goal with dummy was twofold.  One was to avoid having to list
> dummy in things like DT bindings where we don't want platform specifics
> (but I'm sure we could arrange something there).  The other was to
> ensure that we always have something there so we don't need to test for
> platform operations being there outside of init which again we could
> deal with I think.

Thanks.
Current implementation is that all CPU/Codec/Platform are
listed component, and it is selected via dai_link settings, I think.
So, maybe above concerns are no longer needed.
But, I want to investigate more.

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-22 17:39     ` Mark Brown
@ 2019-01-24  2:55       ` Kuninori Morimoto
  2019-01-24  9:48         ` Sylwester Nawrocki
  0 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-24  2:55 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Sylwester Nawrocki, Marek Szyprowski


Hi Sylwester

> > It seems this patch causes card registration failure in multicodec 
> > configuration. When I revert the patch there is no error as below 
> > on Odroid boards:
> 
> OK, I'll drop the patch for now.

Thank you for pointing it.

I hope attached v2 patch works for you.
It is based on latest Mark branch.
Can you test it ? If it was OK, I will re-post it.

-------------------
>From df48c643ee08516c0f709fea468ae74ea5270618 Mon Sep 17 00:00:00 2001
From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Date: Thu, 24 Jan 2019 11:24:05 +0900
Subject: [PATCH] ASoC: soc-core: use for_each_link_codecs() for dai_link
 codecs V2

We can use for_each_link_codecs() without waiting
for_each_rtd_codec_dai() on soc_bind_dai_link().
Let's use for_each macro

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/soc-core.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 8a58fa8..93efab4 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -870,7 +870,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	struct snd_soc_dai_link *dai_link)
 {
 	struct snd_soc_pcm_runtime *rtd;
-	struct snd_soc_dai_link_component *codecs = dai_link->codecs;
+	struct snd_soc_dai_link_component *codecs;
 	struct snd_soc_dai_link_component cpu_dai_component;
 	struct snd_soc_component *component;
 	struct snd_soc_dai **codec_dais;
@@ -905,13 +905,12 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
 	rtd->num_codecs = dai_link->num_codecs;
 
 	/* Find CODEC from registered CODECs */
-	/* we can use for_each_rtd_codec_dai() after this */
 	codec_dais = rtd->codec_dais;
-	for (i = 0; i < rtd->num_codecs; i++) {
-		codec_dais[i] = snd_soc_find_dai(&codecs[i]);
+	for_each_link_codecs(dai_link, i, codecs) {
+		codec_dais[i] = snd_soc_find_dai(codecs);
 		if (!codec_dais[i]) {
 			dev_info(card->dev, "ASoC: CODEC DAI %s not registered\n",
-				 codecs[i].dai_name);
+				 codecs->dai_name);
 			goto _err_defer;
 		}
 		snd_soc_rtdcom_add(rtd, codec_dais[i]->component);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-24  2:55       ` Kuninori Morimoto
@ 2019-01-24  9:48         ` Sylwester Nawrocki
  2019-01-28  1:05           ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Sylwester Nawrocki @ 2019-01-24  9:48 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Mark Brown, Marek Szyprowski

Hi Morimoto-san,

On 1/24/19 03:55, Kuninori Morimoto wrote:
> 
> Thank you for pointing it.
> 
> I hope attached v2 patch works for you.
> It is based on latest Mark branch.
> Can you test it ? If it was OK, I will re-post it.

Thank you, with that patch everything seems fine on Odroid boards
now. You can add my 

Tested-by: Sylwester Nawrocki <s.nawrocki@samsung.com>

-- 
Regards,
Sylwester

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs
  2019-01-24  9:48         ` Sylwester Nawrocki
@ 2019-01-28  1:05           ` Kuninori Morimoto
  0 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2019-01-28  1:05 UTC (permalink / raw)
  To: Sylwester Nawrocki; +Cc: Linux-ALSA, Mark Brown, Marek Szyprowski


Hi Sylwester

> > I hope attached v2 patch works for you.
> > It is based on latest Mark branch.
> > Can you test it ? If it was OK, I will re-post it.
> 
> Thank you, with that patch everything seems fine on Odroid boards
> now. You can add my 
> 
> Tested-by: Sylwester Nawrocki <s.nawrocki@samsung.com>

Thank you for testing !!
I will re-post patch, soon

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2019-01-28  1:05 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-01-21  0:32 [PATCH 0/6] ASoC: soc-core: cleanup and platform Kuninori Morimoto
2019-01-21  0:32 ` [PATCH 1/6] ASoC: soc-core: add .num_platform for dai_link Kuninori Morimoto
2019-01-21 19:20   ` Applied "ASoC: soc-core: add .num_platform for dai_link" to the asoc tree Mark Brown
2019-01-22  2:10     ` Kuninori Morimoto
2019-01-22 20:36       ` Mark Brown
2019-01-24  2:14         ` Kuninori Morimoto
2019-01-21  0:32 ` [PATCH 2/6] ASoC: soc-core: add new snd_soc_flush_all_delayed_work() Kuninori Morimoto
2019-01-21  0:32 ` [PATCH 3/6] ASoC: soc-core: merge card resources cleanup method Kuninori Morimoto
2019-01-21  0:32 ` [PATCH 4/6] ASoC: soc-core: reduce if/else nest on soc_probe_link_dais Kuninori Morimoto
2019-01-21  0:32 ` [PATCH 5/6] ASoC: soc-core: add soc_cleanup_component() Kuninori Morimoto
2019-01-21 19:20   ` Applied "ASoC: soc-core: add soc_cleanup_component()" to the asoc tree Mark Brown
2019-01-21  0:32 ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Kuninori Morimoto
2019-01-21 19:20   ` Applied "ASoC: soc-core: use for_each_link_codecs() for dai_link codecs" to the asoc tree Mark Brown
2019-01-22 15:43   ` [PATCH 6/6] ASoC: soc-core: use for_each_link_codecs() for dai_link codecs Sylwester Nawrocki
2019-01-22 17:39     ` Mark Brown
2019-01-24  2:55       ` Kuninori Morimoto
2019-01-24  9:48         ` Sylwester Nawrocki
2019-01-28  1:05           ` Kuninori Morimoto

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.