diff options
author | Hemanth Puranik <hemanth.puranik@stericsson.com> | 2011-12-13 13:14:34 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:05:03 +0200 |
commit | 678f12d55948f2dc3a5a01ce0dad8ce4ffb1c024 (patch) | |
tree | 7b3ac9b4fe2e5c51665f4cb420b0478cfc4dd6d3 | |
parent | 8f23e308ab4676319ee5d3f054e500448dfe17db (diff) |
ASoc:Ux500 AB5500 CODEC clock always enabled
Codec clock was always enabled in probe function.
This is now removed.
Now it is enabled only when it is used.
ST-Ericsson ID: 400223
ST-Ericsson Linux next: NA
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I7547ebb1462133fdebc7dfec00c99630b74fdeaf
Signed-off-by: Hemanth Puranik <hemanth.puranik@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/42278
Reviewed-by: Amaresh MULAGE <amaresh.mulage@stericsson.com>
Reviewed-by: QABUILD
Reviewed-by: Kumar K M <kumar.km@stericsson.com>
Reviewed-by: Rabin VINCENT <rabin.vincent@stericsson.com>
-rwxr-xr-x[-rw-r--r--] | sound/soc/codecs/ab5500.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/sound/soc/codecs/ab5500.c b/sound/soc/codecs/ab5500.c index e188bcd19ae..a6c9f1e3f1e 100644..100755 --- a/sound/soc/codecs/ab5500.c +++ b/sound/soc/codecs/ab5500.c @@ -53,6 +53,9 @@ static u8 virtual_regs[] = { 0, 0, 0, 0, 0 }; +static int ab5500_clk_request; +static DEFINE_MUTEX(ab5500_clk_mutex); + #define set_reg(reg, val) mask_set_reg((reg), 0xff, (val)) static void mask_set_reg(u8 reg, u8 mask, u8 val) @@ -1237,6 +1240,11 @@ static int ab5500_pcm_prepare(struct snd_pcm_substream *substream, 0 << I2Sx_TRISTATE_SHIFT); } + mutex_lock(&ab5500_clk_mutex); + ab5500_clk_request++; + if (ab5500_clk_request == 1) + mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 1 << CLOCK_ENABLE_SHIFT); + mutex_unlock(&ab5500_clk_mutex); dump_registers(__func__, RX1, AUXO1_ADDER, RX2, AUXO2_ADDER, RX1_DPGA, RX2_DPGA, AUXO1, AUXO2, -1); @@ -1262,6 +1270,11 @@ static void ab5500_pcm_shutdown(struct snd_pcm_substream *substream, 1 << I2Sx_TRISTATE_SHIFT); mask_set_reg(iface, MASTER_GENx_PWR_MASK, 0); } + mutex_lock(&ab5500_clk_mutex); + ab5500_clk_request--; + if (ab5500_clk_request == 0) + mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 0 << CLOCK_ENABLE_SHIFT); + mutex_unlock(&ab5500_clk_mutex); } static int ab5500_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, @@ -1386,13 +1399,15 @@ static int ab5500_codec_remove(struct snd_soc_codec *codec) static int ab5500_codec_suspend(struct snd_soc_codec *codec, pm_message_t state) { - mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 0); + if (!ab5500_clk_request) + mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 0); return 0; } static int ab5500_codec_resume(struct snd_soc_codec *codec) { - mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 0xff); + if (ab5500_clk_request) + mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 0xff); return 0; } #else @@ -1611,7 +1626,6 @@ static int __devinit ab5500_platform_probe(struct platform_device *pdev) for (reg = AB5500_FIRST_REG; reg <= AB5500_LAST_REG; reg++) set_reg(reg, 0); - mask_set_reg(CLOCK, CLOCK_ENABLE_MASK, 1 << CLOCK_ENABLE_SHIFT); mask_set_reg(INTERFACE0, I2Sx_TRISTATE_MASK, 1 << I2Sx_TRISTATE_SHIFT); mask_set_reg(INTERFACE1, I2Sx_TRISTATE_MASK, 1 << I2Sx_TRISTATE_SHIFT); |