aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/soc-dapm.c
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2012-09-07 00:57:11 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2012-09-26 07:29:59 -0400
commitc05b84d14b230a96e3f782c9d87ab18d82df8bd2 (patch)
tree8eeac5a8e43a35f399402b9ee84b7e39a31f6d60 /sound/soc/soc-dapm.c
parent8f6862d4bd6a7f936273d94ba58a25946365eac9 (diff)
ASoC: dapm: Allow regulators to bypass as well as disable when idle
Allow regulators managed via DAPM to make use of the bypass support that has recently been added to the regulator API by setting a flag SND_SOC_DAPM_REGULATOR_BYPASS. When this flag is set the regulator will be put into bypass mode before being disabled, allowing the regulator to fall into bypass mode if it can't be disabled due to other users. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/soc-dapm.c')
-rw-r--r--sound/soc/soc-dapm.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 873e6e76ee87..d0a4be38dc0f 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -1017,10 +1017,29 @@ EXPORT_SYMBOL_GPL(dapm_reg_event);
1017int dapm_regulator_event(struct snd_soc_dapm_widget *w, 1017int dapm_regulator_event(struct snd_soc_dapm_widget *w,
1018 struct snd_kcontrol *kcontrol, int event) 1018 struct snd_kcontrol *kcontrol, int event)
1019{ 1019{
1020 if (SND_SOC_DAPM_EVENT_ON(event)) 1020 int ret;
1021
1022 if (SND_SOC_DAPM_EVENT_ON(event)) {
1023 if (w->invert & SND_SOC_DAPM_REGULATOR_BYPASS) {
1024 ret = regulator_allow_bypass(w->regulator, true);
1025 if (ret != 0)
1026 dev_warn(w->dapm->dev,
1027 "Failed to bypass %s: %d\n",
1028 w->name, ret);
1029 }
1030
1021 return regulator_enable(w->regulator); 1031 return regulator_enable(w->regulator);
1022 else 1032 } else {
1033 if (w->invert & SND_SOC_DAPM_REGULATOR_BYPASS) {
1034 ret = regulator_allow_bypass(w->regulator, false);
1035 if (ret != 0)
1036 dev_warn(w->dapm->dev,
1037 "Failed to unbypass %s: %d\n",
1038 w->name, ret);
1039 }
1040
1023 return regulator_disable_deferred(w->regulator, w->shift); 1041 return regulator_disable_deferred(w->regulator, w->shift);
1042 }
1024} 1043}
1025EXPORT_SYMBOL_GPL(dapm_regulator_event); 1044EXPORT_SYMBOL_GPL(dapm_regulator_event);
1026 1045