aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroder_chiou@realtek.com <oder_chiou@realtek.com>2017-07-20 00:05:34 -0400
committerMark Brown <broonie@kernel.org>2017-07-20 08:09:11 -0400
commite8be3a5ad335316ddf1b90e0386426093187bfc7 (patch)
tree2ca144711ab42747b0704587167e11564c73a287
parent9894dbafb6f864207f9e6aeaca2c8de949955651 (diff)
ASoC: rt5514: Support the TDM docking mode
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>
-rw-r--r--sound/soc/codecs/rt5514.c33
-rw-r--r--sound/soc/codecs/rt5514.h12
2 files changed, 44 insertions, 1 deletions
diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c
index 4ca73bf83cc1..a105c84ef555 100644
--- a/sound/soc/codecs/rt5514.c
+++ b/sound/soc/codecs/rt5514.c
@@ -871,11 +871,38 @@ static int rt5514_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
871{ 871{
872 struct snd_soc_codec *codec = dai->codec; 872 struct snd_soc_codec *codec = dai->codec;
873 struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec); 873 struct rt5514_priv *rt5514 = snd_soc_codec_get_drvdata(codec);
874 unsigned int val = 0; 874 unsigned int val = 0, val2 = 0;
875 875
876 if (rx_mask || tx_mask) 876 if (rx_mask || tx_mask)
877 val |= RT5514_TDM_MODE; 877 val |= RT5514_TDM_MODE;
878 878
879 switch (tx_mask) {
880 case 0x3:
881 val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 |
882 RT5514_TDM_DOCKING_START_SLOT0;
883 break;
884
885 case 0x30:
886 val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH2 |
887 RT5514_TDM_DOCKING_START_SLOT4;
888 break;
889
890 case 0xf:
891 val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 |
892 RT5514_TDM_DOCKING_START_SLOT0;
893 break;
894
895 case 0xf0:
896 val2 |= RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH4 |
897 RT5514_TDM_DOCKING_START_SLOT4;
898 break;
899
900 default:
901 break;
902 }
903
904
905
879 switch (slots) { 906 switch (slots) {
880 case 4: 907 case 4:
881 val |= RT5514_TDMSLOT_SEL_RX_4CH | RT5514_TDMSLOT_SEL_TX_4CH; 908 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,
921 RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK | 948 RT5514_CH_LEN_RX_MASK | RT5514_CH_LEN_TX_MASK |
922 RT5514_TDM_MODE2, val); 949 RT5514_TDM_MODE2, val);
923 950
951 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL2,
952 RT5514_TDM_DOCKING_MODE | RT5514_TDM_DOCKING_VALID_CH_MASK |
953 RT5514_TDM_DOCKING_START_MASK, val2);
954
924 return 0; 955 return 0;
925} 956}
926 957
diff --git a/sound/soc/codecs/rt5514.h b/sound/soc/codecs/rt5514.h
index 02bc212a86d9..75024a4bb7f5 100644
--- a/sound/soc/codecs/rt5514.h
+++ b/sound/soc/codecs/rt5514.h
@@ -164,6 +164,18 @@
164#define RT5514_I2S_DL_24 (0x2 << 0) 164#define RT5514_I2S_DL_24 (0x2 << 0)
165#define RT5514_I2S_DL_8 (0x3 << 0) 165#define RT5514_I2S_DL_8 (0x3 << 0)
166 166
167/* RT5514_I2S_CTRL2 (0x2014) */
168#define RT5514_TDM_DOCKING_MODE (0x1 << 31)
169#define RT5514_TDM_DOCKING_MODE_SFT 31
170#define RT5514_TDM_DOCKING_VALID_CH_MASK (0x1 << 29)
171#define RT5514_TDM_DOCKING_VALID_CH_SFT 29
172#define RT5514_TDM_DOCKING_VALID_CH2 (0x0 << 29)
173#define RT5514_TDM_DOCKING_VALID_CH4 (0x1 << 29)
174#define RT5514_TDM_DOCKING_START_MASK (0x1 << 28)
175#define RT5514_TDM_DOCKING_START_SFT 28
176#define RT5514_TDM_DOCKING_START_SLOT0 (0x0 << 28)
177#define RT5514_TDM_DOCKING_START_SLOT4 (0x1 << 28)
178
167/* RT5514_DIG_SOURCE_CTRL (0x20a4) */ 179/* RT5514_DIG_SOURCE_CTRL (0x20a4) */
168#define RT5514_AD1_DMIC_INPUT_SEL (0x1 << 1) 180#define RT5514_AD1_DMIC_INPUT_SEL (0x1 << 1)
169#define RT5514_AD1_DMIC_INPUT_SEL_SFT 1 181#define RT5514_AD1_DMIC_INPUT_SEL_SFT 1