ASoC: pandora: set divider correctly for higher bit depths
[pandora-kernel.git] / sound / soc / omap / omap3pandora.c
index 7605c37..796484d 100644 (file)
@@ -29,6 +29,7 @@
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
+#include <sound/pcm_params.h>
 
 #include <asm/mach-types.h>
 #include <plat/mcbsp.h>
@@ -49,6 +50,7 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       int divider;
        int ret;
 
        /* Set the codec system clock for DAC and ADC */
@@ -68,9 +70,30 @@ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
                return ret;
        }
 
-       ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 8);
+       divider = 8;
+       if (snd_pcm_format_physical_width(params_format(params)) > 16)
+               divider = 4;
+
+       ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, divider);
+       if (ret < 0) {
+               pr_err(PREFIX "can't set SRG clock divider to %d\n", divider);
+               return ret;
+       }
+
+       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;
+
+       /* Set McBSP clock back to internal for power saving to work */
+       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 SRG clock divider\n");
+               pr_err(PREFIX "can't set cpu system clock\n");
                return ret;
        }
 
@@ -201,6 +224,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 */