ASoC: pandora: fix CLKX polarity
[pandora-kernel.git] / sound / soc / pxa / raumfeld.c
index acfce1c..7e3f416 100644 (file)
@@ -41,7 +41,9 @@ static struct i2c_board_info max9486_hwmon_info = {
 };
 
 #define MAX9485_MCLK_FREQ_112896 0x22
-#define        MAX9485_MCLK_FREQ_122880 0x23
+#define MAX9485_MCLK_FREQ_122880 0x23
+#define MAX9485_MCLK_FREQ_225792 0x32
+#define MAX9485_MCLK_FREQ_245760 0x33
 
 static void set_max9485_clk(char clk)
 {
@@ -71,9 +73,17 @@ static int raumfeld_cs4270_startup(struct snd_pcm_substream *substream)
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
 
-       set_max9485_clk(MAX9485_MCLK_FREQ_112896);
+       /* set freq to 0 to enable all possible codec sample rates */
+       return snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0);
+}
 
-       return snd_soc_dai_set_sysclk(codec_dai, 0, 11289600, 0);
+static void raumfeld_cs4270_shutdown(struct snd_pcm_substream *substream)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
+
+       /* set freq to 0 to enable all possible codec sample rates */
+       snd_soc_dai_set_sysclk(codec_dai, 0, 0, 0);
 }
 
 static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream,
@@ -86,20 +96,24 @@ static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream,
        int ret = 0;
 
        switch (params_rate(params)) {
-       case 8000:
-       case 16000:
+       case 44100:
+               set_max9485_clk(MAX9485_MCLK_FREQ_112896);
+               clk = 11289600;
+               break;
        case 48000:
-       case 96000:
                set_max9485_clk(MAX9485_MCLK_FREQ_122880);
                clk = 12288000;
                break;
-       case 11025:
-       case 22050:
-       case 44100:
        case 88200:
-               set_max9485_clk(MAX9485_MCLK_FREQ_112896);
-               clk = 11289600;
+               set_max9485_clk(MAX9485_MCLK_FREQ_225792);
+               clk = 22579200;
                break;
+       case 96000:
+               set_max9485_clk(MAX9485_MCLK_FREQ_245760);
+               clk = 24576000;
+               break;
+       default:
+               return -EINVAL;
        }
 
        fmt = SND_SOC_DAIFMT_I2S |
@@ -128,7 +142,7 @@ static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream,
        if (ret < 0)
                return ret;
 
-       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_EXT, 0, 1);
+       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_EXT, clk, 1);
        if (ret < 0)
                return ret;
 
@@ -137,6 +151,7 @@ static int raumfeld_cs4270_hw_params(struct snd_pcm_substream *substream,
 
 static struct snd_soc_ops raumfeld_cs4270_ops = {
        .startup = raumfeld_cs4270_startup,
+       .shutdown = raumfeld_cs4270_shutdown,
        .hw_params = raumfeld_cs4270_hw_params,
 };
 
@@ -181,20 +196,24 @@ static int raumfeld_ak4104_hw_params(struct snd_pcm_substream *substream,
        int fmt, ret = 0, clk = 0;
 
        switch (params_rate(params)) {
-       case 8000:
-       case 16000:
+       case 44100:
+               set_max9485_clk(MAX9485_MCLK_FREQ_112896);
+               clk = 11289600;
+               break;
        case 48000:
-       case 96000:
                set_max9485_clk(MAX9485_MCLK_FREQ_122880);
                clk = 12288000;
                break;
-       case 11025:
-       case 22050:
-       case 44100:
        case 88200:
-               set_max9485_clk(MAX9485_MCLK_FREQ_112896);
-               clk = 11289600;
+               set_max9485_clk(MAX9485_MCLK_FREQ_225792);
+               clk = 22579200;
+               break;
+       case 96000:
+               set_max9485_clk(MAX9485_MCLK_FREQ_245760);
+               clk = 24576000;
                break;
+       default:
+               return -EINVAL;
        }
 
        fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF;
@@ -217,7 +236,7 @@ static int raumfeld_ak4104_hw_params(struct snd_pcm_substream *substream,
        if (ret < 0)
                return ret;
 
-       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_EXT, 0, 1);
+       ret = snd_soc_dai_set_sysclk(cpu_dai, PXA_SSP_CLK_EXT, clk, 1);
        if (ret < 0)
                return ret;