summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
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 805c26448d3..a58bb7ea62f 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 */
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);
@@ -550,6 +563,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 */