aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiam Girdwood <lrg@ti.com>2011-07-24 15:59:33 -0400
committerPaolo Pisati <paolo.pisati@canonical.com>2012-08-17 04:18:19 -0400
commit0d09d165cbcd2de57df52ceea46b3151f1d9ebbb (patch)
tree4f3ab3571de0bebce413bdf126077f1465273729
parent2e6c3d203e9bae344834bdb7609ccf37c1a97089 (diff)
Subject: [PATCH 036/104] ASoC: core - platform widget IO
Allow platform driver widgets to perform any IO required via DAPM. Signed-off-by: Liam Girdwood <lrg@ti.com>
-rw-r--r--include/sound/soc-dapm.h2
-rw-r--r--include/sound/soc.h2
-rw-r--r--sound/soc/soc-core.c3
-rw-r--r--sound/soc/soc-dapm.c13
4 files changed, 18 insertions, 2 deletions
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index 602024d4c45..e09505c5a49 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -447,6 +447,7 @@ struct snd_soc_dapm_widget {
447 char *name; /* widget name */ 447 char *name; /* widget name */
448 char *sname; /* stream name */ 448 char *sname; /* stream name */
449 struct snd_soc_codec *codec; 449 struct snd_soc_codec *codec;
450 struct snd_soc_platform *platform;
450 struct list_head list; 451 struct list_head list;
451 struct snd_soc_dapm_context *dapm; 452 struct snd_soc_dapm_context *dapm;
452 453
@@ -510,6 +511,7 @@ struct snd_soc_dapm_context {
510 511
511 struct device *dev; /* from parent - for debug */ 512 struct device *dev; /* from parent - for debug */
512 struct snd_soc_codec *codec; /* parent codec */ 513 struct snd_soc_codec *codec; /* parent codec */
514 struct snd_soc_platform *platform; /* parent platform */
513 struct snd_soc_card *card; /* parent card */ 515 struct snd_soc_card *card; /* parent card */
514 516
515 /* used during DAPM updates */ 517 /* used during DAPM updates */
diff --git a/include/sound/soc.h b/include/sound/soc.h
index c421501532d..6ce8dc32a3d 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -682,6 +682,8 @@ struct snd_soc_platform {
682 struct snd_soc_card *card; 682 struct snd_soc_card *card;
683 struct list_head list; 683 struct list_head list;
684 struct list_head card_list; 684 struct list_head card_list;
685
686 struct snd_soc_dapm_context dapm;
685}; 687};
686 688
687struct snd_soc_dai_link { 689struct snd_soc_dai_link {
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 3c1a8965721..52888b5e91d 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -995,6 +995,7 @@ static int soc_probe_platform(struct snd_soc_card *card,
995 const struct snd_soc_platform_driver *driver = platform->driver; 995 const struct snd_soc_platform_driver *driver = platform->driver;
996 996
997 platform->card = card; 997 platform->card = card;
998 platform->dapm.card = card;
998 999
999 if (!try_module_get(platform->dev->driver->owner)) 1000 if (!try_module_get(platform->dev->driver->owner))
1000 return -ENODEV; 1001 return -ENODEV;
@@ -3138,6 +3139,8 @@ int snd_soc_register_platform(struct device *dev,
3138 3139
3139 platform->dev = dev; 3140 platform->dev = dev;
3140 platform->driver = platform_drv; 3141 platform->driver = platform_drv;
3142 platform->dapm.dev = dev;
3143 platform->dapm.platform = platform;
3141 3144
3142 mutex_lock(&client_mutex); 3145 mutex_lock(&client_mutex);
3143 list_add(&platform->list, &platform_list); 3146 list_add(&platform->list, &platform_list);
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 79fdcd7cfd8..13f4bdea936 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -130,14 +130,22 @@ static int soc_widget_read(struct snd_soc_dapm_widget *w, int reg)
130{ 130{
131 if (w->codec) 131 if (w->codec)
132 return snd_soc_read(w->codec, reg); 132 return snd_soc_read(w->codec, reg);
133 return 0; 133 else if (w->platform)
134 return snd_soc_platform_read(w->platform, reg);
135
136 dev_err(w->dapm->dev, "no valid widget read method\n");
137 return -1;
134} 138}
135 139
136static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val) 140static int soc_widget_write(struct snd_soc_dapm_widget *w, int reg, int val)
137{ 141{
138 if (w->codec) 142 if (w->codec)
139 return snd_soc_write(w->codec, reg, val); 143 return snd_soc_write(w->codec, reg, val);
140 return 0; 144 else if (w->platform)
145 return snd_soc_platform_write(w->platform, reg, val);
146
147 dev_err(w->dapm->dev, "no valid widget write method\n");
148 return -1;
141} 149}
142 150
143static int soc_widget_update_bits(struct snd_soc_dapm_widget *w, 151static int soc_widget_update_bits(struct snd_soc_dapm_widget *w,
@@ -2497,6 +2505,7 @@ int snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
2497 dapm->n_widgets++; 2505 dapm->n_widgets++;
2498 w->dapm = dapm; 2506 w->dapm = dapm;
2499 w->codec = dapm->codec; 2507 w->codec = dapm->codec;
2508 w->platform = dapm->platform;
2500 INIT_LIST_HEAD(&w->sources); 2509 INIT_LIST_HEAD(&w->sources);
2501 INIT_LIST_HEAD(&w->sinks); 2510 INIT_LIST_HEAD(&w->sinks);
2502 INIT_LIST_HEAD(&w->list); 2511 INIT_LIST_HEAD(&w->list);