]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ASoC: da7213: Improve driver efficiency with regards to MCLK usage
authorAdam Thomson <Adam.Thomson.Opensource@diasemi.com>
Thu, 4 Aug 2016 14:35:39 +0000 (15:35 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 8 Aug 2016 10:54:40 +0000 (11:54 +0100)
Currently MCLK remains enabled during bias STANDBY state, and this
is not necessary. This patch updates the code to handle enabling
and disabling of MCLK, if provided, when moving between STANDBY
and PREPARE states, therefore saving power when no active streams
present.

Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/da7213.c

index e5527bc570ae550394807f8062092af3e8f0a6e1..f1c41fa67672ad47d5eb11ca2dd486178ee28b6c 100644 (file)
@@ -1454,11 +1454,10 @@ static int da7213_set_bias_level(struct snd_soc_codec *codec,
 
        switch (level) {
        case SND_SOC_BIAS_ON:
-       case SND_SOC_BIAS_PREPARE:
                break;
-       case SND_SOC_BIAS_STANDBY:
-               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
-                       /* MCLK */
+       case SND_SOC_BIAS_PREPARE:
+               /* Enable MCLK for transition to ON state */
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_STANDBY) {
                        if (da7213->mclk) {
                                ret = clk_prepare_enable(da7213->mclk);
                                if (ret) {
@@ -1467,21 +1466,24 @@ static int da7213_set_bias_level(struct snd_soc_codec *codec,
                                        return ret;
                                }
                        }
-
+               }
+               break;
+       case SND_SOC_BIAS_STANDBY:
+               if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
                        /* Enable VMID reference & master bias */
                        snd_soc_update_bits(codec, DA7213_REFERENCES,
                                            DA7213_VMID_EN | DA7213_BIAS_EN,
                                            DA7213_VMID_EN | DA7213_BIAS_EN);
+               } else {
+                       /* Remove MCLK */
+                       if (da7213->mclk)
+                               clk_disable_unprepare(da7213->mclk);
                }
                break;
        case SND_SOC_BIAS_OFF:
                /* Disable VMID reference & master bias */
                snd_soc_update_bits(codec, DA7213_REFERENCES,
                                    DA7213_VMID_EN | DA7213_BIAS_EN, 0);
-
-               /* MCLK */
-               if (da7213->mclk)
-                       clk_disable_unprepare(da7213->mclk);
                break;
        }
        return 0;