summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorHemanth Puranik <hemanth.puranik@stericsson.com>2011-12-13 13:14:34 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:05:03 +0200
commit678f12d55948f2dc3a5a01ce0dad8ce4ffb1c024 (patch)
tree7b3ac9b4fe2e5c51665f4cb420b0478cfc4dd6d3 /sound
parent8f23e308ab4676319ee5d3f054e500448dfe17db (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>
Diffstat (limited to 'sound')
-rwxr-xr-x[-rw-r--r--]sound/soc/codecs/ab5500.c20
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);