diff options
Diffstat (limited to 'sound/soc/ux500')
-rw-r--r-- | sound/soc/ux500/ux500_ab8500.c | 19 |
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 */ |