ASoC: rt5514: Support the TDM docking mode
authoroder_chiou@realtek.com <oder_chiou@realtek.com>
Thu, 20 Jul 2017 04:05:34 +0000 (12:05 +0800)
committerMark Brown <broonie@kernel.org>
Thu, 20 Jul 2017 12:09:11 +0000 (13:09 +0100)
The TDM docking mode can share the bus to other devices simultaneously.

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 4ca73bf83cc1c26f715f0fc9592bedfb3d684413..a105c84ef555d71d4803a5b881013dd226f2971b 100644 (file)
@@ -871,11 +871,38 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
 {
        struct snd_soc_codec *codec = dai->codec;
        struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec);
-       unsigned int val = 0;
+       unsigned int val = 0, val2 = 0;
 
        if (rx_mask || tx_mask)
                val |= RT5514_TDM_MODE;
 
+       switch (tx_mask) {
+       case 0x3:
+               val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 |
+                       RT5514_TDM_DOCKING_START_SLOT0;
+               break;
+
+       case 0x30:
+               val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 |
+                       RT5514_TDM_DOCKING_START_SLOT4;
+               break;
+
+       case 0xf:
+               val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 |
+                       RT5514_TDM_DOCKING_START_SLOT0;
+               break;
+
+       case 0xf0:
+               val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 |
+                       RT5514_TDM_DOCKING_START_SLOT4;
+               break;
+
+       default:
+               break;
+       }
+
+
+
        switch (slots) {
        case 4:
                val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH;
@@ -921,6 +948,10 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
                RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK |
                RT5514_TDM_MODE2, val);
 
+       regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL2,
+               RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH_MASK |
+               RT5514_TDM_DOCKING_START_MASK, val2);
+
        return 0;
 }
 
index 02bc212a86d9c7e2d9559d7ec0b744f3c906a9e2..75024a4bb7f53215f21d6aa57de32c7448e671f0 100644 (file)
 #define RT5514_I2S_DL_24                       (0x2 << 0)
 #define RT5514_I2S_DL_8                                (0x3 << 0)
 
+/* RT5514_I2S_CTRL2 (0x2014) */
+#define RT5514_TDM_DOCKING_MODE                        (0x1 << 31)
+#define RT5514_TDM_DOCKING_MODE_SFT            31
+#define RT5514_TDM_DOCKING_VALID_CH_MASK       (0x1 << 29)
+#define RT5514_TDM_DOCKING_VALID_CH_SFT                29
+#define RT5514_TDM_DOCKING_VALID_CH2           (0x0 << 29)
+#define RT5514_TDM_DOCKING_VALID_CH4           (0x1 << 29)
+#define RT5514_TDM_DOCKING_START_MASK          (0x1 << 28)
+#define RT5514_TDM_DOCKING_START_SFT           28
+#define RT5514_TDM_DOCKING_START_SLOT0         (0x0 << 28)
+#define RT5514_TDM_DOCKING_START_SLOT4         (0x1 << 28)
+
 /* RT5514_DIG_SOURCE_CTRL (0x20a4) */
 #define RT5514_AD1_DMIC_INPUT_SEL              (0x1 << 1)
 #define RT5514_AD1_DMIC_INPUT_SEL_SFT          1