diff options
author | oder_chiou@realtek.com <oder_chiou@realtek.com> | 2017-07-20 00:05:34 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-07-20 08:09:11 -0400 |
commit | e8be3a5ad335316ddf1b90e0386426093187bfc7 (patch) | |
tree | 2ca144711ab42747b0704587167e11564c73a287 | |
parent | 9894dbafb6f864207f9e6aeaca2c8de949955651 (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.c | 33 | ||||
-rw-r--r-- | sound/soc/codecs/rt5514.h | 12 |
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 |