]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ASoC: davinci-mcasp: Add support for I2S format
authorPeter Ujfalusi <peter.ujfalusi@ti.com>
Fri, 4 Apr 2014 11:31:45 +0000 (14:31 +0300)
committerMark Brown <broonie@linaro.org>
Mon, 14 Apr 2014 16:24:24 +0000 (17:24 +0100)
The FS needs to be inverted in McASP compared to other supported formats.
Use a flag to indicate if the FS needs to be inverted.
At the same time fail when non supported format is asked since the default
case was anyways configuring McASP to a not valid format.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/davinci/davinci-mcasp.c

index 113e74c9479f899a9de083c0a38ea89754bbc955..d4d640004bed759a2ce0127c415e6c9e3c04ef6b 100644 (file)
@@ -273,6 +273,7 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
        int ret = 0;
        u32 data_delay;
        bool fs_pol_rising;
+       bool inv_fs = false;
 
        pm_runtime_get_sync(mcasp->dev);
        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
@@ -291,14 +292,19 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
                /* No delay after FS */
                data_delay = 0;
                break;
-       default:
+       case SND_SOC_DAIFMT_I2S:
                /* configure a full-word SYNC pulse (LRCLK) */
                mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXDUR);
                mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRDUR);
 
                /* 1st data bit occur one ACLK cycle after the frame sync */
                data_delay = 1;
+               /* FS need to be inverted */
+               inv_fs = true;
                break;
+       default:
+               ret = -EINVAL;
+               goto out;
        }
 
        mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, FSXDLY(data_delay),
@@ -379,6 +385,9 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai,
                goto out;
        }
 
+       if (inv_fs)
+               fs_pol_rising = !fs_pol_rising;
+
        if (fs_pol_rising) {
                mcasp_clr_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, FSXPOL);
                mcasp_clr_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, FSRPOL);