diff options
author | Jarkko Nikula <jhnikula@gmail.com> | 2011-05-20 16:52:38 +0300 |
---|---|---|
committer | Liam Girdwood <lrg@ti.com> | 2011-05-23 10:36:44 +0100 |
commit | 9fb352b18b11124ed1ddebc0d74ebbd7ba8defd7 (patch) | |
tree | eba7979bf81596d16d28fdc28fcd13a45f1650de /sound | |
parent | 508b76864c18f34f8d6ba08d192f5817f8dc8ead (diff) | |
download | kernel_samsung_smdk4412-9fb352b18b11124ed1ddebc0d74ebbd7ba8defd7.tar.gz kernel_samsung_smdk4412-9fb352b18b11124ed1ddebc0d74ebbd7ba8defd7.tar.bz2 kernel_samsung_smdk4412-9fb352b18b11124ed1ddebc0d74ebbd7ba8defd7.zip |
ASoC: tlv320aic3x: Do soft reset to codec when going to bias off state
TLV320AIC33, TLV320AIC34 and I believe others too in this family have some
hw bugs that cause that analogue and digital VDD supplies remain leaking
up to a few mA of current after certain use cases even the hw blocks inside
codec are driven to off.
Highest leakages occur after using the bypass paths inside codec but it
is possible to get smaller leakages just by toggling mute switches in
unused audio paths (i.e. no DAPM changes) while codec is on due another
active audio path.
While some cases are able to workaroud by making sure that e.g. output mixer
switches are muted before powering down the output stage this doesn't help
all the cases.
Therefore use the software reset command to clear possible leakage currents
since that works in every cases and affects only this codec instance. Only
drawback is that now cache sync is required everytime when codec bias comes
out from bias off state, not only when supply regulators were off.
Signed-off-by: Jarkko Nikula <jhnikula@gmail.com>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/codecs/tlv320aic3x.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 9047bb173c6..789453d44ec 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c @@ -1120,6 +1120,13 @@ static int aic3x_set_power(struct snd_soc_codec *codec, int power) aic3x_init_3007(codec); codec->cache_sync = 0; } else { + /* + * Do soft reset to this codec instance in order to clear + * possible VDD leakage currents in case the supply regulators + * remain on + */ + snd_soc_write(codec, AIC3X_RESET, SOFT_RESET); + codec->cache_sync = 1; aic3x->power = 0; /* HW writes are needless when bias is off */ codec->cache_only = 1; |