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

TOMOYO Linux Cross Reference
Linux/sound/soc/mediatek/mt8192/mt8192-dai-i2s.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 I2S Control
  4 //
  5 // Copyright (c) 2020 MediaTek Inc.
  6 // Author: Shane Chien <shane.chien@mediatek.com>
  7 //
  8 
  9 #include <linux/bitops.h>
 10 #include <linux/regmap.h>
 11 #include <sound/pcm_params.h>
 12 
 13 #include "mt8192-afe-clk.h"
 14 #include "mt8192-afe-common.h"
 15 #include "mt8192-afe-gpio.h"
 16 #include "mt8192-interconnection.h"
 17 
 18 enum {
 19         I2S_FMT_EIAJ = 0,
 20         I2S_FMT_I2S = 1,
 21 };
 22 
 23 enum {
 24         I2S_WLEN_16_BIT = 0,
 25         I2S_WLEN_32_BIT = 1,
 26 };
 27 
 28 enum {
 29         I2S_HD_NORMAL = 0,
 30         I2S_HD_LOW_JITTER = 1,
 31 };
 32 
 33 enum {
 34         I2S1_SEL_O28_O29 = 0,
 35         I2S1_SEL_O03_O04 = 1,
 36 };
 37 
 38 enum {
 39         I2S_IN_PAD_CONNSYS = 0,
 40         I2S_IN_PAD_IO_MUX = 1,
 41 };
 42 
 43 struct mtk_afe_i2s_priv {
 44         int id;
 45         int rate; /* for determine which apll to use */
 46         int low_jitter_en;
 47 
 48         int share_i2s_id;
 49 
 50         int mclk_id;
 51         int mclk_rate;
 52         int mclk_apll;
 53 };
 54 
 55 static unsigned int get_i2s_wlen(snd_pcm_format_t format)
 56 {
 57         return snd_pcm_format_physical_width(format) <= 16 ?
 58                I2S_WLEN_16_BIT : I2S_WLEN_32_BIT;
 59 }
 60 
 61 #define MTK_AFE_I2S0_KCONTROL_NAME "I2S0_HD_Mux"
 62 #define MTK_AFE_I2S1_KCONTROL_NAME "I2S1_HD_Mux"
 63 #define MTK_AFE_I2S2_KCONTROL_NAME "I2S2_HD_Mux"
 64 #define MTK_AFE_I2S3_KCONTROL_NAME "I2S3_HD_Mux"
 65 #define MTK_AFE_I2S5_KCONTROL_NAME "I2S5_HD_Mux"
 66 #define MTK_AFE_I2S6_KCONTROL_NAME "I2S6_HD_Mux"
 67 #define MTK_AFE_I2S7_KCONTROL_NAME "I2S7_HD_Mux"
 68 #define MTK_AFE_I2S8_KCONTROL_NAME "I2S8_HD_Mux"
 69 #define MTK_AFE_I2S9_KCONTROL_NAME "I2S9_HD_Mux"
 70 
 71 #define I2S0_HD_EN_W_NAME "I2S0_HD_EN"
 72 #define I2S1_HD_EN_W_NAME "I2S1_HD_EN"
 73 #define I2S2_HD_EN_W_NAME "I2S2_HD_EN"
 74 #define I2S3_HD_EN_W_NAME "I2S3_HD_EN"
 75 #define I2S5_HD_EN_W_NAME "I2S5_HD_EN"
 76 #define I2S6_HD_EN_W_NAME "I2S6_HD_EN"
 77 #define I2S7_HD_EN_W_NAME "I2S7_HD_EN"
 78 #define I2S8_HD_EN_W_NAME "I2S8_HD_EN"
 79 #define I2S9_HD_EN_W_NAME "I2S9_HD_EN"
 80 
 81 #define I2S0_MCLK_EN_W_NAME "I2S0_MCLK_EN"
 82 #define I2S1_MCLK_EN_W_NAME "I2S1_MCLK_EN"
 83 #define I2S2_MCLK_EN_W_NAME "I2S2_MCLK_EN"
 84 #define I2S3_MCLK_EN_W_NAME "I2S3_MCLK_EN"
 85 #define I2S5_MCLK_EN_W_NAME "I2S5_MCLK_EN"
 86 #define I2S6_MCLK_EN_W_NAME "I2S6_MCLK_EN"
 87 #define I2S7_MCLK_EN_W_NAME "I2S7_MCLK_EN"
 88 #define I2S8_MCLK_EN_W_NAME "I2S8_MCLK_EN"
 89 #define I2S9_MCLK_EN_W_NAME "I2S9_MCLK_EN"
 90 
 91 static int get_i2s_id_by_name(struct mtk_base_afe *afe,
 92                               const char *name)
 93 {
 94         if (strncmp(name, "I2S0", 4) == 0)
 95                 return MT8192_DAI_I2S_0;
 96         else if (strncmp(name, "I2S1", 4) == 0)
 97                 return MT8192_DAI_I2S_1;
 98         else if (strncmp(name, "I2S2", 4) == 0)
 99                 return MT8192_DAI_I2S_2;
100         else if (strncmp(name, "I2S3", 4) == 0)
101                 return MT8192_DAI_I2S_3;
102         else if (strncmp(name, "I2S5", 4) == 0)
103                 return MT8192_DAI_I2S_5;
104         else if (strncmp(name, "I2S6", 4) == 0)
105                 return MT8192_DAI_I2S_6;
106         else if (strncmp(name, "I2S7", 4) == 0)
107                 return MT8192_DAI_I2S_7;
108         else if (strncmp(name, "I2S8", 4) == 0)
109                 return MT8192_DAI_I2S_8;
110         else if (strncmp(name, "I2S9", 4) == 0)
111                 return MT8192_DAI_I2S_9;
112         else
113                 return -EINVAL;
114 }
115 
116 static struct mtk_afe_i2s_priv *get_i2s_priv_by_name(struct mtk_base_afe *afe,
117                                                      const char *name)
118 {
119         struct mt8192_afe_private *afe_priv = afe->platform_priv;
120         int dai_id = get_i2s_id_by_name(afe, name);
121 
122         if (dai_id < 0)
123                 return NULL;
124 
125         return afe_priv->dai_priv[dai_id];
126 }
127 
128 /* low jitter control */
129 static const char * const mt8192_i2s_hd_str[] = {
130         "Normal", "Low_Jitter"
131 };
132 
133 static SOC_ENUM_SINGLE_EXT_DECL(mt8192_i2s_enum, mt8192_i2s_hd_str);
134 
135 static int mt8192_i2s_hd_get(struct snd_kcontrol *kcontrol,
136                              struct snd_ctl_elem_value *ucontrol)
137 {
138         struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
139         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
140         struct mtk_afe_i2s_priv *i2s_priv;
141 
142         i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);
143 
144         if (!i2s_priv) {
145                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
146                 return -EINVAL;
147         }
148 
149         ucontrol->value.integer.value[0] = i2s_priv->low_jitter_en;
150 
151         return 0;
152 }
153 
154 static int mt8192_i2s_hd_set(struct snd_kcontrol *kcontrol,
155                              struct snd_ctl_elem_value *ucontrol)
156 {
157         struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
158         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
159         struct mtk_afe_i2s_priv *i2s_priv;
160         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
161         int hd_en;
162 
163         if (ucontrol->value.enumerated.item[0] >= e->items)
164                 return -EINVAL;
165 
166         hd_en = ucontrol->value.integer.value[0];
167 
168         dev_dbg(afe->dev, "%s(), kcontrol name %s, hd_en %d\n",
169                 __func__, kcontrol->id.name, hd_en);
170 
171         i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name);
172 
173         if (!i2s_priv) {
174                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
175                 return -EINVAL;
176         }
177 
178         i2s_priv->low_jitter_en = hd_en;
179 
180         return 0;
181 }
182 
183 static const struct snd_kcontrol_new mtk_dai_i2s_controls[] = {
184         SOC_ENUM_EXT(MTK_AFE_I2S0_KCONTROL_NAME, mt8192_i2s_enum,
185                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
186         SOC_ENUM_EXT(MTK_AFE_I2S1_KCONTROL_NAME, mt8192_i2s_enum,
187                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
188         SOC_ENUM_EXT(MTK_AFE_I2S2_KCONTROL_NAME, mt8192_i2s_enum,
189                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
190         SOC_ENUM_EXT(MTK_AFE_I2S3_KCONTROL_NAME, mt8192_i2s_enum,
191                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
192         SOC_ENUM_EXT(MTK_AFE_I2S5_KCONTROL_NAME, mt8192_i2s_enum,
193                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
194         SOC_ENUM_EXT(MTK_AFE_I2S6_KCONTROL_NAME, mt8192_i2s_enum,
195                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
196         SOC_ENUM_EXT(MTK_AFE_I2S7_KCONTROL_NAME, mt8192_i2s_enum,
197                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
198         SOC_ENUM_EXT(MTK_AFE_I2S8_KCONTROL_NAME, mt8192_i2s_enum,
199                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
200         SOC_ENUM_EXT(MTK_AFE_I2S9_KCONTROL_NAME, mt8192_i2s_enum,
201                      mt8192_i2s_hd_get, mt8192_i2s_hd_set),
202 };
203 
204 /* dai component */
205 /* i2s virtual mux to output widget */
206 static const char * const i2s_mux_map[] = {
207         "Normal", "Dummy_Widget",
208 };
209 
210 static int i2s_mux_map_value[] = {
211         0, 1,
212 };
213 
214 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s_mux_map_enum,
215                                               SND_SOC_NOPM,
216                                               0,
217                                               1,
218                                               i2s_mux_map,
219                                               i2s_mux_map_value);
220 
221 static const struct snd_kcontrol_new i2s0_in_mux_control =
222         SOC_DAPM_ENUM("I2S0 In Select", i2s_mux_map_enum);
223 
224 static const struct snd_kcontrol_new i2s8_in_mux_control =
225         SOC_DAPM_ENUM("I2S8 In Select", i2s_mux_map_enum);
226 
227 static const struct snd_kcontrol_new i2s1_out_mux_control =
228         SOC_DAPM_ENUM("I2S1 Out Select", i2s_mux_map_enum);
229 
230 static const struct snd_kcontrol_new i2s3_out_mux_control =
231         SOC_DAPM_ENUM("I2S3 Out Select", i2s_mux_map_enum);
232 
233 static const struct snd_kcontrol_new i2s5_out_mux_control =
234         SOC_DAPM_ENUM("I2S5 Out Select", i2s_mux_map_enum);
235 
236 static const struct snd_kcontrol_new i2s7_out_mux_control =
237         SOC_DAPM_ENUM("I2S7 Out Select", i2s_mux_map_enum);
238 
239 static const struct snd_kcontrol_new i2s9_out_mux_control =
240         SOC_DAPM_ENUM("I2S9 Out Select", i2s_mux_map_enum);
241 
242 /* Tinyconn Mux */
243 enum {
244         TINYCONN_CH1_MUX_DL1 = 0x0,
245         TINYCONN_CH2_MUX_DL1 = 0x1,
246         TINYCONN_CH1_MUX_DL12 = 0x2,
247         TINYCONN_CH2_MUX_DL12 = 0x3,
248         TINYCONN_CH1_MUX_DL2 = 0x4,
249         TINYCONN_CH2_MUX_DL2 = 0x5,
250         TINYCONN_CH1_MUX_DL3 = 0x6,
251         TINYCONN_CH2_MUX_DL3 = 0x7,
252         TINYCONN_MUX_NONE = 0x1f,
253 };
254 
255 static const char * const tinyconn_mux_map[] = {
256         "NONE",
257         "DL1_CH1",
258         "DL1_CH2",
259         "DL12_CH1",
260         "DL12_CH2",
261         "DL2_CH1",
262         "DL2_CH2",
263         "DL3_CH1",
264         "DL3_CH2",
265 };
266 
267 static int tinyconn_mux_map_value[] = {
268         TINYCONN_MUX_NONE,
269         TINYCONN_CH1_MUX_DL1,
270         TINYCONN_CH2_MUX_DL1,
271         TINYCONN_CH1_MUX_DL12,
272         TINYCONN_CH2_MUX_DL12,
273         TINYCONN_CH1_MUX_DL2,
274         TINYCONN_CH2_MUX_DL2,
275         TINYCONN_CH1_MUX_DL3,
276         TINYCONN_CH2_MUX_DL3,
277 };
278 
279 static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch1_mux_map_enum,
280                                   AFE_TINY_CONN5,
281                                   O_20_CFG_SFT,
282                                   O_20_CFG_MASK,
283                                   tinyconn_mux_map,
284                                   tinyconn_mux_map_value);
285 static const struct snd_kcontrol_new i2s1_tinyconn_ch1_mux_control =
286         SOC_DAPM_ENUM("i2s1 ch1 tinyconn Select",
287                       i2s1_tinyconn_ch1_mux_map_enum);
288 
289 static SOC_VALUE_ENUM_SINGLE_DECL(i2s1_tinyconn_ch2_mux_map_enum,
290                                   AFE_TINY_CONN5,
291                                   O_21_CFG_SFT,
292                                   O_21_CFG_MASK,
293                                   tinyconn_mux_map,
294                                   tinyconn_mux_map_value);
295 static const struct snd_kcontrol_new i2s1_tinyconn_ch2_mux_control =
296         SOC_DAPM_ENUM("i2s1 ch2 tinyconn Select",
297                       i2s1_tinyconn_ch2_mux_map_enum);
298 
299 static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch1_mux_map_enum,
300                                   AFE_TINY_CONN5,
301                                   O_22_CFG_SFT,
302                                   O_22_CFG_MASK,
303                                   tinyconn_mux_map,
304                                   tinyconn_mux_map_value);
305 static const struct snd_kcontrol_new i2s3_tinyconn_ch1_mux_control =
306         SOC_DAPM_ENUM("i2s3 ch1 tinyconn Select",
307                       i2s3_tinyconn_ch1_mux_map_enum);
308 
309 static SOC_VALUE_ENUM_SINGLE_DECL(i2s3_tinyconn_ch2_mux_map_enum,
310                                   AFE_TINY_CONN5,
311                                   O_23_CFG_SFT,
312                                   O_23_CFG_MASK,
313                                   tinyconn_mux_map,
314                                   tinyconn_mux_map_value);
315 static const struct snd_kcontrol_new i2s3_tinyconn_ch2_mux_control =
316         SOC_DAPM_ENUM("i2s3 ch2 tinyconn Select",
317                       i2s3_tinyconn_ch2_mux_map_enum);
318 
319 /* i2s in lpbk */
320 static const char * const i2s_lpbk_mux_map[] = {
321         "Normal", "Lpbk",
322 };
323 
324 static int i2s_lpbk_mux_map_value[] = {
325         0, 1,
326 };
327 
328 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s0_lpbk_mux_map_enum,
329                                               AFE_I2S_CON,
330                                               I2S_LOOPBACK_SFT,
331                                               1,
332                                               i2s_lpbk_mux_map,
333                                               i2s_lpbk_mux_map_value);
334 
335 static const struct snd_kcontrol_new i2s0_lpbk_mux_control =
336         SOC_DAPM_ENUM("I2S Lpbk Select", i2s0_lpbk_mux_map_enum);
337 
338 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(i2s2_lpbk_mux_map_enum,
339                                               AFE_I2S_CON2,
340                                               I2S3_LOOPBACK_SFT,
341                                               1,
342                                               i2s_lpbk_mux_map,
343                                               i2s_lpbk_mux_map_value);
344 
345 static const struct snd_kcontrol_new i2s2_lpbk_mux_control =
346         SOC_DAPM_ENUM("I2S Lpbk Select", i2s2_lpbk_mux_map_enum);
347 
348 /* interconnection */
349 static const struct snd_kcontrol_new mtk_i2s3_ch1_mix[] = {
350         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN0, I_DL1_CH1, 1, 0),
351         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN0, I_DL2_CH1, 1, 0),
352         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN0, I_DL3_CH1, 1, 0),
353         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN0, I_DL12_CH1, 1, 0),
354         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN0_1, I_DL6_CH1, 1, 0),
355         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN0_1, I_DL4_CH1, 1, 0),
356         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN0_1, I_DL5_CH1, 1, 0),
357         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN0_1, I_DL8_CH1, 1, 0),
358         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN0_1, I_DL9_CH1, 1, 0),
359         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN0,
360                                     I_GAIN1_OUT_CH1, 1, 0),
361         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN0,
362                                     I_ADDA_UL_CH1, 1, 0),
363         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN0,
364                                     I_ADDA_UL_CH2, 1, 0),
365         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN0,
366                                     I_ADDA_UL_CH3, 1, 0),
367         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN0,
368                                     I_PCM_1_CAP_CH1, 1, 0),
369         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN0,
370                                     I_PCM_2_CAP_CH1, 1, 0),
371 };
372 
373 static const struct snd_kcontrol_new mtk_i2s3_ch2_mix[] = {
374         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN1, I_DL1_CH2, 1, 0),
375         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN1, I_DL2_CH2, 1, 0),
376         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN1, I_DL3_CH2, 1, 0),
377         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN1, I_DL12_CH2, 1, 0),
378         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN1_1, I_DL6_CH2, 1, 0),
379         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN1_1, I_DL4_CH2, 1, 0),
380         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN1_1, I_DL5_CH2, 1, 0),
381         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN1_1, I_DL8_CH2, 1, 0),
382         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN1_1, I_DL9_CH2, 1, 0),
383         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN1,
384                                     I_GAIN1_OUT_CH2, 1, 0),
385         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN1,
386                                     I_ADDA_UL_CH1, 1, 0),
387         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN1,
388                                     I_ADDA_UL_CH2, 1, 0),
389         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN1,
390                                     I_ADDA_UL_CH3, 1, 0),
391         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN1,
392                                     I_PCM_1_CAP_CH1, 1, 0),
393         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN1,
394                                     I_PCM_2_CAP_CH1, 1, 0),
395         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN1,
396                                     I_PCM_1_CAP_CH2, 1, 0),
397         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN1,
398                                     I_PCM_2_CAP_CH2, 1, 0),
399 };
400 
401 static const struct snd_kcontrol_new mtk_i2s1_ch1_mix[] = {
402         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN28, I_DL1_CH1, 1, 0),
403         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN28, I_DL2_CH1, 1, 0),
404         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN28, I_DL3_CH1, 1, 0),
405         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN28, I_DL12_CH1, 1, 0),
406         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN28_1, I_DL6_CH1, 1, 0),
407         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN28_1, I_DL4_CH1, 1, 0),
408         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN28_1, I_DL5_CH1, 1, 0),
409         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN28_1, I_DL8_CH1, 1, 0),
410         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN28_1, I_DL9_CH1, 1, 0),
411         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN28,
412                                     I_GAIN1_OUT_CH1, 1, 0),
413         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN28,
414                                     I_ADDA_UL_CH1, 1, 0),
415         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN28,
416                                     I_PCM_1_CAP_CH1, 1, 0),
417         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN28,
418                                     I_PCM_2_CAP_CH1, 1, 0),
419 };
420 
421 static const struct snd_kcontrol_new mtk_i2s1_ch2_mix[] = {
422         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN29, I_DL1_CH2, 1, 0),
423         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN29, I_DL2_CH2, 1, 0),
424         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN29, I_DL3_CH2, 1, 0),
425         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN29, I_DL12_CH2, 1, 0),
426         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN29_1, I_DL6_CH2, 1, 0),
427         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN29_1, I_DL4_CH2, 1, 0),
428         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN29_1, I_DL5_CH2, 1, 0),
429         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN29_1, I_DL8_CH2, 1, 0),
430         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN29_1, I_DL9_CH2, 1, 0),
431         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN29,
432                                     I_GAIN1_OUT_CH2, 1, 0),
433         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN29,
434                                     I_ADDA_UL_CH2, 1, 0),
435         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN29,
436                                     I_PCM_1_CAP_CH1, 1, 0),
437         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN29,
438                                     I_PCM_2_CAP_CH1, 1, 0),
439         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN29,
440                                     I_PCM_1_CAP_CH2, 1, 0),
441         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN29,
442                                     I_PCM_2_CAP_CH2, 1, 0),
443 };
444 
445 static const struct snd_kcontrol_new mtk_i2s5_ch1_mix[] = {
446         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN30, I_DL1_CH1, 1, 0),
447         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN30, I_DL2_CH1, 1, 0),
448         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN30, I_DL3_CH1, 1, 0),
449         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN30, I_DL12_CH1, 1, 0),
450         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN30_1, I_DL6_CH1, 1, 0),
451         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN30_1, I_DL4_CH1, 1, 0),
452         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN30_1, I_DL5_CH1, 1, 0),
453         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN30_1, I_DL8_CH1, 1, 0),
454         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN30_1, I_DL9_CH1, 1, 0),
455         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN30,
456                                     I_GAIN1_OUT_CH1, 1, 0),
457         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN30,
458                                     I_ADDA_UL_CH1, 1, 0),
459         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN30,
460                                     I_PCM_1_CAP_CH1, 1, 0),
461         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN30,
462                                     I_PCM_2_CAP_CH1, 1, 0),
463 };
464 
465 static const struct snd_kcontrol_new mtk_i2s5_ch2_mix[] = {
466         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN31, I_DL1_CH2, 1, 0),
467         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN31, I_DL2_CH2, 1, 0),
468         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN31, I_DL3_CH2, 1, 0),
469         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN31, I_DL12_CH2, 1, 0),
470         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN31_1, I_DL6_CH2, 1, 0),
471         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN31_1, I_DL4_CH2, 1, 0),
472         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN31_1, I_DL5_CH2, 1, 0),
473         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN31_1, I_DL8_CH2, 1, 0),
474         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN31_1, I_DL9_CH2, 1, 0),
475         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN31,
476                                     I_GAIN1_OUT_CH2, 1, 0),
477         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN31,
478                                     I_ADDA_UL_CH2, 1, 0),
479         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN31,
480                                     I_PCM_1_CAP_CH1, 1, 0),
481         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN31,
482                                     I_PCM_2_CAP_CH1, 1, 0),
483         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN31,
484                                     I_PCM_1_CAP_CH2, 1, 0),
485         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN31,
486                                     I_PCM_2_CAP_CH2, 1, 0),
487 };
488 
489 static const struct snd_kcontrol_new mtk_i2s7_ch1_mix[] = {
490         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN54, I_DL1_CH1, 1, 0),
491         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN54, I_DL2_CH1, 1, 0),
492         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN54, I_DL3_CH1, 1, 0),
493         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN54, I_DL12_CH1, 1, 0),
494         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN54_1, I_DL6_CH1, 1, 0),
495         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN54_1, I_DL4_CH1, 1, 0),
496         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN54_1, I_DL5_CH1, 1, 0),
497         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN54_1, I_DL9_CH1, 1, 0),
498         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN54,
499                                     I_GAIN1_OUT_CH1, 1, 0),
500         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN54,
501                                     I_ADDA_UL_CH1, 1, 0),
502         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN54,
503                                     I_PCM_1_CAP_CH1, 1, 0),
504         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN54,
505                                     I_PCM_2_CAP_CH1, 1, 0),
506 };
507 
508 static const struct snd_kcontrol_new mtk_i2s7_ch2_mix[] = {
509         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN55, I_DL1_CH2, 1, 0),
510         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN55, I_DL2_CH2, 1, 0),
511         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN55, I_DL3_CH2, 1, 0),
512         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN55, I_DL12_CH2, 1, 0),
513         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN55_1, I_DL6_CH2, 1, 0),
514         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN55_1, I_DL4_CH2, 1, 0),
515         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN55_1, I_DL5_CH2, 1, 0),
516         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN55_1, I_DL9_CH2, 1, 0),
517         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN55,
518                                     I_GAIN1_OUT_CH2, 1, 0),
519         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN55,
520                                     I_ADDA_UL_CH2, 1, 0),
521         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN55,
522                                     I_PCM_1_CAP_CH1, 1, 0),
523         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN55,
524                                     I_PCM_2_CAP_CH1, 1, 0),
525         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN55,
526                                     I_PCM_1_CAP_CH2, 1, 0),
527         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN55,
528                                     I_PCM_2_CAP_CH2, 1, 0),
529 };
530 
531 static const struct snd_kcontrol_new mtk_i2s9_ch1_mix[] = {
532         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN56, I_DL1_CH1, 1, 0),
533         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN56, I_DL2_CH1, 1, 0),
534         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN56, I_DL3_CH1, 1, 0),
535         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN56, I_DL12_CH1, 1, 0),
536         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN56_1, I_DL6_CH1, 1, 0),
537         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN56_1, I_DL4_CH1, 1, 0),
538         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN56_1, I_DL5_CH1, 1, 0),
539         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN56_1, I_DL8_CH1, 1, 0),
540         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH1", AFE_CONN56_1, I_DL9_CH1, 1, 0),
541         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN56,
542                                     I_GAIN1_OUT_CH1, 1, 0),
543         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN56,
544                                     I_ADDA_UL_CH1, 1, 0),
545         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN56,
546                                     I_PCM_1_CAP_CH1, 1, 0),
547         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN56,
548                                     I_PCM_2_CAP_CH1, 1, 0),
549 };
550 
551 static const struct snd_kcontrol_new mtk_i2s9_ch2_mix[] = {
552         SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN57, I_DL1_CH2, 1, 0),
553         SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN57, I_DL2_CH2, 1, 0),
554         SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN57, I_DL3_CH2, 1, 0),
555         SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN57, I_DL12_CH2, 1, 0),
556         SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN57_1, I_DL6_CH2, 1, 0),
557         SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN57_1, I_DL4_CH2, 1, 0),
558         SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN57_1, I_DL5_CH2, 1, 0),
559         SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN57_1, I_DL8_CH2, 1, 0),
560         SOC_DAPM_SINGLE_AUTODISABLE("DL9_CH2", AFE_CONN57_1, I_DL9_CH2, 1, 0),
561         SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN57,
562                                     I_GAIN1_OUT_CH2, 1, 0),
563         SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN57,
564                                     I_ADDA_UL_CH2, 1, 0),
565         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN57,
566                                     I_PCM_1_CAP_CH1, 1, 0),
567         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN57,
568                                     I_PCM_2_CAP_CH1, 1, 0),
569         SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN57,
570                                     I_PCM_1_CAP_CH2, 1, 0),
571         SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN57,
572                                     I_PCM_2_CAP_CH2, 1, 0),
573 };
574 
575 enum {
576         SUPPLY_SEQ_APLL,
577         SUPPLY_SEQ_I2S_MCLK_EN,
578         SUPPLY_SEQ_I2S_HD_EN,
579         SUPPLY_SEQ_I2S_EN,
580 };
581 
582 static int mtk_i2s_en_event(struct snd_soc_dapm_widget *w,
583                             struct snd_kcontrol *kcontrol,
584                             int event)
585 {
586         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
587         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
588         struct mtk_afe_i2s_priv *i2s_priv;
589 
590         i2s_priv = get_i2s_priv_by_name(afe, w->name);
591 
592         if (!i2s_priv) {
593                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
594                 return -EINVAL;
595         }
596 
597         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
598                 __func__, w->name, event);
599 
600         switch (event) {
601         case SND_SOC_DAPM_PRE_PMU:
602                 mt8192_afe_gpio_request(afe->dev, true, i2s_priv->id, 0);
603                 break;
604         case SND_SOC_DAPM_POST_PMD:
605                 mt8192_afe_gpio_request(afe->dev, false, i2s_priv->id, 0);
606                 break;
607         default:
608                 break;
609         }
610 
611         return 0;
612 }
613 
614 static int mtk_apll_event(struct snd_soc_dapm_widget *w,
615                           struct snd_kcontrol *kcontrol,
616                           int event)
617 {
618         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
619         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
620 
621         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
622                 __func__, w->name, event);
623 
624         switch (event) {
625         case SND_SOC_DAPM_PRE_PMU:
626                 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
627                         mt8192_apll1_enable(afe);
628                 else
629                         mt8192_apll2_enable(afe);
630                 break;
631         case SND_SOC_DAPM_POST_PMD:
632                 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
633                         mt8192_apll1_disable(afe);
634                 else
635                         mt8192_apll2_disable(afe);
636                 break;
637         default:
638                 break;
639         }
640 
641         return 0;
642 }
643 
644 static int i2s_out_tinyconn_event(struct snd_soc_dapm_widget *w,
645                                   struct snd_kcontrol *kcontrol,
646                                   int event)
647 {
648         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
649         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
650         unsigned int reg;
651         unsigned int reg_shift;
652         unsigned int reg_mask_shift;
653 
654         dev_dbg(afe->dev, "%s(), event 0x%x\n", __func__, event);
655 
656         if (strstr(w->name, "I2S1")) {
657                 reg = AFE_I2S_CON1;
658                 reg_shift = I2S2_32BIT_EN_SFT;
659                 reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;
660         } else if (strstr(w->name, "I2S3")) {
661                 reg = AFE_I2S_CON3;
662                 reg_shift = I2S4_32BIT_EN_SFT;
663                 reg_mask_shift = I2S4_32BIT_EN_MASK_SFT;
664         } else if (strstr(w->name, "I2S5")) {
665                 reg = AFE_I2S_CON4;
666                 reg_shift = I2S5_32BIT_EN_SFT;
667                 reg_mask_shift = I2S5_32BIT_EN_MASK_SFT;
668         } else if (strstr(w->name, "I2S7")) {
669                 reg = AFE_I2S_CON7;
670                 reg_shift = I2S7_32BIT_EN_SFT;
671                 reg_mask_shift = I2S7_32BIT_EN_MASK_SFT;
672         } else if (strstr(w->name, "I2S9")) {
673                 reg = AFE_I2S_CON9;
674                 reg_shift = I2S9_32BIT_EN_SFT;
675                 reg_mask_shift = I2S9_32BIT_EN_MASK_SFT;
676         } else {
677                 reg = AFE_I2S_CON1;
678                 reg_shift = I2S2_32BIT_EN_SFT;
679                 reg_mask_shift = I2S2_32BIT_EN_MASK_SFT;
680                 dev_warn(afe->dev, "%s(), error widget name %s, use i2s1\n",
681                          __func__, w->name);
682         }
683 
684         switch (event) {
685         case SND_SOC_DAPM_PRE_PMU:
686                 regmap_update_bits(afe->regmap, reg, reg_mask_shift,
687                                    0x1 << reg_shift);
688                 break;
689         case SND_SOC_DAPM_PRE_PMD:
690                 regmap_update_bits(afe->regmap, reg, reg_mask_shift,
691                                    0x0 << reg_shift);
692                 break;
693         default:
694                 break;
695         }
696 
697         return 0;
698 }
699 
700 static int mtk_mclk_en_event(struct snd_soc_dapm_widget *w,
701                              struct snd_kcontrol *kcontrol,
702                              int event)
703 {
704         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
705         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
706         struct mtk_afe_i2s_priv *i2s_priv;
707 
708         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
709                 __func__, w->name, event);
710 
711         i2s_priv = get_i2s_priv_by_name(afe, w->name);
712         if (!i2s_priv) {
713                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
714                 return -EINVAL;
715         }
716 
717         switch (event) {
718         case SND_SOC_DAPM_PRE_PMU:
719                 mt8192_mck_enable(afe, i2s_priv->mclk_id, i2s_priv->mclk_rate);
720                 break;
721         case SND_SOC_DAPM_POST_PMD:
722                 i2s_priv->mclk_rate = 0;
723                 mt8192_mck_disable(afe, i2s_priv->mclk_id);
724                 break;
725         default:
726                 break;
727         }
728 
729         return 0;
730 }
731 
732 static const struct snd_soc_dapm_widget mtk_dai_i2s_widgets[] = {
733         SND_SOC_DAPM_INPUT("CONNSYS"),
734 
735         SND_SOC_DAPM_MIXER("I2S1_CH1", SND_SOC_NOPM, 0, 0,
736                            mtk_i2s1_ch1_mix,
737                            ARRAY_SIZE(mtk_i2s1_ch1_mix)),
738         SND_SOC_DAPM_MIXER("I2S1_CH2", SND_SOC_NOPM, 0, 0,
739                            mtk_i2s1_ch2_mix,
740                            ARRAY_SIZE(mtk_i2s1_ch2_mix)),
741 
742         SND_SOC_DAPM_MIXER("I2S3_CH1", SND_SOC_NOPM, 0, 0,
743                            mtk_i2s3_ch1_mix,
744                            ARRAY_SIZE(mtk_i2s3_ch1_mix)),
745         SND_SOC_DAPM_MIXER("I2S3_CH2", SND_SOC_NOPM, 0, 0,
746                            mtk_i2s3_ch2_mix,
747                            ARRAY_SIZE(mtk_i2s3_ch2_mix)),
748 
749         SND_SOC_DAPM_MIXER("I2S5_CH1", SND_SOC_NOPM, 0, 0,
750                            mtk_i2s5_ch1_mix,
751                            ARRAY_SIZE(mtk_i2s5_ch1_mix)),
752         SND_SOC_DAPM_MIXER("I2S5_CH2", SND_SOC_NOPM, 0, 0,
753                            mtk_i2s5_ch2_mix,
754                            ARRAY_SIZE(mtk_i2s5_ch2_mix)),
755 
756         SND_SOC_DAPM_MIXER("I2S7_CH1", SND_SOC_NOPM, 0, 0,
757                            mtk_i2s7_ch1_mix,
758                            ARRAY_SIZE(mtk_i2s7_ch1_mix)),
759         SND_SOC_DAPM_MIXER("I2S7_CH2", SND_SOC_NOPM, 0, 0,
760                            mtk_i2s7_ch2_mix,
761                            ARRAY_SIZE(mtk_i2s7_ch2_mix)),
762 
763         SND_SOC_DAPM_MIXER("I2S9_CH1", SND_SOC_NOPM, 0, 0,
764                            mtk_i2s9_ch1_mix,
765                            ARRAY_SIZE(mtk_i2s9_ch1_mix)),
766         SND_SOC_DAPM_MIXER("I2S9_CH2", SND_SOC_NOPM, 0, 0,
767                            mtk_i2s9_ch2_mix,
768                            ARRAY_SIZE(mtk_i2s9_ch2_mix)),
769 
770         SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,
771                            &i2s1_tinyconn_ch1_mux_control,
772                            i2s_out_tinyconn_event,
773                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
774         SND_SOC_DAPM_MUX_E("I2S1_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,
775                            &i2s1_tinyconn_ch2_mux_control,
776                            i2s_out_tinyconn_event,
777                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
778         SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH1_MUX", SND_SOC_NOPM, 0, 0,
779                            &i2s3_tinyconn_ch1_mux_control,
780                            i2s_out_tinyconn_event,
781                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
782         SND_SOC_DAPM_MUX_E("I2S3_TINYCONN_CH2_MUX", SND_SOC_NOPM, 0, 0,
783                            &i2s3_tinyconn_ch2_mux_control,
784                            i2s_out_tinyconn_event,
785                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
786 
787         /* i2s en*/
788         SND_SOC_DAPM_SUPPLY_S("I2S0_EN", SUPPLY_SEQ_I2S_EN,
789                               AFE_I2S_CON, I2S_EN_SFT, 0,
790                               mtk_i2s_en_event,
791                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
792         SND_SOC_DAPM_SUPPLY_S("I2S1_EN", SUPPLY_SEQ_I2S_EN,
793                               AFE_I2S_CON1, I2S_EN_SFT, 0,
794                               mtk_i2s_en_event,
795                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
796         SND_SOC_DAPM_SUPPLY_S("I2S2_EN", SUPPLY_SEQ_I2S_EN,
797                               AFE_I2S_CON2, I2S_EN_SFT, 0,
798                               mtk_i2s_en_event,
799                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
800         SND_SOC_DAPM_SUPPLY_S("I2S3_EN", SUPPLY_SEQ_I2S_EN,
801                               AFE_I2S_CON3, I2S_EN_SFT, 0,
802                               mtk_i2s_en_event,
803                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
804         SND_SOC_DAPM_SUPPLY_S("I2S5_EN", SUPPLY_SEQ_I2S_EN,
805                               AFE_I2S_CON4, I2S5_EN_SFT, 0,
806                               mtk_i2s_en_event,
807                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
808         SND_SOC_DAPM_SUPPLY_S("I2S6_EN", SUPPLY_SEQ_I2S_EN,
809                               AFE_I2S_CON6, I2S6_EN_SFT, 0,
810                               mtk_i2s_en_event,
811                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
812         SND_SOC_DAPM_SUPPLY_S("I2S7_EN", SUPPLY_SEQ_I2S_EN,
813                               AFE_I2S_CON7, I2S7_EN_SFT, 0,
814                               mtk_i2s_en_event,
815                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
816         SND_SOC_DAPM_SUPPLY_S("I2S8_EN", SUPPLY_SEQ_I2S_EN,
817                               AFE_I2S_CON8, I2S8_EN_SFT, 0,
818                               mtk_i2s_en_event,
819                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
820         SND_SOC_DAPM_SUPPLY_S("I2S9_EN", SUPPLY_SEQ_I2S_EN,
821                               AFE_I2S_CON9, I2S9_EN_SFT, 0,
822                               mtk_i2s_en_event,
823                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
824         /* i2s hd en */
825         SND_SOC_DAPM_SUPPLY_S(I2S0_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
826                               AFE_I2S_CON, I2S1_HD_EN_SFT, 0, NULL, 0),
827         SND_SOC_DAPM_SUPPLY_S(I2S1_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
828                               AFE_I2S_CON1, I2S2_HD_EN_SFT, 0, NULL, 0),
829         SND_SOC_DAPM_SUPPLY_S(I2S2_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
830                               AFE_I2S_CON2, I2S3_HD_EN_SFT, 0, NULL, 0),
831         SND_SOC_DAPM_SUPPLY_S(I2S3_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
832                               AFE_I2S_CON3, I2S4_HD_EN_SFT, 0, NULL, 0),
833         SND_SOC_DAPM_SUPPLY_S(I2S5_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
834                               AFE_I2S_CON4, I2S5_HD_EN_SFT, 0, NULL, 0),
835         SND_SOC_DAPM_SUPPLY_S(I2S6_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
836                               AFE_I2S_CON6, I2S6_HD_EN_SFT, 0, NULL, 0),
837         SND_SOC_DAPM_SUPPLY_S(I2S7_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
838                               AFE_I2S_CON7, I2S7_HD_EN_SFT, 0, NULL, 0),
839         SND_SOC_DAPM_SUPPLY_S(I2S8_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
840                               AFE_I2S_CON8, I2S8_HD_EN_SFT, 0, NULL, 0),
841         SND_SOC_DAPM_SUPPLY_S(I2S9_HD_EN_W_NAME, SUPPLY_SEQ_I2S_HD_EN,
842                               AFE_I2S_CON9, I2S9_HD_EN_SFT, 0, NULL, 0),
843 
844         /* i2s mclk en */
845         SND_SOC_DAPM_SUPPLY_S(I2S0_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
846                               SND_SOC_NOPM, 0, 0,
847                               mtk_mclk_en_event,
848                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
849         SND_SOC_DAPM_SUPPLY_S(I2S1_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
850                               SND_SOC_NOPM, 0, 0,
851                               mtk_mclk_en_event,
852                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
853         SND_SOC_DAPM_SUPPLY_S(I2S2_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
854                               SND_SOC_NOPM, 0, 0,
855                               mtk_mclk_en_event,
856                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
857         SND_SOC_DAPM_SUPPLY_S(I2S3_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
858                               SND_SOC_NOPM, 0, 0,
859                               mtk_mclk_en_event,
860                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
861         SND_SOC_DAPM_SUPPLY_S(I2S5_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
862                               SND_SOC_NOPM, 0, 0,
863                               mtk_mclk_en_event,
864                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
865         SND_SOC_DAPM_SUPPLY_S(I2S6_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
866                               SND_SOC_NOPM, 0, 0,
867                               mtk_mclk_en_event,
868                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
869         SND_SOC_DAPM_SUPPLY_S(I2S7_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
870                               SND_SOC_NOPM, 0, 0,
871                               mtk_mclk_en_event,
872                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
873         SND_SOC_DAPM_SUPPLY_S(I2S8_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
874                               SND_SOC_NOPM, 0, 0,
875                               mtk_mclk_en_event,
876                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
877         SND_SOC_DAPM_SUPPLY_S(I2S9_MCLK_EN_W_NAME, SUPPLY_SEQ_I2S_MCLK_EN,
878                               SND_SOC_NOPM, 0, 0,
879                               mtk_mclk_en_event,
880                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
881 
882         /* apll */
883         SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,
884                               SND_SOC_NOPM, 0, 0,
885                               mtk_apll_event,
886                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
887         SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,
888                               SND_SOC_NOPM, 0, 0,
889                               mtk_apll_event,
890                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
891 
892         /* allow i2s on without codec on */
893         SND_SOC_DAPM_OUTPUT("I2S_DUMMY_OUT"),
894         SND_SOC_DAPM_MUX("I2S1_Out_Mux",
895                          SND_SOC_NOPM, 0, 0, &i2s1_out_mux_control),
896         SND_SOC_DAPM_MUX("I2S3_Out_Mux",
897                          SND_SOC_NOPM, 0, 0, &i2s3_out_mux_control),
898         SND_SOC_DAPM_MUX("I2S5_Out_Mux",
899                          SND_SOC_NOPM, 0, 0, &i2s5_out_mux_control),
900         SND_SOC_DAPM_MUX("I2S7_Out_Mux",
901                          SND_SOC_NOPM, 0, 0, &i2s7_out_mux_control),
902         SND_SOC_DAPM_MUX("I2S9_Out_Mux",
903                          SND_SOC_NOPM, 0, 0, &i2s9_out_mux_control),
904 
905         SND_SOC_DAPM_INPUT("I2S_DUMMY_IN"),
906         SND_SOC_DAPM_MUX("I2S0_In_Mux",
907                          SND_SOC_NOPM, 0, 0, &i2s0_in_mux_control),
908         SND_SOC_DAPM_MUX("I2S8_In_Mux",
909                          SND_SOC_NOPM, 0, 0, &i2s8_in_mux_control),
910 
911         /* i2s in lpbk */
912         SND_SOC_DAPM_MUX("I2S0_Lpbk_Mux",
913                          SND_SOC_NOPM, 0, 0, &i2s0_lpbk_mux_control),
914         SND_SOC_DAPM_MUX("I2S2_Lpbk_Mux",
915                          SND_SOC_NOPM, 0, 0, &i2s2_lpbk_mux_control),
916 };
917 
918 static int mtk_afe_i2s_share_connect(struct snd_soc_dapm_widget *source,
919                                      struct snd_soc_dapm_widget *sink)
920 {
921         struct snd_soc_dapm_widget *w = sink;
922         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
923         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
924         struct mtk_afe_i2s_priv *i2s_priv;
925 
926         i2s_priv = get_i2s_priv_by_name(afe, sink->name);
927         if (!i2s_priv) {
928                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
929                 return 0;
930         }
931 
932         if (i2s_priv->share_i2s_id < 0)
933                 return 0;
934 
935         return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name);
936 }
937 
938 static int mtk_afe_i2s_hd_connect(struct snd_soc_dapm_widget *source,
939                                   struct snd_soc_dapm_widget *sink)
940 {
941         struct snd_soc_dapm_widget *w = sink;
942         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
943         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
944         struct mtk_afe_i2s_priv *i2s_priv;
945 
946         i2s_priv = get_i2s_priv_by_name(afe, sink->name);
947         if (!i2s_priv) {
948                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
949                 return 0;
950         }
951 
952         if (get_i2s_id_by_name(afe, sink->name) ==
953             get_i2s_id_by_name(afe, source->name))
954                 return i2s_priv->low_jitter_en;
955 
956         /* check if share i2s need hd en */
957         if (i2s_priv->share_i2s_id < 0)
958                 return 0;
959 
960         if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))
961                 return i2s_priv->low_jitter_en;
962 
963         return 0;
964 }
965 
966 static int mtk_afe_i2s_apll_connect(struct snd_soc_dapm_widget *source,
967                                     struct snd_soc_dapm_widget *sink)
968 {
969         struct snd_soc_dapm_widget *w = sink;
970         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
971         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
972         struct mtk_afe_i2s_priv *i2s_priv;
973         int cur_apll;
974         int i2s_need_apll;
975 
976         i2s_priv = get_i2s_priv_by_name(afe, w->name);
977         if (!i2s_priv) {
978                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
979                 return 0;
980         }
981 
982         /* which apll */
983         cur_apll = mt8192_get_apll_by_name(afe, source->name);
984 
985         /* choose APLL from i2s rate */
986         i2s_need_apll = mt8192_get_apll_by_rate(afe, i2s_priv->rate);
987 
988         if (i2s_need_apll == cur_apll)
989                 return 1;
990 
991         return 0;
992 }
993 
994 static int mtk_afe_i2s_mclk_connect(struct snd_soc_dapm_widget *source,
995                                     struct snd_soc_dapm_widget *sink)
996 {
997         struct snd_soc_dapm_widget *w = sink;
998         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
999         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
1000         struct mtk_afe_i2s_priv *i2s_priv;
1001 
1002         i2s_priv = get_i2s_priv_by_name(afe, sink->name);
1003         if (!i2s_priv) {
1004                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
1005                 return 0;
1006         }
1007 
1008         if (get_i2s_id_by_name(afe, sink->name) ==
1009             get_i2s_id_by_name(afe, source->name))
1010                 return (i2s_priv->mclk_rate > 0) ? 1 : 0;
1011 
1012         /* check if share i2s need mclk */
1013         if (i2s_priv->share_i2s_id < 0)
1014                 return 0;
1015 
1016         if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name))
1017                 return (i2s_priv->mclk_rate > 0) ? 1 : 0;
1018 
1019         return 0;
1020 }
1021 
1022 static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,
1023                                      struct snd_soc_dapm_widget *sink)
1024 {
1025         struct snd_soc_dapm_widget *w = sink;
1026         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1027         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
1028         struct mtk_afe_i2s_priv *i2s_priv;
1029         int cur_apll;
1030 
1031         i2s_priv = get_i2s_priv_by_name(afe, w->name);
1032         if (!i2s_priv) {
1033                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
1034                 return 0;
1035         }
1036 
1037         /* which apll */
1038         cur_apll = mt8192_get_apll_by_name(afe, source->name);
1039 
1040         if (i2s_priv->mclk_apll == cur_apll)
1041                 return 1;
1042 
1043         return 0;
1044 }
1045 
1046 static const struct snd_soc_dapm_route mtk_dai_i2s_routes[] = {
1047         {"Connsys I2S", NULL, "CONNSYS"},
1048 
1049         /* i2s0 */
1050         {"I2S0", NULL, "I2S0_EN"},
1051         {"I2S0", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1052         {"I2S0", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1053         {"I2S0", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1054         {"I2S0", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1055         {"I2S0", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1056         {"I2S0", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1057         {"I2S0", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1058         {"I2S0", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1059 
1060         {"I2S0", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1061         {"I2S0", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1062         {"I2S0", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1063         {"I2S0", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1064         {"I2S0", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1065         {"I2S0", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1066         {"I2S0", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1067         {"I2S0", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1068         {"I2S0", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1069         {I2S0_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1070         {I2S0_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1071 
1072         {"I2S0", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1073         {"I2S0", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1074         {"I2S0", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1075         {"I2S0", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1076         {"I2S0", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1077         {"I2S0", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1078         {"I2S0", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1079         {"I2S0", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1080         {"I2S0", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1081         {I2S0_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1082         {I2S0_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1083 
1084         /* i2s1 */
1085         {"I2S1_CH1", "DL1_CH1", "DL1"},
1086         {"I2S1_CH2", "DL1_CH2", "DL1"},
1087         {"I2S1_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},
1088         {"I2S1_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},
1089 
1090         {"I2S1_CH1", "DL2_CH1", "DL2"},
1091         {"I2S1_CH2", "DL2_CH2", "DL2"},
1092         {"I2S1_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},
1093         {"I2S1_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},
1094 
1095         {"I2S1_CH1", "DL3_CH1", "DL3"},
1096         {"I2S1_CH2", "DL3_CH2", "DL3"},
1097         {"I2S1_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},
1098         {"I2S1_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},
1099 
1100         {"I2S1_CH1", "DL12_CH1", "DL12"},
1101         {"I2S1_CH2", "DL12_CH2", "DL12"},
1102         {"I2S1_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},
1103         {"I2S1_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},
1104 
1105         {"I2S1_CH1", "DL4_CH1", "DL4"},
1106         {"I2S1_CH2", "DL4_CH2", "DL4"},
1107 
1108         {"I2S1_CH1", "DL5_CH1", "DL5"},
1109         {"I2S1_CH2", "DL5_CH2", "DL5"},
1110 
1111         {"I2S1_CH1", "DL6_CH1", "DL6"},
1112         {"I2S1_CH2", "DL6_CH2", "DL6"},
1113 
1114         {"I2S1_CH1", "DL8_CH1", "DL8"},
1115         {"I2S1_CH2", "DL8_CH2", "DL8"},
1116 
1117         {"I2S1", NULL, "I2S1_CH1"},
1118         {"I2S1", NULL, "I2S1_CH2"},
1119         {"I2S1", NULL, "I2S3_TINYCONN_CH1_MUX"},
1120         {"I2S1", NULL, "I2S3_TINYCONN_CH2_MUX"},
1121 
1122         {"I2S1", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1123         {"I2S1", NULL, "I2S1_EN"},
1124         {"I2S1", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1125         {"I2S1", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1126         {"I2S1", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1127         {"I2S1", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1128         {"I2S1", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1129         {"I2S1", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1130         {"I2S1", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1131 
1132         {"I2S1", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1133         {"I2S1", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1134         {"I2S1", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1135         {"I2S1", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1136         {"I2S1", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1137         {"I2S1", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1138         {"I2S1", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1139         {"I2S1", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1140         {"I2S1", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1141         {I2S1_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1142         {I2S1_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1143 
1144         {"I2S1", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1145         {"I2S1", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1146         {"I2S1", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1147         {"I2S1", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1148         {"I2S1", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1149         {"I2S1", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1150         {"I2S1", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1151         {"I2S1", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1152         {"I2S1", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1153         {I2S1_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1154         {I2S1_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1155 
1156         /* i2s2 */
1157         {"I2S2", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1158         {"I2S2", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1159         {"I2S2", NULL, "I2S2_EN"},
1160         {"I2S2", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1161         {"I2S2", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1162         {"I2S2", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1163         {"I2S2", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1164         {"I2S2", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1165         {"I2S2", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1166 
1167         {"I2S2", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1168         {"I2S2", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1169         {"I2S2", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1170         {"I2S2", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1171         {"I2S2", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1172         {"I2S2", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1173         {"I2S2", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1174         {"I2S2", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1175         {"I2S2", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1176         {I2S2_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1177         {I2S2_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1178 
1179         {"I2S2", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1180         {"I2S2", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1181         {"I2S2", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1182         {"I2S2", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1183         {"I2S2", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1184         {"I2S2", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1185         {"I2S2", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1186         {"I2S2", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1187         {"I2S2", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1188         {I2S2_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1189         {I2S2_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1190 
1191         /* i2s3 */
1192         {"I2S3_CH1", "DL1_CH1", "DL1"},
1193         {"I2S3_CH2", "DL1_CH2", "DL1"},
1194         {"I2S3_TINYCONN_CH1_MUX", "DL1_CH1", "DL1"},
1195         {"I2S3_TINYCONN_CH2_MUX", "DL1_CH2", "DL1"},
1196 
1197         {"I2S3_CH1", "DL2_CH1", "DL2"},
1198         {"I2S3_CH2", "DL2_CH2", "DL2"},
1199         {"I2S3_TINYCONN_CH1_MUX", "DL2_CH1", "DL2"},
1200         {"I2S3_TINYCONN_CH2_MUX", "DL2_CH2", "DL2"},
1201 
1202         {"I2S3_CH1", "DL3_CH1", "DL3"},
1203         {"I2S3_CH2", "DL3_CH2", "DL3"},
1204         {"I2S3_TINYCONN_CH1_MUX", "DL3_CH1", "DL3"},
1205         {"I2S3_TINYCONN_CH2_MUX", "DL3_CH2", "DL3"},
1206 
1207         {"I2S3_CH1", "DL12_CH1", "DL12"},
1208         {"I2S3_CH2", "DL12_CH2", "DL12"},
1209         {"I2S3_TINYCONN_CH1_MUX", "DL12_CH1", "DL12"},
1210         {"I2S3_TINYCONN_CH2_MUX", "DL12_CH2", "DL12"},
1211 
1212         {"I2S3_CH1", "DL4_CH1", "DL4"},
1213         {"I2S3_CH2", "DL4_CH2", "DL4"},
1214 
1215         {"I2S3_CH1", "DL5_CH1", "DL5"},
1216         {"I2S3_CH2", "DL5_CH2", "DL5"},
1217 
1218         {"I2S3_CH1", "DL6_CH1", "DL6"},
1219         {"I2S3_CH2", "DL6_CH2", "DL6"},
1220 
1221         {"I2S3_CH1", "DL8_CH1", "DL8"},
1222         {"I2S3_CH2", "DL8_CH2", "DL8"},
1223 
1224         {"I2S3", NULL, "I2S3_CH1"},
1225         {"I2S3", NULL, "I2S3_CH2"},
1226         {"I2S3", NULL, "I2S3_TINYCONN_CH1_MUX"},
1227         {"I2S3", NULL, "I2S3_TINYCONN_CH2_MUX"},
1228 
1229         {"I2S3", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1230         {"I2S3", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1231         {"I2S3", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1232         {"I2S3", NULL, "I2S3_EN"},
1233         {"I2S3", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1234         {"I2S3", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1235         {"I2S3", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1236         {"I2S3", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1237         {"I2S3", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1238 
1239         {"I2S3", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1240         {"I2S3", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1241         {"I2S3", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1242         {"I2S3", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1243         {"I2S3", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1244         {"I2S3", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1245         {"I2S3", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1246         {"I2S3", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1247         {"I2S3", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1248         {I2S3_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1249         {I2S3_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1250 
1251         {"I2S3", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1252         {"I2S3", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1253         {"I2S3", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1254         {"I2S3", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1255         {"I2S3", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1256         {"I2S3", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1257         {"I2S3", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1258         {"I2S3", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1259         {"I2S3", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1260         {I2S3_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1261         {I2S3_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1262 
1263         /* i2s5 */
1264         {"I2S5_CH1", "DL1_CH1", "DL1"},
1265         {"I2S5_CH2", "DL1_CH2", "DL1"},
1266 
1267         {"I2S5_CH1", "DL2_CH1", "DL2"},
1268         {"I2S5_CH2", "DL2_CH2", "DL2"},
1269 
1270         {"I2S5_CH1", "DL3_CH1", "DL3"},
1271         {"I2S5_CH2", "DL3_CH2", "DL3"},
1272 
1273         {"I2S5_CH1", "DL12_CH1", "DL12"},
1274         {"I2S5_CH2", "DL12_CH2", "DL12"},
1275 
1276         {"I2S5_CH1", "DL4_CH1", "DL4"},
1277         {"I2S5_CH2", "DL4_CH2", "DL4"},
1278 
1279         {"I2S5_CH1", "DL5_CH1", "DL5"},
1280         {"I2S5_CH2", "DL5_CH2", "DL5"},
1281 
1282         {"I2S5_CH1", "DL6_CH1", "DL6"},
1283         {"I2S5_CH2", "DL6_CH2", "DL6"},
1284 
1285         {"I2S5_CH1", "DL8_CH1", "DL8"},
1286         {"I2S5_CH2", "DL8_CH2", "DL8"},
1287 
1288         {"I2S5", NULL, "I2S5_CH1"},
1289         {"I2S5", NULL, "I2S5_CH2"},
1290 
1291         {"I2S5", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1292         {"I2S5", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1293         {"I2S5", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1294         {"I2S5", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1295         {"I2S5", NULL, "I2S5_EN"},
1296         {"I2S5", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1297         {"I2S5", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1298         {"I2S5", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1299         {"I2S5", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1300 
1301         {"I2S5", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1302         {"I2S5", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1303         {"I2S5", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1304         {"I2S5", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1305         {"I2S5", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1306         {"I2S5", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1307         {"I2S5", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1308         {"I2S5", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1309         {"I2S5", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1310         {I2S5_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1311         {I2S5_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1312 
1313         {"I2S5", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1314         {"I2S5", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1315         {"I2S5", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1316         {"I2S5", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1317         {"I2S5", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1318         {"I2S5", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1319         {"I2S5", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1320         {"I2S5", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1321         {"I2S5", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1322         {I2S5_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1323         {I2S5_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1324 
1325         /* i2s6 */
1326         {"I2S6", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1327         {"I2S6", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1328         {"I2S6", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1329         {"I2S6", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1330         {"I2S6", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1331         {"I2S6", NULL, "I2S6_EN"},
1332         {"I2S6", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1333         {"I2S6", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1334         {"I2S6", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1335 
1336         {"I2S6", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1337         {"I2S6", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1338         {"I2S6", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1339         {"I2S6", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1340         {"I2S6", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1341         {"I2S6", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1342         {"I2S6", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1343         {"I2S6", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1344         {"I2S6", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1345         {I2S6_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1346         {I2S6_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1347 
1348         {"I2S6", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1349         {"I2S6", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1350         {"I2S6", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1351         {"I2S6", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1352         {"I2S6", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1353         {"I2S6", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1354         {"I2S6", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1355         {"I2S6", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1356         {"I2S6", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1357         {I2S6_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1358         {I2S6_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1359 
1360         /* i2s7 */
1361         {"I2S7", NULL, "I2S7_CH1"},
1362         {"I2S7", NULL, "I2S7_CH2"},
1363 
1364         {"I2S7", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1365         {"I2S7", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1366         {"I2S7", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1367         {"I2S7", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1368         {"I2S7", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1369         {"I2S7", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1370         {"I2S7", NULL, "I2S7_EN"},
1371         {"I2S7", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1372         {"I2S7", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1373 
1374         {"I2S7", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1375         {"I2S7", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1376         {"I2S7", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1377         {"I2S7", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1378         {"I2S7", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1379         {"I2S7", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1380         {"I2S7", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1381         {"I2S7", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1382         {"I2S7", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1383         {I2S7_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1384         {I2S7_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1385 
1386         {"I2S7", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1387         {"I2S7", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1388         {"I2S7", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1389         {"I2S7", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1390         {"I2S7", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1391         {"I2S7", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1392         {"I2S7", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1393         {"I2S7", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1394         {"I2S7", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1395         {I2S7_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1396         {I2S7_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1397 
1398         /* i2s8 */
1399         {"I2S8", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1400         {"I2S8", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1401         {"I2S8", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1402         {"I2S8", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1403         {"I2S8", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1404         {"I2S8", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1405         {"I2S8", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1406         {"I2S8", NULL, "I2S8_EN"},
1407         {"I2S8", NULL, "I2S9_EN", mtk_afe_i2s_share_connect},
1408 
1409         {"I2S8", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1410         {"I2S8", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1411         {"I2S8", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1412         {"I2S8", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1413         {"I2S8", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1414         {"I2S8", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1415         {"I2S8", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1416         {"I2S8", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1417         {"I2S8", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1418         {I2S8_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1419         {I2S8_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1420 
1421         {"I2S8", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1422         {"I2S8", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1423         {"I2S8", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1424         {"I2S8", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1425         {"I2S8", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1426         {"I2S8", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1427         {"I2S8", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1428         {"I2S8", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1429         {"I2S8", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1430         {I2S8_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1431         {I2S8_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1432 
1433         /* i2s9 */
1434         {"I2S9_CH1", "DL1_CH1", "DL1"},
1435         {"I2S9_CH2", "DL1_CH2", "DL1"},
1436 
1437         {"I2S9_CH1", "DL2_CH1", "DL2"},
1438         {"I2S9_CH2", "DL2_CH2", "DL2"},
1439 
1440         {"I2S9_CH1", "DL3_CH1", "DL3"},
1441         {"I2S9_CH2", "DL3_CH2", "DL3"},
1442 
1443         {"I2S9_CH1", "DL12_CH1", "DL12"},
1444         {"I2S9_CH2", "DL12_CH2", "DL12"},
1445 
1446         {"I2S9_CH1", "DL4_CH1", "DL4"},
1447         {"I2S9_CH2", "DL4_CH2", "DL4"},
1448 
1449         {"I2S9_CH1", "DL5_CH1", "DL5"},
1450         {"I2S9_CH2", "DL5_CH2", "DL5"},
1451 
1452         {"I2S9_CH1", "DL6_CH1", "DL6"},
1453         {"I2S9_CH2", "DL6_CH2", "DL6"},
1454 
1455         {"I2S9_CH1", "DL8_CH1", "DL8"},
1456         {"I2S9_CH2", "DL8_CH2", "DL8"},
1457 
1458         {"I2S9_CH1", "DL9_CH1", "DL9"},
1459         {"I2S9_CH2", "DL9_CH2", "DL9"},
1460 
1461         {"I2S9", NULL, "I2S9_CH1"},
1462         {"I2S9", NULL, "I2S9_CH2"},
1463 
1464         {"I2S9", NULL, "I2S0_EN", mtk_afe_i2s_share_connect},
1465         {"I2S9", NULL, "I2S1_EN", mtk_afe_i2s_share_connect},
1466         {"I2S9", NULL, "I2S2_EN", mtk_afe_i2s_share_connect},
1467         {"I2S9", NULL, "I2S3_EN", mtk_afe_i2s_share_connect},
1468         {"I2S9", NULL, "I2S5_EN", mtk_afe_i2s_share_connect},
1469         {"I2S9", NULL, "I2S6_EN", mtk_afe_i2s_share_connect},
1470         {"I2S9", NULL, "I2S7_EN", mtk_afe_i2s_share_connect},
1471         {"I2S9", NULL, "I2S8_EN", mtk_afe_i2s_share_connect},
1472         {"I2S9", NULL, "I2S9_EN"},
1473 
1474         {"I2S9", NULL, I2S0_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1475         {"I2S9", NULL, I2S1_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1476         {"I2S9", NULL, I2S2_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1477         {"I2S9", NULL, I2S3_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1478         {"I2S9", NULL, I2S5_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1479         {"I2S9", NULL, I2S6_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1480         {"I2S9", NULL, I2S7_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1481         {"I2S9", NULL, I2S8_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1482         {"I2S9", NULL, I2S9_HD_EN_W_NAME, mtk_afe_i2s_hd_connect},
1483         {I2S9_HD_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_i2s_apll_connect},
1484         {I2S9_HD_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_i2s_apll_connect},
1485 
1486         {"I2S9", NULL, I2S0_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1487         {"I2S9", NULL, I2S1_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1488         {"I2S9", NULL, I2S2_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1489         {"I2S9", NULL, I2S3_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1490         {"I2S9", NULL, I2S5_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1491         {"I2S9", NULL, I2S6_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1492         {"I2S9", NULL, I2S7_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1493         {"I2S9", NULL, I2S8_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1494         {"I2S9", NULL, I2S9_MCLK_EN_W_NAME, mtk_afe_i2s_mclk_connect},
1495         {I2S9_MCLK_EN_W_NAME, NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1496         {I2S9_MCLK_EN_W_NAME, NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1497 
1498         /* allow i2s on without codec on */
1499         {"I2S0", NULL, "I2S0_In_Mux"},
1500         {"I2S0_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},
1501 
1502         {"I2S8", NULL, "I2S8_In_Mux"},
1503         {"I2S8_In_Mux", "Dummy_Widget", "I2S_DUMMY_IN"},
1504 
1505         {"I2S1_Out_Mux", "Dummy_Widget", "I2S1"},
1506         {"I2S_DUMMY_OUT", NULL, "I2S1_Out_Mux"},
1507 
1508         {"I2S3_Out_Mux", "Dummy_Widget", "I2S3"},
1509         {"I2S_DUMMY_OUT", NULL, "I2S3_Out_Mux"},
1510 
1511         {"I2S5_Out_Mux", "Dummy_Widget", "I2S5"},
1512         {"I2S_DUMMY_OUT", NULL, "I2S5_Out_Mux"},
1513 
1514         {"I2S7_Out_Mux", "Dummy_Widget", "I2S7"},
1515         {"I2S_DUMMY_OUT", NULL, "I2S7_Out_Mux"},
1516 
1517         {"I2S9_Out_Mux", "Dummy_Widget", "I2S9"},
1518         {"I2S_DUMMY_OUT", NULL, "I2S9_Out_Mux"},
1519 
1520         /* i2s in lpbk */
1521         {"I2S0_Lpbk_Mux", "Lpbk", "I2S3"},
1522         {"I2S2_Lpbk_Mux", "Lpbk", "I2S1"},
1523         {"I2S0", NULL, "I2S0_Lpbk_Mux"},
1524         {"I2S2", NULL, "I2S2_Lpbk_Mux"},
1525 };
1526 
1527 /* dai ops */
1528 static int mtk_dai_connsys_i2s_hw_params(struct snd_pcm_substream *substream,
1529                                          struct snd_pcm_hw_params *params,
1530                                          struct snd_soc_dai *dai)
1531 {
1532         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1533         unsigned int rate = params_rate(params);
1534         unsigned int rate_reg = mt8192_rate_transform(afe->dev,
1535                                                       rate, dai->id);
1536         unsigned int i2s_con = 0;
1537 
1538         dev_dbg(afe->dev, "%s(), id %d, stream %d, rate %d\n",
1539                 __func__, dai->id, substream->stream, rate);
1540 
1541         /* non-inverse, i2s mode, proxy mode, 16bits, from connsys */
1542         i2s_con |= 0 << INV_PAD_CTRL_SFT;
1543         i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;
1544         i2s_con |= 1 << I2S_SRC_SFT;
1545         i2s_con |= get_i2s_wlen(SNDRV_PCM_FORMAT_S16_LE) << I2S_WLEN_SFT;
1546         i2s_con |= 0 << I2SIN_PAD_SEL_SFT;
1547         regmap_write(afe->regmap, AFE_CONNSYS_I2S_CON, i2s_con);
1548 
1549         /* use asrc */
1550         regmap_update_bits(afe->regmap,
1551                            AFE_CONNSYS_I2S_CON,
1552                            I2S_BYPSRC_MASK_SFT,
1553                            0x0 << I2S_BYPSRC_SFT);
1554 
1555         /* proxy mode, set i2s for asrc */
1556         regmap_update_bits(afe->regmap,
1557                            AFE_CONNSYS_I2S_CON,
1558                            I2S_MODE_MASK_SFT,
1559                            rate_reg << I2S_MODE_SFT);
1560 
1561         switch (rate) {
1562         case 32000:
1563                 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x140000);
1564                 break;
1565         case 44100:
1566                 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001B9000);
1567                 break;
1568         default:
1569                 regmap_write(afe->regmap, AFE_ASRC_2CH_CON3, 0x001E0000);
1570                 break;
1571         }
1572 
1573         /* Calibration setting */
1574         regmap_write(afe->regmap, AFE_ASRC_2CH_CON4, 0x00140000);
1575         regmap_write(afe->regmap, AFE_ASRC_2CH_CON9, 0x00036000);
1576         regmap_write(afe->regmap, AFE_ASRC_2CH_CON10, 0x0002FC00);
1577         regmap_write(afe->regmap, AFE_ASRC_2CH_CON6, 0x00007EF4);
1578         regmap_write(afe->regmap, AFE_ASRC_2CH_CON5, 0x00FF5986);
1579 
1580         /* 0:Stereo 1:Mono */
1581         regmap_update_bits(afe->regmap,
1582                            AFE_ASRC_2CH_CON2,
1583                            CHSET_IS_MONO_MASK_SFT,
1584                            0x0 << CHSET_IS_MONO_SFT);
1585 
1586         return 0;
1587 }
1588 
1589 static int mtk_dai_connsys_i2s_trigger(struct snd_pcm_substream *substream,
1590                                        int cmd, struct snd_soc_dai *dai)
1591 {
1592         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1593         struct mt8192_afe_private *afe_priv = afe->platform_priv;
1594 
1595         dev_dbg(afe->dev, "%s(), cmd %d, stream %d\n",
1596                 __func__, cmd, substream->stream);
1597 
1598         switch (cmd) {
1599         case SNDRV_PCM_TRIGGER_START:
1600         case SNDRV_PCM_TRIGGER_RESUME:
1601                 /* i2s enable */
1602                 regmap_update_bits(afe->regmap,
1603                                    AFE_CONNSYS_I2S_CON,
1604                                    I2S_EN_MASK_SFT,
1605                                    0x1 << I2S_EN_SFT);
1606 
1607                 /* calibrator enable */
1608                 regmap_update_bits(afe->regmap,
1609                                    AFE_ASRC_2CH_CON5,
1610                                    CALI_EN_MASK_SFT,
1611                                    0x1 << CALI_EN_SFT);
1612 
1613                 /* asrc enable */
1614                 regmap_update_bits(afe->regmap,
1615                                    AFE_ASRC_2CH_CON0,
1616                                    CON0_CHSET_STR_CLR_MASK_SFT,
1617                                    0x1 << CON0_CHSET_STR_CLR_SFT);
1618                 regmap_update_bits(afe->regmap,
1619                                    AFE_ASRC_2CH_CON0,
1620                                    CON0_ASM_ON_MASK_SFT,
1621                                    0x1 << CON0_ASM_ON_SFT);
1622 
1623                 afe_priv->dai_on[dai->id] = true;
1624                 break;
1625         case SNDRV_PCM_TRIGGER_STOP:
1626         case SNDRV_PCM_TRIGGER_SUSPEND:
1627                 regmap_update_bits(afe->regmap,
1628                                    AFE_ASRC_2CH_CON0,
1629                                    CON0_ASM_ON_MASK_SFT,
1630                                    0 << CON0_ASM_ON_SFT);
1631                 regmap_update_bits(afe->regmap,
1632                                    AFE_ASRC_2CH_CON5,
1633                                    CALI_EN_MASK_SFT,
1634                                    0 << CALI_EN_SFT);
1635 
1636                 /* i2s disable */
1637                 regmap_update_bits(afe->regmap,
1638                                    AFE_CONNSYS_I2S_CON,
1639                                    I2S_EN_MASK_SFT,
1640                                    0x0 << I2S_EN_SFT);
1641 
1642                 /* bypass asrc */
1643                 regmap_update_bits(afe->regmap,
1644                                    AFE_CONNSYS_I2S_CON,
1645                                    I2S_BYPSRC_MASK_SFT,
1646                                    0x1 << I2S_BYPSRC_SFT);
1647 
1648                 afe_priv->dai_on[dai->id] = false;
1649                 break;
1650         default:
1651                 return -EINVAL;
1652         }
1653         return 0;
1654 }
1655 
1656 static const struct snd_soc_dai_ops mtk_dai_connsys_i2s_ops = {
1657         .hw_params = mtk_dai_connsys_i2s_hw_params,
1658         .trigger = mtk_dai_connsys_i2s_trigger,
1659 };
1660 
1661 /* i2s */
1662 static int mtk_dai_i2s_config(struct mtk_base_afe *afe,
1663                               struct snd_pcm_hw_params *params,
1664                               int i2s_id)
1665 {
1666         struct mt8192_afe_private *afe_priv = afe->platform_priv;
1667         struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[i2s_id];
1668 
1669         unsigned int rate = params_rate(params);
1670         unsigned int rate_reg = mt8192_rate_transform(afe->dev,
1671                                                       rate, i2s_id);
1672         snd_pcm_format_t format = params_format(params);
1673         unsigned int i2s_con = 0;
1674         int ret = 0;
1675 
1676         dev_dbg(afe->dev, "%s(), id %d, rate %d, format %d\n",
1677                 __func__, i2s_id, rate, format);
1678 
1679         if (i2s_priv)
1680                 i2s_priv->rate = rate;
1681         else
1682                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
1683 
1684         switch (i2s_id) {
1685         case MT8192_DAI_I2S_0:
1686                 i2s_con = I2S_IN_PAD_IO_MUX << I2SIN_PAD_SEL_SFT;
1687                 i2s_con |= rate_reg << I2S_OUT_MODE_SFT;
1688                 i2s_con |= I2S_FMT_I2S << I2S_FMT_SFT;
1689                 i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT;
1690                 regmap_update_bits(afe->regmap, AFE_I2S_CON,
1691                                    0xffffeffe, i2s_con);
1692                 break;
1693         case MT8192_DAI_I2S_1:
1694                 i2s_con = I2S1_SEL_O28_O29 << I2S2_SEL_O03_O04_SFT;
1695                 i2s_con |= rate_reg << I2S2_OUT_MODE_SFT;
1696                 i2s_con |= I2S_FMT_I2S << I2S2_FMT_SFT;
1697                 i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT;
1698                 regmap_update_bits(afe->regmap, AFE_I2S_CON1,
1699                                    0xffffeffe, i2s_con);
1700                 break;
1701         case MT8192_DAI_I2S_2:
1702                 i2s_con = 8 << I2S3_UPDATE_WORD_SFT;
1703                 i2s_con |= rate_reg << I2S3_OUT_MODE_SFT;
1704                 i2s_con |= I2S_FMT_I2S << I2S3_FMT_SFT;
1705                 i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT;
1706                 regmap_update_bits(afe->regmap, AFE_I2S_CON2,
1707                                    0xffffeffe, i2s_con);
1708                 break;
1709         case MT8192_DAI_I2S_3:
1710                 i2s_con = rate_reg << I2S4_OUT_MODE_SFT;
1711                 i2s_con |= I2S_FMT_I2S << I2S4_FMT_SFT;
1712                 i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT;
1713                 regmap_update_bits(afe->regmap, AFE_I2S_CON3,
1714                                    0xffffeffe, i2s_con);
1715                 break;
1716         case MT8192_DAI_I2S_5:
1717                 i2s_con = rate_reg << I2S5_OUT_MODE_SFT;
1718                 i2s_con |= I2S_FMT_I2S << I2S5_FMT_SFT;
1719                 i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT;
1720                 regmap_update_bits(afe->regmap, AFE_I2S_CON4,
1721                                    0xffffeffe, i2s_con);
1722                 break;
1723         case MT8192_DAI_I2S_6:
1724                 i2s_con = rate_reg << I2S6_OUT_MODE_SFT;
1725                 i2s_con |= I2S_FMT_I2S << I2S6_FMT_SFT;
1726                 i2s_con |= get_i2s_wlen(format) << I2S6_WLEN_SFT;
1727                 regmap_update_bits(afe->regmap, AFE_I2S_CON6,
1728                                    0xffffeffe, i2s_con);
1729                 break;
1730         case MT8192_DAI_I2S_7:
1731                 i2s_con = rate_reg << I2S7_OUT_MODE_SFT;
1732                 i2s_con |= I2S_FMT_I2S << I2S7_FMT_SFT;
1733                 i2s_con |= get_i2s_wlen(format) << I2S7_WLEN_SFT;
1734                 regmap_update_bits(afe->regmap, AFE_I2S_CON7,
1735                                    0xffffeffe, i2s_con);
1736                 break;
1737         case MT8192_DAI_I2S_8:
1738                 i2s_con = rate_reg << I2S8_OUT_MODE_SFT;
1739                 i2s_con |= I2S_FMT_I2S << I2S8_FMT_SFT;
1740                 i2s_con |= get_i2s_wlen(format) << I2S8_WLEN_SFT;
1741                 regmap_update_bits(afe->regmap, AFE_I2S_CON8,
1742                                    0xffffeffe, i2s_con);
1743                 break;
1744         case MT8192_DAI_I2S_9:
1745                 i2s_con = rate_reg << I2S9_OUT_MODE_SFT;
1746                 i2s_con |= I2S_FMT_I2S << I2S9_FMT_SFT;
1747                 i2s_con |= get_i2s_wlen(format) << I2S9_WLEN_SFT;
1748                 regmap_update_bits(afe->regmap, AFE_I2S_CON9,
1749                                    0xffffeffe, i2s_con);
1750                 break;
1751         default:
1752                 dev_warn(afe->dev, "%s(), id %d not support\n",
1753                          __func__, i2s_id);
1754                 return -EINVAL;
1755         }
1756 
1757         /* set share i2s */
1758         if (i2s_priv && i2s_priv->share_i2s_id >= 0)
1759                 ret = mtk_dai_i2s_config(afe, params, i2s_priv->share_i2s_id);
1760 
1761         return ret;
1762 }
1763 
1764 static int mtk_dai_i2s_hw_params(struct snd_pcm_substream *substream,
1765                                  struct snd_pcm_hw_params *params,
1766                                  struct snd_soc_dai *dai)
1767 {
1768         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1769 
1770         return mtk_dai_i2s_config(afe, params, dai->id);
1771 }
1772 
1773 static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai,
1774                                   int clk_id, unsigned int freq, int dir)
1775 {
1776         struct mtk_base_afe *afe = dev_get_drvdata(dai->dev);
1777         struct mt8192_afe_private *afe_priv = afe->platform_priv;
1778         struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[dai->id];
1779         int apll;
1780         int apll_rate;
1781 
1782         if (!i2s_priv) {
1783                 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__);
1784                 return -EINVAL;
1785         }
1786 
1787         if (dir != SND_SOC_CLOCK_OUT) {
1788                 dev_warn(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__);
1789                 return -EINVAL;
1790         }
1791 
1792         dev_dbg(afe->dev, "%s(), freq %d\n", __func__, freq);
1793 
1794         apll = mt8192_get_apll_by_rate(afe, freq);
1795         apll_rate = mt8192_get_apll_rate(afe, apll);
1796 
1797         if (freq > apll_rate) {
1798                 dev_warn(afe->dev, "%s(), freq > apll rate", __func__);
1799                 return -EINVAL;
1800         }
1801 
1802         if (apll_rate % freq != 0) {
1803                 dev_warn(afe->dev, "%s(), APLL can't gen freq Hz", __func__);
1804                 return -EINVAL;
1805         }
1806 
1807         i2s_priv->mclk_rate = freq;
1808         i2s_priv->mclk_apll = apll;
1809 
1810         if (i2s_priv->share_i2s_id > 0) {
1811                 struct mtk_afe_i2s_priv *share_i2s_priv;
1812 
1813                 share_i2s_priv = afe_priv->dai_priv[i2s_priv->share_i2s_id];
1814                 if (!share_i2s_priv) {
1815                         dev_warn(afe->dev, "%s(), share_i2s_priv = NULL",
1816                                  __func__);
1817                         return -EINVAL;
1818                 }
1819 
1820                 share_i2s_priv->mclk_rate = i2s_priv->mclk_rate;
1821                 share_i2s_priv->mclk_apll = i2s_priv->mclk_apll;
1822         }
1823 
1824         return 0;
1825 }
1826 
1827 static const struct snd_soc_dai_ops mtk_dai_i2s_ops = {
1828         .hw_params = mtk_dai_i2s_hw_params,
1829         .set_sysclk = mtk_dai_i2s_set_sysclk,
1830 };
1831 
1832 /* dai driver */
1833 #define MTK_CONNSYS_I2S_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
1834 
1835 #define MTK_I2S_RATES (SNDRV_PCM_RATE_8000_48000 |\
1836                        SNDRV_PCM_RATE_88200 |\
1837                        SNDRV_PCM_RATE_96000 |\
1838                        SNDRV_PCM_RATE_176400 |\
1839                        SNDRV_PCM_RATE_192000)
1840 
1841 #define MTK_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1842                          SNDRV_PCM_FMTBIT_S24_LE |\
1843                          SNDRV_PCM_FMTBIT_S32_LE)
1844 
1845 static struct snd_soc_dai_driver mtk_dai_i2s_driver[] = {
1846         {
1847                 .name = "CONNSYS_I2S",
1848                 .id = MT8192_DAI_CONNSYS_I2S,
1849                 .capture = {
1850                         .stream_name = "Connsys I2S",
1851                         .channels_min = 1,
1852                         .channels_max = 2,
1853                         .rates = MTK_CONNSYS_I2S_RATES,
1854                         .formats = MTK_I2S_FORMATS,
1855                 },
1856                 .ops = &mtk_dai_connsys_i2s_ops,
1857         },
1858         {
1859                 .name = "I2S0",
1860                 .id = MT8192_DAI_I2S_0,
1861                 .capture = {
1862                         .stream_name = "I2S0",
1863                         .channels_min = 1,
1864                         .channels_max = 2,
1865                         .rates = MTK_I2S_RATES,
1866                         .formats = MTK_I2S_FORMATS,
1867                 },
1868                 .ops = &mtk_dai_i2s_ops,
1869         },
1870         {
1871                 .name = "I2S1",
1872                 .id = MT8192_DAI_I2S_1,
1873                 .playback = {
1874                         .stream_name = "I2S1",
1875                         .channels_min = 1,
1876                         .channels_max = 2,
1877                         .rates = MTK_I2S_RATES,
1878                         .formats = MTK_I2S_FORMATS,
1879                 },
1880                 .ops = &mtk_dai_i2s_ops,
1881         },
1882         {
1883                 .name = "I2S2",
1884                 .id = MT8192_DAI_I2S_2,
1885                 .capture = {
1886                         .stream_name = "I2S2",
1887                         .channels_min = 1,
1888                         .channels_max = 2,
1889                         .rates = MTK_I2S_RATES,
1890                         .formats = MTK_I2S_FORMATS,
1891                 },
1892                 .ops = &mtk_dai_i2s_ops,
1893         },
1894         {
1895                 .name = "I2S3",
1896                 .id = MT8192_DAI_I2S_3,
1897                 .playback = {
1898                         .stream_name = "I2S3",
1899                         .channels_min = 1,
1900                         .channels_max = 2,
1901                         .rates = MTK_I2S_RATES,
1902                         .formats = MTK_I2S_FORMATS,
1903                 },
1904                 .ops = &mtk_dai_i2s_ops,
1905         },
1906         {
1907                 .name = "I2S5",
1908                 .id = MT8192_DAI_I2S_5,
1909                 .playback = {
1910                         .stream_name = "I2S5",
1911                         .channels_min = 1,
1912                         .channels_max = 2,
1913                         .rates = MTK_I2S_RATES,
1914                         .formats = MTK_I2S_FORMATS,
1915                 },
1916                 .ops = &mtk_dai_i2s_ops,
1917         },
1918         {
1919                 .name = "I2S6",
1920                 .id = MT8192_DAI_I2S_6,
1921                 .capture = {
1922                         .stream_name = "I2S6",
1923                         .channels_min = 1,
1924                         .channels_max = 2,
1925                         .rates = MTK_I2S_RATES,
1926                         .formats = MTK_I2S_FORMATS,
1927                 },
1928                 .ops = &mtk_dai_i2s_ops,
1929         },
1930         {
1931                 .name = "I2S7",
1932                 .id = MT8192_DAI_I2S_7,
1933                 .playback = {
1934                         .stream_name = "I2S7",
1935                         .channels_min = 1,
1936                         .channels_max = 2,
1937                         .rates = MTK_I2S_RATES,
1938                         .formats = MTK_I2S_FORMATS,
1939                 },
1940                 .ops = &mtk_dai_i2s_ops,
1941         },
1942         {
1943                 .name = "I2S8",
1944                 .id = MT8192_DAI_I2S_8,
1945                 .capture = {
1946                         .stream_name = "I2S8",
1947                         .channels_min = 1,
1948                         .channels_max = 2,
1949                         .rates = MTK_I2S_RATES,
1950                         .formats = MTK_I2S_FORMATS,
1951                 },
1952                 .ops = &mtk_dai_i2s_ops,
1953         },
1954         {
1955                 .name = "I2S9",
1956                 .id = MT8192_DAI_I2S_9,
1957                 .playback = {
1958                         .stream_name = "I2S9",
1959                         .channels_min = 1,
1960                         .channels_max = 2,
1961                         .rates = MTK_I2S_RATES,
1962                         .formats = MTK_I2S_FORMATS,
1963                 },
1964                 .ops = &mtk_dai_i2s_ops,
1965         }
1966 };
1967 
1968 /* this enum is merely for mtk_afe_i2s_priv declare */
1969 enum {
1970         DAI_I2S0 = 0,
1971         DAI_I2S1,
1972         DAI_I2S2,
1973         DAI_I2S3,
1974         DAI_I2S5,
1975         DAI_I2S6,
1976         DAI_I2S7,
1977         DAI_I2S8,
1978         DAI_I2S9,
1979         DAI_I2S_NUM,
1980 };
1981 
1982 static const struct mtk_afe_i2s_priv mt8192_i2s_priv[DAI_I2S_NUM] = {
1983         [DAI_I2S0] = {
1984                 .id = MT8192_DAI_I2S_0,
1985                 .mclk_id = MT8192_I2S0_MCK,
1986                 .share_i2s_id = -1,
1987         },
1988         [DAI_I2S1] = {
1989                 .id = MT8192_DAI_I2S_1,
1990                 .mclk_id = MT8192_I2S1_MCK,
1991                 .share_i2s_id = -1,
1992         },
1993         [DAI_I2S2] = {
1994                 .id = MT8192_DAI_I2S_2,
1995                 .mclk_id = MT8192_I2S2_MCK,
1996                 .share_i2s_id = -1,
1997         },
1998         [DAI_I2S3] = {
1999                 .id = MT8192_DAI_I2S_3,
2000                 .mclk_id = MT8192_I2S3_MCK,
2001                 .share_i2s_id = -1,
2002         },
2003         [DAI_I2S5] = {
2004                 .id = MT8192_DAI_I2S_5,
2005                 .mclk_id = MT8192_I2S5_MCK,
2006                 .share_i2s_id = -1,
2007         },
2008         [DAI_I2S6] = {
2009                 .id = MT8192_DAI_I2S_6,
2010                 .mclk_id = MT8192_I2S6_MCK,
2011                 .share_i2s_id = -1,
2012         },
2013         [DAI_I2S7] = {
2014                 .id = MT8192_DAI_I2S_7,
2015                 .mclk_id = MT8192_I2S7_MCK,
2016                 .share_i2s_id = -1,
2017         },
2018         [DAI_I2S8] = {
2019                 .id = MT8192_DAI_I2S_8,
2020                 .mclk_id = MT8192_I2S8_MCK,
2021                 .share_i2s_id = -1,
2022         },
2023         [DAI_I2S9] = {
2024                 .id = MT8192_DAI_I2S_9,
2025                 .mclk_id = MT8192_I2S9_MCK,
2026                 .share_i2s_id = -1,
2027         },
2028 };
2029 
2030 /**
2031  * mt8192_dai_i2s_set_share() - Set up I2S ports to share a single clock.
2032  * @afe: Pointer to &struct mtk_base_afe
2033  * @main_i2s_name: The name of the I2S port that will provide the clock
2034  * @secondary_i2s_name: The name of the I2S port that will use this clock
2035  */
2036 int mt8192_dai_i2s_set_share(struct mtk_base_afe *afe, const char *main_i2s_name,
2037                              const char *secondary_i2s_name)
2038 {
2039         struct mtk_afe_i2s_priv *secondary_i2s_priv;
2040         int main_i2s_id;
2041 
2042         secondary_i2s_priv = get_i2s_priv_by_name(afe, secondary_i2s_name);
2043         if (!secondary_i2s_priv)
2044                 return -EINVAL;
2045 
2046         main_i2s_id = get_i2s_id_by_name(afe, main_i2s_name);
2047         if (main_i2s_id < 0)
2048                 return main_i2s_id;
2049 
2050         secondary_i2s_priv->share_i2s_id = main_i2s_id;
2051 
2052         return 0;
2053 }
2054 EXPORT_SYMBOL_GPL(mt8192_dai_i2s_set_share);
2055 
2056 static int mt8192_dai_i2s_set_priv(struct mtk_base_afe *afe)
2057 {
2058         int i;
2059         int ret;
2060 
2061         for (i = 0; i < DAI_I2S_NUM; i++) {
2062                 ret = mt8192_dai_set_priv(afe, mt8192_i2s_priv[i].id,
2063                                           sizeof(struct mtk_afe_i2s_priv),
2064                                           &mt8192_i2s_priv[i]);
2065                 if (ret)
2066                         return ret;
2067         }
2068 
2069         return 0;
2070 }
2071 
2072 int mt8192_dai_i2s_register(struct mtk_base_afe *afe)
2073 {
2074         struct mtk_base_afe_dai *dai;
2075         int ret;
2076 
2077         dev_dbg(afe->dev, "%s()\n", __func__);
2078 
2079         dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
2080         if (!dai)
2081                 return -ENOMEM;
2082 
2083         list_add(&dai->list, &afe->sub_dais);
2084 
2085         dai->dai_drivers = mtk_dai_i2s_driver;
2086         dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_i2s_driver);
2087 
2088         dai->controls = mtk_dai_i2s_controls;
2089         dai->num_controls = ARRAY_SIZE(mtk_dai_i2s_controls);
2090         dai->dapm_widgets = mtk_dai_i2s_widgets;
2091         dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_i2s_widgets);
2092         dai->dapm_routes = mtk_dai_i2s_routes;
2093         dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_i2s_routes);
2094 
2095         /* set all dai i2s private data */
2096         ret = mt8192_dai_i2s_set_priv(afe);
2097         if (ret)
2098                 return ret;
2099 
2100         return 0;
2101 }
2102 

~ [ 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