ASoC: Only do WM8994 bias off transition from standby

Otherwise we may try to power down multiple times when the using
idle bias off and the driver is removed.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
This commit is contained in:
Mark Brown 2010-03-30 14:29:14 +01:00
parent 4dcc93d0ed
commit d522ffbfb9

View File

@ -3007,34 +3007,39 @@ static int wm8994_set_bias_level(struct snd_soc_codec *codec,
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
/* Switch over to startup biases */ if (codec->bias_level == SND_SOC_BIAS_STANDBY) {
snd_soc_update_bits(codec, WM8994_ANTIPOP_2, /* Switch over to startup biases */
WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
WM8994_VMID_BUF_ENA | WM8994_BIAS_SRC |
WM8994_VMID_RAMP_MASK, WM8994_STARTUP_BIAS_ENA |
WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA | WM8994_VMID_BUF_ENA |
WM8994_VMID_BUF_ENA | WM8994_VMID_RAMP_MASK,
(1 << WM8994_VMID_RAMP_SHIFT)); WM8994_BIAS_SRC |
WM8994_STARTUP_BIAS_ENA |
WM8994_VMID_BUF_ENA |
(1 << WM8994_VMID_RAMP_SHIFT));
/* Disable main biases */ /* Disable main biases */
snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1, snd_soc_update_bits(codec, WM8994_POWER_MANAGEMENT_1,
WM8994_BIAS_ENA | WM8994_VMID_SEL_MASK, 0); WM8994_BIAS_ENA |
WM8994_VMID_SEL_MASK, 0);
/* Discharge line */ /* Discharge line */
snd_soc_update_bits(codec, WM8994_ANTIPOP_1, snd_soc_update_bits(codec, WM8994_ANTIPOP_1,
WM8994_LINEOUT1_DISCH | WM8994_LINEOUT1_DISCH |
WM8994_LINEOUT2_DISCH, WM8994_LINEOUT2_DISCH,
WM8994_LINEOUT1_DISCH | WM8994_LINEOUT1_DISCH |
WM8994_LINEOUT2_DISCH); WM8994_LINEOUT2_DISCH);
msleep(5); msleep(5);
/* Switch off startup biases */
snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
WM8994_BIAS_SRC | WM8994_STARTUP_BIAS_ENA |
WM8994_VMID_BUF_ENA |
WM8994_VMID_RAMP_MASK, 0);
/* Switch off startup biases */
snd_soc_update_bits(codec, WM8994_ANTIPOP_2,
WM8994_BIAS_SRC |
WM8994_STARTUP_BIAS_ENA |
WM8994_VMID_BUF_ENA |
WM8994_VMID_RAMP_MASK, 0);
}
break; break;
} }
codec->bias_level = level; codec->bias_level = level;