[alsa-devel] [PATCH] ASoC: pandora: switch clock back to internal on stop
Grazvydas Ignotas
notasas at gmail.com
Sat Feb 18 23:39:55 CET 2012
For some reason, OMAP doesn't enter lower power states with functional
clock (CLKS) source set to external, so switch it back to internal when
done playing.
Signed-off-by: Grazvydas Ignotas <notasas at gmail.com>
---
sound/soc/omap/omap3pandora.c | 22 ++++++++++++++++++++++
1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/sound/soc/omap/omap3pandora.c b/sound/soc/omap/omap3pandora.c
index 07794bd..1be26df 100644
--- a/sound/soc/omap/omap3pandora.c
+++ b/sound/soc/omap/omap3pandora.c
@@ -77,6 +77,27 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
return 0;
}
+static int omap3pandora_hw_free(struct snd_pcm_substream *substream)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+ int ret;
+
+ /*
+ * For some reason, if we don't set clock back to internal, OMAP power
+ * saving features don't work properly (per power domain doesn't enter
+ * lower power states). Switch it back until better solution is found.
+ */
+ ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_FCLK,
+ 0, SND_SOC_CLOCK_IN);
+ if (ret < 0) {
+ pr_err(PREFIX "can't set cpu system clock\n");
+ return ret;
+ }
+
+ return 0;
+}
+
static int omap3pandora_dac_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *k, int event)
{
@@ -201,6 +222,7 @@ static int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd)
static struct snd_soc_ops omap3pandora_ops = {
.hw_params = omap3pandora_hw_params,
+ .hw_free = omap3pandora_hw_free,
};
/* Digital audio interface glue - connects codec <--> CPU */
--
1.7.0.4
More information about the Alsa-devel
mailing list