aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorEric Nelson <eric@nelint.com>2016-06-06 19:14:52 -0400
committerMark Brown <broonie@kernel.org>2016-06-15 09:09:30 -0400
commit8419caa7270291e26f8b34b12b29680586c85d30 (patch)
treef636a0dca303de3b016e6afbf5a54edf4981fa7c /sound
parent08dea16e0960ea5caf7876045b747145cb677096 (diff)
ASoC: sgtl5000: Do not disable regulators in SND_SOC_BIAS_OFF
Disabling the SGTL5000 through regulators would certainly save more power than simply disabling the reference voltages as described in the data sheet, but won't properly restore things on resume. This driver does not support active regulators. So we simply disable the reference bias currents. Signed-off-by: Eric Nelson <eric@nelint.com> Signed-off-by: Clemens Gruber <clemens.gruber@pqgruber.com> Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/sgtl5000.c35
1 files changed, 5 insertions, 30 deletions
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c
index 0916bb46ccf2..39a178a88b36 100644
--- a/sound/soc/codecs/sgtl5000.c
+++ b/sound/soc/codecs/sgtl5000.c
@@ -761,42 +761,17 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
761static int sgtl5000_set_bias_level(struct snd_soc_codec *codec, 761static int sgtl5000_set_bias_level(struct snd_soc_codec *codec,
762 enum snd_soc_bias_level level) 762 enum snd_soc_bias_level level)
763{ 763{
764 int ret;
765 struct sgtl5000_priv *sgtl5000 = snd_soc_codec_get_drvdata(codec);
766
767 switch (level) { 764 switch (level) {
768 case SND_SOC_BIAS_ON: 765 case SND_SOC_BIAS_ON:
769 case SND_SOC_BIAS_PREPARE: 766 case SND_SOC_BIAS_PREPARE:
770 break;
771 case SND_SOC_BIAS_STANDBY: 767 case SND_SOC_BIAS_STANDBY:
772 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { 768 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
773 ret = regulator_bulk_enable( 769 SGTL5000_REFTOP_POWERUP,
774 sgtl5000->num_supplies, 770 SGTL5000_REFTOP_POWERUP);
775 sgtl5000->supplies);
776 if (ret)
777 return ret;
778 udelay(10);
779
780 regcache_cache_only(sgtl5000->regmap, false);
781
782 ret = regcache_sync(sgtl5000->regmap);
783 if (ret != 0) {
784 dev_err(codec->dev,
785 "Failed to restore cache: %d\n", ret);
786
787 regcache_cache_only(sgtl5000->regmap, true);
788 regulator_bulk_disable(sgtl5000->num_supplies,
789 sgtl5000->supplies);
790
791 return ret;
792 }
793 }
794
795 break; 771 break;
796 case SND_SOC_BIAS_OFF: 772 case SND_SOC_BIAS_OFF:
797 regcache_cache_only(sgtl5000->regmap, true); 773 snd_soc_update_bits(codec, SGTL5000_CHIP_ANA_POWER,
798 regulator_bulk_disable(sgtl5000->num_supplies, 774 SGTL5000_REFTOP_POWERUP, 0);
799 sgtl5000->supplies);
800 break; 775 break;
801 } 776 }
802 777