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;
307 case SND_SOC_DAPM_PRE_PMU:
308 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
310 /* update setting to dmic */
312 /* mtkaif_rxif_data_mode = 1, dmic */
313 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
316 /* dmic mode, 3.25M*/
317 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
318 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
320 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
323 case SND_SOC_DAPM_POST_PMD:
324 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
325 usleep_range(125, 135);
326 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
335 static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
336 struct snd_kcontrol *kcontrol,
339 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
340 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
341 struct mt8192_afe_private *afe_priv = afe->platform_priv;
342 int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
343 int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
346 case SND_SOC_DAPM_PRE_PMU:
347 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
350 /* update setting to dmic */
352 /* mtkaif_rxif_data_mode = 1, dmic */
353 regmap_update_bits(afe->regmap,
354 AFE_ADDA6_MTKAIF_RX_CFG0,
357 /* dmic mode, 3.25M*/
358 regmap_update_bits(afe->regmap,
359 AFE_ADDA6_MTKAIF_RX_CFG0,
360 MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
362 mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
365 /* when using adda6 without adda enabled,
366 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
367 * data cannot be received.
369 if (mtkaif_adda6_only) {
370 regmap_update_bits(afe->regmap,
371 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
372 0x1 << 23, 0x1 << 23);
375 case SND_SOC_DAPM_POST_PMD:
376 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
377 usleep_range(125, 135);
378 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
382 afe_priv->mtkaif_dmic_ch34 = 0;
384 if (mtkaif_adda6_only) {
385 regmap_update_bits(afe->regmap,
386 AFE_ADDA_MTKAIF_SYNCWORD_CFG,
387 0x1 << 23, 0x0 << 23);
397 static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
398 struct snd_kcontrol *kcontrol,
401 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
402 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
403 struct mt8192_afe_private *afe_priv = afe->platform_priv;
406 case SND_SOC_DAPM_PRE_PMU:
407 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
408 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
410 regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
419 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
420 struct snd_kcontrol *kcontrol,
423 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
424 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
425 struct mt8192_afe_private *afe_priv = afe->platform_priv;
430 case SND_SOC_DAPM_PRE_PMU:
431 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
433 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
435 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
438 if (snd_soc_dapm_widget_name_cmp(w, "ADDA_MTKAIF_CFG") == 0 &&
439 (afe_priv->mtkaif_chosen_phase[0] < 0 ||
440 afe_priv->mtkaif_chosen_phase[1] < 0)) {
442 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
444 afe_priv->mtkaif_chosen_phase[0],
445 afe_priv->mtkaif_chosen_phase[1]);
447 } else if (snd_soc_dapm_widget_name_cmp(w, "ADDA6_MTKAIF_CFG") == 0 &&
448 afe_priv->mtkaif_chosen_phase[2] < 0) {
450 "%s(), mtkaif_chosen_phase[2]:%d\n",
452 afe_priv->mtkaif_chosen_phase[2]);
456 /* mtkaif_rxif_clkinv_adc inverse for calibration */
457 regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
458 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
459 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
460 regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
461 MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
462 0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
464 /* set delay for ch12 */
465 if (afe_priv->mtkaif_phase_cycle[0] >=
466 afe_priv->mtkaif_phase_cycle[1]) {
467 delay_data = DELAY_DATA_MISO1;
468 delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
469 afe_priv->mtkaif_phase_cycle[1];
471 delay_data = DELAY_DATA_MISO2;
472 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
473 afe_priv->mtkaif_phase_cycle[0];
476 regmap_update_bits(afe->regmap,
477 AFE_ADDA_MTKAIF_RX_CFG2,
478 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
480 MTKAIF_RXIF_DELAY_DATA_SFT);
482 regmap_update_bits(afe->regmap,
483 AFE_ADDA_MTKAIF_RX_CFG2,
484 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
486 MTKAIF_RXIF_DELAY_CYCLE_SFT);
488 /* set delay between ch3 and ch2 */
489 if (afe_priv->mtkaif_phase_cycle[2] >=
490 afe_priv->mtkaif_phase_cycle[1]) {
491 delay_data = DELAY_DATA_MISO1; /* ch3 */
492 delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
493 afe_priv->mtkaif_phase_cycle[1];
495 delay_data = DELAY_DATA_MISO2; /* ch2 */
496 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
497 afe_priv->mtkaif_phase_cycle[2];
500 regmap_update_bits(afe->regmap,
501 AFE_ADDA6_MTKAIF_RX_CFG2,
502 MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
504 MTKAIF_RXIF_DELAY_DATA_SFT);
505 regmap_update_bits(afe->regmap,
506 AFE_ADDA6_MTKAIF_RX_CFG2,
507 MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
509 MTKAIF_RXIF_DELAY_CYCLE_SFT);
510 } else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
511 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
513 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
516 regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
517 regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
527 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
528 struct snd_kcontrol *kcontrol,
531 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
532 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
535 case SND_SOC_DAPM_PRE_PMU:
536 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
538 case SND_SOC_DAPM_POST_PMD:
539 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
540 usleep_range(125, 135);
541 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
550 static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
551 struct snd_kcontrol *kcontrol,
554 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
555 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
558 case SND_SOC_DAPM_PRE_PMU:
559 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
562 case SND_SOC_DAPM_POST_PMD:
563 /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
564 usleep_range(125, 135);
565 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
576 static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
577 struct snd_ctl_elem_value *ucontrol)
579 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
580 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
581 struct mt8192_afe_private *afe_priv = afe->platform_priv;
583 ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
587 static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
588 struct snd_ctl_elem_value *ucontrol)
590 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
591 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
592 struct mt8192_afe_private *afe_priv = afe->platform_priv;
593 int gain_db = ucontrol->value.integer.value[0];
596 afe_priv->stf_positive_gain_db = gain_db;
598 if (gain_db >= 0 && gain_db <= 24) {
599 regmap_update_bits_check(afe->regmap,
601 POSITIVE_GAIN_MASK_SFT,
602 (gain_db / 6) << POSITIVE_GAIN_SFT,
611 static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
612 struct snd_ctl_elem_value *ucontrol)
614 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
615 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
616 struct mt8192_afe_private *afe_priv = afe->platform_priv;
618 ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
622 static int mt8192_adda_dmic_set(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;
631 dmic_on = ucontrol->value.integer.value[0];
633 change = (afe_priv->mtkaif_dmic != dmic_on) ||
634 (afe_priv->mtkaif_dmic_ch34 != dmic_on);
636 afe_priv->mtkaif_dmic = dmic_on;
637 afe_priv->mtkaif_dmic_ch34 = dmic_on;
642 static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
643 struct snd_ctl_elem_value *ucontrol)
645 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
646 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
647 struct mt8192_afe_private *afe_priv = afe->platform_priv;
649 ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
653 static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
654 struct snd_ctl_elem_value *ucontrol)
656 struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
657 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
658 struct mt8192_afe_private *afe_priv = afe->platform_priv;
659 int mtkaif_adda6_only;
662 mtkaif_adda6_only = ucontrol->value.integer.value[0];
664 change = afe_priv->mtkaif_adda6_only != mtkaif_adda6_only;
665 afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
670 static const struct snd_kcontrol_new mtk_adda_controls[] = {
671 SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
672 SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
673 SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 24, 0,
674 stf_positive_gain_get, stf_positive_gain_set),
675 SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
676 DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
677 SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
678 mt8192_adda_dmic_get, mt8192_adda_dmic_set),
679 SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
680 mt8192_adda6_only_get, mt8192_adda6_only_set),
683 static const struct snd_kcontrol_new stf_ctl =
684 SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
686 static const u16 stf_coeff_table_16k[] = {
687 0x049C, 0x09E8, 0x09E0, 0x089C,
688 0xFF54, 0xF488, 0xEAFC, 0xEBAC,
689 0xfA40, 0x17AC, 0x3D1C, 0x6028,
693 static const u16 stf_coeff_table_32k[] = {
694 0xFE52, 0x0042, 0x00C5, 0x0194,
695 0x029A, 0x03B7, 0x04BF, 0x057D,
696 0x05BE, 0x0555, 0x0426, 0x0230,
697 0xFF92, 0xFC89, 0xF973, 0xF6C6,
698 0xF500, 0xF49D, 0xF603, 0xF970,
699 0xFEF3, 0x065F, 0x0F4F, 0x1928,
700 0x2329, 0x2C80, 0x345E, 0x3A0D,
704 static const u16 stf_coeff_table_48k[] = {
705 0x0401, 0xFFB0, 0xFF5A, 0xFECE,
706 0xFE10, 0xFD28, 0xFC21, 0xFB08,
707 0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
708 0xF724, 0xF746, 0xF7E6, 0xF90F,
709 0xFACC, 0xFD1E, 0xFFFF, 0x0364,
710 0x0737, 0x0B62, 0x0FC1, 0x1431,
711 0x188A, 0x1CA4, 0x2056, 0x237D,
712 0x25F9, 0x27B0, 0x2890
715 static int mtk_stf_event(struct snd_soc_dapm_widget *w,
716 struct snd_kcontrol *kcontrol,
719 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
720 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
723 const u16 *stf_coeff_table;
724 unsigned int ul_rate, reg_value;
727 regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
728 ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
729 ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
731 if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
732 half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
733 stf_coeff_table = stf_coeff_table_48k;
734 } else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
735 half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
736 stf_coeff_table = stf_coeff_table_32k;
738 half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
739 stf_coeff_table = stf_coeff_table_16k;
742 regmap_read(afe->regmap, AFE_SIDETONE_CON1, ®_value);
745 case SND_SOC_DAPM_PRE_PMU:
746 /* set side tone gain = 0 */
747 regmap_update_bits(afe->regmap,
749 SIDE_TONE_GAIN_MASK_SFT,
751 regmap_update_bits(afe->regmap,
753 POSITIVE_GAIN_MASK_SFT,
755 /* don't bypass stf */
756 regmap_update_bits(afe->regmap,
760 /* set stf half tap num */
761 regmap_update_bits(afe->regmap,
763 SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
764 half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
766 /* set side tone coefficient */
767 regmap_read(afe->regmap, AFE_SIDETONE_CON0, ®_value);
768 for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
769 bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
770 bool new_w_ready = 0;
773 regmap_update_bits(afe->regmap,
780 SIDE_TONE_COEFFICIENT_ADDR_SFT) |
781 stf_coeff_table[coef_addr]);
783 /* wait until flag write_ready changed */
784 for (try_cnt = 0; try_cnt < 10; try_cnt++) {
785 regmap_read(afe->regmap,
786 AFE_SIDETONE_CON0, ®_value);
787 new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
790 if (new_w_ready == old_w_ready) {
794 "%s(), write coeff not ready",
801 /* need write -> read -> write to write next coeff */
802 regmap_update_bits(afe->regmap,
808 case SND_SOC_DAPM_POST_PMD:
810 regmap_update_bits(afe->regmap,
815 /* set side tone gain = 0 */
816 regmap_update_bits(afe->regmap,
818 SIDE_TONE_GAIN_MASK_SFT,
820 regmap_update_bits(afe->regmap,
822 POSITIVE_GAIN_MASK_SFT,
834 STF_SRC_ADDA_ADDA6 = 0,
838 static const char *const stf_o19o20_mux_map[] = {
843 static int stf_o19o20_mux_map_value[] = {
848 static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
850 STF_SOURCE_FROM_O19O20_SFT,
851 STF_SOURCE_FROM_O19O20_MASK,
853 stf_o19o20_mux_map_value);
855 static const struct snd_kcontrol_new stf_o19O20_mux_control =
856 SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
863 static const char *const stf_adda_mux_map[] = {
868 static int stf_adda_mux_map_value[] = {
873 static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
875 STF_O19O20_OUT_EN_SEL_SFT,
876 STF_O19O20_OUT_EN_SEL_MASK,
878 stf_adda_mux_map_value);
880 static const struct snd_kcontrol_new stf_adda_mux_control =
881 SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
885 ADDA_UL_MUX_MTKAIF = 0,
887 ADDA_UL_MUX_MASK = 0x1,
890 static const char * const adda_ul_mux_map[] = {
894 static int adda_ul_map_value[] = {
899 static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
906 static const struct snd_kcontrol_new adda_ul_mux_control =
907 SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
909 static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
910 SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
912 static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
913 /* inter-connections */
914 SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
916 ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
917 SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
919 ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
921 SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
923 ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
924 SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
926 ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
928 SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
929 AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
932 SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
933 AFE_ADDA_DL_SRC2_CON0,
934 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
936 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
937 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
938 SUPPLY_SEQ_ADDA_DL_ON,
939 AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
940 DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
941 mtk_adda_ch34_dl_event,
942 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
944 SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
945 AFE_ADDA_UL_SRC_CON0,
946 UL_SRC_ON_TMP_CTL_SFT, 0,
948 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
949 SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
950 AFE_ADDA6_UL_SRC_CON0,
951 UL_SRC_ON_TMP_CTL_SFT, 0,
952 mtk_adda_ch34_ul_event,
953 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
955 SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
957 RG_RX_FIFO_ON_SFT, 0,
958 mtk_adda_pad_top_event,
959 SND_SOC_DAPM_PRE_PMU),
960 SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
962 mtk_adda_mtkaif_cfg_event,
963 SND_SOC_DAPM_PRE_PMU),
964 SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
966 mtk_adda_mtkaif_cfg_event,
967 SND_SOC_DAPM_PRE_PMU),
969 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
970 AFE_ADDA_UL_SRC_CON0,
971 UL_AP_DMIC_ON_SFT, 0,
973 SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
974 AFE_ADDA6_UL_SRC_CON0,
975 UL_AP_DMIC_ON_SFT, 0,
978 SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
980 AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
982 SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
984 AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
987 SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
988 &adda_ul_mux_control),
989 SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
990 &adda_ch34_ul_mux_control),
992 SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
993 SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
996 SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
997 AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
1000 SND_SOC_DAPM_PRE_PMU |
1001 SND_SOC_DAPM_POST_PMD),
1002 SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
1003 &stf_o19O20_mux_control),
1004 SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
1005 &stf_adda_mux_control),
1006 SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
1008 ARRAY_SIZE(mtk_stf_ch1_mix)),
1009 SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
1011 ARRAY_SIZE(mtk_stf_ch2_mix)),
1012 SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
1015 SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
1017 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
1018 SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
1019 SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
1020 SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
1022 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
1023 SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
1026 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1028 {"ADDA_DL_CH1", "DL1_CH1", "DL1"},
1029 {"ADDA_DL_CH2", "DL1_CH1", "DL1"},
1030 {"ADDA_DL_CH2", "DL1_CH2", "DL1"},
1032 {"ADDA_DL_CH1", "DL12_CH1", "DL12"},
1033 {"ADDA_DL_CH2", "DL12_CH2", "DL12"},
1035 {"ADDA_DL_CH1", "DL6_CH1", "DL6"},
1036 {"ADDA_DL_CH2", "DL6_CH2", "DL6"},
1038 {"ADDA_DL_CH1", "DL8_CH1", "DL8"},
1039 {"ADDA_DL_CH2", "DL8_CH2", "DL8"},
1041 {"ADDA_DL_CH1", "DL2_CH1", "DL2"},
1042 {"ADDA_DL_CH2", "DL2_CH1", "DL2"},
1043 {"ADDA_DL_CH2", "DL2_CH2", "DL2"},
1045 {"ADDA_DL_CH1", "DL3_CH1", "DL3"},
1046 {"ADDA_DL_CH2", "DL3_CH1", "DL3"},
1047 {"ADDA_DL_CH2", "DL3_CH2", "DL3"},
1049 {"ADDA_DL_CH1", "DL4_CH1", "DL4"},
1050 {"ADDA_DL_CH2", "DL4_CH2", "DL4"},
1052 {"ADDA_DL_CH1", "DL5_CH1", "DL5"},
1053 {"ADDA_DL_CH2", "DL5_CH2", "DL5"},
1055 {"ADDA Playback", NULL, "ADDA_DL_CH1"},
1056 {"ADDA Playback", NULL, "ADDA_DL_CH2"},
1058 {"ADDA Playback", NULL, "ADDA Enable"},
1059 {"ADDA Playback", NULL, "ADDA Playback Enable"},
1061 {"ADDA_DL_CH3", "DL1_CH1", "DL1"},
1062 {"ADDA_DL_CH4", "DL1_CH1", "DL1"},
1063 {"ADDA_DL_CH4", "DL1_CH2", "DL1"},
1065 {"ADDA_DL_CH3", "DL12_CH1", "DL12"},
1066 {"ADDA_DL_CH4", "DL12_CH2", "DL12"},
1068 {"ADDA_DL_CH3", "DL6_CH1", "DL6"},
1069 {"ADDA_DL_CH4", "DL6_CH2", "DL6"},
1071 {"ADDA_DL_CH3", "DL2_CH1", "DL2"},
1072 {"ADDA_DL_CH4", "DL2_CH1", "DL2"},
1073 {"ADDA_DL_CH4", "DL2_CH2", "DL2"},
1075 {"ADDA_DL_CH3", "DL3_CH1", "DL3"},
1076 {"ADDA_DL_CH4", "DL3_CH1", "DL3"},
1077 {"ADDA_DL_CH4", "DL3_CH2", "DL3"},
1079 {"ADDA_DL_CH3", "DL4_CH1", "DL4"},
1080 {"ADDA_DL_CH4", "DL4_CH2", "DL4"},
1082 {"ADDA_DL_CH3", "DL5_CH1", "DL5"},
1083 {"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1085 {"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1086 {"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1088 {"ADDA CH34 Playback", NULL, "ADDA Enable"},
1089 {"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1092 {"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1093 {"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1095 {"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1096 {"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1098 {"ADDA Capture", NULL, "ADDA Enable"},
1099 {"ADDA Capture", NULL, "ADDA Capture Enable"},
1100 {"ADDA Capture", NULL, "AUD_PAD_TOP"},
1101 {"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
1103 {"AP DMIC Capture", NULL, "ADDA Enable"},
1104 {"AP DMIC Capture", NULL, "ADDA Capture Enable"},
1105 {"AP DMIC Capture", NULL, "ADDA_FIFO"},
1106 {"AP DMIC Capture", NULL, "AP_DMIC_EN"},
1108 {"ADDA CH34 Capture", NULL, "ADDA Enable"},
1109 {"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1110 {"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
1111 {"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
1113 {"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
1114 {"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1115 {"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
1116 {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
1118 {"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1119 {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1121 /* sidetone filter */
1122 {"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1123 {"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1125 {"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1126 {"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1127 {"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1129 {"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
1130 {"STF_OUTPUT", NULL, "Sidetone Filter"},
1131 {"ADDA Playback", NULL, "Sidetone Filter"},
1132 {"ADDA CH34 Playback", NULL, "Sidetone Filter"},
1135 {"ADDA Playback", NULL, "aud_dac_clk"},
1136 {"ADDA Playback", NULL, "aud_dac_predis_clk"},
1138 {"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1139 {"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1141 {"ADDA Capture Enable", NULL, "aud_adc_clk"},
1142 {"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1146 static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
1147 struct snd_pcm_hw_params *params,
1148 struct snd_soc_dai *dai)
1150 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1151 unsigned int rate = params_rate(params);
1154 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1155 unsigned int dl_src2_con0 = 0;
1156 unsigned int dl_src2_con1 = 0;
1158 /* set sampling rate */
1159 dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1160 DL_2_INPUT_MODE_CTL_SFT;
1162 /* set output mode, UP_SAMPLING_RATE_X8 */
1163 dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1165 /* turn off mute function */
1166 dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
1167 dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
1169 /* set voice input data if input sample rate is 8k or 16k */
1170 if (rate == 8000 || rate == 16000)
1171 dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1173 /* SA suggest apply -0.3db to audio/speech path */
1174 dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1175 DL_2_GAIN_CTL_PRE_SFT;
1177 /* turn on down-link gain */
1178 dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1180 if (id == MT8192_DAI_ADDA) {
1181 /* clean predistortion */
1182 regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
1183 regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
1185 regmap_write(afe->regmap,
1186 AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
1187 regmap_write(afe->regmap,
1188 AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
1191 regmap_update_bits(afe->regmap,
1192 AFE_ADDA_DL_SDM_DCCOMP_CON,
1193 ATTGAIN_CTL_MASK_SFT,
1194 AUDIO_SDM_LEVEL_NORMAL <<
1198 regmap_update_bits(afe->regmap,
1199 AFE_ADDA_DL_SDM_DCCOMP_CON,
1200 USE_3RD_SDM_MASK_SFT,
1201 AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1203 /* sdm auto reset */
1204 regmap_write(afe->regmap,
1205 AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1206 SDM_AUTO_RESET_THRESHOLD);
1207 regmap_update_bits(afe->regmap,
1208 AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1209 ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1210 0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
1212 /* clean predistortion */
1213 regmap_write(afe->regmap,
1214 AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
1215 regmap_write(afe->regmap,
1216 AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
1218 regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1220 regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1224 regmap_update_bits(afe->regmap,
1225 AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1226 ATTGAIN_CTL_MASK_SFT,
1227 AUDIO_SDM_LEVEL_NORMAL <<
1231 regmap_update_bits(afe->regmap,
1232 AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1233 USE_3RD_SDM_MASK_SFT,
1234 AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1236 /* sdm auto reset */
1237 regmap_write(afe->regmap,
1238 AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1239 SDM_AUTO_RESET_THRESHOLD);
1240 regmap_update_bits(afe->regmap,
1241 AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1242 ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1243 0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
1246 unsigned int voice_mode = 0;
1247 unsigned int ul_src_con0 = 0; /* default value */
1249 voice_mode = adda_ul_rate_transform(afe, rate);
1251 ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1254 ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
1255 UL_IIR_ON_TMP_CTL_MASK_SFT;
1256 ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
1257 UL_IIRMODE_CTL_MASK_SFT;
1260 case MT8192_DAI_ADDA:
1261 case MT8192_DAI_AP_DMIC:
1263 regmap_write(afe->regmap,
1264 AFE_ADDA_IIR_COEF_02_01, 0x00000000);
1265 regmap_write(afe->regmap,
1266 AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
1267 regmap_write(afe->regmap,
1268 AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
1269 regmap_write(afe->regmap,
1270 AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
1271 regmap_write(afe->regmap,
1272 AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
1274 regmap_write(afe->regmap,
1275 AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1277 /* Using Internal ADC */
1278 regmap_update_bits(afe->regmap,
1283 /* mtkaif_rxif_data_mode = 0, amic */
1284 regmap_update_bits(afe->regmap,
1285 AFE_ADDA_MTKAIF_RX_CFG0,
1289 case MT8192_DAI_ADDA_CH34:
1290 case MT8192_DAI_AP_DMIC_CH34:
1292 regmap_write(afe->regmap,
1293 AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
1294 regmap_write(afe->regmap,
1295 AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
1296 regmap_write(afe->regmap,
1297 AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
1298 regmap_write(afe->regmap,
1299 AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
1300 regmap_write(afe->regmap,
1301 AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
1303 regmap_write(afe->regmap,
1304 AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1306 /* Using Internal ADC */
1307 regmap_update_bits(afe->regmap,
1312 /* mtkaif_rxif_data_mode = 0, amic */
1313 regmap_update_bits(afe->regmap,
1314 AFE_ADDA6_MTKAIF_RX_CFG0,
1324 case MT8192_DAI_AP_DMIC:
1325 case MT8192_DAI_AP_DMIC_CH34:
1326 mtk_adda_ul_src_dmic(afe, id);
1336 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1337 .hw_params = mtk_dai_adda_hw_params,
1341 #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1342 SNDRV_PCM_RATE_96000 |\
1343 SNDRV_PCM_RATE_192000)
1345 #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
1346 SNDRV_PCM_RATE_16000 |\
1347 SNDRV_PCM_RATE_32000 |\
1348 SNDRV_PCM_RATE_48000 |\
1349 SNDRV_PCM_RATE_96000 |\
1350 SNDRV_PCM_RATE_192000)
1352 #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1353 SNDRV_PCM_FMTBIT_S24_LE |\
1354 SNDRV_PCM_FMTBIT_S32_LE)
1356 static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1359 .id = MT8192_DAI_ADDA,
1361 .stream_name = "ADDA Playback",
1364 .rates = MTK_ADDA_PLAYBACK_RATES,
1365 .formats = MTK_ADDA_FORMATS,
1368 .stream_name = "ADDA Capture",
1371 .rates = MTK_ADDA_CAPTURE_RATES,
1372 .formats = MTK_ADDA_FORMATS,
1374 .ops = &mtk_dai_adda_ops,
1377 .name = "ADDA_CH34",
1378 .id = MT8192_DAI_ADDA_CH34,
1380 .stream_name = "ADDA CH34 Playback",
1383 .rates = MTK_ADDA_PLAYBACK_RATES,
1384 .formats = MTK_ADDA_FORMATS,
1387 .stream_name = "ADDA CH34 Capture",
1390 .rates = MTK_ADDA_CAPTURE_RATES,
1391 .formats = MTK_ADDA_FORMATS,
1393 .ops = &mtk_dai_adda_ops,
1397 .id = MT8192_DAI_AP_DMIC,
1399 .stream_name = "AP DMIC Capture",
1402 .rates = MTK_ADDA_CAPTURE_RATES,
1403 .formats = MTK_ADDA_FORMATS,
1405 .ops = &mtk_dai_adda_ops,
1408 .name = "AP_DMIC_CH34",
1409 .id = MT8192_DAI_AP_DMIC_CH34,
1411 .stream_name = "AP DMIC CH34 Capture",
1414 .rates = MTK_ADDA_CAPTURE_RATES,
1415 .formats = MTK_ADDA_FORMATS,
1417 .ops = &mtk_dai_adda_ops,
1421 int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1423 struct mtk_base_afe_dai *dai;
1424 struct mt8192_afe_private *afe_priv = afe->platform_priv;
1426 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1430 list_add(&dai->list, &afe->sub_dais);
1432 dai->dai_drivers = mtk_dai_adda_driver;
1433 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1435 dai->controls = mtk_adda_controls;
1436 dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
1437 dai->dapm_widgets = mtk_dai_adda_widgets;
1438 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
1439 dai->dapm_routes = mtk_dai_adda_routes;
1440 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
1442 /* ap dmic priv share with adda */
1443 afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
1444 afe_priv->dai_priv[MT8192_DAI_ADDA];
1445 afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
1446 afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];