ASoC: nau8825: reduce standby power consumption
authorJohn Hsu <KCHSU0@nuvoton.com>
Tue, 22 Mar 2016 03:57:05 +0000 (11:57 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 30 May 2016 15:17:44 +0000 (16:17 +0100)
Decrease internal clock frequency for power saving when standby.
But clock divider needs restore when MCLK as system clock in playback.

Signed-off-by: John Hsu <KCHSU0@nuvoton.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/nau8825.c

index cb08a358b2a32d5e68d149f4107e0c59fe6207f7..1269fbbb2bac6d4ef0a863d0f981be6f7be365b5 100644 (file)
@@ -1132,6 +1132,9 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
                regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
                        NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_MCLK);
                regmap_update_bits(regmap, NAU8825_REG_FLL6, NAU8825_DCO_EN, 0);
+               /* MCLK not changed by clock tree */
+               regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
+                       NAU8825_CLK_MCLK_SRC_MASK, 0);
                ret = nau8825_mclk_prepare(nau8825, freq);
                if (ret)
                        return ret;
@@ -1142,6 +1145,13 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
                        NAU8825_DCO_EN);
                regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
                        NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_VCO);
+               /* Decrease the VCO frequency for power saving */
+               regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
+                       NAU8825_CLK_MCLK_SRC_MASK, 0xf);
+               regmap_update_bits(regmap, NAU8825_REG_FLL1,
+                       NAU8825_FLL_RATIO_MASK, 0x10);
+               regmap_update_bits(regmap, NAU8825_REG_FLL6,
+                       NAU8825_SDM_EN, NAU8825_SDM_EN);
                if (nau8825->mclk_freq) {
                        clk_disable_unprepare(nau8825->mclk);
                        nau8825->mclk_freq = 0;