ASoC: rt5514: Add more width and channels support in the TDM mode
authorOder Chiou <oder_chiou@realtek.com>
Tue, 2 May 2017 02:42:56 +0000 (10:42 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 14 May 2017 10:14:33 +0000 (19:14 +0900)
This patch adds more width and channels support in the TDM mode.

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

index f91221b..ff97360 100644 (file)
@@ -906,9 +906,23 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
        if (rx_mask || tx_mask)
                val |= RT5514_TDM_MODE;
 
-       if (slots == 4)
+       switch (slots) {
+       case 4:
                val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH;
+               break;
+
+       case 6:
+               val |= RT5514_TDMSLOT_SEL_RX_6CH | RT5514_TDMSLOT_SEL_TX_6CH;
+               break;
+
+       case 8:
+               val |= RT5514_TDMSLOT_SEL_RX_8CH | RT5514_TDMSLOT_SEL_TX_8CH;
+               break;
 
+       case 2:
+       default:
+               break;
+       }
 
        switch (slot_width) {
        case 20:
@@ -919,6 +933,10 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                val |= RT5514_CH_LEN_RX_24 | RT5514_CH_LEN_TX_24;
                break;
 
+       case 25:
+               val |= RT5514_TDM_MODE2;
+               break;
+
        case 32:
                val |= RT5514_CH_LEN_RX_32 | RT5514_CH_LEN_TX_32;
                break;
@@ -930,7 +948,8 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 
        regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_TDM_MODE |
                RT5514_TDMSLOT_SEL_RX_MASK | RT5514_TDMSLOT_SEL_TX_MASK |
-               RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK, val);
+               RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK |
+               RT5514_TDM_MODE2, val);
 
        return 0;
 }
index 5d343fb..02bc212 100644 (file)
 #define RT5514_POW_ADCFEDL_BIT                 0
 
 /* RT5514_I2S_CTRL1 (0x2010) */
+#define RT5514_TDM_MODE2                       (0x1 << 30)
+#define RT5514_TDM_MODE2_SFT                   30
 #define RT5514_TDM_MODE                                (0x1 << 28)
 #define RT5514_TDM_MODE_SFT                    28
 #define RT5514_I2S_LR_MASK                     (0x1 << 26)
 #define RT5514_TDMSLOT_SEL_RX_MASK             (0x3 << 10)
 #define RT5514_TDMSLOT_SEL_RX_SFT              10
 #define RT5514_TDMSLOT_SEL_RX_4CH              (0x1 << 10)
+#define RT5514_TDMSLOT_SEL_RX_6CH              (0x2 << 10)
+#define RT5514_TDMSLOT_SEL_RX_8CH              (0x3 << 10)
 #define RT5514_CH_LEN_RX_MASK                  (0x3 << 8)
 #define RT5514_CH_LEN_RX_SFT                   8
 #define RT5514_CH_LEN_RX_16                    (0x0 << 8)
 #define RT5514_TDMSLOT_SEL_TX_MASK             (0x3 << 6)
 #define RT5514_TDMSLOT_SEL_TX_SFT              6
 #define RT5514_TDMSLOT_SEL_TX_4CH              (0x1 << 6)
+#define RT5514_TDMSLOT_SEL_TX_6CH              (0x2 << 6)
+#define RT5514_TDMSLOT_SEL_TX_8CH              (0x3 << 6)
 #define RT5514_CH_LEN_TX_MASK                  (0x3 << 4)
 #define RT5514_CH_LEN_TX_SFT                   4
 #define RT5514_CH_LEN_TX_16                    (0x0 << 4)