xref: /linux/sound/soc/mediatek/mt8192/mt8192-dai-adda.c (revision 33e02dc69afbd8f1b85a51d74d72f139ba4ca623)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // MediaTek ALSA SoC Audio DAI ADDA Control
4 //
5 // Copyright (c) 2020 MediaTek Inc.
6 // Author: Shane Chien <shane.chien@mediatek.com>
7 //
8 
9 #include <linux/delay.h>
10 #include <linux/regmap.h>
11 
12 #include "mt8192-afe-clk.h"
13 #include "mt8192-afe-common.h"
14 #include "mt8192-afe-gpio.h"
15 #include "mt8192-interconnection.h"
16 #include "../common/mtk-dai-adda-common.h"
17 
18 enum {
19 	UL_IIR_SW = 0,
20 	UL_IIR_5HZ,
21 	UL_IIR_10HZ,
22 	UL_IIR_25HZ,
23 	UL_IIR_50HZ,
24 	UL_IIR_75HZ,
25 };
26 
27 enum {
28 	AUDIO_SDM_LEVEL_MUTE = 0,
29 	AUDIO_SDM_LEVEL_NORMAL = 0x1d,
30 	/* if you change level normal */
31 	/* you need to change formula of hp impedance and dc trim too */
32 };
33 
34 enum {
35 	AUDIO_SDM_2ND = 0,
36 	AUDIO_SDM_3RD,
37 };
38 
39 #define SDM_AUTO_RESET_THRESHOLD 0x190000
40 
41 /* dai component */
42 static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
43 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
44 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
45 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
46 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
47 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
48 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
49 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
50 	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
51 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
52 				    I_ADDA_UL_CH3, 1, 0),
53 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
54 				    I_ADDA_UL_CH2, 1, 0),
55 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
56 				    I_ADDA_UL_CH1, 1, 0),
57 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
58 				    I_GAIN1_OUT_CH1, 1, 0),
59 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
60 				    I_PCM_1_CAP_CH1, 1, 0),
61 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
62 				    I_PCM_2_CAP_CH1, 1, 0),
63 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
64 				    I_SRC_1_OUT_CH1, 1, 0),
65 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
66 				    I_SRC_2_OUT_CH1, 1, 0),
67 };
68 
69 static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
70 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
71 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
72 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
73 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
74 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
75 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
76 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
77 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
78 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
79 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
80 	SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
81 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
82 				    I_ADDA_UL_CH3, 1, 0),
83 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
84 				    I_ADDA_UL_CH2, 1, 0),
85 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
86 				    I_ADDA_UL_CH1, 1, 0),
87 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
88 				    I_GAIN1_OUT_CH2, 1, 0),
89 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
90 				    I_PCM_1_CAP_CH1, 1, 0),
91 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
92 				    I_PCM_2_CAP_CH1, 1, 0),
93 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
94 				    I_PCM_1_CAP_CH2, 1, 0),
95 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
96 				    I_PCM_2_CAP_CH2, 1, 0),
97 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
98 				    I_SRC_1_OUT_CH2, 1, 0),
99 	SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
100 				    I_SRC_2_OUT_CH2, 1, 0),
101 };
102 
103 static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
104 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
105 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
106 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
107 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
108 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
109 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
110 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
111 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
112 				    I_ADDA_UL_CH3, 1, 0),
113 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
114 				    I_ADDA_UL_CH2, 1, 0),
115 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
116 				    I_ADDA_UL_CH1, 1, 0),
117 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
118 				    I_GAIN1_OUT_CH1, 1, 0),
119 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
120 				    I_PCM_1_CAP_CH1, 1, 0),
121 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
122 				    I_PCM_2_CAP_CH1, 1, 0),
123 };
124 
125 static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
126 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
127 	SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
128 	SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
129 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
130 	SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
131 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
132 	SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
133 	SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
134 	SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
135 	SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
136 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
137 				    I_ADDA_UL_CH3, 1, 0),
138 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
139 				    I_ADDA_UL_CH2, 1, 0),
140 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
141 				    I_ADDA_UL_CH1, 1, 0),
142 	SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
143 				    I_GAIN1_OUT_CH2, 1, 0),
144 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
145 				    I_PCM_1_CAP_CH1, 1, 0),
146 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
147 				    I_PCM_2_CAP_CH1, 1, 0),
148 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
149 				    I_PCM_1_CAP_CH2, 1, 0),
150 	SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
151 				    I_PCM_2_CAP_CH2, 1, 0),
152 };
153 
154 static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
155 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
156 				    I_ADDA_UL_CH1, 1, 0),
157 };
158 
159 static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
160 	SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
161 				    I_ADDA_UL_CH2, 1, 0),
162 };
163 
164 enum {
165 	SUPPLY_SEQ_ADDA_AFE_ON,
166 	SUPPLY_SEQ_ADDA_DL_ON,
167 	SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
168 	SUPPLY_SEQ_ADDA_MTKAIF_CFG,
169 	SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
170 	SUPPLY_SEQ_ADDA_FIFO,
171 	SUPPLY_SEQ_ADDA_AP_DMIC,
172 	SUPPLY_SEQ_ADDA_UL_ON,
173 };
174 
mtk_adda_ul_src_dmic(struct mtk_base_afe * afe,int id)175 static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
176 {
177 	unsigned int reg;
178 
179 	switch (id) {
180 	case MT8192_DAI_ADDA:
181 	case MT8192_DAI_AP_DMIC:
182 		reg = AFE_ADDA_UL_SRC_CON0;
183 		break;
184 	case MT8192_DAI_ADDA_CH34:
185 	case MT8192_DAI_AP_DMIC_CH34:
186 		reg = AFE_ADDA6_UL_SRC_CON0;
187 		break;
188 	default:
189 		return -EINVAL;
190 	}
191 
192 	/* dmic mode, 3.25M*/
193 	regmap_update_bits(afe->regmap, reg,
194 			   DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
195 			   0x0);
196 	regmap_update_bits(afe->regmap, reg,
197 			   DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
198 			   0x0);
199 
200 	/* turn on dmic, ch1, ch2 */
201 	regmap_update_bits(afe->regmap, reg,
202 			   UL_SDM_3_LEVEL_CTL_MASK_SFT,
203 			   0x1 << UL_SDM_3_LEVEL_CTL_SFT);
204 	regmap_update_bits(afe->regmap, reg,
205 			   UL_MODE_3P25M_CH1_CTL_MASK_SFT,
206 			   0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
207 	regmap_update_bits(afe->regmap, reg,
208 			   UL_MODE_3P25M_CH2_CTL_MASK_SFT,
209 			   0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
210 	return 0;
211 }
212 
mtk_adda_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)213 static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
214 			     struct snd_kcontrol *kcontrol,
215 			     int event)
216 {
217 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
218 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
219 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
220 	int mtkaif_dmic = afe_priv->mtkaif_dmic;
221 
222 	switch (event) {
223 	case SND_SOC_DAPM_PRE_PMU:
224 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
225 
226 		/* update setting to dmic */
227 		if (mtkaif_dmic) {
228 			/* mtkaif_rxif_data_mode = 1, dmic */
229 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
230 					   0x1, 0x1);
231 
232 			/* dmic mode, 3.25M*/
233 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
234 					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
235 					   0x0);
236 			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
237 		}
238 		break;
239 	case SND_SOC_DAPM_POST_PMD:
240 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
241 		usleep_range(125, 135);
242 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
243 		break;
244 	default:
245 		break;
246 	}
247 
248 	return 0;
249 }
250 
mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)251 static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
252 				  struct snd_kcontrol *kcontrol,
253 				  int event)
254 {
255 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
256 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
257 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
258 	int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
259 	int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
260 
261 	switch (event) {
262 	case SND_SOC_DAPM_PRE_PMU:
263 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
264 					1);
265 
266 		/* update setting to dmic */
267 		if (mtkaif_dmic) {
268 			/* mtkaif_rxif_data_mode = 1, dmic */
269 			regmap_update_bits(afe->regmap,
270 					   AFE_ADDA6_MTKAIF_RX_CFG0,
271 					   0x1, 0x1);
272 
273 			/* dmic mode, 3.25M*/
274 			regmap_update_bits(afe->regmap,
275 					   AFE_ADDA6_MTKAIF_RX_CFG0,
276 					   MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
277 					   0x0);
278 			mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
279 		}
280 
281 		/* when using adda6 without adda enabled,
282 		 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
283 		 * data cannot be received.
284 		 */
285 		if (mtkaif_adda6_only) {
286 			regmap_update_bits(afe->regmap,
287 					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
288 					   0x1 << 23, 0x1 << 23);
289 		}
290 		break;
291 	case SND_SOC_DAPM_POST_PMD:
292 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
293 		usleep_range(125, 135);
294 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
295 					1);
296 
297 		/* reset dmic */
298 		afe_priv->mtkaif_dmic_ch34 = 0;
299 
300 		if (mtkaif_adda6_only) {
301 			regmap_update_bits(afe->regmap,
302 					   AFE_ADDA_MTKAIF_SYNCWORD_CFG,
303 					   0x1 << 23, 0x0 << 23);
304 		}
305 		break;
306 	default:
307 		break;
308 	}
309 
310 	return 0;
311 }
312 
mtk_adda_pad_top_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)313 static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
314 				  struct snd_kcontrol *kcontrol,
315 				  int event)
316 {
317 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
318 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
319 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
320 
321 	switch (event) {
322 	case SND_SOC_DAPM_PRE_PMU:
323 		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
324 			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
325 		else
326 			regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
327 		break;
328 	default:
329 		break;
330 	}
331 
332 	return 0;
333 }
334 
mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)335 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
336 				     struct snd_kcontrol *kcontrol,
337 				     int event)
338 {
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 delay_data;
343 	int delay_cycle;
344 
345 	switch (event) {
346 	case SND_SOC_DAPM_PRE_PMU:
347 		if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
348 			/* set protocol 2 */
349 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
350 				     0x00010000);
351 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
352 				     0x00010000);
353 
354 			if (snd_soc_dapm_widget_name_cmp(w, "ADDA_MTKAIF_CFG") == 0 &&
355 			    (afe_priv->mtkaif_chosen_phase[0] < 0 ||
356 			     afe_priv->mtkaif_chosen_phase[1] < 0)) {
357 				dev_warn(afe->dev,
358 					 "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
359 					 __func__,
360 					 afe_priv->mtkaif_chosen_phase[0],
361 					 afe_priv->mtkaif_chosen_phase[1]);
362 				break;
363 			} else if (snd_soc_dapm_widget_name_cmp(w, "ADDA6_MTKAIF_CFG") == 0 &&
364 				   afe_priv->mtkaif_chosen_phase[2] < 0) {
365 				dev_warn(afe->dev,
366 					 "%s(), mtkaif_chosen_phase[2]:%d\n",
367 					 __func__,
368 					 afe_priv->mtkaif_chosen_phase[2]);
369 				break;
370 			}
371 
372 			/* mtkaif_rxif_clkinv_adc inverse for calibration */
373 			regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
374 					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
375 					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
376 			regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
377 					   MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
378 					   0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
379 
380 			/* set delay for ch12 */
381 			if (afe_priv->mtkaif_phase_cycle[0] >=
382 			    afe_priv->mtkaif_phase_cycle[1]) {
383 				delay_data = DELAY_DATA_MISO1;
384 				delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
385 					      afe_priv->mtkaif_phase_cycle[1];
386 			} else {
387 				delay_data = DELAY_DATA_MISO2;
388 				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
389 					      afe_priv->mtkaif_phase_cycle[0];
390 			}
391 
392 			regmap_update_bits(afe->regmap,
393 					   AFE_ADDA_MTKAIF_RX_CFG2,
394 					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
395 					   delay_data <<
396 					   MTKAIF_RXIF_DELAY_DATA_SFT);
397 
398 			regmap_update_bits(afe->regmap,
399 					   AFE_ADDA_MTKAIF_RX_CFG2,
400 					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
401 					   delay_cycle <<
402 					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
403 
404 			/* set delay between ch3 and ch2 */
405 			if (afe_priv->mtkaif_phase_cycle[2] >=
406 			    afe_priv->mtkaif_phase_cycle[1]) {
407 				delay_data = DELAY_DATA_MISO1;	/* ch3 */
408 				delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
409 					      afe_priv->mtkaif_phase_cycle[1];
410 			} else {
411 				delay_data = DELAY_DATA_MISO2;	/* ch2 */
412 				delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
413 					      afe_priv->mtkaif_phase_cycle[2];
414 			}
415 
416 			regmap_update_bits(afe->regmap,
417 					   AFE_ADDA6_MTKAIF_RX_CFG2,
418 					   MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
419 					   delay_data <<
420 					   MTKAIF_RXIF_DELAY_DATA_SFT);
421 			regmap_update_bits(afe->regmap,
422 					   AFE_ADDA6_MTKAIF_RX_CFG2,
423 					   MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
424 					   delay_cycle <<
425 					   MTKAIF_RXIF_DELAY_CYCLE_SFT);
426 		} else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
427 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
428 				     0x00010000);
429 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
430 				     0x00010000);
431 		} else {
432 			regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
433 			regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
434 		}
435 		break;
436 	default:
437 		break;
438 	}
439 
440 	return 0;
441 }
442 
mtk_adda_dl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)443 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
444 			     struct snd_kcontrol *kcontrol,
445 			     int event)
446 {
447 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
448 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
449 
450 	switch (event) {
451 	case SND_SOC_DAPM_PRE_PMU:
452 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
453 		break;
454 	case SND_SOC_DAPM_POST_PMD:
455 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
456 		usleep_range(125, 135);
457 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
458 		break;
459 	default:
460 		break;
461 	}
462 
463 	return 0;
464 }
465 
mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)466 static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
467 				  struct snd_kcontrol *kcontrol,
468 				  int event)
469 {
470 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
471 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
472 
473 	switch (event) {
474 	case SND_SOC_DAPM_PRE_PMU:
475 		mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
476 					0);
477 		break;
478 	case SND_SOC_DAPM_POST_PMD:
479 		/* should delayed 1/fs(smallest is 8k) = 125us before afe off */
480 		usleep_range(125, 135);
481 		mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
482 					0);
483 		break;
484 	default:
485 		break;
486 	}
487 
488 	return 0;
489 }
490 
491 /* stf */
stf_positive_gain_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)492 static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
493 				 struct snd_ctl_elem_value *ucontrol)
494 {
495 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
496 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
497 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
498 
499 	ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
500 	return 0;
501 }
502 
stf_positive_gain_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)503 static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
504 				 struct snd_ctl_elem_value *ucontrol)
505 {
506 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
507 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
508 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
509 	int gain_db = ucontrol->value.integer.value[0];
510 	bool change = false;
511 
512 	afe_priv->stf_positive_gain_db = gain_db;
513 
514 	if (gain_db >= 0 && gain_db <= 24) {
515 		regmap_update_bits_check(afe->regmap,
516 					 AFE_SIDETONE_GAIN,
517 					 POSITIVE_GAIN_MASK_SFT,
518 					 (gain_db / 6) << POSITIVE_GAIN_SFT,
519 					 &change);
520 	} else {
521 		return -EINVAL;
522 	}
523 
524 	return change;
525 }
526 
mt8192_adda_dmic_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)527 static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
528 				struct snd_ctl_elem_value *ucontrol)
529 {
530 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
531 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
532 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
533 
534 	ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
535 	return 0;
536 }
537 
mt8192_adda_dmic_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)538 static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
539 				struct snd_ctl_elem_value *ucontrol)
540 {
541 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
542 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
543 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
544 	int dmic_on;
545 	bool change;
546 
547 	dmic_on = ucontrol->value.integer.value[0];
548 
549 	change = (afe_priv->mtkaif_dmic != dmic_on) ||
550 		(afe_priv->mtkaif_dmic_ch34 != dmic_on);
551 
552 	afe_priv->mtkaif_dmic = dmic_on;
553 	afe_priv->mtkaif_dmic_ch34 = dmic_on;
554 
555 	return change;
556 }
557 
mt8192_adda6_only_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)558 static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
559 				 struct snd_ctl_elem_value *ucontrol)
560 {
561 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
562 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
563 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
564 
565 	ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
566 	return 0;
567 }
568 
mt8192_adda6_only_set(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)569 static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
570 				 struct snd_ctl_elem_value *ucontrol)
571 {
572 	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
573 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
574 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
575 	int mtkaif_adda6_only;
576 	bool change;
577 
578 	mtkaif_adda6_only = ucontrol->value.integer.value[0];
579 
580 	change = afe_priv->mtkaif_adda6_only != mtkaif_adda6_only;
581 	afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
582 
583 	return change;
584 }
585 
586 static const struct snd_kcontrol_new mtk_adda_controls[] = {
587 	SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
588 		   SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
589 	SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 24, 0,
590 		       stf_positive_gain_get, stf_positive_gain_set),
591 	SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
592 		   DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
593 	SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
594 			    mt8192_adda_dmic_get, mt8192_adda_dmic_set),
595 	SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
596 			    mt8192_adda6_only_get, mt8192_adda6_only_set),
597 };
598 
599 static const struct snd_kcontrol_new stf_ctl =
600 	SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
601 
602 static const u16 stf_coeff_table_16k[] = {
603 	0x049C, 0x09E8, 0x09E0, 0x089C,
604 	0xFF54, 0xF488, 0xEAFC, 0xEBAC,
605 	0xfA40, 0x17AC, 0x3D1C, 0x6028,
606 	0x7538
607 };
608 
609 static const u16 stf_coeff_table_32k[] = {
610 	0xFE52, 0x0042, 0x00C5, 0x0194,
611 	0x029A, 0x03B7, 0x04BF, 0x057D,
612 	0x05BE, 0x0555, 0x0426, 0x0230,
613 	0xFF92, 0xFC89, 0xF973, 0xF6C6,
614 	0xF500, 0xF49D, 0xF603, 0xF970,
615 	0xFEF3, 0x065F, 0x0F4F, 0x1928,
616 	0x2329, 0x2C80, 0x345E, 0x3A0D,
617 	0x3D08
618 };
619 
620 static const u16 stf_coeff_table_48k[] = {
621 	0x0401, 0xFFB0, 0xFF5A, 0xFECE,
622 	0xFE10, 0xFD28, 0xFC21, 0xFB08,
623 	0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
624 	0xF724, 0xF746, 0xF7E6, 0xF90F,
625 	0xFACC, 0xFD1E, 0xFFFF, 0x0364,
626 	0x0737, 0x0B62, 0x0FC1, 0x1431,
627 	0x188A, 0x1CA4, 0x2056, 0x237D,
628 	0x25F9, 0x27B0, 0x2890
629 };
630 
mtk_stf_event(struct snd_soc_dapm_widget * w,struct snd_kcontrol * kcontrol,int event)631 static int mtk_stf_event(struct snd_soc_dapm_widget *w,
632 			 struct snd_kcontrol *kcontrol,
633 			 int event)
634 {
635 	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
636 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
637 
638 	size_t half_tap_num;
639 	const u16 *stf_coeff_table;
640 	unsigned int ul_rate, reg_value;
641 	size_t coef_addr;
642 
643 	regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
644 	ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
645 	ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
646 
647 	if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
648 		half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
649 		stf_coeff_table = stf_coeff_table_48k;
650 	} else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
651 		half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
652 		stf_coeff_table = stf_coeff_table_32k;
653 	} else {
654 		half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
655 		stf_coeff_table = stf_coeff_table_16k;
656 	}
657 
658 	regmap_read(afe->regmap, AFE_SIDETONE_CON1, &reg_value);
659 
660 	switch (event) {
661 	case SND_SOC_DAPM_PRE_PMU:
662 		/* set side tone gain = 0 */
663 		regmap_update_bits(afe->regmap,
664 				   AFE_SIDETONE_GAIN,
665 				   SIDE_TONE_GAIN_MASK_SFT,
666 				   0);
667 		regmap_update_bits(afe->regmap,
668 				   AFE_SIDETONE_GAIN,
669 				   POSITIVE_GAIN_MASK_SFT,
670 				   0);
671 		/* don't bypass stf */
672 		regmap_update_bits(afe->regmap,
673 				   AFE_SIDETONE_CON1,
674 				   0x1f << 27,
675 				   0x0);
676 		/* set stf half tap num */
677 		regmap_update_bits(afe->regmap,
678 				   AFE_SIDETONE_CON1,
679 				   SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
680 				   half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
681 
682 		/* set side tone coefficient */
683 		regmap_read(afe->regmap, AFE_SIDETONE_CON0, &reg_value);
684 		for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
685 			bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
686 			bool new_w_ready = 0;
687 			int try_cnt = 0;
688 
689 			regmap_update_bits(afe->regmap,
690 					   AFE_SIDETONE_CON0,
691 					   0x39FFFFF,
692 					   (1 << R_W_EN_SFT) |
693 					   (1 << R_W_SEL_SFT) |
694 					   (0 << SEL_CH2_SFT) |
695 					   (coef_addr <<
696 					   SIDE_TONE_COEFFICIENT_ADDR_SFT) |
697 					   stf_coeff_table[coef_addr]);
698 
699 			/* wait until flag write_ready changed */
700 			for (try_cnt = 0; try_cnt < 10; try_cnt++) {
701 				regmap_read(afe->regmap,
702 					    AFE_SIDETONE_CON0, &reg_value);
703 				new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
704 
705 				/* flip => ok */
706 				if (new_w_ready == old_w_ready) {
707 					udelay(3);
708 					if (try_cnt == 9) {
709 						dev_warn(afe->dev,
710 							 "%s(), write coeff not ready",
711 							 __func__);
712 					}
713 				} else {
714 					break;
715 				}
716 			}
717 			/* need write -> read -> write to write next coeff */
718 			regmap_update_bits(afe->regmap,
719 					   AFE_SIDETONE_CON0,
720 					   R_W_SEL_MASK_SFT,
721 					   0x0);
722 		}
723 		break;
724 	case SND_SOC_DAPM_POST_PMD:
725 		/* bypass stf */
726 		regmap_update_bits(afe->regmap,
727 				   AFE_SIDETONE_CON1,
728 				   0x1f << 27,
729 				   0x1f << 27);
730 
731 		/* set side tone gain = 0 */
732 		regmap_update_bits(afe->regmap,
733 				   AFE_SIDETONE_GAIN,
734 				   SIDE_TONE_GAIN_MASK_SFT,
735 				   0);
736 		regmap_update_bits(afe->regmap,
737 				   AFE_SIDETONE_GAIN,
738 				   POSITIVE_GAIN_MASK_SFT,
739 				   0);
740 		break;
741 	default:
742 		break;
743 	}
744 
745 	return 0;
746 }
747 
748 /* stf mux */
749 enum {
750 	STF_SRC_ADDA_ADDA6 = 0,
751 	STF_SRC_O19O20,
752 };
753 
754 static const char *const stf_o19o20_mux_map[] = {
755 	"ADDA_ADDA6",
756 	"O19O20",
757 };
758 
759 static int stf_o19o20_mux_map_value[] = {
760 	STF_SRC_ADDA_ADDA6,
761 	STF_SRC_O19O20,
762 };
763 
764 static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
765 				  AFE_SIDETONE_CON1,
766 				  STF_SOURCE_FROM_O19O20_SFT,
767 				  STF_SOURCE_FROM_O19O20_MASK,
768 				  stf_o19o20_mux_map,
769 				  stf_o19o20_mux_map_value);
770 
771 static const struct snd_kcontrol_new stf_o19O20_mux_control =
772 	SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
773 
774 enum {
775 	STF_SRC_ADDA = 0,
776 	STF_SRC_ADDA6,
777 };
778 
779 static const char *const stf_adda_mux_map[] = {
780 	"ADDA",
781 	"ADDA6",
782 };
783 
784 static int stf_adda_mux_map_value[] = {
785 	STF_SRC_ADDA,
786 	STF_SRC_ADDA6,
787 };
788 
789 static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
790 				  AFE_SIDETONE_CON1,
791 				  STF_O19O20_OUT_EN_SEL_SFT,
792 				  STF_O19O20_OUT_EN_SEL_MASK,
793 				  stf_adda_mux_map,
794 				  stf_adda_mux_map_value);
795 
796 static const struct snd_kcontrol_new stf_adda_mux_control =
797 	SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
798 
799 /* ADDA UL MUX */
800 enum {
801 	ADDA_UL_MUX_MTKAIF = 0,
802 	ADDA_UL_MUX_AP_DMIC,
803 	ADDA_UL_MUX_MASK = 0x1,
804 };
805 
806 static const char * const adda_ul_mux_map[] = {
807 	"MTKAIF", "AP_DMIC"
808 };
809 
810 static int adda_ul_map_value[] = {
811 	ADDA_UL_MUX_MTKAIF,
812 	ADDA_UL_MUX_AP_DMIC,
813 };
814 
815 static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
816 				  SND_SOC_NOPM,
817 				  0,
818 				  ADDA_UL_MUX_MASK,
819 				  adda_ul_mux_map,
820 				  adda_ul_map_value);
821 
822 static const struct snd_kcontrol_new adda_ul_mux_control =
823 	SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
824 
825 static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
826 	SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
827 
828 static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
829 	/* inter-connections */
830 	SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
831 			   mtk_adda_dl_ch1_mix,
832 			   ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
833 	SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
834 			   mtk_adda_dl_ch2_mix,
835 			   ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
836 
837 	SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
838 			   mtk_adda_dl_ch3_mix,
839 			   ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
840 	SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
841 			   mtk_adda_dl_ch4_mix,
842 			   ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
843 
844 	SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
845 			      AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
846 			      NULL, 0),
847 
848 	SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
849 			      AFE_ADDA_DL_SRC2_CON0,
850 			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
851 			      mtk_adda_dl_event,
852 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
853 	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
854 			      SUPPLY_SEQ_ADDA_DL_ON,
855 			      AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
856 			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
857 			      mtk_adda_ch34_dl_event,
858 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
859 
860 	SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
861 			      AFE_ADDA_UL_SRC_CON0,
862 			      UL_SRC_ON_TMP_CTL_SFT, 0,
863 			      mtk_adda_ul_event,
864 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
865 	SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
866 			      AFE_ADDA6_UL_SRC_CON0,
867 			      UL_SRC_ON_TMP_CTL_SFT, 0,
868 			      mtk_adda_ch34_ul_event,
869 			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
870 
871 	SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
872 			      AFE_AUD_PAD_TOP,
873 			      RG_RX_FIFO_ON_SFT, 0,
874 			      mtk_adda_pad_top_event,
875 			      SND_SOC_DAPM_PRE_PMU),
876 	SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
877 			      SND_SOC_NOPM, 0, 0,
878 			      mtk_adda_mtkaif_cfg_event,
879 			      SND_SOC_DAPM_PRE_PMU),
880 	SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
881 			      SND_SOC_NOPM, 0, 0,
882 			      mtk_adda_mtkaif_cfg_event,
883 			      SND_SOC_DAPM_PRE_PMU),
884 
885 	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
886 			      AFE_ADDA_UL_SRC_CON0,
887 			      UL_AP_DMIC_ON_SFT, 0,
888 			      NULL, 0),
889 	SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
890 			      AFE_ADDA6_UL_SRC_CON0,
891 			      UL_AP_DMIC_ON_SFT, 0,
892 			      NULL, 0),
893 
894 	SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
895 			      AFE_ADDA_UL_DL_CON0,
896 			      AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
897 			      NULL, 0),
898 	SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
899 			      AFE_ADDA_UL_DL_CON0,
900 			      AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
901 			      NULL, 0),
902 
903 	SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
904 			 &adda_ul_mux_control),
905 	SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
906 			 &adda_ch34_ul_mux_control),
907 
908 	SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
909 	SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
910 
911 	/* stf */
912 	SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
913 			      AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
914 			      &stf_ctl,
915 			      mtk_stf_event,
916 			      SND_SOC_DAPM_PRE_PMU |
917 			      SND_SOC_DAPM_POST_PMD),
918 	SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
919 			 &stf_o19O20_mux_control),
920 	SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
921 			 &stf_adda_mux_control),
922 	SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
923 			   mtk_stf_ch1_mix,
924 			   ARRAY_SIZE(mtk_stf_ch1_mix)),
925 	SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
926 			   mtk_stf_ch2_mix,
927 			   ARRAY_SIZE(mtk_stf_ch2_mix)),
928 	SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
929 
930 	/* clock */
931 	SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
932 
933 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
934 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
935 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
936 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
937 
938 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
939 	SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
940 };
941 
942 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
943 	/* playback */
944 	{"ADDA_DL_CH1", "DL1_CH1", "DL1"},
945 	{"ADDA_DL_CH2", "DL1_CH1", "DL1"},
946 	{"ADDA_DL_CH2", "DL1_CH2", "DL1"},
947 
948 	{"ADDA_DL_CH1", "DL12_CH1", "DL12"},
949 	{"ADDA_DL_CH2", "DL12_CH2", "DL12"},
950 
951 	{"ADDA_DL_CH1", "DL6_CH1", "DL6"},
952 	{"ADDA_DL_CH2", "DL6_CH2", "DL6"},
953 
954 	{"ADDA_DL_CH1", "DL8_CH1", "DL8"},
955 	{"ADDA_DL_CH2", "DL8_CH2", "DL8"},
956 
957 	{"ADDA_DL_CH1", "DL2_CH1", "DL2"},
958 	{"ADDA_DL_CH2", "DL2_CH1", "DL2"},
959 	{"ADDA_DL_CH2", "DL2_CH2", "DL2"},
960 
961 	{"ADDA_DL_CH1", "DL3_CH1", "DL3"},
962 	{"ADDA_DL_CH2", "DL3_CH1", "DL3"},
963 	{"ADDA_DL_CH2", "DL3_CH2", "DL3"},
964 
965 	{"ADDA_DL_CH1", "DL4_CH1", "DL4"},
966 	{"ADDA_DL_CH2", "DL4_CH2", "DL4"},
967 
968 	{"ADDA_DL_CH1", "DL5_CH1", "DL5"},
969 	{"ADDA_DL_CH2", "DL5_CH2", "DL5"},
970 
971 	{"ADDA Playback", NULL, "ADDA_DL_CH1"},
972 	{"ADDA Playback", NULL, "ADDA_DL_CH2"},
973 
974 	{"ADDA Playback", NULL, "ADDA Enable"},
975 	{"ADDA Playback", NULL, "ADDA Playback Enable"},
976 
977 	{"ADDA_DL_CH3", "DL1_CH1", "DL1"},
978 	{"ADDA_DL_CH4", "DL1_CH1", "DL1"},
979 	{"ADDA_DL_CH4", "DL1_CH2", "DL1"},
980 
981 	{"ADDA_DL_CH3", "DL12_CH1", "DL12"},
982 	{"ADDA_DL_CH4", "DL12_CH2", "DL12"},
983 
984 	{"ADDA_DL_CH3", "DL6_CH1", "DL6"},
985 	{"ADDA_DL_CH4", "DL6_CH2", "DL6"},
986 
987 	{"ADDA_DL_CH3", "DL2_CH1", "DL2"},
988 	{"ADDA_DL_CH4", "DL2_CH1", "DL2"},
989 	{"ADDA_DL_CH4", "DL2_CH2", "DL2"},
990 
991 	{"ADDA_DL_CH3", "DL3_CH1", "DL3"},
992 	{"ADDA_DL_CH4", "DL3_CH1", "DL3"},
993 	{"ADDA_DL_CH4", "DL3_CH2", "DL3"},
994 
995 	{"ADDA_DL_CH3", "DL4_CH1", "DL4"},
996 	{"ADDA_DL_CH4", "DL4_CH2", "DL4"},
997 
998 	{"ADDA_DL_CH3", "DL5_CH1", "DL5"},
999 	{"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1000 
1001 	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1002 	{"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1003 
1004 	{"ADDA CH34 Playback", NULL, "ADDA Enable"},
1005 	{"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1006 
1007 	/* capture */
1008 	{"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1009 	{"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1010 
1011 	{"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1012 	{"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1013 
1014 	{"ADDA Capture", NULL, "ADDA Enable"},
1015 	{"ADDA Capture", NULL, "ADDA Capture Enable"},
1016 	{"ADDA Capture", NULL, "AUD_PAD_TOP"},
1017 	{"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
1018 
1019 	{"AP DMIC Capture", NULL, "ADDA Enable"},
1020 	{"AP DMIC Capture", NULL, "ADDA Capture Enable"},
1021 	{"AP DMIC Capture", NULL, "ADDA_FIFO"},
1022 	{"AP DMIC Capture", NULL, "AP_DMIC_EN"},
1023 
1024 	{"ADDA CH34 Capture", NULL, "ADDA Enable"},
1025 	{"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1026 	{"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
1027 	{"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
1028 
1029 	{"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
1030 	{"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1031 	{"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
1032 	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
1033 
1034 	{"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1035 	{"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1036 
1037 	/* sidetone filter */
1038 	{"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1039 	{"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1040 
1041 	{"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1042 	{"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1043 	{"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1044 
1045 	{"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
1046 	{"STF_OUTPUT", NULL, "Sidetone Filter"},
1047 	{"ADDA Playback", NULL, "Sidetone Filter"},
1048 	{"ADDA CH34 Playback", NULL, "Sidetone Filter"},
1049 
1050 	/* clk */
1051 	{"ADDA Playback", NULL, "aud_dac_clk"},
1052 	{"ADDA Playback", NULL, "aud_dac_predis_clk"},
1053 
1054 	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1055 	{"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1056 
1057 	{"ADDA Capture Enable", NULL, "aud_adc_clk"},
1058 	{"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1059 };
1060 
1061 /* dai ops */
mtk_dai_adda_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)1062 static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
1063 				  struct snd_pcm_hw_params *params,
1064 				  struct snd_soc_dai *dai)
1065 {
1066 	struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1067 	unsigned int rate = params_rate(params);
1068 	int id = dai->id;
1069 
1070 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1071 		unsigned int dl_src2_con0 = 0;
1072 		unsigned int dl_src2_con1 = 0;
1073 
1074 		/* set sampling rate */
1075 		dl_src2_con0 = mtk_adda_dl_rate_transform(afe, rate) <<
1076 			       DL_2_INPUT_MODE_CTL_SFT;
1077 
1078 		/* set output mode, UP_SAMPLING_RATE_X8 */
1079 		dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1080 
1081 		/* turn off mute function */
1082 		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
1083 		dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
1084 
1085 		/* set voice input data if input sample rate is 8k or 16k */
1086 		if (rate == 8000 || rate == 16000)
1087 			dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1088 
1089 		/* SA suggest apply -0.3db to audio/speech path */
1090 		dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1091 			       DL_2_GAIN_CTL_PRE_SFT;
1092 
1093 		/* turn on down-link gain */
1094 		dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1095 
1096 		if (id == MT8192_DAI_ADDA) {
1097 			/* clean predistortion */
1098 			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
1099 			regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
1100 
1101 			regmap_write(afe->regmap,
1102 				     AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
1103 			regmap_write(afe->regmap,
1104 				     AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
1105 
1106 			/* set sdm gain */
1107 			regmap_update_bits(afe->regmap,
1108 					   AFE_ADDA_DL_SDM_DCCOMP_CON,
1109 					   ATTGAIN_CTL_MASK_SFT,
1110 					   AUDIO_SDM_LEVEL_NORMAL <<
1111 					   ATTGAIN_CTL_SFT);
1112 
1113 			/* 2nd sdm */
1114 			regmap_update_bits(afe->regmap,
1115 					   AFE_ADDA_DL_SDM_DCCOMP_CON,
1116 					   USE_3RD_SDM_MASK_SFT,
1117 					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1118 
1119 			/* sdm auto reset */
1120 			regmap_write(afe->regmap,
1121 				     AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1122 				     SDM_AUTO_RESET_THRESHOLD);
1123 			regmap_update_bits(afe->regmap,
1124 					   AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1125 					   ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1126 					   0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
1127 		} else {
1128 			/* clean predistortion */
1129 			regmap_write(afe->regmap,
1130 				     AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
1131 			regmap_write(afe->regmap,
1132 				     AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
1133 
1134 			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1135 				     dl_src2_con0);
1136 			regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1137 				     dl_src2_con1);
1138 
1139 			/* set sdm gain */
1140 			regmap_update_bits(afe->regmap,
1141 					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1142 					   ATTGAIN_CTL_MASK_SFT,
1143 					   AUDIO_SDM_LEVEL_NORMAL <<
1144 					   ATTGAIN_CTL_SFT);
1145 
1146 			/* 2nd sdm */
1147 			regmap_update_bits(afe->regmap,
1148 					   AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1149 					   USE_3RD_SDM_MASK_SFT,
1150 					   AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1151 
1152 			/* sdm auto reset */
1153 			regmap_write(afe->regmap,
1154 				     AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1155 				     SDM_AUTO_RESET_THRESHOLD);
1156 			regmap_update_bits(afe->regmap,
1157 					   AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1158 					   ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1159 					   0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
1160 		}
1161 	} else {
1162 		unsigned int voice_mode = 0;
1163 		unsigned int ul_src_con0 = 0;	/* default value */
1164 
1165 		voice_mode = mtk_adda_ul_rate_transform(afe, rate);
1166 
1167 		ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1168 
1169 		/* enable iir */
1170 		ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
1171 			       UL_IIR_ON_TMP_CTL_MASK_SFT;
1172 		ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
1173 			       UL_IIRMODE_CTL_MASK_SFT;
1174 
1175 		switch (id) {
1176 		case MT8192_DAI_ADDA:
1177 		case MT8192_DAI_AP_DMIC:
1178 			/* 35Hz @ 48k */
1179 			regmap_write(afe->regmap,
1180 				     AFE_ADDA_IIR_COEF_02_01, 0x00000000);
1181 			regmap_write(afe->regmap,
1182 				     AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
1183 			regmap_write(afe->regmap,
1184 				     AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
1185 			regmap_write(afe->regmap,
1186 				     AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
1187 			regmap_write(afe->regmap,
1188 				     AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
1189 
1190 			regmap_write(afe->regmap,
1191 				     AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1192 
1193 			/* Using Internal ADC */
1194 			regmap_update_bits(afe->regmap,
1195 					   AFE_ADDA_TOP_CON0,
1196 					   0x1 << 0,
1197 					   0x0 << 0);
1198 
1199 			/* mtkaif_rxif_data_mode = 0, amic */
1200 			regmap_update_bits(afe->regmap,
1201 					   AFE_ADDA_MTKAIF_RX_CFG0,
1202 					   0x1 << 0,
1203 					   0x0 << 0);
1204 			break;
1205 		case MT8192_DAI_ADDA_CH34:
1206 		case MT8192_DAI_AP_DMIC_CH34:
1207 			/* 35Hz @ 48k */
1208 			regmap_write(afe->regmap,
1209 				     AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
1210 			regmap_write(afe->regmap,
1211 				     AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
1212 			regmap_write(afe->regmap,
1213 				     AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
1214 			regmap_write(afe->regmap,
1215 				     AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
1216 			regmap_write(afe->regmap,
1217 				     AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
1218 
1219 			regmap_write(afe->regmap,
1220 				     AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1221 
1222 			/* Using Internal ADC */
1223 			regmap_update_bits(afe->regmap,
1224 					   AFE_ADDA6_TOP_CON0,
1225 					   0x1 << 0,
1226 					   0x0 << 0);
1227 
1228 			/* mtkaif_rxif_data_mode = 0, amic */
1229 			regmap_update_bits(afe->regmap,
1230 					   AFE_ADDA6_MTKAIF_RX_CFG0,
1231 					   0x1 << 0,
1232 					   0x0 << 0);
1233 			break;
1234 		default:
1235 			break;
1236 		}
1237 
1238 		/* ap dmic */
1239 		switch (id) {
1240 		case MT8192_DAI_AP_DMIC:
1241 		case MT8192_DAI_AP_DMIC_CH34:
1242 			mtk_adda_ul_src_dmic(afe, id);
1243 			break;
1244 		default:
1245 			break;
1246 		}
1247 	}
1248 
1249 	return 0;
1250 }
1251 
1252 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1253 	.hw_params = mtk_dai_adda_hw_params,
1254 };
1255 
1256 /* dai driver */
1257 #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1258 				 SNDRV_PCM_RATE_96000 |\
1259 				 SNDRV_PCM_RATE_192000)
1260 
1261 #define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
1262 				SNDRV_PCM_RATE_16000 |\
1263 				SNDRV_PCM_RATE_32000 |\
1264 				SNDRV_PCM_RATE_48000 |\
1265 				SNDRV_PCM_RATE_96000 |\
1266 				SNDRV_PCM_RATE_192000)
1267 
1268 #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1269 			  SNDRV_PCM_FMTBIT_S24_LE |\
1270 			  SNDRV_PCM_FMTBIT_S32_LE)
1271 
1272 static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1273 	{
1274 		.name = "ADDA",
1275 		.id = MT8192_DAI_ADDA,
1276 		.playback = {
1277 			.stream_name = "ADDA Playback",
1278 			.channels_min = 1,
1279 			.channels_max = 2,
1280 			.rates = MTK_ADDA_PLAYBACK_RATES,
1281 			.formats = MTK_ADDA_FORMATS,
1282 		},
1283 		.capture = {
1284 			.stream_name = "ADDA Capture",
1285 			.channels_min = 1,
1286 			.channels_max = 2,
1287 			.rates = MTK_ADDA_CAPTURE_RATES,
1288 			.formats = MTK_ADDA_FORMATS,
1289 		},
1290 		.ops = &mtk_dai_adda_ops,
1291 	},
1292 	{
1293 		.name = "ADDA_CH34",
1294 		.id = MT8192_DAI_ADDA_CH34,
1295 		.playback = {
1296 			.stream_name = "ADDA CH34 Playback",
1297 			.channels_min = 1,
1298 			.channels_max = 2,
1299 			.rates = MTK_ADDA_PLAYBACK_RATES,
1300 			.formats = MTK_ADDA_FORMATS,
1301 		},
1302 		.capture = {
1303 			.stream_name = "ADDA CH34 Capture",
1304 			.channels_min = 1,
1305 			.channels_max = 2,
1306 			.rates = MTK_ADDA_CAPTURE_RATES,
1307 			.formats = MTK_ADDA_FORMATS,
1308 		},
1309 		.ops = &mtk_dai_adda_ops,
1310 	},
1311 	{
1312 		.name = "AP_DMIC",
1313 		.id = MT8192_DAI_AP_DMIC,
1314 		.capture = {
1315 			.stream_name = "AP DMIC Capture",
1316 			.channels_min = 1,
1317 			.channels_max = 2,
1318 			.rates = MTK_ADDA_CAPTURE_RATES,
1319 			.formats = MTK_ADDA_FORMATS,
1320 		},
1321 		.ops = &mtk_dai_adda_ops,
1322 	},
1323 	{
1324 		.name = "AP_DMIC_CH34",
1325 		.id = MT8192_DAI_AP_DMIC_CH34,
1326 		.capture = {
1327 			.stream_name = "AP DMIC CH34 Capture",
1328 			.channels_min = 1,
1329 			.channels_max = 2,
1330 			.rates = MTK_ADDA_CAPTURE_RATES,
1331 			.formats = MTK_ADDA_FORMATS,
1332 		},
1333 		.ops = &mtk_dai_adda_ops,
1334 	},
1335 };
1336 
mt8192_dai_adda_register(struct mtk_base_afe * afe)1337 int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1338 {
1339 	struct mtk_base_afe_dai *dai;
1340 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
1341 
1342 	dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1343 	if (!dai)
1344 		return -ENOMEM;
1345 
1346 	list_add(&dai->list, &afe->sub_dais);
1347 
1348 	dai->dai_drivers = mtk_dai_adda_driver;
1349 	dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1350 
1351 	dai->controls = mtk_adda_controls;
1352 	dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
1353 	dai->dapm_widgets = mtk_dai_adda_widgets;
1354 	dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
1355 	dai->dapm_routes = mtk_dai_adda_routes;
1356 	dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
1357 
1358 	/* ap dmic priv share with adda */
1359 	afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
1360 		afe_priv->dai_priv[MT8192_DAI_ADDA];
1361 	afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
1362 		afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];
1363 
1364 	return 0;
1365 }
1366