Linux 6.7-rc7
[linux-modified.git] / sound / soc / mediatek / mt8192 / mt8192-dai-adda.c
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
17 enum {
18         UL_IIR_SW = 0,
19         UL_IIR_5HZ,
20         UL_IIR_10HZ,
21         UL_IIR_25HZ,
22         UL_IIR_50HZ,
23         UL_IIR_75HZ,
24 };
25
26 enum {
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 */
31 };
32
33 enum {
34         AUDIO_SDM_2ND = 0,
35         AUDIO_SDM_3RD,
36 };
37
38 enum {
39         DELAY_DATA_MISO1 = 0,
40         DELAY_DATA_MISO2,
41 };
42
43 enum {
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,
55 };
56
57 enum {
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,
65 };
66
67 #define SDM_AUTO_RESET_THRESHOLD 0x190000
68
69 static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
70                                            unsigned int rate)
71 {
72         switch (rate) {
73         case 8000:
74                 return MTK_AFE_ADDA_DL_RATE_8K;
75         case 11025:
76                 return MTK_AFE_ADDA_DL_RATE_11K;
77         case 12000:
78                 return MTK_AFE_ADDA_DL_RATE_12K;
79         case 16000:
80                 return MTK_AFE_ADDA_DL_RATE_16K;
81         case 22050:
82                 return MTK_AFE_ADDA_DL_RATE_22K;
83         case 24000:
84                 return MTK_AFE_ADDA_DL_RATE_24K;
85         case 32000:
86                 return MTK_AFE_ADDA_DL_RATE_32K;
87         case 44100:
88                 return MTK_AFE_ADDA_DL_RATE_44K;
89         case 48000:
90                 return MTK_AFE_ADDA_DL_RATE_48K;
91         case 96000:
92                 return MTK_AFE_ADDA_DL_RATE_96K;
93         case 192000:
94                 return MTK_AFE_ADDA_DL_RATE_192K;
95         default:
96                 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
97                          __func__, rate);
98                 return MTK_AFE_ADDA_DL_RATE_48K;
99         }
100 }
101
102 static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
103                                            unsigned int rate)
104 {
105         switch (rate) {
106         case 8000:
107                 return MTK_AFE_ADDA_UL_RATE_8K;
108         case 16000:
109                 return MTK_AFE_ADDA_UL_RATE_16K;
110         case 32000:
111                 return MTK_AFE_ADDA_UL_RATE_32K;
112         case 48000:
113                 return MTK_AFE_ADDA_UL_RATE_48K;
114         case 96000:
115                 return MTK_AFE_ADDA_UL_RATE_96K;
116         case 192000:
117                 return MTK_AFE_ADDA_UL_RATE_192K;
118         default:
119                 dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
120                          __func__, rate);
121                 return MTK_AFE_ADDA_UL_RATE_48K;
122         }
123 }
124
125 /* dai component */
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),
151 };
152
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),
185 };
186
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),
207 };
208
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),
236 };
237
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),
241 };
242
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),
246 };
247
248 enum {
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,
257 };
258
259 static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
260 {
261         unsigned int reg;
262
263         switch (id) {
264         case MT8192_DAI_ADDA:
265         case MT8192_DAI_AP_DMIC:
266                 reg = AFE_ADDA_UL_SRC_CON0;
267                 break;
268         case MT8192_DAI_ADDA_CH34:
269         case MT8192_DAI_AP_DMIC_CH34:
270                 reg = AFE_ADDA6_UL_SRC_CON0;
271                 break;
272         default:
273                 return -EINVAL;
274         }
275
276         /* dmic mode, 3.25M*/
277         regmap_update_bits(afe->regmap, reg,
278                            DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
279                            0x0);
280         regmap_update_bits(afe->regmap, reg,
281                            DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
282                            0x0);
283
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);
294         return 0;
295 }
296
297 static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
298                              struct snd_kcontrol *kcontrol,
299                              int event)
300 {
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;
305
306         switch (event) {
307         case SND_SOC_DAPM_PRE_PMU:
308                 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
309
310                 /* update setting to dmic */
311                 if (mtkaif_dmic) {
312                         /* mtkaif_rxif_data_mode = 1, dmic */
313                         regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
314                                            0x1, 0x1);
315
316                         /* dmic mode, 3.25M*/
317                         regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
318                                            MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
319                                            0x0);
320                         mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
321                 }
322                 break;
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);
327                 break;
328         default:
329                 break;
330         }
331
332         return 0;
333 }
334
335 static int mtk_adda_ch34_ul_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 mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
343         int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
344
345         switch (event) {
346         case SND_SOC_DAPM_PRE_PMU:
347                 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
348                                         1);
349
350                 /* update setting to dmic */
351                 if (mtkaif_dmic) {
352                         /* mtkaif_rxif_data_mode = 1, dmic */
353                         regmap_update_bits(afe->regmap,
354                                            AFE_ADDA6_MTKAIF_RX_CFG0,
355                                            0x1, 0x1);
356
357                         /* dmic mode, 3.25M*/
358                         regmap_update_bits(afe->regmap,
359                                            AFE_ADDA6_MTKAIF_RX_CFG0,
360                                            MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
361                                            0x0);
362                         mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
363                 }
364
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.
368                  */
369                 if (mtkaif_adda6_only) {
370                         regmap_update_bits(afe->regmap,
371                                            AFE_ADDA_MTKAIF_SYNCWORD_CFG,
372                                            0x1 << 23, 0x1 << 23);
373                 }
374                 break;
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,
379                                         1);
380
381                 /* reset dmic */
382                 afe_priv->mtkaif_dmic_ch34 = 0;
383
384                 if (mtkaif_adda6_only) {
385                         regmap_update_bits(afe->regmap,
386                                            AFE_ADDA_MTKAIF_SYNCWORD_CFG,
387                                            0x1 << 23, 0x0 << 23);
388                 }
389                 break;
390         default:
391                 break;
392         }
393
394         return 0;
395 }
396
397 static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
398                                   struct snd_kcontrol *kcontrol,
399                                   int event)
400 {
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;
404
405         switch (event) {
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);
409                 else
410                         regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
411                 break;
412         default:
413                 break;
414         }
415
416         return 0;
417 }
418
419 static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
420                                      struct snd_kcontrol *kcontrol,
421                                      int event)
422 {
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;
426         int delay_data;
427         int delay_cycle;
428
429         switch (event) {
430         case SND_SOC_DAPM_PRE_PMU:
431                 if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
432                         /* set protocol 2 */
433                         regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
434                                      0x00010000);
435                         regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
436                                      0x00010000);
437
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)) {
441                                 dev_warn(afe->dev,
442                                          "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
443                                          __func__,
444                                          afe_priv->mtkaif_chosen_phase[0],
445                                          afe_priv->mtkaif_chosen_phase[1]);
446                                 break;
447                         } else if (snd_soc_dapm_widget_name_cmp(w, "ADDA6_MTKAIF_CFG") == 0 &&
448                                    afe_priv->mtkaif_chosen_phase[2] < 0) {
449                                 dev_warn(afe->dev,
450                                          "%s(), mtkaif_chosen_phase[2]:%d\n",
451                                          __func__,
452                                          afe_priv->mtkaif_chosen_phase[2]);
453                                 break;
454                         }
455
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);
463
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];
470                         } else {
471                                 delay_data = DELAY_DATA_MISO2;
472                                 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
473                                               afe_priv->mtkaif_phase_cycle[0];
474                         }
475
476                         regmap_update_bits(afe->regmap,
477                                            AFE_ADDA_MTKAIF_RX_CFG2,
478                                            MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
479                                            delay_data <<
480                                            MTKAIF_RXIF_DELAY_DATA_SFT);
481
482                         regmap_update_bits(afe->regmap,
483                                            AFE_ADDA_MTKAIF_RX_CFG2,
484                                            MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
485                                            delay_cycle <<
486                                            MTKAIF_RXIF_DELAY_CYCLE_SFT);
487
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];
494                         } else {
495                                 delay_data = DELAY_DATA_MISO2;  /* ch2 */
496                                 delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
497                                               afe_priv->mtkaif_phase_cycle[2];
498                         }
499
500                         regmap_update_bits(afe->regmap,
501                                            AFE_ADDA6_MTKAIF_RX_CFG2,
502                                            MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
503                                            delay_data <<
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,
508                                            delay_cycle <<
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,
512                                      0x00010000);
513                         regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
514                                      0x00010000);
515                 } else {
516                         regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
517                         regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
518                 }
519                 break;
520         default:
521                 break;
522         }
523
524         return 0;
525 }
526
527 static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
528                              struct snd_kcontrol *kcontrol,
529                              int event)
530 {
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);
533
534         switch (event) {
535         case SND_SOC_DAPM_PRE_PMU:
536                 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
537                 break;
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);
542                 break;
543         default:
544                 break;
545         }
546
547         return 0;
548 }
549
550 static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
551                                   struct snd_kcontrol *kcontrol,
552                                   int event)
553 {
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);
556
557         switch (event) {
558         case SND_SOC_DAPM_PRE_PMU:
559                 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
560                                         0);
561                 break;
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,
566                                         0);
567                 break;
568         default:
569                 break;
570         }
571
572         return 0;
573 }
574
575 /* stf */
576 static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
577                                  struct snd_ctl_elem_value *ucontrol)
578 {
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;
582
583         ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
584         return 0;
585 }
586
587 static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
588                                  struct snd_ctl_elem_value *ucontrol)
589 {
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];
594         bool change = false;
595
596         afe_priv->stf_positive_gain_db = gain_db;
597
598         if (gain_db >= 0 && gain_db <= 24) {
599                 regmap_update_bits_check(afe->regmap,
600                                          AFE_SIDETONE_GAIN,
601                                          POSITIVE_GAIN_MASK_SFT,
602                                          (gain_db / 6) << POSITIVE_GAIN_SFT,
603                                          &change);
604         } else {
605                 return -EINVAL;
606         }
607
608         return change;
609 }
610
611 static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
612                                 struct snd_ctl_elem_value *ucontrol)
613 {
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;
617
618         ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
619         return 0;
620 }
621
622 static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
623                                 struct snd_ctl_elem_value *ucontrol)
624 {
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;
628         int dmic_on;
629         bool change;
630
631         dmic_on = ucontrol->value.integer.value[0];
632
633         change = (afe_priv->mtkaif_dmic != dmic_on) ||
634                 (afe_priv->mtkaif_dmic_ch34 != dmic_on);
635
636         afe_priv->mtkaif_dmic = dmic_on;
637         afe_priv->mtkaif_dmic_ch34 = dmic_on;
638
639         return change;
640 }
641
642 static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
643                                  struct snd_ctl_elem_value *ucontrol)
644 {
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;
648
649         ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
650         return 0;
651 }
652
653 static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
654                                  struct snd_ctl_elem_value *ucontrol)
655 {
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;
660         bool change;
661
662         mtkaif_adda6_only = ucontrol->value.integer.value[0];
663
664         change = afe_priv->mtkaif_adda6_only != mtkaif_adda6_only;
665         afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
666
667         return change;
668 }
669
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),
681 };
682
683 static const struct snd_kcontrol_new stf_ctl =
684         SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
685
686 static const u16 stf_coeff_table_16k[] = {
687         0x049C, 0x09E8, 0x09E0, 0x089C,
688         0xFF54, 0xF488, 0xEAFC, 0xEBAC,
689         0xfA40, 0x17AC, 0x3D1C, 0x6028,
690         0x7538
691 };
692
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,
701         0x3D08
702 };
703
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
713 };
714
715 static int mtk_stf_event(struct snd_soc_dapm_widget *w,
716                          struct snd_kcontrol *kcontrol,
717                          int event)
718 {
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);
721
722         size_t half_tap_num;
723         const u16 *stf_coeff_table;
724         unsigned int ul_rate, reg_value;
725         size_t coef_addr;
726
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;
730
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;
737         } else {
738                 half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
739                 stf_coeff_table = stf_coeff_table_16k;
740         }
741
742         regmap_read(afe->regmap, AFE_SIDETONE_CON1, &reg_value);
743
744         switch (event) {
745         case SND_SOC_DAPM_PRE_PMU:
746                 /* set side tone gain = 0 */
747                 regmap_update_bits(afe->regmap,
748                                    AFE_SIDETONE_GAIN,
749                                    SIDE_TONE_GAIN_MASK_SFT,
750                                    0);
751                 regmap_update_bits(afe->regmap,
752                                    AFE_SIDETONE_GAIN,
753                                    POSITIVE_GAIN_MASK_SFT,
754                                    0);
755                 /* don't bypass stf */
756                 regmap_update_bits(afe->regmap,
757                                    AFE_SIDETONE_CON1,
758                                    0x1f << 27,
759                                    0x0);
760                 /* set stf half tap num */
761                 regmap_update_bits(afe->regmap,
762                                    AFE_SIDETONE_CON1,
763                                    SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
764                                    half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
765
766                 /* set side tone coefficient */
767                 regmap_read(afe->regmap, AFE_SIDETONE_CON0, &reg_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;
771                         int try_cnt = 0;
772
773                         regmap_update_bits(afe->regmap,
774                                            AFE_SIDETONE_CON0,
775                                            0x39FFFFF,
776                                            (1 << R_W_EN_SFT) |
777                                            (1 << R_W_SEL_SFT) |
778                                            (0 << SEL_CH2_SFT) |
779                                            (coef_addr <<
780                                            SIDE_TONE_COEFFICIENT_ADDR_SFT) |
781                                            stf_coeff_table[coef_addr]);
782
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, &reg_value);
787                                 new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
788
789                                 /* flip => ok */
790                                 if (new_w_ready == old_w_ready) {
791                                         udelay(3);
792                                         if (try_cnt == 9) {
793                                                 dev_warn(afe->dev,
794                                                          "%s(), write coeff not ready",
795                                                          __func__);
796                                         }
797                                 } else {
798                                         break;
799                                 }
800                         }
801                         /* need write -> read -> write to write next coeff */
802                         regmap_update_bits(afe->regmap,
803                                            AFE_SIDETONE_CON0,
804                                            R_W_SEL_MASK_SFT,
805                                            0x0);
806                 }
807                 break;
808         case SND_SOC_DAPM_POST_PMD:
809                 /* bypass stf */
810                 regmap_update_bits(afe->regmap,
811                                    AFE_SIDETONE_CON1,
812                                    0x1f << 27,
813                                    0x1f << 27);
814
815                 /* set side tone gain = 0 */
816                 regmap_update_bits(afe->regmap,
817                                    AFE_SIDETONE_GAIN,
818                                    SIDE_TONE_GAIN_MASK_SFT,
819                                    0);
820                 regmap_update_bits(afe->regmap,
821                                    AFE_SIDETONE_GAIN,
822                                    POSITIVE_GAIN_MASK_SFT,
823                                    0);
824                 break;
825         default:
826                 break;
827         }
828
829         return 0;
830 }
831
832 /* stf mux */
833 enum {
834         STF_SRC_ADDA_ADDA6 = 0,
835         STF_SRC_O19O20,
836 };
837
838 static const char *const stf_o19o20_mux_map[] = {
839         "ADDA_ADDA6",
840         "O19O20",
841 };
842
843 static int stf_o19o20_mux_map_value[] = {
844         STF_SRC_ADDA_ADDA6,
845         STF_SRC_O19O20,
846 };
847
848 static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
849                                   AFE_SIDETONE_CON1,
850                                   STF_SOURCE_FROM_O19O20_SFT,
851                                   STF_SOURCE_FROM_O19O20_MASK,
852                                   stf_o19o20_mux_map,
853                                   stf_o19o20_mux_map_value);
854
855 static const struct snd_kcontrol_new stf_o19O20_mux_control =
856         SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
857
858 enum {
859         STF_SRC_ADDA = 0,
860         STF_SRC_ADDA6,
861 };
862
863 static const char *const stf_adda_mux_map[] = {
864         "ADDA",
865         "ADDA6",
866 };
867
868 static int stf_adda_mux_map_value[] = {
869         STF_SRC_ADDA,
870         STF_SRC_ADDA6,
871 };
872
873 static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
874                                   AFE_SIDETONE_CON1,
875                                   STF_O19O20_OUT_EN_SEL_SFT,
876                                   STF_O19O20_OUT_EN_SEL_MASK,
877                                   stf_adda_mux_map,
878                                   stf_adda_mux_map_value);
879
880 static const struct snd_kcontrol_new stf_adda_mux_control =
881         SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
882
883 /* ADDA UL MUX */
884 enum {
885         ADDA_UL_MUX_MTKAIF = 0,
886         ADDA_UL_MUX_AP_DMIC,
887         ADDA_UL_MUX_MASK = 0x1,
888 };
889
890 static const char * const adda_ul_mux_map[] = {
891         "MTKAIF", "AP_DMIC"
892 };
893
894 static int adda_ul_map_value[] = {
895         ADDA_UL_MUX_MTKAIF,
896         ADDA_UL_MUX_AP_DMIC,
897 };
898
899 static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
900                                   SND_SOC_NOPM,
901                                   0,
902                                   ADDA_UL_MUX_MASK,
903                                   adda_ul_mux_map,
904                                   adda_ul_map_value);
905
906 static const struct snd_kcontrol_new adda_ul_mux_control =
907         SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
908
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);
911
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,
915                            mtk_adda_dl_ch1_mix,
916                            ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
917         SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
918                            mtk_adda_dl_ch2_mix,
919                            ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
920
921         SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
922                            mtk_adda_dl_ch3_mix,
923                            ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
924         SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
925                            mtk_adda_dl_ch4_mix,
926                            ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
927
928         SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
929                               AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
930                               NULL, 0),
931
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,
935                               mtk_adda_dl_event,
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),
943
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,
947                               mtk_adda_ul_event,
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),
954
955         SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
956                               AFE_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,
961                               SND_SOC_NOPM, 0, 0,
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,
965                               SND_SOC_NOPM, 0, 0,
966                               mtk_adda_mtkaif_cfg_event,
967                               SND_SOC_DAPM_PRE_PMU),
968
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,
972                               NULL, 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,
976                               NULL, 0),
977
978         SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
979                               AFE_ADDA_UL_DL_CON0,
980                               AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
981                               NULL, 0),
982         SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
983                               AFE_ADDA_UL_DL_CON0,
984                               AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
985                               NULL, 0),
986
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),
991
992         SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
993         SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
994
995         /* stf */
996         SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
997                               AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
998                               &stf_ctl,
999                               mtk_stf_event,
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,
1007                            mtk_stf_ch1_mix,
1008                            ARRAY_SIZE(mtk_stf_ch1_mix)),
1009         SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
1010                            mtk_stf_ch2_mix,
1011                            ARRAY_SIZE(mtk_stf_ch2_mix)),
1012         SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
1013
1014         /* clock */
1015         SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
1016
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"),
1021
1022         SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
1023         SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
1024 };
1025
1026 static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1027         /* playback */
1028         {"ADDA_DL_CH1", "DL1_CH1", "DL1"},
1029         {"ADDA_DL_CH2", "DL1_CH1", "DL1"},
1030         {"ADDA_DL_CH2", "DL1_CH2", "DL1"},
1031
1032         {"ADDA_DL_CH1", "DL12_CH1", "DL12"},
1033         {"ADDA_DL_CH2", "DL12_CH2", "DL12"},
1034
1035         {"ADDA_DL_CH1", "DL6_CH1", "DL6"},
1036         {"ADDA_DL_CH2", "DL6_CH2", "DL6"},
1037
1038         {"ADDA_DL_CH1", "DL8_CH1", "DL8"},
1039         {"ADDA_DL_CH2", "DL8_CH2", "DL8"},
1040
1041         {"ADDA_DL_CH1", "DL2_CH1", "DL2"},
1042         {"ADDA_DL_CH2", "DL2_CH1", "DL2"},
1043         {"ADDA_DL_CH2", "DL2_CH2", "DL2"},
1044
1045         {"ADDA_DL_CH1", "DL3_CH1", "DL3"},
1046         {"ADDA_DL_CH2", "DL3_CH1", "DL3"},
1047         {"ADDA_DL_CH2", "DL3_CH2", "DL3"},
1048
1049         {"ADDA_DL_CH1", "DL4_CH1", "DL4"},
1050         {"ADDA_DL_CH2", "DL4_CH2", "DL4"},
1051
1052         {"ADDA_DL_CH1", "DL5_CH1", "DL5"},
1053         {"ADDA_DL_CH2", "DL5_CH2", "DL5"},
1054
1055         {"ADDA Playback", NULL, "ADDA_DL_CH1"},
1056         {"ADDA Playback", NULL, "ADDA_DL_CH2"},
1057
1058         {"ADDA Playback", NULL, "ADDA Enable"},
1059         {"ADDA Playback", NULL, "ADDA Playback Enable"},
1060
1061         {"ADDA_DL_CH3", "DL1_CH1", "DL1"},
1062         {"ADDA_DL_CH4", "DL1_CH1", "DL1"},
1063         {"ADDA_DL_CH4", "DL1_CH2", "DL1"},
1064
1065         {"ADDA_DL_CH3", "DL12_CH1", "DL12"},
1066         {"ADDA_DL_CH4", "DL12_CH2", "DL12"},
1067
1068         {"ADDA_DL_CH3", "DL6_CH1", "DL6"},
1069         {"ADDA_DL_CH4", "DL6_CH2", "DL6"},
1070
1071         {"ADDA_DL_CH3", "DL2_CH1", "DL2"},
1072         {"ADDA_DL_CH4", "DL2_CH1", "DL2"},
1073         {"ADDA_DL_CH4", "DL2_CH2", "DL2"},
1074
1075         {"ADDA_DL_CH3", "DL3_CH1", "DL3"},
1076         {"ADDA_DL_CH4", "DL3_CH1", "DL3"},
1077         {"ADDA_DL_CH4", "DL3_CH2", "DL3"},
1078
1079         {"ADDA_DL_CH3", "DL4_CH1", "DL4"},
1080         {"ADDA_DL_CH4", "DL4_CH2", "DL4"},
1081
1082         {"ADDA_DL_CH3", "DL5_CH1", "DL5"},
1083         {"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1084
1085         {"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1086         {"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1087
1088         {"ADDA CH34 Playback", NULL, "ADDA Enable"},
1089         {"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1090
1091         /* capture */
1092         {"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1093         {"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1094
1095         {"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1096         {"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1097
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"},
1102
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"},
1107
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"},
1112
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"},
1117
1118         {"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1119         {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1120
1121         /* sidetone filter */
1122         {"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1123         {"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1124
1125         {"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1126         {"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1127         {"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1128
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"},
1133
1134         /* clk */
1135         {"ADDA Playback", NULL, "aud_dac_clk"},
1136         {"ADDA Playback", NULL, "aud_dac_predis_clk"},
1137
1138         {"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1139         {"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1140
1141         {"ADDA Capture Enable", NULL, "aud_adc_clk"},
1142         {"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1143 };
1144
1145 /* dai ops */
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)
1149 {
1150         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1151         unsigned int rate = params_rate(params);
1152         int id = dai->id;
1153
1154         if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1155                 unsigned int dl_src2_con0 = 0;
1156                 unsigned int dl_src2_con1 = 0;
1157
1158                 /* set sampling rate */
1159                 dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1160                                DL_2_INPUT_MODE_CTL_SFT;
1161
1162                 /* set output mode, UP_SAMPLING_RATE_X8 */
1163                 dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1164
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);
1168
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;
1172
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;
1176
1177                 /* turn on down-link gain */
1178                 dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1179
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);
1184
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);
1189
1190                         /* set sdm gain */
1191                         regmap_update_bits(afe->regmap,
1192                                            AFE_ADDA_DL_SDM_DCCOMP_CON,
1193                                            ATTGAIN_CTL_MASK_SFT,
1194                                            AUDIO_SDM_LEVEL_NORMAL <<
1195                                            ATTGAIN_CTL_SFT);
1196
1197                         /* 2nd sdm */
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);
1202
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);
1211                 } else {
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);
1217
1218                         regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1219                                      dl_src2_con0);
1220                         regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1221                                      dl_src2_con1);
1222
1223                         /* set sdm gain */
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 <<
1228                                            ATTGAIN_CTL_SFT);
1229
1230                         /* 2nd sdm */
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);
1235
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);
1244                 }
1245         } else {
1246                 unsigned int voice_mode = 0;
1247                 unsigned int ul_src_con0 = 0;   /* default value */
1248
1249                 voice_mode = adda_ul_rate_transform(afe, rate);
1250
1251                 ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1252
1253                 /* enable iir */
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;
1258
1259                 switch (id) {
1260                 case MT8192_DAI_ADDA:
1261                 case MT8192_DAI_AP_DMIC:
1262                         /* 35Hz @ 48k */
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);
1273
1274                         regmap_write(afe->regmap,
1275                                      AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1276
1277                         /* Using Internal ADC */
1278                         regmap_update_bits(afe->regmap,
1279                                            AFE_ADDA_TOP_CON0,
1280                                            0x1 << 0,
1281                                            0x0 << 0);
1282
1283                         /* mtkaif_rxif_data_mode = 0, amic */
1284                         regmap_update_bits(afe->regmap,
1285                                            AFE_ADDA_MTKAIF_RX_CFG0,
1286                                            0x1 << 0,
1287                                            0x0 << 0);
1288                         break;
1289                 case MT8192_DAI_ADDA_CH34:
1290                 case MT8192_DAI_AP_DMIC_CH34:
1291                         /* 35Hz @ 48k */
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);
1302
1303                         regmap_write(afe->regmap,
1304                                      AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1305
1306                         /* Using Internal ADC */
1307                         regmap_update_bits(afe->regmap,
1308                                            AFE_ADDA6_TOP_CON0,
1309                                            0x1 << 0,
1310                                            0x0 << 0);
1311
1312                         /* mtkaif_rxif_data_mode = 0, amic */
1313                         regmap_update_bits(afe->regmap,
1314                                            AFE_ADDA6_MTKAIF_RX_CFG0,
1315                                            0x1 << 0,
1316                                            0x0 << 0);
1317                         break;
1318                 default:
1319                         break;
1320                 }
1321
1322                 /* ap dmic */
1323                 switch (id) {
1324                 case MT8192_DAI_AP_DMIC:
1325                 case MT8192_DAI_AP_DMIC_CH34:
1326                         mtk_adda_ul_src_dmic(afe, id);
1327                         break;
1328                 default:
1329                         break;
1330                 }
1331         }
1332
1333         return 0;
1334 }
1335
1336 static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1337         .hw_params = mtk_dai_adda_hw_params,
1338 };
1339
1340 /* dai driver */
1341 #define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1342                                  SNDRV_PCM_RATE_96000 |\
1343                                  SNDRV_PCM_RATE_192000)
1344
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)
1351
1352 #define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1353                           SNDRV_PCM_FMTBIT_S24_LE |\
1354                           SNDRV_PCM_FMTBIT_S32_LE)
1355
1356 static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1357         {
1358                 .name = "ADDA",
1359                 .id = MT8192_DAI_ADDA,
1360                 .playback = {
1361                         .stream_name = "ADDA Playback",
1362                         .channels_min = 1,
1363                         .channels_max = 2,
1364                         .rates = MTK_ADDA_PLAYBACK_RATES,
1365                         .formats = MTK_ADDA_FORMATS,
1366                 },
1367                 .capture = {
1368                         .stream_name = "ADDA Capture",
1369                         .channels_min = 1,
1370                         .channels_max = 2,
1371                         .rates = MTK_ADDA_CAPTURE_RATES,
1372                         .formats = MTK_ADDA_FORMATS,
1373                 },
1374                 .ops = &mtk_dai_adda_ops,
1375         },
1376         {
1377                 .name = "ADDA_CH34",
1378                 .id = MT8192_DAI_ADDA_CH34,
1379                 .playback = {
1380                         .stream_name = "ADDA CH34 Playback",
1381                         .channels_min = 1,
1382                         .channels_max = 2,
1383                         .rates = MTK_ADDA_PLAYBACK_RATES,
1384                         .formats = MTK_ADDA_FORMATS,
1385                 },
1386                 .capture = {
1387                         .stream_name = "ADDA CH34 Capture",
1388                         .channels_min = 1,
1389                         .channels_max = 2,
1390                         .rates = MTK_ADDA_CAPTURE_RATES,
1391                         .formats = MTK_ADDA_FORMATS,
1392                 },
1393                 .ops = &mtk_dai_adda_ops,
1394         },
1395         {
1396                 .name = "AP_DMIC",
1397                 .id = MT8192_DAI_AP_DMIC,
1398                 .capture = {
1399                         .stream_name = "AP DMIC Capture",
1400                         .channels_min = 1,
1401                         .channels_max = 2,
1402                         .rates = MTK_ADDA_CAPTURE_RATES,
1403                         .formats = MTK_ADDA_FORMATS,
1404                 },
1405                 .ops = &mtk_dai_adda_ops,
1406         },
1407         {
1408                 .name = "AP_DMIC_CH34",
1409                 .id = MT8192_DAI_AP_DMIC_CH34,
1410                 .capture = {
1411                         .stream_name = "AP DMIC CH34 Capture",
1412                         .channels_min = 1,
1413                         .channels_max = 2,
1414                         .rates = MTK_ADDA_CAPTURE_RATES,
1415                         .formats = MTK_ADDA_FORMATS,
1416                 },
1417                 .ops = &mtk_dai_adda_ops,
1418         },
1419 };
1420
1421 int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1422 {
1423         struct mtk_base_afe_dai *dai;
1424         struct mt8192_afe_private *afe_priv = afe->platform_priv;
1425
1426         dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1427         if (!dai)
1428                 return -ENOMEM;
1429
1430         list_add(&dai->list, &afe->sub_dais);
1431
1432         dai->dai_drivers = mtk_dai_adda_driver;
1433         dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1434
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);
1441
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];
1447
1448         return 0;
1449 }