diff mbox

[1/2] ASoC: core: Add extra dapm properties for Device Tree

Message ID 15b0ecaefffcd48bb5f56fe76326d705c3467438.1423963314.git.nicoleotsuka@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Nicolin Chen Feb. 15, 2015, 1:22 a.m. UTC
The current helper functions, snd_soc_of_parse_audio_simple_widgets()
and snd_soc_of_parse_audio_routing(), set dapm_widgets and dapm_routes
without caring if they are already set by using build-in widgets and
routes in the card driver. So there could be one of them, build-in one
or Device Tree one, overrided by the other depending on which one was
assigned later.

This patch adds an extra pair of dapm_widgets and dapm_routes for DT
use only so as to prevent unexpected overriding.

Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
---
 include/sound/soc.h  |  5 +++++
 sound/soc/soc-core.c | 16 ++++++++++++----
 2 files changed, 17 insertions(+), 4 deletions(-)

Comments

Mark Brown Feb. 24, 2015, 2:47 p.m. UTC | #1
On Sat, Feb 14, 2015 at 05:22:49PM -0800, Nicolin Chen wrote:
> The current helper functions, snd_soc_of_parse_audio_simple_widgets()
> and snd_soc_of_parse_audio_routing(), set dapm_widgets and dapm_routes
> without caring if they are already set by using build-in widgets and
> routes in the card driver. So there could be one of them, build-in one
> or Device Tree one, overrided by the other depending on which one was
> assigned later.

Applied both, thanks.  This doesn't feel terribly elegant (what happens
with ACPI and with whatever else?) but it does the job and we can always
refactor it to be neater later.  Or perhaps just rename the variable
which may actually be all that's needed.
diff mbox

Patch

diff --git a/include/sound/soc.h b/include/sound/soc.h
index ac8b333..7443062 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -1068,11 +1068,16 @@  struct snd_soc_card {
 
 	/*
 	 * Card-specific routes and widgets.
+	 * Note: of_dapm_xxx for Device Tree; Otherwise for driver build-in.
 	 */
 	const struct snd_soc_dapm_widget *dapm_widgets;
 	int num_dapm_widgets;
 	const struct snd_soc_dapm_route *dapm_routes;
 	int num_dapm_routes;
+	const struct snd_soc_dapm_widget *of_dapm_widgets;
+	int num_of_dapm_widgets;
+	const struct snd_soc_dapm_route *of_dapm_routes;
+	int num_of_dapm_routes;
 	bool fully_routed;
 
 	struct work_struct deferred_resume_work;
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index c024962..2695a12 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -1486,6 +1486,10 @@  static int snd_soc_instantiate_card(struct snd_soc_card *card)
 		snd_soc_dapm_new_controls(&card->dapm, card->dapm_widgets,
 					  card->num_dapm_widgets);
 
+	if (card->of_dapm_widgets)
+		snd_soc_dapm_new_controls(&card->dapm, card->of_dapm_widgets,
+					  card->num_of_dapm_widgets);
+
 	/* initialise the sound card only once */
 	if (card->probe) {
 		ret = card->probe(card);
@@ -1541,6 +1545,10 @@  static int snd_soc_instantiate_card(struct snd_soc_card *card)
 		snd_soc_dapm_add_routes(&card->dapm, card->dapm_routes,
 					card->num_dapm_routes);
 
+	if (card->of_dapm_routes)
+		snd_soc_dapm_add_routes(&card->dapm, card->of_dapm_routes,
+					card->num_of_dapm_routes);
+
 	for (i = 0; i < card->num_links; i++) {
 		struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
 		dai_link = &card->dai_link[i];
@@ -3187,8 +3195,8 @@  int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
 		widgets[i].name = wname;
 	}
 
-	card->dapm_widgets = widgets;
-	card->num_dapm_widgets = num_widgets;
+	card->of_dapm_widgets = widgets;
+	card->num_of_dapm_widgets = num_widgets;
 
 	return 0;
 }
@@ -3272,8 +3280,8 @@  int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
 		}
 	}
 
-	card->num_dapm_routes = num_routes;
-	card->dapm_routes = routes;
+	card->num_of_dapm_routes = num_routes;
+	card->of_dapm_routes = routes;
 
 	return 0;
 }