summaryrefslogtreecommitdiff
path: root/sound/soc
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2011-04-06 11:38:14 +0900
committerMark Brown <broonie@opensource.wolfsonmicro.com>2011-04-09 11:25:20 +0900
commit0d86733cce776ca0262b850ee8eb46bc52dc8244 (patch)
treee0bac583719dd5f37e7c1199cae81b077aeb6a59 /sound/soc
parent52ba67bf85889828b3766207fa43ce7159c84c78 (diff)
ASoC: Allow DAPM pin operations to match any context
The DAPM pin operations currently require that the specific DAPM context that the pin being operated in is contained in be specified. With multi component and especially with the addition of a per-card DAPM context this isn't ideal as it means that things like disabling unused pins on CODECs require looking up the CODEC DAPM context. Fix this by falling back to matching a widget in any context if there isn't a match in the current context. The code isn't ideal currently but will do the job. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/soc-dapm.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 68879209b31..2ee738c08ca 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -1477,6 +1477,19 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm,
}
}
+ /* Try again in other contexts */
+ list_for_each_entry(w, &dapm->card->widgets, list) {
+ if (!strcmp(w->name, pin)) {
+ dev_dbg(w->dapm->dev, "dapm: pin %s = %d\n",
+ pin, status);
+ w->connected = status;
+ /* Allow disabling of forced pins */
+ if (status == 0)
+ w->force = 0;
+ return 0;
+ }
+ }
+
dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
return -EINVAL;
}
@@ -2317,6 +2330,17 @@ int snd_soc_dapm_force_enable_pin(struct snd_soc_dapm_context *dapm,
}
}
+ /* Try again with other contexts */
+ list_for_each_entry(w, &dapm->card->widgets, list) {
+ if (!strcmp(w->name, pin)) {
+ dev_dbg(w->dapm->dev,
+ "dapm: force enable pin %s\n", pin);
+ w->connected = 1;
+ w->force = 1;
+ return 0;
+ }
+ }
+
dev_err(dapm->dev, "dapm: unknown pin %s\n", pin);
return -EINVAL;
}