]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - sound/soc/davinci/davinci-evm.c
ASoC: Fix DaVinci module unload error
[linux-2.6-omap-h63xx.git] / sound / soc / davinci / davinci-evm.c
index 5c041bf05f31c0d80e93850b148921c2d5b62d79..9b90b347007cf400128bbceac8edbf3eaadac1e8 100644 (file)
@@ -26,8 +26,9 @@
 #include "davinci-pcm.h"
 #include "davinci-i2s.h"
 
-#define EVM_CODEC_CLOCK 22579200
 
+#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_B | \
+               SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
 static int evm_hw_params(struct snd_pcm_substream *substream,
                         struct snd_pcm_hw_params *params)
 {
@@ -35,24 +36,34 @@ static int evm_hw_params(struct snd_pcm_substream *substream,
        struct snd_soc_dai *codec_dai = rtd->dai->codec_dai;
        struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
        int ret = 0;
+       unsigned sysclk;
+
+       /* ASP1 on DM355 EVM is clocked by an external oscillator */
+       if (machine_is_davinci_dm355_evm())
+               sysclk = 27000000;
+
+       /* ASP0 in DM6446 EVM is clocked by U55, as configured by
+        * board-dm644x-evm.c using GPIOs from U18.  There are six
+        * options; here we "know" we use a 48 KHz sample rate.
+        */
+       else if (machine_is_davinci_evm())
+               sysclk = 12288000;
+
+       else
+               return -EINVAL;
 
        /* set codec DAI configuration */
-       ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
-                                       SND_SOC_DAIFMT_CBM_CFM |
-                                       SND_SOC_DAIFMT_NB_NF);
+       ret = snd_soc_dai_set_fmt(codec_dai, AUDIO_FORMAT);
        if (ret < 0)
                return ret;
 
        /* set cpu DAI configuration */
-       ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
-                                       SND_SOC_DAIFMT_CBM_CFM |
-                                      SND_SOC_DAIFMT_IB_NF);
+       ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
        if (ret < 0)
                return ret;
 
        /* set the codec system clock */
-       ret = snd_soc_dai_set_sysclk(codec_dai, 0, EVM_CODEC_CLOCK,
-                                           SND_SOC_CLOCK_OUT);
+       ret = snd_soc_dai_set_sysclk(codec_dai, 0, sysclk, SND_SOC_CLOCK_OUT);
        if (ret < 0)
                return ret;
 
@@ -175,7 +186,8 @@ static int __init evm_init(void)
 
        platform_set_drvdata(evm_snd_device, &evm_snd_devdata);
        evm_snd_devdata.dev = &evm_snd_device->dev;
-       evm_snd_device->dev.platform_data = &evm_snd_data;
+       platform_device_add_data(evm_snd_device, &evm_snd_data,
+                                sizeof(evm_snd_data));
 
        ret = platform_device_add_resources(evm_snd_device, evm_snd_resources,
                                            ARRAY_SIZE(evm_snd_resources));