1 // SPDX-License-Identifier: GPL-2.0
3 // MediaTek ALSA SoC Audio DAI ADDA Control
5 // Copyright (c) 2020 MediaTek Inc.
6 // Author: Shane Chien <shane.chien@mediatek.com>
9 #include <linux/delay.h>
10 #include <linux/regmap.h>
12 #include "mt8192-afe-clk.h"
13 #include "mt8192-afe-common.h"
14 #include "mt8192-afe-gpio.h"
15 #include "mt8192-interconnection.h"
27 AUDIO_SDM_LEVEL_MUTE = 0,
28 AUDIO_SDM_LEVEL_NORMAL = 0x1d,
29 /* if you change level normal */
30 /* you need to change formula of hp impedance and dc trim too */
44 MTK_AFE_ADDA_DL_RATE_8K = 0,
45 MTK_AFE_ADDA_DL_RATE_11K = 1,
46 MTK_AFE_ADDA_DL_RATE_12K = 2,
47 MTK_AFE_ADDA_DL_RATE_16K = 3,
48 MTK_AFE_ADDA_DL_RATE_22K = 4,
49 MTK_AFE_ADDA_DL_RATE_24K = 5,
50 MTK_AFE_ADDA_DL_RATE_32K = 6,
51 MTK_AFE_ADDA_DL_RATE_44K = 7,
52 MTK_AFE_ADDA_DL_RATE_48K = 8,
53 MTK_AFE_ADDA_DL_RATE_96K = 9,
54 MTK_AFE_ADDA_DL_RATE_192K = 10,
58 MTK_AFE_ADDA_UL_RATE_8K = 0,
59 MTK_AFE_ADDA_UL_RATE_16K = 1,
60 MTK_AFE_ADDA_UL_RATE_32K = 2,
61 MTK_AFE_ADDA_UL_RATE_48K = 3,
62 MTK_AFE_ADDA_UL_RATE_96K = 4,
63 MTK_AFE_ADDA_UL_RATE_192K = 5,
64 MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
67 #define SDM_AUTO_RESET_THRESHOLD 0x190000
69 static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
74 return MTK_AFE_ADDA_DL_RATE_8K;
76 return MTK_AFE_ADDA_DL_RATE_11K;
78 return MTK_AFE_ADDA_DL_RATE_12K;
80 return MTK_AFE_ADDA_DL_RATE_16K;
82 return MTK_AFE_ADDA_DL_RATE_22K;
84 return MTK_AFE_ADDA_DL_RATE_24K;
86 return MTK_AFE_ADDA_DL_RATE_32K;
88 return MTK_AFE_ADDA_DL_RATE_44K;
90 return MTK_AFE_ADDA_DL_RATE_48K;
92 return MTK_AFE_ADDA_DL_RATE_96K;
94 return MTK_AFE_ADDA_DL_RATE_192K;
96 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
98 return MTK_AFE_ADDA_DL_RATE_48K;
102 static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
107 return MTK_AFE_ADDA_UL_RATE_8K;
109 return MTK_AFE_ADDA_UL_RATE_16K;
111 return MTK_AFE_ADDA_UL_RATE_32K;
113 return MTK_AFE_ADDA_UL_RATE_48K;
115 return MTK_AFE_ADDA_UL_RATE_96K;
117 return MTK_AFE_ADDA_UL_RATE_192K;
119 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
121 return MTK_AFE_ADDA_UL_RATE_48K;
126 static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
127 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
128 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
129 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
130 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
131 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
132 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
133 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
134 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
135 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
136 I_ADDA_UL_CH3, 1, 0),
137 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
138 I_ADDA_UL_CH2, 1, 0),
139 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
140 I_ADDA_UL_CH1, 1, 0),
141 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
142 I_GAIN1_OUT_CH1, 1, 0),
143 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
144 I_PCM_1_CAP_CH1, 1, 0),
145 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
146 I_PCM_2_CAP_CH1, 1, 0),
147 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
148 I_SRC_1_OUT_CH1, 1, 0),
149 SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
150 I_SRC_2_OUT_CH1, 1, 0),
153 static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
154 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
155 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
156 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
157 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
158 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
159 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
160 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
161 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
162 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
163 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
164 SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
165 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
166 I_ADDA_UL_CH3, 1, 0),
167 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
168 I_ADDA_UL_CH2, 1, 0),
169 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
170 I_ADDA_UL_CH1, 1, 0),
171 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
172 I_GAIN1_OUT_CH2, 1, 0),
173 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
174 I_PCM_1_CAP_CH1, 1, 0),
175 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
176 I_PCM_2_CAP_CH1, 1, 0),
177 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
178 I_PCM_1_CAP_CH2, 1, 0),
179 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
180 I_PCM_2_CAP_CH2, 1, 0),
181 SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
182 I_SRC_1_OUT_CH2, 1, 0),
183 SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
184 I_SRC_2_OUT_CH2, 1, 0),
187 static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
188 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
189 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
190 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
191 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
192 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
193 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
194 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
195 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
196 I_ADDA_UL_CH3, 1, 0),
197 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
198 I_ADDA_UL_CH2, 1, 0),
199 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
200 I_ADDA_UL_CH1, 1, 0),
201 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
202 I_GAIN1_OUT_CH1, 1, 0),
203 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
204 I_PCM_1_CAP_CH1, 1, 0),
205 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
206 I_PCM_2_CAP_CH1, 1, 0),
209 static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
210 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
211 SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
212 SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
213 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
214 SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
215 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
216 SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
217 SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
218 SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
219 SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
220 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
221 I_ADDA_UL_CH3, 1, 0),
222 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
223 I_ADDA_UL_CH2, 1, 0),
224 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
225 I_ADDA_UL_CH1, 1, 0),
226 SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
227 I_GAIN1_OUT_CH2, 1, 0),
228 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
229 I_PCM_1_CAP_CH1, 1, 0),
230 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
231 I_PCM_2_CAP_CH1, 1, 0),
232 SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
233 I_PCM_1_CAP_CH2, 1, 0),
234 SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
235 I_PCM_2_CAP_CH2, 1, 0),
238 static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
239 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
240 I_ADDA_UL_CH1, 1, 0),
243 static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
244 SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
245 I_ADDA_UL_CH2, 1, 0),
249 SUPPLY_SEQ_ADDA_AFE_ON,
250 SUPPLY_SEQ_ADDA_DL_ON,
251 SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
252 SUPPLY_SEQ_ADDA_MTKAIF_CFG,
253 SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
254 SUPPLY_SEQ_ADDA_FIFO,
255 SUPPLY_SEQ_ADDA_AP_DMIC,
256 SUPPLY_SEQ_ADDA_UL_ON,
259 static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
264 case MT8192_DAI_ADDA:
265 case MT8192_DAI_AP_DMIC:
266 reg = AFE_ADDA_UL_SRC_CON0;
268 case MT8192_DAI_ADDA_CH34:
269 case MT8192_DAI_AP_DMIC_CH34:
270 reg = AFE_ADDA6_UL_SRC_CON0;
276 /* dmic mode, 3.25M*/
277 regmap_update_bits(afe->regmap, reg,
278 DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
280 regmap_update_bits(afe->regmap, reg,
281 DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
284 /* turn on dmic, ch1, ch2 */
285 regmap_update_bits(afe->regmap, reg,
286 UL_SDM_3_LEVEL_CTL_MASK_SFT,
287 0x1 << UL_SDM_3_LEVEL_CTL_SFT);
288 regmap_update_bits(afe->regmap, reg,
289 UL_MODE_3P25M_CH1_CTL_MASK_SFT,
290 0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
291 regmap_update_bits(afe->regmap, reg,
292 UL_MODE_3P25M_CH2_CTL_MASK_SFT,
293 0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
297 static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
298 struct snd_kcontrol *kcontrol,
301 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
302 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
303 struct mt8192_afe_private *afe_priv = afe->platform_priv;
304 int mtkaif_dmic = afe_priv->mtkaif_dmic;
306 dev_info(afe->dev, "%s(), name %s, event 0x%x, mtkaif_dmic %d\n",
307 __func__, w->name, event, mtkaif_dmic);
310 case SND_SOC_DAPM_PRE_PMU:
311 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
313 /* update setting to dmic */
315 /* mtkaif_rxif_data_mode = 1, dmic */
316 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
319 /* dmic mode, 3.25M*/
320 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
321 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
323 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
326 case SND_SOC_DAPM_POST_PMD:
327 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
328 usleep_range(125, 135);
329 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
338 static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
339 struct snd_kcontrol *kcontrol,
342 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
343 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
344 struct mt8192_afe_private *afe_priv = afe->platform_priv;
345 int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
346 int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
349 "%s(), name %s, event 0x%x, mtkaif_dmic %d, mtkaif_adda6_only %d\n",
350 __func__, w->name, event, mtkaif_dmic, mtkaif_adda6_only);
353 case SND_SOC_DAPM_PRE_PMU:
354 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
357 /* update setting to dmic */
359 /* mtkaif_rxif_data_mode = 1, dmic */
360 regmap_update_bits(afe->regmap,
361 AFE_ADDA6_MTKAIF_RX_CFG0,
364 /* dmic mode, 3.25M*/
365 regmap_update_bits(afe->regmap,
366 AFE_ADDA6_MTKAIF_RX_CFG0,
367 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
369 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
372 /* when using adda6 without adda enabled,
373 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
374 * data cannot be received.
376 if (mtkaif_adda6_only) {
377 regmap_update_bits(afe->regmap,
378 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
379 0x1 << 23, 0x1 << 23);
382 case SND_SOC_DAPM_POST_PMD:
383 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
384 usleep_range(125, 135);
385 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
389 afe_priv->mtkaif_dmic_ch34 = 0;
391 if (mtkaif_adda6_only) {
392 regmap_update_bits(afe->regmap,
393 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
394 0x1 << 23, 0x0 << 23);
404 static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
405 struct snd_kcontrol *kcontrol,
408 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
409 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
410 struct mt8192_afe_private *afe_priv = afe->platform_priv;
413 case SND_SOC_DAPM_PRE_PMU:
414 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
415 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
417 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
426 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
427 struct snd_kcontrol *kcontrol,
430 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
431 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
432 struct mt8192_afe_private *afe_priv = afe->platform_priv;
437 case SND_SOC_DAPM_PRE_PMU:
438 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
440 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
442 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
445 if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&
446 (afe_priv->mtkaif_chosen_phase[0] < 0 ||
447 afe_priv->mtkaif_chosen_phase[1] < 0)) {
449 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
451 afe_priv->mtkaif_chosen_phase[0],
452 afe_priv->mtkaif_chosen_phase[1]);
454 } else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&
455 afe_priv->mtkaif_chosen_phase[2] < 0) {
457 "%s(), mtkaif_chosen_phase[2]:%d\n",
459 afe_priv->mtkaif_chosen_phase[2]);
463 /* mtkaif_rxif_clkinv_adc inverse for calibration */
464 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
465 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
466 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
467 regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
468 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
469 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
471 /* set delay for ch12 */
472 if (afe_priv->mtkaif_phase_cycle[0] >=
473 afe_priv->mtkaif_phase_cycle[1]) {
474 delay_data = DELAY_DATA_MISO1;
475 delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
476 afe_priv->mtkaif_phase_cycle[1];
478 delay_data = DELAY_DATA_MISO2;
479 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
480 afe_priv->mtkaif_phase_cycle[0];
483 regmap_update_bits(afe->regmap,
484 AFE_ADDA_MTKAIF_RX_CFG2,
485 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
487 MTKAIF_RXIF_DELAY_DATA_SFT);
489 regmap_update_bits(afe->regmap,
490 AFE_ADDA_MTKAIF_RX_CFG2,
491 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
493 MTKAIF_RXIF_DELAY_CYCLE_SFT);
495 /* set delay between ch3 and ch2 */
496 if (afe_priv->mtkaif_phase_cycle[2] >=
497 afe_priv->mtkaif_phase_cycle[1]) {
498 delay_data = DELAY_DATA_MISO1; /* ch3 */
499 delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
500 afe_priv->mtkaif_phase_cycle[1];
502 delay_data = DELAY_DATA_MISO2; /* ch2 */
503 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
504 afe_priv->mtkaif_phase_cycle[2];
507 regmap_update_bits(afe->regmap,
508 AFE_ADDA6_MTKAIF_RX_CFG2,
509 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
511 MTKAIF_RXIF_DELAY_DATA_SFT);
512 regmap_update_bits(afe->regmap,
513 AFE_ADDA6_MTKAIF_RX_CFG2,
514 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
516 MTKAIF_RXIF_DELAY_CYCLE_SFT);
517 } else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
518 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
520 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
523 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
524 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
534 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
535 struct snd_kcontrol *kcontrol,
538 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
539 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
541 dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
542 __func__, w->name, event);
545 case SND_SOC_DAPM_PRE_PMU:
546 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
548 case SND_SOC_DAPM_POST_PMD:
549 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
550 usleep_range(125, 135);
551 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
560 static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
561 struct snd_kcontrol *kcontrol,
564 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
565 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
567 dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
568 __func__, w->name, event);
571 case SND_SOC_DAPM_PRE_PMU:
572 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
575 case SND_SOC_DAPM_POST_PMD:
576 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
577 usleep_range(125, 135);
578 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
589 static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
590 struct snd_ctl_elem_value *ucontrol)
592 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
593 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
594 struct mt8192_afe_private *afe_priv = afe->platform_priv;
596 ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
600 static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
601 struct snd_ctl_elem_value *ucontrol)
603 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
604 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
605 struct mt8192_afe_private *afe_priv = afe->platform_priv;
606 int gain_db = ucontrol->value.integer.value[0];
608 afe_priv->stf_positive_gain_db = gain_db;
610 if (gain_db >= 0 && gain_db <= 24) {
611 regmap_update_bits(afe->regmap,
613 POSITIVE_GAIN_MASK_SFT,
614 (gain_db / 6) << POSITIVE_GAIN_SFT);
616 dev_warn(afe->dev, "%s(), gain_db %d invalid\n",
622 static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
623 struct snd_ctl_elem_value *ucontrol)
625 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
626 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
627 struct mt8192_afe_private *afe_priv = afe->platform_priv;
629 ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
633 static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
634 struct snd_ctl_elem_value *ucontrol)
636 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
637 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
638 struct mt8192_afe_private *afe_priv = afe->platform_priv;
641 dmic_on = ucontrol->value.integer.value[0];
643 dev_info(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
644 __func__, kcontrol->id.name, dmic_on);
646 afe_priv->mtkaif_dmic = dmic_on;
647 afe_priv->mtkaif_dmic_ch34 = dmic_on;
651 static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
652 struct snd_ctl_elem_value *ucontrol)
654 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
655 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
656 struct mt8192_afe_private *afe_priv = afe->platform_priv;
658 ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
662 static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
663 struct snd_ctl_elem_value *ucontrol)
665 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
666 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
667 struct mt8192_afe_private *afe_priv = afe->platform_priv;
668 int mtkaif_adda6_only;
670 mtkaif_adda6_only = ucontrol->value.integer.value[0];
672 dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
673 __func__, kcontrol->id.name, mtkaif_adda6_only);
675 afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
679 static const struct snd_kcontrol_new mtk_adda_controls[] = {
680 SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
681 SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
682 SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 100, 0,
683 stf_positive_gain_get, stf_positive_gain_set),
684 SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
685 DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
686 SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
687 mt8192_adda_dmic_get, mt8192_adda_dmic_set),
688 SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
689 mt8192_adda6_only_get, mt8192_adda6_only_set),
692 static const struct snd_kcontrol_new stf_ctl =
693 SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
695 static const u16 stf_coeff_table_16k[] = {
696 0x049C, 0x09E8, 0x09E0, 0x089C,
697 0xFF54, 0xF488, 0xEAFC, 0xEBAC,
698 0xfA40, 0x17AC, 0x3D1C, 0x6028,
702 static const u16 stf_coeff_table_32k[] = {
703 0xFE52, 0x0042, 0x00C5, 0x0194,
704 0x029A, 0x03B7, 0x04BF, 0x057D,
705 0x05BE, 0x0555, 0x0426, 0x0230,
706 0xFF92, 0xFC89, 0xF973, 0xF6C6,
707 0xF500, 0xF49D, 0xF603, 0xF970,
708 0xFEF3, 0x065F, 0x0F4F, 0x1928,
709 0x2329, 0x2C80, 0x345E, 0x3A0D,
713 static const u16 stf_coeff_table_48k[] = {
714 0x0401, 0xFFB0, 0xFF5A, 0xFECE,
715 0xFE10, 0xFD28, 0xFC21, 0xFB08,
716 0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
717 0xF724, 0xF746, 0xF7E6, 0xF90F,
718 0xFACC, 0xFD1E, 0xFFFF, 0x0364,
719 0x0737, 0x0B62, 0x0FC1, 0x1431,
720 0x188A, 0x1CA4, 0x2056, 0x237D,
721 0x25F9, 0x27B0, 0x2890
724 static int mtk_stf_event(struct snd_soc_dapm_widget *w,
725 struct snd_kcontrol *kcontrol,
728 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
729 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
732 const u16 *stf_coeff_table;
733 unsigned int ul_rate, reg_value;
736 regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
737 ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
738 ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
740 if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
741 half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
742 stf_coeff_table = stf_coeff_table_48k;
743 } else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
744 half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
745 stf_coeff_table = stf_coeff_table_32k;
747 half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
748 stf_coeff_table = stf_coeff_table_16k;
751 regmap_read(afe->regmap, AFE_SIDETONE_CON1, ®_value);
753 dev_info(afe->dev, "%s(), name %s, event 0x%x, ul_rate 0x%x, AFE_SIDETONE_CON1 0x%x\n",
754 __func__, w->name, event, ul_rate, reg_value);
757 case SND_SOC_DAPM_PRE_PMU:
758 /* set side tone gain = 0 */
759 regmap_update_bits(afe->regmap,
761 SIDE_TONE_GAIN_MASK_SFT,
763 regmap_update_bits(afe->regmap,
765 POSITIVE_GAIN_MASK_SFT,
767 /* don't bypass stf */
768 regmap_update_bits(afe->regmap,
772 /* set stf half tap num */
773 regmap_update_bits(afe->regmap,
775 SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
776 half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
778 /* set side tone coefficient */
779 regmap_read(afe->regmap, AFE_SIDETONE_CON0, ®_value);
780 for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
781 bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
782 bool new_w_ready = 0;
785 regmap_update_bits(afe->regmap,
792 SIDE_TONE_COEFFICIENT_ADDR_SFT) |
793 stf_coeff_table[coef_addr]);
795 /* wait until flag write_ready changed */
796 for (try_cnt = 0; try_cnt < 10; try_cnt++) {
797 regmap_read(afe->regmap,
798 AFE_SIDETONE_CON0, ®_value);
799 new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
802 if (new_w_ready == old_w_ready) {
806 "%s(), write coeff not ready",
813 /* need write -> read -> write to write next coeff */
814 regmap_update_bits(afe->regmap,
820 case SND_SOC_DAPM_POST_PMD:
822 regmap_update_bits(afe->regmap,
827 /* set side tone gain = 0 */
828 regmap_update_bits(afe->regmap,
830 SIDE_TONE_GAIN_MASK_SFT,
832 regmap_update_bits(afe->regmap,
834 POSITIVE_GAIN_MASK_SFT,
846 STF_SRC_ADDA_ADDA6 = 0,
850 static const char *const stf_o19o20_mux_map[] = {
855 static int stf_o19o20_mux_map_value[] = {
860 static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
862 STF_SOURCE_FROM_O19O20_SFT,
863 STF_SOURCE_FROM_O19O20_MASK,
865 stf_o19o20_mux_map_value);
867 static const struct snd_kcontrol_new stf_o19O20_mux_control =
868 SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
875 static const char *const stf_adda_mux_map[] = {
880 static int stf_adda_mux_map_value[] = {
885 static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
887 STF_O19O20_OUT_EN_SEL_SFT,
888 STF_O19O20_OUT_EN_SEL_MASK,
890 stf_adda_mux_map_value);
892 static const struct snd_kcontrol_new stf_adda_mux_control =
893 SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
897 ADDA_UL_MUX_MTKAIF = 0,
899 ADDA_UL_MUX_MASK = 0x1,
902 static const char * const adda_ul_mux_map[] = {
906 static int adda_ul_map_value[] = {
911 static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
918 static const struct snd_kcontrol_new adda_ul_mux_control =
919 SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
921 static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
922 SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
924 static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
925 /* inter-connections */
926 SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
928 ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
929 SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
931 ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
933 SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
935 ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
936 SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
938 ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
940 SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
941 AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
944 SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
945 AFE_ADDA_DL_SRC2_CON0,
946 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
948 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
949 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
950 SUPPLY_SEQ_ADDA_DL_ON,
951 AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
952 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
953 mtk_adda_ch34_dl_event,
954 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
956 SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
957 AFE_ADDA_UL_SRC_CON0,
958 UL_SRC_ON_TMP_CTL_SFT, 0,
960 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
961 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
962 AFE_ADDA6_UL_SRC_CON0,
963 UL_SRC_ON_TMP_CTL_SFT, 0,
964 mtk_adda_ch34_ul_event,
965 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
967 SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
969 RG_RX_FIFO_ON_SFT, 0,
970 mtk_adda_pad_top_event,
971 SND_SOC_DAPM_PRE_PMU),
972 SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
974 mtk_adda_mtkaif_cfg_event,
975 SND_SOC_DAPM_PRE_PMU),
976 SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
978 mtk_adda_mtkaif_cfg_event,
979 SND_SOC_DAPM_PRE_PMU),
981 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
982 AFE_ADDA_UL_SRC_CON0,
983 UL_AP_DMIC_ON_SFT, 0,
985 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
986 AFE_ADDA6_UL_SRC_CON0,
987 UL_AP_DMIC_ON_SFT, 0,
990 SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
992 AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
994 SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
996 AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
999 SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
1000 &adda_ul_mux_control),
1001 SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
1002 &adda_ch34_ul_mux_control),
1004 SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
1005 SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
1008 SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
1009 AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
1012 SND_SOC_DAPM_PRE_PMU |
1013 SND_SOC_DAPM_POST_PMD),
1014 SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
1015 &stf_o19O20_mux_control),
1016 SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
1017 &stf_adda_mux_control),
1018 SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
1020 ARRAY_SIZE(mtk_stf_ch1_mix)),
1021 SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
1023 ARRAY_SIZE(mtk_stf_ch2_mix)),
1024 SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
1027 SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
1029 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
1030 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
1031 SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
1032 SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
1034 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
1035 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
1038 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1040 {"ADDA_DL_CH1", "DL1_CH1", "DL1"},
1041 {"ADDA_DL_CH2", "DL1_CH1", "DL1"},
1042 {"ADDA_DL_CH2", "DL1_CH2", "DL1"},
1044 {"ADDA_DL_CH1", "DL12_CH1", "DL12"},
1045 {"ADDA_DL_CH2", "DL12_CH2", "DL12"},
1047 {"ADDA_DL_CH1", "DL6_CH1", "DL6"},
1048 {"ADDA_DL_CH2", "DL6_CH2", "DL6"},
1050 {"ADDA_DL_CH1", "DL8_CH1", "DL8"},
1051 {"ADDA_DL_CH2", "DL8_CH2", "DL8"},
1053 {"ADDA_DL_CH1", "DL2_CH1", "DL2"},
1054 {"ADDA_DL_CH2", "DL2_CH1", "DL2"},
1055 {"ADDA_DL_CH2", "DL2_CH2", "DL2"},
1057 {"ADDA_DL_CH1", "DL3_CH1", "DL3"},
1058 {"ADDA_DL_CH2", "DL3_CH1", "DL3"},
1059 {"ADDA_DL_CH2", "DL3_CH2", "DL3"},
1061 {"ADDA_DL_CH1", "DL4_CH1", "DL4"},
1062 {"ADDA_DL_CH2", "DL4_CH2", "DL4"},
1064 {"ADDA_DL_CH1", "DL5_CH1", "DL5"},
1065 {"ADDA_DL_CH2", "DL5_CH2", "DL5"},
1067 {"ADDA Playback", NULL, "ADDA_DL_CH1"},
1068 {"ADDA Playback", NULL, "ADDA_DL_CH2"},
1070 {"ADDA Playback", NULL, "ADDA Enable"},
1071 {"ADDA Playback", NULL, "ADDA Playback Enable"},
1073 {"ADDA_DL_CH3", "DL1_CH1", "DL1"},
1074 {"ADDA_DL_CH4", "DL1_CH1", "DL1"},
1075 {"ADDA_DL_CH4", "DL1_CH2", "DL1"},
1077 {"ADDA_DL_CH3", "DL12_CH1", "DL12"},
1078 {"ADDA_DL_CH4", "DL12_CH2", "DL12"},
1080 {"ADDA_DL_CH3", "DL6_CH1", "DL6"},
1081 {"ADDA_DL_CH4", "DL6_CH2", "DL6"},
1083 {"ADDA_DL_CH3", "DL2_CH1", "DL2"},
1084 {"ADDA_DL_CH4", "DL2_CH1", "DL2"},
1085 {"ADDA_DL_CH4", "DL2_CH2", "DL2"},
1087 {"ADDA_DL_CH3", "DL3_CH1", "DL3"},
1088 {"ADDA_DL_CH4", "DL3_CH1", "DL3"},
1089 {"ADDA_DL_CH4", "DL3_CH2", "DL3"},
1091 {"ADDA_DL_CH3", "DL4_CH1", "DL4"},
1092 {"ADDA_DL_CH4", "DL4_CH2", "DL4"},
1094 {"ADDA_DL_CH3", "DL5_CH1", "DL5"},
1095 {"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1097 {"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1098 {"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1100 {"ADDA CH34 Playback", NULL, "ADDA Enable"},
1101 {"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1104 {"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1105 {"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1107 {"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1108 {"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1110 {"ADDA Capture", NULL, "ADDA Enable"},
1111 {"ADDA Capture", NULL, "ADDA Capture Enable"},
1112 {"ADDA Capture", NULL, "AUD_PAD_TOP"},
1113 {"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
1115 {"AP DMIC Capture", NULL, "ADDA Enable"},
1116 {"AP DMIC Capture", NULL, "ADDA Capture Enable"},
1117 {"AP DMIC Capture", NULL, "ADDA_FIFO"},
1118 {"AP DMIC Capture", NULL, "AP_DMIC_EN"},
1120 {"ADDA CH34 Capture", NULL, "ADDA Enable"},
1121 {"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1122 {"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
1123 {"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
1125 {"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
1126 {"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1127 {"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
1128 {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
1130 {"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1131 {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1133 /* sidetone filter */
1134 {"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1135 {"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1137 {"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1138 {"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1139 {"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1141 {"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
1142 {"STF_OUTPUT", NULL, "Sidetone Filter"},
1143 {"ADDA Playback", NULL, "Sidetone Filter"},
1144 {"ADDA CH34 Playback", NULL, "Sidetone Filter"},
1147 {"ADDA Playback", NULL, "aud_dac_clk"},
1148 {"ADDA Playback", NULL, "aud_dac_predis_clk"},
1150 {"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1151 {"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1153 {"ADDA Capture Enable", NULL, "aud_adc_clk"},
1154 {"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1158 static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
1159 struct snd_pcm_hw_params *params,
1160 struct snd_soc_dai *dai)
1162 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1163 unsigned int rate = params_rate(params);
1166 dev_info(afe->dev, "%s(), id %d, stream %d, rate %d\n",
1172 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1173 unsigned int dl_src2_con0 = 0;
1174 unsigned int dl_src2_con1 = 0;
1176 /* set sampling rate */
1177 dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1178 DL_2_INPUT_MODE_CTL_SFT;
1180 /* set output mode, UP_SAMPLING_RATE_X8 */
1181 dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1183 /* turn off mute function */
1184 dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
1185 dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
1187 /* set voice input data if input sample rate is 8k or 16k */
1188 if (rate == 8000 || rate == 16000)
1189 dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1191 /* SA suggest apply -0.3db to audio/speech path */
1192 dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1193 DL_2_GAIN_CTL_PRE_SFT;
1195 /* turn on down-link gain */
1196 dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1198 if (id == MT8192_DAI_ADDA) {
1199 /* clean predistortion */
1200 regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
1201 regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
1203 regmap_write(afe->regmap,
1204 AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
1205 regmap_write(afe->regmap,
1206 AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
1209 regmap_update_bits(afe->regmap,
1210 AFE_ADDA_DL_SDM_DCCOMP_CON,
1211 ATTGAIN_CTL_MASK_SFT,
1212 AUDIO_SDM_LEVEL_NORMAL <<
1216 regmap_update_bits(afe->regmap,
1217 AFE_ADDA_DL_SDM_DCCOMP_CON,
1218 USE_3RD_SDM_MASK_SFT,
1219 AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1221 /* sdm auto reset */
1222 regmap_write(afe->regmap,
1223 AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1224 SDM_AUTO_RESET_THRESHOLD);
1225 regmap_update_bits(afe->regmap,
1226 AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1227 ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1228 0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
1230 /* clean predistortion */
1231 regmap_write(afe->regmap,
1232 AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
1233 regmap_write(afe->regmap,
1234 AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
1236 regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1238 regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1242 regmap_update_bits(afe->regmap,
1243 AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1244 ATTGAIN_CTL_MASK_SFT,
1245 AUDIO_SDM_LEVEL_NORMAL <<
1249 regmap_update_bits(afe->regmap,
1250 AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1251 USE_3RD_SDM_MASK_SFT,
1252 AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1254 /* sdm auto reset */
1255 regmap_write(afe->regmap,
1256 AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1257 SDM_AUTO_RESET_THRESHOLD);
1258 regmap_update_bits(afe->regmap,
1259 AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1260 ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1261 0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
1264 unsigned int voice_mode = 0;
1265 unsigned int ul_src_con0 = 0; /* default value */
1267 voice_mode = adda_ul_rate_transform(afe, rate);
1269 ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1272 ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
1273 UL_IIR_ON_TMP_CTL_MASK_SFT;
1274 ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
1275 UL_IIRMODE_CTL_MASK_SFT;
1278 case MT8192_DAI_ADDA:
1279 case MT8192_DAI_AP_DMIC:
1281 regmap_write(afe->regmap,
1282 AFE_ADDA_IIR_COEF_02_01, 0x00000000);
1283 regmap_write(afe->regmap,
1284 AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
1285 regmap_write(afe->regmap,
1286 AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
1287 regmap_write(afe->regmap,
1288 AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
1289 regmap_write(afe->regmap,
1290 AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
1292 regmap_write(afe->regmap,
1293 AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1295 /* Using Internal ADC */
1296 regmap_update_bits(afe->regmap,
1301 /* mtkaif_rxif_data_mode = 0, amic */
1302 regmap_update_bits(afe->regmap,
1303 AFE_ADDA_MTKAIF_RX_CFG0,
1307 case MT8192_DAI_ADDA_CH34:
1308 case MT8192_DAI_AP_DMIC_CH34:
1310 regmap_write(afe->regmap,
1311 AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
1312 regmap_write(afe->regmap,
1313 AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
1314 regmap_write(afe->regmap,
1315 AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
1316 regmap_write(afe->regmap,
1317 AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
1318 regmap_write(afe->regmap,
1319 AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
1321 regmap_write(afe->regmap,
1322 AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1324 /* Using Internal ADC */
1325 regmap_update_bits(afe->regmap,
1330 /* mtkaif_rxif_data_mode = 0, amic */
1331 regmap_update_bits(afe->regmap,
1332 AFE_ADDA6_MTKAIF_RX_CFG0,
1342 case MT8192_DAI_AP_DMIC:
1343 case MT8192_DAI_AP_DMIC_CH34:
1344 mtk_adda_ul_src_dmic(afe, id);
1354 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1355 .hw_params = mtk_dai_adda_hw_params,
1359 #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1360 SNDRV_PCM_RATE_96000 |\
1361 SNDRV_PCM_RATE_192000)
1363 #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
1364 SNDRV_PCM_RATE_16000 |\
1365 SNDRV_PCM_RATE_32000 |\
1366 SNDRV_PCM_RATE_48000 |\
1367 SNDRV_PCM_RATE_96000 |\
1368 SNDRV_PCM_RATE_192000)
1370 #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1371 SNDRV_PCM_FMTBIT_S24_LE |\
1372 SNDRV_PCM_FMTBIT_S32_LE)
1374 static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1377 .id = MT8192_DAI_ADDA,
1379 .stream_name = "ADDA Playback",
1382 .rates = MTK_ADDA_PLAYBACK_RATES,
1383 .formats = MTK_ADDA_FORMATS,
1386 .stream_name = "ADDA Capture",
1389 .rates = MTK_ADDA_CAPTURE_RATES,
1390 .formats = MTK_ADDA_FORMATS,
1392 .ops = &mtk_dai_adda_ops,
1395 .name = "ADDA_CH34",
1396 .id = MT8192_DAI_ADDA_CH34,
1398 .stream_name = "ADDA CH34 Playback",
1401 .rates = MTK_ADDA_PLAYBACK_RATES,
1402 .formats = MTK_ADDA_FORMATS,
1405 .stream_name = "ADDA CH34 Capture",
1408 .rates = MTK_ADDA_CAPTURE_RATES,
1409 .formats = MTK_ADDA_FORMATS,
1411 .ops = &mtk_dai_adda_ops,
1415 .id = MT8192_DAI_AP_DMIC,
1417 .stream_name = "AP DMIC Capture",
1420 .rates = MTK_ADDA_CAPTURE_RATES,
1421 .formats = MTK_ADDA_FORMATS,
1423 .ops = &mtk_dai_adda_ops,
1426 .name = "AP_DMIC_CH34",
1427 .id = MT8192_DAI_AP_DMIC_CH34,
1429 .stream_name = "AP DMIC CH34 Capture",
1432 .rates = MTK_ADDA_CAPTURE_RATES,
1433 .formats = MTK_ADDA_FORMATS,
1435 .ops = &mtk_dai_adda_ops,
1439 int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1441 struct mtk_base_afe_dai *dai;
1442 struct mt8192_afe_private *afe_priv = afe->platform_priv;
1444 dev_info(afe->dev, "%s()\n", __func__);
1446 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1450 list_add(&dai->list, &afe->sub_dais);
1452 dai->dai_drivers = mtk_dai_adda_driver;
1453 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1455 dai->controls = mtk_adda_controls;
1456 dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
1457 dai->dapm_widgets = mtk_dai_adda_widgets;
1458 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
1459 dai->dapm_routes = mtk_dai_adda_routes;
1460 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
1462 /* ap dmic priv share with adda */
1463 afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
1464 afe_priv->dai_priv[MT8192_DAI_ADDA];
1465 afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
1466 afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];