ASoC: rt5677: Add the TDM function
authorOder Chiou <oder_chiou@realtek.com>
Wed, 17 Sep 2014 07:12:33 +0000 (15:12 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 17 Sep 2014 17:05:12 +0000 (10:05 -0700)
The patch adds the TDM function.

Signed-off-by: Oder Chiou <oder_chiou@realtek.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/rt5677.c

index 02bc8bd7caebaf71d3b7e9ed08b89648297ddb9a..1d4719f5fe7579ef48e657832a501d1ea1877e09 100644 (file)
@@ -3107,6 +3107,59 @@ static int rt5677_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
        return 0;
 }
 
+static int rt5677_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
+                       unsigned int rx_mask, int slots, int slot_width)
+{
+       struct snd_soc_codec *codec = dai->codec;
+       unsigned int val = 0;
+
+       if (rx_mask || tx_mask)
+               val |= (1 << 12);
+
+       switch (slots) {
+       case 4:
+               val |= (1 << 10);
+               break;
+       case 6:
+               val |= (2 << 10);
+               break;
+       case 8:
+               val |= (3 << 10);
+               break;
+       case 2:
+       default:
+               break;
+       }
+
+       switch (slot_width) {
+       case 20:
+               val |= (1 << 8);
+               break;
+       case 24:
+               val |= (2 << 8);
+               break;
+       case 32:
+               val |= (3 << 8);
+               break;
+       case 16:
+       default:
+               break;
+       }
+
+       switch (dai->id) {
+       case RT5677_AIF1:
+               snd_soc_update_bits(codec, RT5677_TDM1_CTRL1, 0x1f00, val);
+               break;
+       case RT5677_AIF2:
+               snd_soc_update_bits(codec, RT5677_TDM2_CTRL1, 0x1f00, val);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 static int rt5677_set_bias_level(struct snd_soc_codec *codec,
                        enum snd_soc_bias_level level)
 {
@@ -3357,6 +3410,7 @@ static struct snd_soc_dai_ops rt5677_aif_dai_ops = {
        .set_fmt = rt5677_set_dai_fmt,
        .set_sysclk = rt5677_set_dai_sysclk,
        .set_pll = rt5677_set_dai_pll,
+       .set_tdm_slot = rt5677_set_tdm_slot,
 };
 
 static struct snd_soc_dai_driver rt5677_dai[] = {