summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorHenrik Segerback <henrik.xh.segerback@stericsson.com>2011-08-19 11:07:39 +0200
committerRobert Marklund <robert.marklund@stericsson.com>2011-10-05 12:57:11 +0200
commitfddbcff28b5e6248e2ea28072625a916b95c7ab7 (patch)
treea594ea3d9a9753292097f1f320a3ef85a7ff8736 /sound
parent679bd5e8cab4eef31d1416caa212d3c43a80d4ae (diff)
Ux500 ASoC: Activate gpio.1 clock during playback
During burst mode, the DSP accesses the GPIO block to configure sleep mode before and after DSP sleeps. To allow this, the GPIO block must be clocked. ST-Ericsson Linux next: NA ST-Ericsson ID: 349519 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I625c63fd506316d543e26392d1edb4912193a12c Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/29114 Reviewed-by: Kristoffer KARLSSON <kristoffer.karlsson@stericsson.com> Tested-by: Kristoffer KARLSSON <kristoffer.karlsson@stericsson.com> Reviewed-by: QABUILD Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com> Reviewed-by: QATEST Reviewed-by: Roger NILSSON1 <roger.xr.nilsson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/30802 Tested-by: Roger NILSSON1 <roger.xr.nilsson@stericsson.com> Reviewed-by: Henrik SEGERBACK <henrik.xh.segerback@stericsson.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/ux500/ux500_ab8500.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/sound/soc/ux500/ux500_ab8500.c b/sound/soc/ux500/ux500_ab8500.c
index be647daeeed..128820b51cd 100644
--- a/sound/soc/ux500/ux500_ab8500.c
+++ b/sound/soc/ux500/ux500_ab8500.c
@@ -56,6 +56,7 @@ static struct clk *clk_ptr_audioclk;
static struct clk *clk_ptr_intclk;
static struct clk *clk_ptr_sysclk;
static struct clk *clk_ptr_ulpclk;
+static struct clk *clk_ptr_gpio1;
/* Regulators */
static enum regulator_idx {
@@ -306,9 +307,14 @@ int ux500_ab8500_startup(struct snd_pcm_substream *substream)
return ret;
}
- return ux500_ab8500_power_control_inc();
+ /* Enable gpio.1-clock (needed by DSP in burst mode) */
+ ret = clk_enable(clk_ptr_gpio1);
+ if (ret) {
+ pr_err("%s: ERROR: clk_enable(gpio.1) failed (ret = %d)!", __func__, ret);
+ return ret;
+ }
- return ret;
+ return ux500_ab8500_power_control_inc();
}
void ux500_ab8500_shutdown(struct snd_pcm_substream *substream)
@@ -328,6 +334,7 @@ void ux500_ab8500_shutdown(struct snd_pcm_substream *substream)
disable_regulator(REGULATOR_AMIC2);
}
+ clk_disable(clk_ptr_gpio1);
ux500_ab8500_power_control_dec();
}
@@ -481,6 +488,7 @@ int ux500_ab8500_machine_codec_init(struct snd_soc_pcm_runtime *rtd)
clk_ptr_ulpclk = NULL;
clk_ptr_intclk = NULL;
clk_ptr_audioclk = NULL;
+ clk_ptr_gpio1 = NULL;
clk_ptr_sysclk = clk_get(codec->dev, "sysclk");
if (IS_ERR(clk_ptr_sysclk)) {
pr_err("ERROR: clk_get failed (ret = %d)!", -EFAULT);
@@ -501,6 +509,11 @@ int ux500_ab8500_machine_codec_init(struct snd_soc_pcm_runtime *rtd)
pr_err("ERROR: clk_get failed (ret = %d)!", -EFAULT);
return -EFAULT;
}
+ clk_ptr_gpio1 = clk_get_sys("gpio.1", NULL);
+ if (IS_ERR(clk_ptr_gpio1)) {
+ pr_err("ERROR: clk_get_sys(gpio.1) failed (ret = %d)!", -EFAULT);
+ return -EFAULT;
+ }
/* Set intclk default parent to ulpclk */
ret = clk_set_parent(clk_ptr_intclk, clk_ptr_ulpclk);
@@ -548,6 +561,8 @@ void ux500_ab8500_soc_machine_drv_cleanup(void)
clk_put(clk_ptr_intclk);
if (clk_ptr_audioclk != NULL)
clk_put(clk_ptr_audioclk);
+ if (clk_ptr_gpio1 != NULL)
+ clk_put(clk_ptr_gpio1);
}
/* Extended interface */