~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/mediatek/mt8192/mt8192-dai-adda.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 
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 
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 
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 
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 
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 
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 
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 */
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 
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 
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 
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 
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 
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 
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 */
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 
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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php