]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00162797 SSI: add I2S mode for stereo playback
authorGary Zhang <b13634@freescale.com>
Wed, 7 Dec 2011 06:46:54 +0000 (14:46 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:33:35 +0000 (08:33 +0200)
Former stereo playback uses network mode which does not
suppot 24bit format well.
Add I2S mode to do the same manner with codec.

Signed-off-by: Gary Zhang <b13634@freescale.com>
sound/soc/imx/imx-ssi.c

index c67c20f5f8f1677cfef1db6da3440a65c705ee5e..5f0f6c7217efcd81a8661740ab4203c3228eb6a4 100644 (file)
@@ -99,10 +99,6 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
        case SND_SOC_DAIFMT_I2S:
                /* data on rising edge of bclk, frame low 1clk before data */
                strcr |= SSI_STCR_TFSI | SSI_STCR_TEFS | SSI_STCR_TXBIT0;
-               if (ssi->flags & IMX_SSI_USE_I2S_SLAVE) {
-                       scr &= ~SSI_I2S_MODE_MASK;
-                       scr |= SSI_SCR_I2S_MODE_SLAVE;
-               }
                break;
        case SND_SOC_DAIFMT_LEFT_J:
                /* data on rising edge of bclk, frame high with data */
@@ -138,10 +134,21 @@ static int imx_ssi_set_dai_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
 
        /* DAI clock master masks */
        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
+       case SND_SOC_DAIFMT_CBS_CFS:
+               strcr |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
+               if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) {
+                       scr &= ~SSI_I2S_MODE_MASK;
+                       scr |= SSI_SCR_I2S_MODE_MSTR;
+               }
+               break;
        case SND_SOC_DAIFMT_CBM_CFM:
+               strcr &= ~(SSI_STCR_TFDIR | SSI_STCR_TXDIR);
+               if ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) {
+                       scr &= ~SSI_I2S_MODE_MASK;
+                       scr |= SSI_SCR_I2S_MODE_SLAVE;
+               }
                break;
        default:
-               /* Master mode not implemented, needs handling of clocks. */
                return -EINVAL;
        }
 
@@ -279,9 +286,10 @@ static int imx_ssi_hw_params(struct snd_pcm_substream *substream,
 
        scr = readl(ssi->base + SSI_SCR);
 
-       if (channels == 1)
+       if (channels == 1) {
                scr &= ~SSI_SCR_NET;
-       else
+               scr &= ~SSI_I2S_MODE_MASK;
+       } else
                scr |= SSI_SCR_NET;
 
        writel(scr, ssi->base + SSI_SCR);