| From 7679e42ec833ed70aa34790a5f39dcb7e5bda4fe Mon Sep 17 00:00:00 2001 |
| From: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| Date: Wed, 22 Feb 2012 15:52:56 +0000 |
| Subject: ASoC: dapm: Check for bias level when powering down |
| |
| From: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| |
| commit 7679e42ec833ed70aa34790a5f39dcb7e5bda4fe upstream. |
| |
| Recent enhancements in the bias management means that we might not be |
| in standby when the CODEC is idle and can have active widgets without |
| being in full power mode but the shutdown functionality assumes these |
| things. Add checks for the bias level at each stage so that we don't |
| do transitions other than the ON->PREPARE->STANDBY->OFF ones that the |
| drivers are expecting. |
| |
| Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/soc-dapm.c | 12 +++++++++--- |
| 1 file changed, 9 insertions(+), 3 deletions(-) |
| |
| --- a/sound/soc/soc-dapm.c |
| +++ b/sound/soc/soc-dapm.c |
| @@ -2982,9 +2982,13 @@ static void soc_dapm_shutdown_codec(stru |
| * standby. |
| */ |
| if (powerdown) { |
| - snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_PREPARE); |
| + if (dapm->bias_level == SND_SOC_BIAS_ON) |
| + snd_soc_dapm_set_bias_level(dapm, |
| + SND_SOC_BIAS_PREPARE); |
| dapm_seq_run(dapm, &down_list, 0, false); |
| - snd_soc_dapm_set_bias_level(dapm, SND_SOC_BIAS_STANDBY); |
| + if (dapm->bias_level == SND_SOC_BIAS_PREPARE) |
| + snd_soc_dapm_set_bias_level(dapm, |
| + SND_SOC_BIAS_STANDBY); |
| } |
| } |
| |
| @@ -2997,7 +3001,9 @@ void snd_soc_dapm_shutdown(struct snd_so |
| |
| list_for_each_entry(codec, &card->codec_dev_list, list) { |
| soc_dapm_shutdown_codec(&codec->dapm); |
| - snd_soc_dapm_set_bias_level(&codec->dapm, SND_SOC_BIAS_OFF); |
| + if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) |
| + snd_soc_dapm_set_bias_level(&codec->dapm, |
| + SND_SOC_BIAS_OFF); |
| } |
| } |
| |