ASoC: pcm3168a: add I2S/Left_J TDM support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 12 Oct 2018 06:31:49 +0000 (06:31 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 12 Oct 2018 16:52:08 +0000 (18:52 +0200)
pcm3168a is supporting TDM on I2S/Left_J, but there is no
settings for it. This patch add it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/pcm3168a.c

index f0e2b886323ea8f829246828972ae8547990c0fb..63aa02592bc048457e7a387af769f181ef92f9ff 100644 (file)
@@ -33,6 +33,8 @@
 #define PCM3168A_FMT_RIGHT_J_16                0x3
 #define PCM3168A_FMT_DSP_A             0x4
 #define PCM3168A_FMT_DSP_B             0x5
+#define PCM3168A_FMT_I2S_TDM           0x6
+#define PCM3168A_FMT_LEFT_J_TDM                0x7
 #define PCM3168A_FMT_DSP_MASK          0x4
 
 #define PCM3168A_NUM_SUPPLIES 6
@@ -401,9 +403,11 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream,
        bool tx, master_mode;
        u32 val, mask, shift, reg;
        unsigned int rate, fmt, ratio, max_ratio;
+       unsigned int chan;
        int i, min_frame_size;
 
        rate = params_rate(params);
+       chan = params_channels(params);
 
        ratio = pcm3168a->sysclk / rate;
 
@@ -456,6 +460,21 @@ static int pcm3168a_hw_params(struct snd_pcm_substream *substream,
                return -EINVAL;
        }
 
+       /* for TDM */
+       if (chan > 2) {
+               switch (fmt) {
+               case PCM3168A_FMT_I2S:
+                       fmt = PCM3168A_FMT_I2S_TDM;
+                       break;
+               case PCM3168A_FMT_LEFT_J:
+                       fmt = PCM3168A_FMT_LEFT_J_TDM;
+                       break;
+               default:
+                       dev_err(component->dev, "TDM is supported under I2S/Left_J only\n");
+                       return -EINVAL;
+               }
+       }
+
        if (master_mode)
                val = ((i + 1) << shift);
        else