From 678f12d55948f2dc3a5a01ce0dad8ce4ffb1c024 Mon Sep 17 00:00:00 2001 From: Hemanth Puranik Date: Tue, 13 Dec 2011 13:14:34 +0530 Subject: 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 Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/42278 Reviewed-by: Amaresh MULAGE Reviewed-by: QABUILD Reviewed-by: Kumar K M Reviewed-by: Rabin VINCENT --- sound/soc/codecs/ab5500.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) mode change 100644 => 100755 sound/soc/codecs/ab5500.c (limited to 'sound') diff --git a/sound/soc/codecs/ab5500.c b/sound/soc/codecs/ab5500.c old mode 100644 new mode 100755 index e188bcd19ae..a6c9f1e3f1e --- 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); -- cgit v1.2.3