arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / sound / soc / mediatek / mt8188 / mt8188-dai-etdm.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * MediaTek ALSA SoC Audio DAI eTDM Control
4  *
5  * Copyright (c) 2022 MediaTek Inc.
6  * Author: Bicycle Tsai <bicycle.tsai@mediatek.com>
7  *         Trevor Wu <trevor.wu@mediatek.com>
8  *         Chun-Chia Chiu <chun-chia.chiu@mediatek.com>
9  */
10
11 #include <linux/bitfield.h>
12 #include <linux/pm_runtime.h>
13 #include <linux/regmap.h>
14 #include <sound/pcm_params.h>
15 #include "mt8188-afe-clk.h"
16 #include "mt8188-afe-common.h"
17 #include "mt8188-reg.h"
18
19 #define MT8188_ETDM_MAX_CHANNELS 16
20 #define MT8188_ETDM_NORMAL_MAX_BCK_RATE 24576000
21 #define ETDM_TO_DAI_ID(x) ((x) + MT8188_AFE_IO_ETDM_START)
22 #define ENUM_TO_STR(x)  #x
23
24 enum {
25         SUPPLY_SEQ_APLL,
26         SUPPLY_SEQ_ETDM_MCLK,
27         SUPPLY_SEQ_ETDM_CG,
28         SUPPLY_SEQ_DPTX_EN,
29         SUPPLY_SEQ_ETDM_EN,
30 };
31
32 enum {
33         MTK_DAI_ETDM_FORMAT_I2S = 0,
34         MTK_DAI_ETDM_FORMAT_LJ,
35         MTK_DAI_ETDM_FORMAT_RJ,
36         MTK_DAI_ETDM_FORMAT_EIAJ,
37         MTK_DAI_ETDM_FORMAT_DSPA,
38         MTK_DAI_ETDM_FORMAT_DSPB,
39 };
40
41 enum {
42         MTK_DAI_ETDM_DATA_ONE_PIN = 0,
43         MTK_DAI_ETDM_DATA_MULTI_PIN,
44 };
45
46 enum {
47         ETDM_IN,
48         ETDM_OUT,
49 };
50
51 enum {
52         COWORK_ETDM_NONE = 0,
53         COWORK_ETDM_IN1_M = 2,
54         COWORK_ETDM_IN1_S = 3,
55         COWORK_ETDM_IN2_M = 4,
56         COWORK_ETDM_IN2_S = 5,
57         COWORK_ETDM_OUT1_M = 10,
58         COWORK_ETDM_OUT1_S = 11,
59         COWORK_ETDM_OUT2_M = 12,
60         COWORK_ETDM_OUT2_S = 13,
61         COWORK_ETDM_OUT3_M = 14,
62         COWORK_ETDM_OUT3_S = 15,
63 };
64
65 enum {
66         ETDM_RELATCH_TIMING_A1A2SYS,
67         ETDM_RELATCH_TIMING_A3SYS,
68         ETDM_RELATCH_TIMING_A4SYS,
69 };
70
71 enum {
72         ETDM_SYNC_NONE,
73         ETDM_SYNC_FROM_IN1 = 2,
74         ETDM_SYNC_FROM_IN2 = 4,
75         ETDM_SYNC_FROM_OUT1 = 10,
76         ETDM_SYNC_FROM_OUT2 = 12,
77         ETDM_SYNC_FROM_OUT3 = 14,
78 };
79
80 struct etdm_con_reg {
81         unsigned int con0;
82         unsigned int con1;
83         unsigned int con2;
84         unsigned int con3;
85         unsigned int con4;
86         unsigned int con5;
87 };
88
89 struct mtk_dai_etdm_rate {
90         unsigned int rate;
91         unsigned int reg_value;
92 };
93
94 struct mtk_dai_etdm_priv {
95         unsigned int data_mode;
96         bool slave_mode;
97         bool lrck_inv;
98         bool bck_inv;
99         unsigned int rate;
100         unsigned int format;
101         unsigned int slots;
102         unsigned int lrck_width;
103         unsigned int mclk_freq;
104         unsigned int mclk_fixed_apll;
105         unsigned int mclk_apll;
106         unsigned int mclk_dir;
107         int cowork_source_id; //dai id
108         unsigned int cowork_slv_count;
109         int cowork_slv_id[MT8188_AFE_IO_ETDM_NUM - 1]; //dai_id
110         bool in_disable_ch[MT8188_ETDM_MAX_CHANNELS];
111 };
112
113 static const struct mtk_dai_etdm_rate mt8188_etdm_rates[] = {
114         { .rate = 8000, .reg_value = 0, },
115         { .rate = 12000, .reg_value = 1, },
116         { .rate = 16000, .reg_value = 2, },
117         { .rate = 24000, .reg_value = 3, },
118         { .rate = 32000, .reg_value = 4, },
119         { .rate = 48000, .reg_value = 5, },
120         { .rate = 96000, .reg_value = 7, },
121         { .rate = 192000, .reg_value = 9, },
122         { .rate = 384000, .reg_value = 11, },
123         { .rate = 11025, .reg_value = 16, },
124         { .rate = 22050, .reg_value = 17, },
125         { .rate = 44100, .reg_value = 18, },
126         { .rate = 88200, .reg_value = 19, },
127         { .rate = 176400, .reg_value = 20, },
128         { .rate = 352800, .reg_value = 21, },
129 };
130
131 static int get_etdm_fs_timing(unsigned int rate)
132 {
133         int i;
134
135         for (i = 0; i < ARRAY_SIZE(mt8188_etdm_rates); i++)
136                 if (mt8188_etdm_rates[i].rate == rate)
137                         return mt8188_etdm_rates[i].reg_value;
138
139         return -EINVAL;
140 }
141
142 static unsigned int get_etdm_ch_fixup(unsigned int channels)
143 {
144         if (channels > 16)
145                 return 24;
146         else if (channels > 8)
147                 return 16;
148         else if (channels > 4)
149                 return 8;
150         else if (channels > 2)
151                 return 4;
152         else
153                 return 2;
154 }
155
156 static int get_etdm_reg(unsigned int dai_id, struct etdm_con_reg *etdm_reg)
157 {
158         switch (dai_id) {
159         case MT8188_AFE_IO_ETDM1_IN:
160                 etdm_reg->con0 = ETDM_IN1_CON0;
161                 etdm_reg->con1 = ETDM_IN1_CON1;
162                 etdm_reg->con2 = ETDM_IN1_CON2;
163                 etdm_reg->con3 = ETDM_IN1_CON3;
164                 etdm_reg->con4 = ETDM_IN1_CON4;
165                 etdm_reg->con5 = ETDM_IN1_CON5;
166                 break;
167         case MT8188_AFE_IO_ETDM2_IN:
168                 etdm_reg->con0 = ETDM_IN2_CON0;
169                 etdm_reg->con1 = ETDM_IN2_CON1;
170                 etdm_reg->con2 = ETDM_IN2_CON2;
171                 etdm_reg->con3 = ETDM_IN2_CON3;
172                 etdm_reg->con4 = ETDM_IN2_CON4;
173                 etdm_reg->con5 = ETDM_IN2_CON5;
174                 break;
175         case MT8188_AFE_IO_ETDM1_OUT:
176                 etdm_reg->con0 = ETDM_OUT1_CON0;
177                 etdm_reg->con1 = ETDM_OUT1_CON1;
178                 etdm_reg->con2 = ETDM_OUT1_CON2;
179                 etdm_reg->con3 = ETDM_OUT1_CON3;
180                 etdm_reg->con4 = ETDM_OUT1_CON4;
181                 etdm_reg->con5 = ETDM_OUT1_CON5;
182                 break;
183         case MT8188_AFE_IO_ETDM2_OUT:
184                 etdm_reg->con0 = ETDM_OUT2_CON0;
185                 etdm_reg->con1 = ETDM_OUT2_CON1;
186                 etdm_reg->con2 = ETDM_OUT2_CON2;
187                 etdm_reg->con3 = ETDM_OUT2_CON3;
188                 etdm_reg->con4 = ETDM_OUT2_CON4;
189                 etdm_reg->con5 = ETDM_OUT2_CON5;
190                 break;
191         case MT8188_AFE_IO_ETDM3_OUT:
192         case MT8188_AFE_IO_DPTX:
193                 etdm_reg->con0 = ETDM_OUT3_CON0;
194                 etdm_reg->con1 = ETDM_OUT3_CON1;
195                 etdm_reg->con2 = ETDM_OUT3_CON2;
196                 etdm_reg->con3 = ETDM_OUT3_CON3;
197                 etdm_reg->con4 = ETDM_OUT3_CON4;
198                 etdm_reg->con5 = ETDM_OUT3_CON5;
199                 break;
200         default:
201                 return -EINVAL;
202         }
203         return 0;
204 }
205
206 static int get_etdm_dir(unsigned int dai_id)
207 {
208         switch (dai_id) {
209         case MT8188_AFE_IO_ETDM1_IN:
210         case MT8188_AFE_IO_ETDM2_IN:
211                 return ETDM_IN;
212         case MT8188_AFE_IO_ETDM1_OUT:
213         case MT8188_AFE_IO_ETDM2_OUT:
214         case MT8188_AFE_IO_ETDM3_OUT:
215                 return ETDM_OUT;
216         default:
217                 return -EINVAL;
218         }
219 }
220
221 static int get_etdm_wlen(unsigned int bitwidth)
222 {
223         return bitwidth <= 16 ? 16 : 32;
224 }
225
226 static bool is_valid_etdm_dai(int dai_id)
227 {
228         switch (dai_id) {
229         case MT8188_AFE_IO_ETDM1_IN:
230                 fallthrough;
231         case MT8188_AFE_IO_ETDM2_IN:
232                 fallthrough;
233         case MT8188_AFE_IO_ETDM1_OUT:
234                 fallthrough;
235         case MT8188_AFE_IO_ETDM2_OUT:
236                 fallthrough;
237         case MT8188_AFE_IO_DPTX:
238                 fallthrough;
239         case MT8188_AFE_IO_ETDM3_OUT:
240                 return true;
241         default:
242                 return false;
243         }
244 }
245
246 static int is_cowork_mode(struct snd_soc_dai *dai)
247 {
248         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
249         struct mt8188_afe_private *afe_priv = afe->platform_priv;
250         struct mtk_dai_etdm_priv *etdm_data;
251
252         if (!is_valid_etdm_dai(dai->id))
253                 return -EINVAL;
254         etdm_data = afe_priv->dai_priv[dai->id];
255
256         return (etdm_data->cowork_slv_count > 0 ||
257                 etdm_data->cowork_source_id != COWORK_ETDM_NONE);
258 }
259
260 static int sync_to_dai_id(int source_sel)
261 {
262         switch (source_sel) {
263         case ETDM_SYNC_FROM_IN1:
264                 return MT8188_AFE_IO_ETDM1_IN;
265         case ETDM_SYNC_FROM_IN2:
266                 return MT8188_AFE_IO_ETDM2_IN;
267         case ETDM_SYNC_FROM_OUT1:
268                 return MT8188_AFE_IO_ETDM1_OUT;
269         case ETDM_SYNC_FROM_OUT2:
270                 return MT8188_AFE_IO_ETDM2_OUT;
271         case ETDM_SYNC_FROM_OUT3:
272                 return MT8188_AFE_IO_ETDM3_OUT;
273         default:
274                 return 0;
275         }
276 }
277
278 static int get_etdm_cowork_master_id(struct snd_soc_dai *dai)
279 {
280         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
281         struct mt8188_afe_private *afe_priv = afe->platform_priv;
282         struct mtk_dai_etdm_priv *etdm_data;
283         int dai_id;
284
285         if (!is_valid_etdm_dai(dai->id))
286                 return -EINVAL;
287         etdm_data = afe_priv->dai_priv[dai->id];
288         dai_id = etdm_data->cowork_source_id;
289
290         if (dai_id == COWORK_ETDM_NONE)
291                 dai_id = dai->id;
292
293         return dai_id;
294 }
295
296 static int mtk_dai_etdm_get_cg_id_by_dai_id(int dai_id)
297 {
298         switch (dai_id) {
299         case MT8188_AFE_IO_DPTX:
300                 return MT8188_CLK_AUD_HDMI_OUT;
301         case MT8188_AFE_IO_ETDM1_IN:
302                 return MT8188_CLK_AUD_TDM_IN;
303         case MT8188_AFE_IO_ETDM2_IN:
304                 return MT8188_CLK_AUD_I2SIN;
305         case MT8188_AFE_IO_ETDM1_OUT:
306                 return MT8188_CLK_AUD_TDM_OUT;
307         case MT8188_AFE_IO_ETDM2_OUT:
308                 return MT8188_CLK_AUD_I2S_OUT;
309         case MT8188_AFE_IO_ETDM3_OUT:
310                 return MT8188_CLK_AUD_HDMI_OUT;
311         default:
312                 return -EINVAL;
313         }
314 }
315
316 static int mtk_dai_etdm_get_clk_id_by_dai_id(int dai_id)
317 {
318         switch (dai_id) {
319         case MT8188_AFE_IO_DPTX:
320                 return MT8188_CLK_TOP_DPTX_M_SEL;
321         case MT8188_AFE_IO_ETDM1_IN:
322                 return MT8188_CLK_TOP_I2SI1_M_SEL;
323         case MT8188_AFE_IO_ETDM2_IN:
324                 return MT8188_CLK_TOP_I2SI2_M_SEL;
325         case MT8188_AFE_IO_ETDM1_OUT:
326                 return MT8188_CLK_TOP_I2SO1_M_SEL;
327         case MT8188_AFE_IO_ETDM2_OUT:
328                 return MT8188_CLK_TOP_I2SO2_M_SEL;
329         case MT8188_AFE_IO_ETDM3_OUT:
330         default:
331                 return -EINVAL;
332         }
333 }
334
335 static int mtk_dai_etdm_get_clkdiv_id_by_dai_id(int dai_id)
336 {
337         switch (dai_id) {
338         case MT8188_AFE_IO_DPTX:
339                 return MT8188_CLK_TOP_APLL12_DIV9;
340         case MT8188_AFE_IO_ETDM1_IN:
341                 return MT8188_CLK_TOP_APLL12_DIV0;
342         case MT8188_AFE_IO_ETDM2_IN:
343                 return MT8188_CLK_TOP_APLL12_DIV1;
344         case MT8188_AFE_IO_ETDM1_OUT:
345                 return MT8188_CLK_TOP_APLL12_DIV2;
346         case MT8188_AFE_IO_ETDM2_OUT:
347                 return MT8188_CLK_TOP_APLL12_DIV3;
348         case MT8188_AFE_IO_ETDM3_OUT:
349         default:
350                 return -EINVAL;
351         }
352 }
353
354 static int get_etdm_id_by_name(struct mtk_base_afe *afe,
355                                const char *name)
356 {
357         if (!strncmp(name, "ETDM1_IN", strlen("ETDM1_IN")))
358                 return MT8188_AFE_IO_ETDM1_IN;
359         else if (!strncmp(name, "ETDM2_IN", strlen("ETDM2_IN")))
360                 return MT8188_AFE_IO_ETDM2_IN;
361         else if (!strncmp(name, "ETDM1_OUT", strlen("ETDM1_OUT")))
362                 return MT8188_AFE_IO_ETDM1_OUT;
363         else if (!strncmp(name, "ETDM2_OUT", strlen("ETDM2_OUT")))
364                 return MT8188_AFE_IO_ETDM2_OUT;
365         else if (!strncmp(name, "ETDM3_OUT", strlen("ETDM3_OUT")))
366                 return MT8188_AFE_IO_ETDM3_OUT;
367         else if (!strncmp(name, "DPTX", strlen("DPTX")))
368                 return MT8188_AFE_IO_ETDM3_OUT;
369         else
370                 return -EINVAL;
371 }
372
373 static struct mtk_dai_etdm_priv *get_etdm_priv_by_name(struct mtk_base_afe *afe,
374                                                        const char *name)
375 {
376         struct mt8188_afe_private *afe_priv = afe->platform_priv;
377         int dai_id = get_etdm_id_by_name(afe, name);
378
379         if (dai_id < MT8188_AFE_IO_ETDM_START ||
380             dai_id >= MT8188_AFE_IO_ETDM_END)
381                 return NULL;
382
383         return afe_priv->dai_priv[dai_id];
384 }
385
386 static int mtk_dai_etdm_enable_mclk(struct mtk_base_afe *afe, int dai_id)
387 {
388         struct mt8188_afe_private *afe_priv = afe->platform_priv;
389         struct mtk_dai_etdm_priv *etdm_data;
390         struct etdm_con_reg etdm_reg;
391         unsigned int val = 0;
392         unsigned int mask;
393         int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
394         int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
395         int apll_clk_id;
396         int apll;
397         int ret;
398
399         if (!is_valid_etdm_dai(dai_id))
400                 return -EINVAL;
401         etdm_data = afe_priv->dai_priv[dai_id];
402
403         apll = etdm_data->mclk_apll;
404         apll_clk_id = mt8188_afe_get_mclk_source_clk_id(apll);
405
406         if (clkmux_id < 0 || clkdiv_id < 0)
407                 return -EINVAL;
408
409         if (apll_clk_id < 0)
410                 return apll_clk_id;
411
412         ret = get_etdm_reg(dai_id, &etdm_reg);
413         if (ret < 0)
414                 return ret;
415
416         mask = ETDM_CON1_MCLK_OUTPUT;
417         if (etdm_data->mclk_dir == SND_SOC_CLOCK_OUT)
418                 val = ETDM_CON1_MCLK_OUTPUT;
419         regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
420
421         /* enable parent clock before select apll*/
422         mt8188_afe_enable_clk(afe, afe_priv->clk[clkmux_id]);
423
424         /* select apll */
425         ret = mt8188_afe_set_clk_parent(afe, afe_priv->clk[clkmux_id],
426                                         afe_priv->clk[apll_clk_id]);
427         if (ret)
428                 return ret;
429
430         /* set rate */
431         ret = mt8188_afe_set_clk_rate(afe, afe_priv->clk[clkdiv_id],
432                                       etdm_data->mclk_freq);
433
434         mt8188_afe_enable_clk(afe, afe_priv->clk[clkdiv_id]);
435
436         return 0;
437 }
438
439 static int mtk_dai_etdm_disable_mclk(struct mtk_base_afe *afe, int dai_id)
440 {
441         struct mt8188_afe_private *afe_priv = afe->platform_priv;
442         int clkmux_id = mtk_dai_etdm_get_clk_id_by_dai_id(dai_id);
443         int clkdiv_id = mtk_dai_etdm_get_clkdiv_id_by_dai_id(dai_id);
444
445         if (clkmux_id < 0 || clkdiv_id < 0)
446                 return -EINVAL;
447
448         mt8188_afe_disable_clk(afe, afe_priv->clk[clkdiv_id]);
449         mt8188_afe_disable_clk(afe, afe_priv->clk[clkmux_id]);
450
451         return 0;
452 }
453
454 static int mtk_afe_etdm_apll_connect(struct snd_soc_dapm_widget *source,
455                                      struct snd_soc_dapm_widget *sink)
456 {
457         struct snd_soc_dapm_widget *w = sink;
458         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
459         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
460         struct mtk_dai_etdm_priv *etdm_priv;
461         int cur_apll;
462         int need_apll;
463
464         etdm_priv = get_etdm_priv_by_name(afe, w->name);
465         if (!etdm_priv) {
466                 dev_dbg(afe->dev, "etdm_priv == NULL\n");
467                 return 0;
468         }
469
470         cur_apll = mt8188_get_apll_by_name(afe, source->name);
471         need_apll = mt8188_get_apll_by_rate(afe, etdm_priv->rate);
472
473         return (need_apll == cur_apll) ? 1 : 0;
474 }
475
476 static int mtk_afe_mclk_apll_connect(struct snd_soc_dapm_widget *source,
477                                      struct snd_soc_dapm_widget *sink)
478 {
479         struct snd_soc_dapm_widget *w = sink;
480         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
481         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
482         struct mtk_dai_etdm_priv *etdm_priv;
483         int cur_apll;
484
485         etdm_priv = get_etdm_priv_by_name(afe, w->name);
486
487         cur_apll = mt8188_get_apll_by_name(afe, source->name);
488
489         return (etdm_priv->mclk_apll == cur_apll) ? 1 : 0;
490 }
491
492 static int mtk_etdm_mclk_connect(struct snd_soc_dapm_widget *source,
493                                  struct snd_soc_dapm_widget *sink)
494 {
495         struct snd_soc_dapm_widget *w = sink;
496         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
497         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
498         struct mt8188_afe_private *afe_priv = afe->platform_priv;
499         struct mtk_dai_etdm_priv *etdm_priv;
500         int mclk_id;
501
502         mclk_id = get_etdm_id_by_name(afe, source->name);
503         if (mclk_id < 0) {
504                 dev_dbg(afe->dev, "mclk_id < 0\n");
505                 return 0;
506         }
507
508         etdm_priv = get_etdm_priv_by_name(afe, w->name);
509         if (!etdm_priv) {
510                 dev_dbg(afe->dev, "etdm_priv == NULL\n");
511                 return 0;
512         }
513
514         if (get_etdm_id_by_name(afe, sink->name) == mclk_id)
515                 return !!(etdm_priv->mclk_freq > 0);
516
517         if (etdm_priv->cowork_source_id == mclk_id) {
518                 etdm_priv = afe_priv->dai_priv[mclk_id];
519                 return !!(etdm_priv->mclk_freq > 0);
520         }
521
522         return 0;
523 }
524
525 static int mtk_etdm_cowork_connect(struct snd_soc_dapm_widget *source,
526                                    struct snd_soc_dapm_widget *sink)
527 {
528         struct snd_soc_dapm_widget *w = sink;
529         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
530         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
531         struct mt8188_afe_private *afe_priv = afe->platform_priv;
532         struct mtk_dai_etdm_priv *etdm_priv;
533         int source_id;
534         int i;
535
536         source_id = get_etdm_id_by_name(afe, source->name);
537         if (source_id < 0) {
538                 dev_dbg(afe->dev, "%s() source_id < 0\n", __func__);
539                 return 0;
540         }
541
542         etdm_priv = get_etdm_priv_by_name(afe, w->name);
543         if (!etdm_priv) {
544                 dev_dbg(afe->dev, "%s() etdm_priv == NULL\n", __func__);
545                 return 0;
546         }
547
548         if (etdm_priv->cowork_source_id != COWORK_ETDM_NONE) {
549                 if (etdm_priv->cowork_source_id == source_id)
550                         return 1;
551
552                 etdm_priv = afe_priv->dai_priv[etdm_priv->cowork_source_id];
553                 for (i = 0; i < etdm_priv->cowork_slv_count; i++) {
554                         if (etdm_priv->cowork_slv_id[i] == source_id)
555                                 return 1;
556                 }
557         } else {
558                 for (i = 0; i < etdm_priv->cowork_slv_count; i++) {
559                         if (etdm_priv->cowork_slv_id[i] == source_id)
560                                 return 1;
561                 }
562         }
563
564         return 0;
565 }
566
567 static int mtk_apll_event(struct snd_soc_dapm_widget *w,
568                           struct snd_kcontrol *kcontrol,
569                           int event)
570 {
571         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
572         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
573
574         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
575                 __func__, w->name, event);
576
577         switch (event) {
578         case SND_SOC_DAPM_PRE_PMU:
579                 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
580                         mt8188_apll1_enable(afe);
581                 else
582                         mt8188_apll2_enable(afe);
583                 break;
584         case SND_SOC_DAPM_POST_PMD:
585                 if (snd_soc_dapm_widget_name_cmp(w, APLL1_W_NAME) == 0)
586                         mt8188_apll1_disable(afe);
587                 else
588                         mt8188_apll2_disable(afe);
589                 break;
590         default:
591                 break;
592         }
593
594         return 0;
595 }
596
597 static int mtk_etdm_mclk_event(struct snd_soc_dapm_widget *w,
598                                struct snd_kcontrol *kcontrol,
599                                int event)
600 {
601         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
602         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
603         int mclk_id = get_etdm_id_by_name(afe, w->name);
604
605         if (mclk_id < 0) {
606                 dev_dbg(afe->dev, "%s() mclk_id < 0\n", __func__);
607                 return 0;
608         }
609
610         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
611                 __func__, w->name, event);
612
613         switch (event) {
614         case SND_SOC_DAPM_PRE_PMU:
615                 mtk_dai_etdm_enable_mclk(afe, mclk_id);
616                 break;
617         case SND_SOC_DAPM_POST_PMD:
618                 mtk_dai_etdm_disable_mclk(afe, mclk_id);
619                 break;
620         default:
621                 break;
622         }
623
624         return 0;
625 }
626
627 static int mtk_dptx_mclk_event(struct snd_soc_dapm_widget *w,
628                                struct snd_kcontrol *kcontrol,
629                                int event)
630 {
631         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
632         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
633
634         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
635                 __func__, w->name, event);
636
637         switch (event) {
638         case SND_SOC_DAPM_PRE_PMU:
639                 mtk_dai_etdm_enable_mclk(afe, MT8188_AFE_IO_DPTX);
640                 break;
641         case SND_SOC_DAPM_POST_PMD:
642                 mtk_dai_etdm_disable_mclk(afe, MT8188_AFE_IO_DPTX);
643                 break;
644         default:
645                 break;
646         }
647
648         return 0;
649 }
650
651 static int mtk_etdm_cg_event(struct snd_soc_dapm_widget *w,
652                              struct snd_kcontrol *kcontrol,
653                              int event)
654 {
655         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
656         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
657         struct mt8188_afe_private *afe_priv = afe->platform_priv;
658         int etdm_id;
659         int cg_id;
660
661         etdm_id = get_etdm_id_by_name(afe, w->name);
662         if (etdm_id < 0) {
663                 dev_dbg(afe->dev, "%s() etdm_id < 0\n", __func__);
664                 return 0;
665         }
666
667         cg_id = mtk_dai_etdm_get_cg_id_by_dai_id(etdm_id);
668         if (cg_id < 0) {
669                 dev_dbg(afe->dev, "%s() cg_id < 0\n", __func__);
670                 return 0;
671         }
672
673         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
674                 __func__, w->name, event);
675
676         switch (event) {
677         case SND_SOC_DAPM_PRE_PMU:
678                 mt8188_afe_enable_clk(afe, afe_priv->clk[cg_id]);
679                 break;
680         case SND_SOC_DAPM_POST_PMD:
681                 mt8188_afe_disable_clk(afe, afe_priv->clk[cg_id]);
682                 break;
683         default:
684                 break;
685         }
686
687         return 0;
688 }
689
690 static int mtk_etdm3_cg_event(struct snd_soc_dapm_widget *w,
691                               struct snd_kcontrol *kcontrol,
692                               int event)
693 {
694         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
695         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
696         struct mt8188_afe_private *afe_priv = afe->platform_priv;
697
698         dev_dbg(cmpnt->dev, "%s(), name %s, event 0x%x\n",
699                 __func__, w->name, event);
700
701         switch (event) {
702         case SND_SOC_DAPM_PRE_PMU:
703                 mt8188_afe_enable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);
704                 break;
705         case SND_SOC_DAPM_POST_PMD:
706                 mt8188_afe_disable_clk(afe, afe_priv->clk[MT8188_CLK_AUD_HDMI_OUT]);
707                 break;
708         default:
709                 break;
710         }
711
712         return 0;
713 }
714
715 static const struct snd_kcontrol_new mtk_dai_etdm_o048_mix[] = {
716         SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN48, 20, 1, 0),
717         SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN48, 22, 1, 0),
718         SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN48_1, 14, 1, 0),
719         SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN48_2, 6, 1, 0),
720 };
721
722 static const struct snd_kcontrol_new mtk_dai_etdm_o049_mix[] = {
723         SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN49, 21, 1, 0),
724         SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN49, 23, 1, 0),
725         SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN49_1, 15, 1, 0),
726         SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN49_2, 7, 1, 0),
727 };
728
729 static const struct snd_kcontrol_new mtk_dai_etdm_o050_mix[] = {
730         SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN50, 24, 1, 0),
731         SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN50_1, 16, 1, 0),
732 };
733
734 static const struct snd_kcontrol_new mtk_dai_etdm_o051_mix[] = {
735         SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN51, 25, 1, 0),
736         SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN51_1, 17, 1, 0),
737 };
738
739 static const struct snd_kcontrol_new mtk_dai_etdm_o052_mix[] = {
740         SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN52, 26, 1, 0),
741         SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN52_1, 18, 1, 0),
742 };
743
744 static const struct snd_kcontrol_new mtk_dai_etdm_o053_mix[] = {
745         SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN53, 27, 1, 0),
746         SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN53_1, 19, 1, 0),
747 };
748
749 static const struct snd_kcontrol_new mtk_dai_etdm_o054_mix[] = {
750         SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN54, 28, 1, 0),
751         SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN54_1, 20, 1, 0),
752 };
753
754 static const struct snd_kcontrol_new mtk_dai_etdm_o055_mix[] = {
755         SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN55, 29, 1, 0),
756         SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN55_1, 21, 1, 0),
757 };
758
759 static const struct snd_kcontrol_new mtk_dai_etdm_o056_mix[] = {
760         SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN56, 30, 1, 0),
761         SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN56_1, 22, 1, 0),
762 };
763
764 static const struct snd_kcontrol_new mtk_dai_etdm_o057_mix[] = {
765         SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN57, 31, 1, 0),
766         SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN57_1, 23, 1, 0),
767 };
768
769 static const struct snd_kcontrol_new mtk_dai_etdm_o058_mix[] = {
770         SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN58_1, 0, 1, 0),
771         SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN58_1, 24, 1, 0),
772 };
773
774 static const struct snd_kcontrol_new mtk_dai_etdm_o059_mix[] = {
775         SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN59_1, 1, 1, 0),
776         SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN59_1, 25, 1, 0),
777 };
778
779 static const struct snd_kcontrol_new mtk_dai_etdm_o060_mix[] = {
780         SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN60_1, 2, 1, 0),
781         SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN60_1, 26, 1, 0),
782 };
783
784 static const struct snd_kcontrol_new mtk_dai_etdm_o061_mix[] = {
785         SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN61_1, 3, 1, 0),
786         SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN61_1, 27, 1, 0),
787 };
788
789 static const struct snd_kcontrol_new mtk_dai_etdm_o062_mix[] = {
790         SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN62_1, 4, 1, 0),
791         SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN62_1, 28, 1, 0),
792 };
793
794 static const struct snd_kcontrol_new mtk_dai_etdm_o063_mix[] = {
795         SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN63_1, 5, 1, 0),
796         SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN63_1, 29, 1, 0),
797 };
798
799 static const struct snd_kcontrol_new mtk_dai_etdm_o072_mix[] = {
800         SOC_DAPM_SINGLE_AUTODISABLE("I020 Switch", AFE_CONN72, 20, 1, 0),
801         SOC_DAPM_SINGLE_AUTODISABLE("I022 Switch", AFE_CONN72, 22, 1, 0),
802         SOC_DAPM_SINGLE_AUTODISABLE("I046 Switch", AFE_CONN72_1, 14, 1, 0),
803         SOC_DAPM_SINGLE_AUTODISABLE("I070 Switch", AFE_CONN72_2, 6, 1, 0),
804 };
805
806 static const struct snd_kcontrol_new mtk_dai_etdm_o073_mix[] = {
807         SOC_DAPM_SINGLE_AUTODISABLE("I021 Switch", AFE_CONN73, 21, 1, 0),
808         SOC_DAPM_SINGLE_AUTODISABLE("I023 Switch", AFE_CONN73, 23, 1, 0),
809         SOC_DAPM_SINGLE_AUTODISABLE("I047 Switch", AFE_CONN73_1, 15, 1, 0),
810         SOC_DAPM_SINGLE_AUTODISABLE("I071 Switch", AFE_CONN73_2, 7, 1, 0),
811 };
812
813 static const struct snd_kcontrol_new mtk_dai_etdm_o074_mix[] = {
814         SOC_DAPM_SINGLE_AUTODISABLE("I024 Switch", AFE_CONN74, 24, 1, 0),
815         SOC_DAPM_SINGLE_AUTODISABLE("I048 Switch", AFE_CONN74_1, 16, 1, 0),
816 };
817
818 static const struct snd_kcontrol_new mtk_dai_etdm_o075_mix[] = {
819         SOC_DAPM_SINGLE_AUTODISABLE("I025 Switch", AFE_CONN75, 25, 1, 0),
820         SOC_DAPM_SINGLE_AUTODISABLE("I049 Switch", AFE_CONN75_1, 17, 1, 0),
821 };
822
823 static const struct snd_kcontrol_new mtk_dai_etdm_o076_mix[] = {
824         SOC_DAPM_SINGLE_AUTODISABLE("I026 Switch", AFE_CONN76, 26, 1, 0),
825         SOC_DAPM_SINGLE_AUTODISABLE("I050 Switch", AFE_CONN76_1, 18, 1, 0),
826 };
827
828 static const struct snd_kcontrol_new mtk_dai_etdm_o077_mix[] = {
829         SOC_DAPM_SINGLE_AUTODISABLE("I027 Switch", AFE_CONN77, 27, 1, 0),
830         SOC_DAPM_SINGLE_AUTODISABLE("I051 Switch", AFE_CONN77_1, 19, 1, 0),
831 };
832
833 static const struct snd_kcontrol_new mtk_dai_etdm_o078_mix[] = {
834         SOC_DAPM_SINGLE_AUTODISABLE("I028 Switch", AFE_CONN78, 28, 1, 0),
835         SOC_DAPM_SINGLE_AUTODISABLE("I052 Switch", AFE_CONN78_1, 20, 1, 0),
836 };
837
838 static const struct snd_kcontrol_new mtk_dai_etdm_o079_mix[] = {
839         SOC_DAPM_SINGLE_AUTODISABLE("I029 Switch", AFE_CONN79, 29, 1, 0),
840         SOC_DAPM_SINGLE_AUTODISABLE("I053 Switch", AFE_CONN79_1, 21, 1, 0),
841 };
842
843 static const struct snd_kcontrol_new mtk_dai_etdm_o080_mix[] = {
844         SOC_DAPM_SINGLE_AUTODISABLE("I030 Switch", AFE_CONN80, 30, 1, 0),
845         SOC_DAPM_SINGLE_AUTODISABLE("I054 Switch", AFE_CONN80_1, 22, 1, 0),
846 };
847
848 static const struct snd_kcontrol_new mtk_dai_etdm_o081_mix[] = {
849         SOC_DAPM_SINGLE_AUTODISABLE("I031 Switch", AFE_CONN81, 31, 1, 0),
850         SOC_DAPM_SINGLE_AUTODISABLE("I055 Switch", AFE_CONN81_1, 23, 1, 0),
851 };
852
853 static const struct snd_kcontrol_new mtk_dai_etdm_o082_mix[] = {
854         SOC_DAPM_SINGLE_AUTODISABLE("I032 Switch", AFE_CONN82_1, 0, 1, 0),
855         SOC_DAPM_SINGLE_AUTODISABLE("I056 Switch", AFE_CONN82_1, 24, 1, 0),
856 };
857
858 static const struct snd_kcontrol_new mtk_dai_etdm_o083_mix[] = {
859         SOC_DAPM_SINGLE_AUTODISABLE("I033 Switch", AFE_CONN83_1, 1, 1, 0),
860         SOC_DAPM_SINGLE_AUTODISABLE("I057 Switch", AFE_CONN83_1, 25, 1, 0),
861 };
862
863 static const struct snd_kcontrol_new mtk_dai_etdm_o084_mix[] = {
864         SOC_DAPM_SINGLE_AUTODISABLE("I034 Switch", AFE_CONN84_1, 2, 1, 0),
865         SOC_DAPM_SINGLE_AUTODISABLE("I058 Switch", AFE_CONN84_1, 26, 1, 0),
866 };
867
868 static const struct snd_kcontrol_new mtk_dai_etdm_o085_mix[] = {
869         SOC_DAPM_SINGLE_AUTODISABLE("I035 Switch", AFE_CONN85_1, 3, 1, 0),
870         SOC_DAPM_SINGLE_AUTODISABLE("I059 Switch", AFE_CONN85_1, 27, 1, 0),
871 };
872
873 static const struct snd_kcontrol_new mtk_dai_etdm_o086_mix[] = {
874         SOC_DAPM_SINGLE_AUTODISABLE("I036 Switch", AFE_CONN86_1, 4, 1, 0),
875         SOC_DAPM_SINGLE_AUTODISABLE("I060 Switch", AFE_CONN86_1, 28, 1, 0),
876 };
877
878 static const struct snd_kcontrol_new mtk_dai_etdm_o087_mix[] = {
879         SOC_DAPM_SINGLE_AUTODISABLE("I037 Switch", AFE_CONN87_1, 5, 1, 0),
880         SOC_DAPM_SINGLE_AUTODISABLE("I061 Switch", AFE_CONN87_1, 29, 1, 0),
881 };
882
883 static const char * const mt8188_etdm_clk_src_sel_text[] = {
884         "26m",
885         "a1sys_a2sys",
886         "a3sys",
887         "a4sys",
888 };
889
890 static SOC_ENUM_SINGLE_EXT_DECL(etdmout_clk_src_enum,
891         mt8188_etdm_clk_src_sel_text);
892
893 static const char * const hdmitx_dptx_mux_map[] = {
894         "Disconnect", "Connect",
895 };
896
897 static int hdmitx_dptx_mux_map_value[] = {
898         0, 1,
899 };
900
901 /* HDMI_OUT_MUX */
902 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(hdmi_out_mux_map_enum,
903                                 SND_SOC_NOPM,
904                                 0,
905                                 1,
906                                 hdmitx_dptx_mux_map,
907                                 hdmitx_dptx_mux_map_value);
908
909 static const struct snd_kcontrol_new hdmi_out_mux_control =
910         SOC_DAPM_ENUM("HDMI_OUT_MUX", hdmi_out_mux_map_enum);
911
912 /* DPTX_OUT_MUX */
913 static SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(dptx_out_mux_map_enum,
914                                 SND_SOC_NOPM,
915                                 0,
916                                 1,
917                                 hdmitx_dptx_mux_map,
918                                 hdmitx_dptx_mux_map_value);
919
920 static const struct snd_kcontrol_new dptx_out_mux_control =
921         SOC_DAPM_ENUM("DPTX_OUT_MUX", dptx_out_mux_map_enum);
922
923 /* HDMI_CH0_MUX ~ HDMI_CH7_MUX */
924 static const char *const afe_conn_hdmi_mux_map[] = {
925         "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7",
926 };
927
928 static int afe_conn_hdmi_mux_map_value[] = {
929         0, 1, 2, 3, 4, 5, 6, 7,
930 };
931
932 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch0_mux_map_enum,
933                                 AFE_TDMOUT_CONN0,
934                                 0,
935                                 0xf,
936                                 afe_conn_hdmi_mux_map,
937                                 afe_conn_hdmi_mux_map_value);
938
939 static const struct snd_kcontrol_new hdmi_ch0_mux_control =
940         SOC_DAPM_ENUM("HDMI_CH0_MUX", hdmi_ch0_mux_map_enum);
941
942 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch1_mux_map_enum,
943                                 AFE_TDMOUT_CONN0,
944                                 4,
945                                 0xf,
946                                 afe_conn_hdmi_mux_map,
947                                 afe_conn_hdmi_mux_map_value);
948
949 static const struct snd_kcontrol_new hdmi_ch1_mux_control =
950         SOC_DAPM_ENUM("HDMI_CH1_MUX", hdmi_ch1_mux_map_enum);
951
952 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch2_mux_map_enum,
953                                 AFE_TDMOUT_CONN0,
954                                 8,
955                                 0xf,
956                                 afe_conn_hdmi_mux_map,
957                                 afe_conn_hdmi_mux_map_value);
958
959 static const struct snd_kcontrol_new hdmi_ch2_mux_control =
960         SOC_DAPM_ENUM("HDMI_CH2_MUX", hdmi_ch2_mux_map_enum);
961
962 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch3_mux_map_enum,
963                                 AFE_TDMOUT_CONN0,
964                                 12,
965                                 0xf,
966                                 afe_conn_hdmi_mux_map,
967                                 afe_conn_hdmi_mux_map_value);
968
969 static const struct snd_kcontrol_new hdmi_ch3_mux_control =
970         SOC_DAPM_ENUM("HDMI_CH3_MUX", hdmi_ch3_mux_map_enum);
971
972 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch4_mux_map_enum,
973                                 AFE_TDMOUT_CONN0,
974                                 16,
975                                 0xf,
976                                 afe_conn_hdmi_mux_map,
977                                 afe_conn_hdmi_mux_map_value);
978
979 static const struct snd_kcontrol_new hdmi_ch4_mux_control =
980         SOC_DAPM_ENUM("HDMI_CH4_MUX", hdmi_ch4_mux_map_enum);
981
982 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch5_mux_map_enum,
983                                 AFE_TDMOUT_CONN0,
984                                 20,
985                                 0xf,
986                                 afe_conn_hdmi_mux_map,
987                                 afe_conn_hdmi_mux_map_value);
988
989 static const struct snd_kcontrol_new hdmi_ch5_mux_control =
990         SOC_DAPM_ENUM("HDMI_CH5_MUX", hdmi_ch5_mux_map_enum);
991
992 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch6_mux_map_enum,
993                                 AFE_TDMOUT_CONN0,
994                                 24,
995                                 0xf,
996                                 afe_conn_hdmi_mux_map,
997                                 afe_conn_hdmi_mux_map_value);
998
999 static const struct snd_kcontrol_new hdmi_ch6_mux_control =
1000         SOC_DAPM_ENUM("HDMI_CH6_MUX", hdmi_ch6_mux_map_enum);
1001
1002 static SOC_VALUE_ENUM_SINGLE_DECL(hdmi_ch7_mux_map_enum,
1003                                 AFE_TDMOUT_CONN0,
1004                                 28,
1005                                 0xf,
1006                                 afe_conn_hdmi_mux_map,
1007                                 afe_conn_hdmi_mux_map_value);
1008
1009 static const struct snd_kcontrol_new hdmi_ch7_mux_control =
1010         SOC_DAPM_ENUM("HDMI_CH7_MUX", hdmi_ch7_mux_map_enum);
1011
1012 static int mt8188_etdm_clk_src_sel_put(struct snd_kcontrol *kcontrol,
1013                                        struct snd_ctl_elem_value *ucontrol)
1014 {
1015         struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1016         struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1017         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
1018         unsigned int source = ucontrol->value.enumerated.item[0];
1019         unsigned int val;
1020         unsigned int old_val;
1021         unsigned int mask;
1022         unsigned int reg;
1023
1024         if (source >= e->items)
1025                 return -EINVAL;
1026
1027         if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
1028                 reg = ETDM_OUT1_CON4;
1029                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1030                 val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
1031         } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
1032                 reg = ETDM_OUT2_CON4;
1033                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1034                 val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
1035         } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
1036                 reg = ETDM_OUT3_CON4;
1037                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1038                 val = FIELD_PREP(ETDM_OUT_CON4_CLOCK_MASK, source);
1039         } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
1040                 reg = ETDM_IN1_CON2;
1041                 mask = ETDM_IN_CON2_CLOCK_MASK;
1042                 val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);
1043         } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
1044                 reg = ETDM_IN2_CON2;
1045                 mask = ETDM_IN_CON2_CLOCK_MASK;
1046                 val = FIELD_PREP(ETDM_IN_CON2_CLOCK_MASK, source);
1047         } else {
1048                 return -EINVAL;
1049         }
1050
1051         regmap_read(afe->regmap, reg, &old_val);
1052         old_val &= mask;
1053         if (old_val == val)
1054                 return 0;
1055
1056         regmap_update_bits(afe->regmap, reg, mask, val);
1057
1058         return 1;
1059 }
1060
1061 static int mt8188_etdm_clk_src_sel_get(struct snd_kcontrol *kcontrol,
1062                                        struct snd_ctl_elem_value *ucontrol)
1063 {
1064         struct snd_soc_component *component =
1065                 snd_soc_kcontrol_component(kcontrol);
1066         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
1067         unsigned int value;
1068         unsigned int reg;
1069         unsigned int mask;
1070         unsigned int shift;
1071
1072         if (!strcmp(kcontrol->id.name, "ETDM_OUT1_Clock_Source")) {
1073                 reg = ETDM_OUT1_CON4;
1074                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1075                 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
1076         } else if (!strcmp(kcontrol->id.name, "ETDM_OUT2_Clock_Source")) {
1077                 reg = ETDM_OUT2_CON4;
1078                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1079                 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
1080         } else if (!strcmp(kcontrol->id.name, "ETDM_OUT3_Clock_Source")) {
1081                 reg = ETDM_OUT3_CON4;
1082                 mask = ETDM_OUT_CON4_CLOCK_MASK;
1083                 shift = ETDM_OUT_CON4_CLOCK_SHIFT;
1084         } else if (!strcmp(kcontrol->id.name, "ETDM_IN1_Clock_Source")) {
1085                 reg = ETDM_IN1_CON2;
1086                 mask = ETDM_IN_CON2_CLOCK_MASK;
1087                 shift = ETDM_IN_CON2_CLOCK_SHIFT;
1088         } else if (!strcmp(kcontrol->id.name, "ETDM_IN2_Clock_Source")) {
1089                 reg = ETDM_IN2_CON2;
1090                 mask = ETDM_IN_CON2_CLOCK_MASK;
1091                 shift = ETDM_IN_CON2_CLOCK_SHIFT;
1092         } else {
1093                 return -EINVAL;
1094         }
1095
1096         regmap_read(afe->regmap, reg, &value);
1097
1098         value &= mask;
1099         value >>= shift;
1100         ucontrol->value.enumerated.item[0] = value;
1101         return 0;
1102 }
1103
1104 static const struct snd_kcontrol_new mtk_dai_etdm_controls[] = {
1105         SOC_ENUM_EXT("ETDM_OUT1_Clock_Source", etdmout_clk_src_enum,
1106                      mt8188_etdm_clk_src_sel_get,
1107                      mt8188_etdm_clk_src_sel_put),
1108         SOC_ENUM_EXT("ETDM_OUT2_Clock_Source", etdmout_clk_src_enum,
1109                      mt8188_etdm_clk_src_sel_get,
1110                      mt8188_etdm_clk_src_sel_put),
1111         SOC_ENUM_EXT("ETDM_OUT3_Clock_Source", etdmout_clk_src_enum,
1112                      mt8188_etdm_clk_src_sel_get,
1113                      mt8188_etdm_clk_src_sel_put),
1114         SOC_ENUM_EXT("ETDM_IN1_Clock_Source", etdmout_clk_src_enum,
1115                      mt8188_etdm_clk_src_sel_get,
1116                      mt8188_etdm_clk_src_sel_put),
1117         SOC_ENUM_EXT("ETDM_IN2_Clock_Source", etdmout_clk_src_enum,
1118                      mt8188_etdm_clk_src_sel_get,
1119                      mt8188_etdm_clk_src_sel_put),
1120 };
1121
1122 static const struct snd_soc_dapm_widget mtk_dai_etdm_widgets[] = {
1123         /* eTDM_IN2 */
1124         SND_SOC_DAPM_MIXER("I012", SND_SOC_NOPM, 0, 0, NULL, 0),
1125         SND_SOC_DAPM_MIXER("I013", SND_SOC_NOPM, 0, 0, NULL, 0),
1126         SND_SOC_DAPM_MIXER("I014", SND_SOC_NOPM, 0, 0, NULL, 0),
1127         SND_SOC_DAPM_MIXER("I015", SND_SOC_NOPM, 0, 0, NULL, 0),
1128         SND_SOC_DAPM_MIXER("I016", SND_SOC_NOPM, 0, 0, NULL, 0),
1129         SND_SOC_DAPM_MIXER("I017", SND_SOC_NOPM, 0, 0, NULL, 0),
1130         SND_SOC_DAPM_MIXER("I018", SND_SOC_NOPM, 0, 0, NULL, 0),
1131         SND_SOC_DAPM_MIXER("I019", SND_SOC_NOPM, 0, 0, NULL, 0),
1132         SND_SOC_DAPM_MIXER("I188", SND_SOC_NOPM, 0, 0, NULL, 0),
1133         SND_SOC_DAPM_MIXER("I189", SND_SOC_NOPM, 0, 0, NULL, 0),
1134         SND_SOC_DAPM_MIXER("I190", SND_SOC_NOPM, 0, 0, NULL, 0),
1135         SND_SOC_DAPM_MIXER("I191", SND_SOC_NOPM, 0, 0, NULL, 0),
1136         SND_SOC_DAPM_MIXER("I192", SND_SOC_NOPM, 0, 0, NULL, 0),
1137         SND_SOC_DAPM_MIXER("I193", SND_SOC_NOPM, 0, 0, NULL, 0),
1138         SND_SOC_DAPM_MIXER("I194", SND_SOC_NOPM, 0, 0, NULL, 0),
1139         SND_SOC_DAPM_MIXER("I195", SND_SOC_NOPM, 0, 0, NULL, 0),
1140
1141         /* eTDM_IN1 */
1142         SND_SOC_DAPM_MIXER("I072", SND_SOC_NOPM, 0, 0, NULL, 0),
1143         SND_SOC_DAPM_MIXER("I073", SND_SOC_NOPM, 0, 0, NULL, 0),
1144         SND_SOC_DAPM_MIXER("I074", SND_SOC_NOPM, 0, 0, NULL, 0),
1145         SND_SOC_DAPM_MIXER("I075", SND_SOC_NOPM, 0, 0, NULL, 0),
1146         SND_SOC_DAPM_MIXER("I076", SND_SOC_NOPM, 0, 0, NULL, 0),
1147         SND_SOC_DAPM_MIXER("I077", SND_SOC_NOPM, 0, 0, NULL, 0),
1148         SND_SOC_DAPM_MIXER("I078", SND_SOC_NOPM, 0, 0, NULL, 0),
1149         SND_SOC_DAPM_MIXER("I079", SND_SOC_NOPM, 0, 0, NULL, 0),
1150         SND_SOC_DAPM_MIXER("I080", SND_SOC_NOPM, 0, 0, NULL, 0),
1151         SND_SOC_DAPM_MIXER("I081", SND_SOC_NOPM, 0, 0, NULL, 0),
1152         SND_SOC_DAPM_MIXER("I082", SND_SOC_NOPM, 0, 0, NULL, 0),
1153         SND_SOC_DAPM_MIXER("I083", SND_SOC_NOPM, 0, 0, NULL, 0),
1154         SND_SOC_DAPM_MIXER("I084", SND_SOC_NOPM, 0, 0, NULL, 0),
1155         SND_SOC_DAPM_MIXER("I085", SND_SOC_NOPM, 0, 0, NULL, 0),
1156         SND_SOC_DAPM_MIXER("I086", SND_SOC_NOPM, 0, 0, NULL, 0),
1157         SND_SOC_DAPM_MIXER("I087", SND_SOC_NOPM, 0, 0, NULL, 0),
1158
1159         /* eTDM_OUT2 */
1160         SND_SOC_DAPM_MIXER("O048", SND_SOC_NOPM, 0, 0,
1161                            mtk_dai_etdm_o048_mix, ARRAY_SIZE(mtk_dai_etdm_o048_mix)),
1162         SND_SOC_DAPM_MIXER("O049", SND_SOC_NOPM, 0, 0,
1163                            mtk_dai_etdm_o049_mix, ARRAY_SIZE(mtk_dai_etdm_o049_mix)),
1164         SND_SOC_DAPM_MIXER("O050", SND_SOC_NOPM, 0, 0,
1165                            mtk_dai_etdm_o050_mix, ARRAY_SIZE(mtk_dai_etdm_o050_mix)),
1166         SND_SOC_DAPM_MIXER("O051", SND_SOC_NOPM, 0, 0,
1167                            mtk_dai_etdm_o051_mix, ARRAY_SIZE(mtk_dai_etdm_o051_mix)),
1168         SND_SOC_DAPM_MIXER("O052", SND_SOC_NOPM, 0, 0,
1169                            mtk_dai_etdm_o052_mix, ARRAY_SIZE(mtk_dai_etdm_o052_mix)),
1170         SND_SOC_DAPM_MIXER("O053", SND_SOC_NOPM, 0, 0,
1171                            mtk_dai_etdm_o053_mix, ARRAY_SIZE(mtk_dai_etdm_o053_mix)),
1172         SND_SOC_DAPM_MIXER("O054", SND_SOC_NOPM, 0, 0,
1173                            mtk_dai_etdm_o054_mix, ARRAY_SIZE(mtk_dai_etdm_o054_mix)),
1174         SND_SOC_DAPM_MIXER("O055", SND_SOC_NOPM, 0, 0,
1175                            mtk_dai_etdm_o055_mix, ARRAY_SIZE(mtk_dai_etdm_o055_mix)),
1176         SND_SOC_DAPM_MIXER("O056", SND_SOC_NOPM, 0, 0,
1177                            mtk_dai_etdm_o056_mix, ARRAY_SIZE(mtk_dai_etdm_o056_mix)),
1178         SND_SOC_DAPM_MIXER("O057", SND_SOC_NOPM, 0, 0,
1179                            mtk_dai_etdm_o057_mix, ARRAY_SIZE(mtk_dai_etdm_o057_mix)),
1180         SND_SOC_DAPM_MIXER("O058", SND_SOC_NOPM, 0, 0,
1181                            mtk_dai_etdm_o058_mix, ARRAY_SIZE(mtk_dai_etdm_o058_mix)),
1182         SND_SOC_DAPM_MIXER("O059", SND_SOC_NOPM, 0, 0,
1183                            mtk_dai_etdm_o059_mix, ARRAY_SIZE(mtk_dai_etdm_o059_mix)),
1184         SND_SOC_DAPM_MIXER("O060", SND_SOC_NOPM, 0, 0,
1185                            mtk_dai_etdm_o060_mix, ARRAY_SIZE(mtk_dai_etdm_o060_mix)),
1186         SND_SOC_DAPM_MIXER("O061", SND_SOC_NOPM, 0, 0,
1187                            mtk_dai_etdm_o061_mix, ARRAY_SIZE(mtk_dai_etdm_o061_mix)),
1188         SND_SOC_DAPM_MIXER("O062", SND_SOC_NOPM, 0, 0,
1189                            mtk_dai_etdm_o062_mix, ARRAY_SIZE(mtk_dai_etdm_o062_mix)),
1190         SND_SOC_DAPM_MIXER("O063", SND_SOC_NOPM, 0, 0,
1191                            mtk_dai_etdm_o063_mix, ARRAY_SIZE(mtk_dai_etdm_o063_mix)),
1192
1193         /* eTDM_OUT1 */
1194         SND_SOC_DAPM_MIXER("O072", SND_SOC_NOPM, 0, 0,
1195                            mtk_dai_etdm_o072_mix, ARRAY_SIZE(mtk_dai_etdm_o072_mix)),
1196         SND_SOC_DAPM_MIXER("O073", SND_SOC_NOPM, 0, 0,
1197                            mtk_dai_etdm_o073_mix, ARRAY_SIZE(mtk_dai_etdm_o073_mix)),
1198         SND_SOC_DAPM_MIXER("O074", SND_SOC_NOPM, 0, 0,
1199                            mtk_dai_etdm_o074_mix, ARRAY_SIZE(mtk_dai_etdm_o074_mix)),
1200         SND_SOC_DAPM_MIXER("O075", SND_SOC_NOPM, 0, 0,
1201                            mtk_dai_etdm_o075_mix, ARRAY_SIZE(mtk_dai_etdm_o075_mix)),
1202         SND_SOC_DAPM_MIXER("O076", SND_SOC_NOPM, 0, 0,
1203                            mtk_dai_etdm_o076_mix, ARRAY_SIZE(mtk_dai_etdm_o076_mix)),
1204         SND_SOC_DAPM_MIXER("O077", SND_SOC_NOPM, 0, 0,
1205                            mtk_dai_etdm_o077_mix, ARRAY_SIZE(mtk_dai_etdm_o077_mix)),
1206         SND_SOC_DAPM_MIXER("O078", SND_SOC_NOPM, 0, 0,
1207                            mtk_dai_etdm_o078_mix, ARRAY_SIZE(mtk_dai_etdm_o078_mix)),
1208         SND_SOC_DAPM_MIXER("O079", SND_SOC_NOPM, 0, 0,
1209                            mtk_dai_etdm_o079_mix, ARRAY_SIZE(mtk_dai_etdm_o079_mix)),
1210         SND_SOC_DAPM_MIXER("O080", SND_SOC_NOPM, 0, 0,
1211                            mtk_dai_etdm_o080_mix, ARRAY_SIZE(mtk_dai_etdm_o080_mix)),
1212         SND_SOC_DAPM_MIXER("O081", SND_SOC_NOPM, 0, 0,
1213                            mtk_dai_etdm_o081_mix, ARRAY_SIZE(mtk_dai_etdm_o081_mix)),
1214         SND_SOC_DAPM_MIXER("O082", SND_SOC_NOPM, 0, 0,
1215                            mtk_dai_etdm_o082_mix, ARRAY_SIZE(mtk_dai_etdm_o082_mix)),
1216         SND_SOC_DAPM_MIXER("O083", SND_SOC_NOPM, 0, 0,
1217                            mtk_dai_etdm_o083_mix, ARRAY_SIZE(mtk_dai_etdm_o083_mix)),
1218         SND_SOC_DAPM_MIXER("O084", SND_SOC_NOPM, 0, 0,
1219                            mtk_dai_etdm_o084_mix, ARRAY_SIZE(mtk_dai_etdm_o084_mix)),
1220         SND_SOC_DAPM_MIXER("O085", SND_SOC_NOPM, 0, 0,
1221                            mtk_dai_etdm_o085_mix, ARRAY_SIZE(mtk_dai_etdm_o085_mix)),
1222         SND_SOC_DAPM_MIXER("O086", SND_SOC_NOPM, 0, 0,
1223                            mtk_dai_etdm_o086_mix, ARRAY_SIZE(mtk_dai_etdm_o086_mix)),
1224         SND_SOC_DAPM_MIXER("O087", SND_SOC_NOPM, 0, 0,
1225                            mtk_dai_etdm_o087_mix, ARRAY_SIZE(mtk_dai_etdm_o087_mix)),
1226
1227         /* eTDM_OUT3 */
1228         SND_SOC_DAPM_MUX("HDMI_OUT_MUX", SND_SOC_NOPM, 0, 0,
1229                          &hdmi_out_mux_control),
1230         SND_SOC_DAPM_MUX("DPTX_OUT_MUX", SND_SOC_NOPM, 0, 0,
1231                          &dptx_out_mux_control),
1232
1233         SND_SOC_DAPM_MUX("HDMI_CH0_MUX", SND_SOC_NOPM, 0, 0,
1234                          &hdmi_ch0_mux_control),
1235         SND_SOC_DAPM_MUX("HDMI_CH1_MUX", SND_SOC_NOPM, 0, 0,
1236                          &hdmi_ch1_mux_control),
1237         SND_SOC_DAPM_MUX("HDMI_CH2_MUX", SND_SOC_NOPM, 0, 0,
1238                          &hdmi_ch2_mux_control),
1239         SND_SOC_DAPM_MUX("HDMI_CH3_MUX", SND_SOC_NOPM, 0, 0,
1240                          &hdmi_ch3_mux_control),
1241         SND_SOC_DAPM_MUX("HDMI_CH4_MUX", SND_SOC_NOPM, 0, 0,
1242                          &hdmi_ch4_mux_control),
1243         SND_SOC_DAPM_MUX("HDMI_CH5_MUX", SND_SOC_NOPM, 0, 0,
1244                          &hdmi_ch5_mux_control),
1245         SND_SOC_DAPM_MUX("HDMI_CH6_MUX", SND_SOC_NOPM, 0, 0,
1246                          &hdmi_ch6_mux_control),
1247         SND_SOC_DAPM_MUX("HDMI_CH7_MUX", SND_SOC_NOPM, 0, 0,
1248                          &hdmi_ch7_mux_control),
1249
1250         /* mclk en */
1251         SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,
1252                               SND_SOC_NOPM, 0, 0,
1253                               mtk_etdm_mclk_event,
1254                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1255         SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_MCLK", SUPPLY_SEQ_ETDM_MCLK,
1256                               SND_SOC_NOPM, 0, 0,
1257                               mtk_etdm_mclk_event,
1258                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1259         SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,
1260                               SND_SOC_NOPM, 0, 0,
1261                               mtk_etdm_mclk_event,
1262                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1263         SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_MCLK", SUPPLY_SEQ_ETDM_MCLK,
1264                               SND_SOC_NOPM, 0, 0,
1265                               mtk_etdm_mclk_event,
1266                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1267         SND_SOC_DAPM_SUPPLY_S("DPTX_MCLK", SUPPLY_SEQ_ETDM_MCLK,
1268                               SND_SOC_NOPM, 0, 0,
1269                               mtk_dptx_mclk_event,
1270                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1271
1272         /* cg */
1273         SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_CG", SUPPLY_SEQ_ETDM_CG,
1274                               SND_SOC_NOPM, 0, 0,
1275                               mtk_etdm_cg_event,
1276                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1277         SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_CG", SUPPLY_SEQ_ETDM_CG,
1278                               SND_SOC_NOPM, 0, 0,
1279                               mtk_etdm_cg_event,
1280                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1281         SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_CG", SUPPLY_SEQ_ETDM_CG,
1282                               SND_SOC_NOPM, 0, 0,
1283                               mtk_etdm_cg_event,
1284                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1285         SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_CG", SUPPLY_SEQ_ETDM_CG,
1286                               SND_SOC_NOPM, 0, 0,
1287                               mtk_etdm_cg_event,
1288                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1289         SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_CG", SUPPLY_SEQ_ETDM_CG,
1290                               SND_SOC_NOPM, 0, 0,
1291                               mtk_etdm3_cg_event,
1292                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1293
1294         /* en */
1295         SND_SOC_DAPM_SUPPLY_S("ETDM1_IN_EN", SUPPLY_SEQ_ETDM_EN,
1296                               ETDM_IN1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
1297         SND_SOC_DAPM_SUPPLY_S("ETDM2_IN_EN", SUPPLY_SEQ_ETDM_EN,
1298                               ETDM_IN2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
1299         SND_SOC_DAPM_SUPPLY_S("ETDM1_OUT_EN", SUPPLY_SEQ_ETDM_EN,
1300                               ETDM_OUT1_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
1301         SND_SOC_DAPM_SUPPLY_S("ETDM2_OUT_EN", SUPPLY_SEQ_ETDM_EN,
1302                               ETDM_OUT2_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
1303         SND_SOC_DAPM_SUPPLY_S("ETDM3_OUT_EN", SUPPLY_SEQ_ETDM_EN,
1304                               ETDM_OUT3_CON0, ETDM_CON0_EN_SHIFT, 0, NULL, 0),
1305         SND_SOC_DAPM_SUPPLY_S("DPTX_EN", SUPPLY_SEQ_DPTX_EN,
1306                               AFE_DPTX_CON, AFE_DPTX_CON_ON_SHIFT, 0, NULL, 0),
1307
1308         /* apll */
1309         SND_SOC_DAPM_SUPPLY_S(APLL1_W_NAME, SUPPLY_SEQ_APLL,
1310                               SND_SOC_NOPM, 0, 0,
1311                               mtk_apll_event,
1312                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1313         SND_SOC_DAPM_SUPPLY_S(APLL2_W_NAME, SUPPLY_SEQ_APLL,
1314                               SND_SOC_NOPM, 0, 0,
1315                               mtk_apll_event,
1316                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1317
1318         SND_SOC_DAPM_INPUT("ETDM_INPUT"),
1319         SND_SOC_DAPM_OUTPUT("ETDM_OUTPUT"),
1320 };
1321
1322 static const struct snd_soc_dapm_route mtk_dai_etdm_routes[] = {
1323         /* mclk */
1324         {"ETDM1_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
1325         {"ETDM1_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
1326         {"ETDM1_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
1327         {"ETDM1_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
1328
1329         {"ETDM2_IN", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
1330         {"ETDM2_IN", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
1331         {"ETDM2_IN", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
1332         {"ETDM2_IN", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
1333
1334         {"ETDM1_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
1335         {"ETDM1_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
1336         {"ETDM1_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
1337         {"ETDM1_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
1338
1339         {"ETDM2_OUT", NULL, "ETDM1_IN_MCLK", mtk_etdm_mclk_connect},
1340         {"ETDM2_OUT", NULL, "ETDM2_IN_MCLK", mtk_etdm_mclk_connect},
1341         {"ETDM2_OUT", NULL, "ETDM1_OUT_MCLK", mtk_etdm_mclk_connect},
1342         {"ETDM2_OUT", NULL, "ETDM2_OUT_MCLK", mtk_etdm_mclk_connect},
1343
1344         {"DPTX", NULL, "DPTX_MCLK"},
1345
1346         {"ETDM1_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1347         {"ETDM1_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1348
1349         {"ETDM2_IN_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1350         {"ETDM2_IN_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1351
1352         {"ETDM1_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1353         {"ETDM1_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1354
1355         {"ETDM2_OUT_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1356         {"ETDM2_OUT_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1357
1358         {"DPTX_MCLK", NULL, APLL1_W_NAME, mtk_afe_mclk_apll_connect},
1359         {"DPTX_MCLK", NULL, APLL2_W_NAME, mtk_afe_mclk_apll_connect},
1360
1361         /* cg */
1362         {"ETDM1_IN", NULL, "ETDM1_IN_CG"},
1363         {"ETDM1_IN", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
1364         {"ETDM1_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
1365         {"ETDM1_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
1366
1367         {"ETDM2_IN", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
1368         {"ETDM2_IN", NULL, "ETDM2_IN_CG"},
1369         {"ETDM2_IN", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
1370         {"ETDM2_IN", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
1371
1372         {"ETDM1_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
1373         {"ETDM1_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
1374         {"ETDM1_OUT", NULL, "ETDM1_OUT_CG"},
1375         {"ETDM1_OUT", NULL, "ETDM2_OUT_CG", mtk_etdm_cowork_connect},
1376
1377         {"ETDM2_OUT", NULL, "ETDM1_IN_CG", mtk_etdm_cowork_connect},
1378         {"ETDM2_OUT", NULL, "ETDM2_IN_CG", mtk_etdm_cowork_connect},
1379         {"ETDM2_OUT", NULL, "ETDM1_OUT_CG", mtk_etdm_cowork_connect},
1380         {"ETDM2_OUT", NULL, "ETDM2_OUT_CG"},
1381
1382         {"ETDM3_OUT", NULL, "ETDM3_OUT_CG"},
1383         {"DPTX", NULL, "ETDM3_OUT_CG"},
1384
1385         /* en */
1386         {"ETDM1_IN", NULL, "ETDM1_IN_EN"},
1387         {"ETDM1_IN", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
1388         {"ETDM1_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
1389         {"ETDM1_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
1390
1391         {"ETDM2_IN", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
1392         {"ETDM2_IN", NULL, "ETDM2_IN_EN"},
1393         {"ETDM2_IN", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
1394         {"ETDM2_IN", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
1395
1396         {"ETDM1_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
1397         {"ETDM1_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
1398         {"ETDM1_OUT", NULL, "ETDM1_OUT_EN"},
1399         {"ETDM1_OUT", NULL, "ETDM2_OUT_EN", mtk_etdm_cowork_connect},
1400
1401         {"ETDM2_OUT", NULL, "ETDM1_IN_EN", mtk_etdm_cowork_connect},
1402         {"ETDM2_OUT", NULL, "ETDM2_IN_EN", mtk_etdm_cowork_connect},
1403         {"ETDM2_OUT", NULL, "ETDM1_OUT_EN", mtk_etdm_cowork_connect},
1404         {"ETDM2_OUT", NULL, "ETDM2_OUT_EN"},
1405
1406         {"ETDM3_OUT", NULL, "ETDM3_OUT_EN"},
1407         {"DPTX", NULL, "ETDM3_OUT_EN"},
1408         {"DPTX", NULL, "DPTX_EN"},
1409
1410         {"ETDM1_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
1411         {"ETDM1_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
1412
1413         {"ETDM2_IN_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
1414         {"ETDM2_IN_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
1415
1416         {"ETDM1_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
1417         {"ETDM1_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
1418
1419         {"ETDM2_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
1420         {"ETDM2_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
1421
1422         {"ETDM3_OUT_EN", NULL, APLL1_W_NAME, mtk_afe_etdm_apll_connect},
1423         {"ETDM3_OUT_EN", NULL, APLL2_W_NAME, mtk_afe_etdm_apll_connect},
1424
1425         {"I012", NULL, "ETDM2_IN"},
1426         {"I013", NULL, "ETDM2_IN"},
1427         {"I014", NULL, "ETDM2_IN"},
1428         {"I015", NULL, "ETDM2_IN"},
1429         {"I016", NULL, "ETDM2_IN"},
1430         {"I017", NULL, "ETDM2_IN"},
1431         {"I018", NULL, "ETDM2_IN"},
1432         {"I019", NULL, "ETDM2_IN"},
1433         {"I188", NULL, "ETDM2_IN"},
1434         {"I189", NULL, "ETDM2_IN"},
1435         {"I190", NULL, "ETDM2_IN"},
1436         {"I191", NULL, "ETDM2_IN"},
1437         {"I192", NULL, "ETDM2_IN"},
1438         {"I193", NULL, "ETDM2_IN"},
1439         {"I194", NULL, "ETDM2_IN"},
1440         {"I195", NULL, "ETDM2_IN"},
1441
1442         {"I072", NULL, "ETDM1_IN"},
1443         {"I073", NULL, "ETDM1_IN"},
1444         {"I074", NULL, "ETDM1_IN"},
1445         {"I075", NULL, "ETDM1_IN"},
1446         {"I076", NULL, "ETDM1_IN"},
1447         {"I077", NULL, "ETDM1_IN"},
1448         {"I078", NULL, "ETDM1_IN"},
1449         {"I079", NULL, "ETDM1_IN"},
1450         {"I080", NULL, "ETDM1_IN"},
1451         {"I081", NULL, "ETDM1_IN"},
1452         {"I082", NULL, "ETDM1_IN"},
1453         {"I083", NULL, "ETDM1_IN"},
1454         {"I084", NULL, "ETDM1_IN"},
1455         {"I085", NULL, "ETDM1_IN"},
1456         {"I086", NULL, "ETDM1_IN"},
1457         {"I087", NULL, "ETDM1_IN"},
1458
1459         {"UL8", NULL, "ETDM1_IN"},
1460         {"UL3", NULL, "ETDM2_IN"},
1461
1462         {"ETDM2_OUT", NULL, "O048"},
1463         {"ETDM2_OUT", NULL, "O049"},
1464         {"ETDM2_OUT", NULL, "O050"},
1465         {"ETDM2_OUT", NULL, "O051"},
1466         {"ETDM2_OUT", NULL, "O052"},
1467         {"ETDM2_OUT", NULL, "O053"},
1468         {"ETDM2_OUT", NULL, "O054"},
1469         {"ETDM2_OUT", NULL, "O055"},
1470         {"ETDM2_OUT", NULL, "O056"},
1471         {"ETDM2_OUT", NULL, "O057"},
1472         {"ETDM2_OUT", NULL, "O058"},
1473         {"ETDM2_OUT", NULL, "O059"},
1474         {"ETDM2_OUT", NULL, "O060"},
1475         {"ETDM2_OUT", NULL, "O061"},
1476         {"ETDM2_OUT", NULL, "O062"},
1477         {"ETDM2_OUT", NULL, "O063"},
1478
1479         {"ETDM1_OUT", NULL, "O072"},
1480         {"ETDM1_OUT", NULL, "O073"},
1481         {"ETDM1_OUT", NULL, "O074"},
1482         {"ETDM1_OUT", NULL, "O075"},
1483         {"ETDM1_OUT", NULL, "O076"},
1484         {"ETDM1_OUT", NULL, "O077"},
1485         {"ETDM1_OUT", NULL, "O078"},
1486         {"ETDM1_OUT", NULL, "O079"},
1487         {"ETDM1_OUT", NULL, "O080"},
1488         {"ETDM1_OUT", NULL, "O081"},
1489         {"ETDM1_OUT", NULL, "O082"},
1490         {"ETDM1_OUT", NULL, "O083"},
1491         {"ETDM1_OUT", NULL, "O084"},
1492         {"ETDM1_OUT", NULL, "O085"},
1493         {"ETDM1_OUT", NULL, "O086"},
1494         {"ETDM1_OUT", NULL, "O087"},
1495
1496         {"O048", "I020 Switch", "I020"},
1497         {"O049", "I021 Switch", "I021"},
1498
1499         {"O048", "I022 Switch", "I022"},
1500         {"O049", "I023 Switch", "I023"},
1501         {"O050", "I024 Switch", "I024"},
1502         {"O051", "I025 Switch", "I025"},
1503         {"O052", "I026 Switch", "I026"},
1504         {"O053", "I027 Switch", "I027"},
1505         {"O054", "I028 Switch", "I028"},
1506         {"O055", "I029 Switch", "I029"},
1507         {"O056", "I030 Switch", "I030"},
1508         {"O057", "I031 Switch", "I031"},
1509         {"O058", "I032 Switch", "I032"},
1510         {"O059", "I033 Switch", "I033"},
1511         {"O060", "I034 Switch", "I034"},
1512         {"O061", "I035 Switch", "I035"},
1513         {"O062", "I036 Switch", "I036"},
1514         {"O063", "I037 Switch", "I037"},
1515
1516         {"O048", "I046 Switch", "I046"},
1517         {"O049", "I047 Switch", "I047"},
1518         {"O050", "I048 Switch", "I048"},
1519         {"O051", "I049 Switch", "I049"},
1520         {"O052", "I050 Switch", "I050"},
1521         {"O053", "I051 Switch", "I051"},
1522         {"O054", "I052 Switch", "I052"},
1523         {"O055", "I053 Switch", "I053"},
1524         {"O056", "I054 Switch", "I054"},
1525         {"O057", "I055 Switch", "I055"},
1526         {"O058", "I056 Switch", "I056"},
1527         {"O059", "I057 Switch", "I057"},
1528         {"O060", "I058 Switch", "I058"},
1529         {"O061", "I059 Switch", "I059"},
1530         {"O062", "I060 Switch", "I060"},
1531         {"O063", "I061 Switch", "I061"},
1532
1533         {"O048", "I070 Switch", "I070"},
1534         {"O049", "I071 Switch", "I071"},
1535
1536         {"O072", "I020 Switch", "I020"},
1537         {"O073", "I021 Switch", "I021"},
1538
1539         {"O072", "I022 Switch", "I022"},
1540         {"O073", "I023 Switch", "I023"},
1541         {"O074", "I024 Switch", "I024"},
1542         {"O075", "I025 Switch", "I025"},
1543         {"O076", "I026 Switch", "I026"},
1544         {"O077", "I027 Switch", "I027"},
1545         {"O078", "I028 Switch", "I028"},
1546         {"O079", "I029 Switch", "I029"},
1547         {"O080", "I030 Switch", "I030"},
1548         {"O081", "I031 Switch", "I031"},
1549         {"O082", "I032 Switch", "I032"},
1550         {"O083", "I033 Switch", "I033"},
1551         {"O084", "I034 Switch", "I034"},
1552         {"O085", "I035 Switch", "I035"},
1553         {"O086", "I036 Switch", "I036"},
1554         {"O087", "I037 Switch", "I037"},
1555
1556         {"O072", "I046 Switch", "I046"},
1557         {"O073", "I047 Switch", "I047"},
1558         {"O074", "I048 Switch", "I048"},
1559         {"O075", "I049 Switch", "I049"},
1560         {"O076", "I050 Switch", "I050"},
1561         {"O077", "I051 Switch", "I051"},
1562         {"O078", "I052 Switch", "I052"},
1563         {"O079", "I053 Switch", "I053"},
1564         {"O080", "I054 Switch", "I054"},
1565         {"O081", "I055 Switch", "I055"},
1566         {"O082", "I056 Switch", "I056"},
1567         {"O083", "I057 Switch", "I057"},
1568         {"O084", "I058 Switch", "I058"},
1569         {"O085", "I059 Switch", "I059"},
1570         {"O086", "I060 Switch", "I060"},
1571         {"O087", "I061 Switch", "I061"},
1572
1573         {"O072", "I070 Switch", "I070"},
1574         {"O073", "I071 Switch", "I071"},
1575
1576         {"HDMI_CH0_MUX", "CH0", "DL10"},
1577         {"HDMI_CH0_MUX", "CH1", "DL10"},
1578         {"HDMI_CH0_MUX", "CH2", "DL10"},
1579         {"HDMI_CH0_MUX", "CH3", "DL10"},
1580         {"HDMI_CH0_MUX", "CH4", "DL10"},
1581         {"HDMI_CH0_MUX", "CH5", "DL10"},
1582         {"HDMI_CH0_MUX", "CH6", "DL10"},
1583         {"HDMI_CH0_MUX", "CH7", "DL10"},
1584
1585         {"HDMI_CH1_MUX", "CH0", "DL10"},
1586         {"HDMI_CH1_MUX", "CH1", "DL10"},
1587         {"HDMI_CH1_MUX", "CH2", "DL10"},
1588         {"HDMI_CH1_MUX", "CH3", "DL10"},
1589         {"HDMI_CH1_MUX", "CH4", "DL10"},
1590         {"HDMI_CH1_MUX", "CH5", "DL10"},
1591         {"HDMI_CH1_MUX", "CH6", "DL10"},
1592         {"HDMI_CH1_MUX", "CH7", "DL10"},
1593
1594         {"HDMI_CH2_MUX", "CH0", "DL10"},
1595         {"HDMI_CH2_MUX", "CH1", "DL10"},
1596         {"HDMI_CH2_MUX", "CH2", "DL10"},
1597         {"HDMI_CH2_MUX", "CH3", "DL10"},
1598         {"HDMI_CH2_MUX", "CH4", "DL10"},
1599         {"HDMI_CH2_MUX", "CH5", "DL10"},
1600         {"HDMI_CH2_MUX", "CH6", "DL10"},
1601         {"HDMI_CH2_MUX", "CH7", "DL10"},
1602
1603         {"HDMI_CH3_MUX", "CH0", "DL10"},
1604         {"HDMI_CH3_MUX", "CH1", "DL10"},
1605         {"HDMI_CH3_MUX", "CH2", "DL10"},
1606         {"HDMI_CH3_MUX", "CH3", "DL10"},
1607         {"HDMI_CH3_MUX", "CH4", "DL10"},
1608         {"HDMI_CH3_MUX", "CH5", "DL10"},
1609         {"HDMI_CH3_MUX", "CH6", "DL10"},
1610         {"HDMI_CH3_MUX", "CH7", "DL10"},
1611
1612         {"HDMI_CH4_MUX", "CH0", "DL10"},
1613         {"HDMI_CH4_MUX", "CH1", "DL10"},
1614         {"HDMI_CH4_MUX", "CH2", "DL10"},
1615         {"HDMI_CH4_MUX", "CH3", "DL10"},
1616         {"HDMI_CH4_MUX", "CH4", "DL10"},
1617         {"HDMI_CH4_MUX", "CH5", "DL10"},
1618         {"HDMI_CH4_MUX", "CH6", "DL10"},
1619         {"HDMI_CH4_MUX", "CH7", "DL10"},
1620
1621         {"HDMI_CH5_MUX", "CH0", "DL10"},
1622         {"HDMI_CH5_MUX", "CH1", "DL10"},
1623         {"HDMI_CH5_MUX", "CH2", "DL10"},
1624         {"HDMI_CH5_MUX", "CH3", "DL10"},
1625         {"HDMI_CH5_MUX", "CH4", "DL10"},
1626         {"HDMI_CH5_MUX", "CH5", "DL10"},
1627         {"HDMI_CH5_MUX", "CH6", "DL10"},
1628         {"HDMI_CH5_MUX", "CH7", "DL10"},
1629
1630         {"HDMI_CH6_MUX", "CH0", "DL10"},
1631         {"HDMI_CH6_MUX", "CH1", "DL10"},
1632         {"HDMI_CH6_MUX", "CH2", "DL10"},
1633         {"HDMI_CH6_MUX", "CH3", "DL10"},
1634         {"HDMI_CH6_MUX", "CH4", "DL10"},
1635         {"HDMI_CH6_MUX", "CH5", "DL10"},
1636         {"HDMI_CH6_MUX", "CH6", "DL10"},
1637         {"HDMI_CH6_MUX", "CH7", "DL10"},
1638
1639         {"HDMI_CH7_MUX", "CH0", "DL10"},
1640         {"HDMI_CH7_MUX", "CH1", "DL10"},
1641         {"HDMI_CH7_MUX", "CH2", "DL10"},
1642         {"HDMI_CH7_MUX", "CH3", "DL10"},
1643         {"HDMI_CH7_MUX", "CH4", "DL10"},
1644         {"HDMI_CH7_MUX", "CH5", "DL10"},
1645         {"HDMI_CH7_MUX", "CH6", "DL10"},
1646         {"HDMI_CH7_MUX", "CH7", "DL10"},
1647
1648         {"HDMI_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
1649         {"HDMI_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
1650         {"HDMI_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
1651         {"HDMI_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
1652         {"HDMI_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
1653         {"HDMI_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
1654         {"HDMI_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
1655         {"HDMI_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
1656
1657         {"DPTX_OUT_MUX", "Connect", "HDMI_CH0_MUX"},
1658         {"DPTX_OUT_MUX", "Connect", "HDMI_CH1_MUX"},
1659         {"DPTX_OUT_MUX", "Connect", "HDMI_CH2_MUX"},
1660         {"DPTX_OUT_MUX", "Connect", "HDMI_CH3_MUX"},
1661         {"DPTX_OUT_MUX", "Connect", "HDMI_CH4_MUX"},
1662         {"DPTX_OUT_MUX", "Connect", "HDMI_CH5_MUX"},
1663         {"DPTX_OUT_MUX", "Connect", "HDMI_CH6_MUX"},
1664         {"DPTX_OUT_MUX", "Connect", "HDMI_CH7_MUX"},
1665
1666         {"ETDM3_OUT", NULL, "HDMI_OUT_MUX"},
1667         {"DPTX", NULL, "DPTX_OUT_MUX"},
1668
1669         {"ETDM_OUTPUT", NULL, "DPTX"},
1670         {"ETDM_OUTPUT", NULL, "ETDM1_OUT"},
1671         {"ETDM_OUTPUT", NULL, "ETDM2_OUT"},
1672         {"ETDM_OUTPUT", NULL, "ETDM3_OUT"},
1673         {"ETDM1_IN", NULL, "ETDM_INPUT"},
1674         {"ETDM2_IN", NULL, "ETDM_INPUT"},
1675 };
1676
1677 static int etdm_cowork_slv_sel(int id, int slave_mode)
1678 {
1679         if (slave_mode) {
1680                 switch (id) {
1681                 case MT8188_AFE_IO_ETDM1_IN:
1682                         return COWORK_ETDM_IN1_S;
1683                 case MT8188_AFE_IO_ETDM2_IN:
1684                         return COWORK_ETDM_IN2_S;
1685                 case MT8188_AFE_IO_ETDM1_OUT:
1686                         return COWORK_ETDM_OUT1_S;
1687                 case MT8188_AFE_IO_ETDM2_OUT:
1688                         return COWORK_ETDM_OUT2_S;
1689                 case MT8188_AFE_IO_ETDM3_OUT:
1690                         return COWORK_ETDM_OUT3_S;
1691                 default:
1692                         return -EINVAL;
1693                 }
1694         } else {
1695                 switch (id) {
1696                 case MT8188_AFE_IO_ETDM1_IN:
1697                         return COWORK_ETDM_IN1_M;
1698                 case MT8188_AFE_IO_ETDM2_IN:
1699                         return COWORK_ETDM_IN2_M;
1700                 case MT8188_AFE_IO_ETDM1_OUT:
1701                         return COWORK_ETDM_OUT1_M;
1702                 case MT8188_AFE_IO_ETDM2_OUT:
1703                         return COWORK_ETDM_OUT2_M;
1704                 case MT8188_AFE_IO_ETDM3_OUT:
1705                         return COWORK_ETDM_OUT3_M;
1706                 default:
1707                         return -EINVAL;
1708                 }
1709         }
1710 }
1711
1712 static int etdm_cowork_sync_sel(int id)
1713 {
1714         switch (id) {
1715         case MT8188_AFE_IO_ETDM1_IN:
1716                 return ETDM_SYNC_FROM_IN1;
1717         case MT8188_AFE_IO_ETDM2_IN:
1718                 return ETDM_SYNC_FROM_IN2;
1719         case MT8188_AFE_IO_ETDM1_OUT:
1720                 return ETDM_SYNC_FROM_OUT1;
1721         case MT8188_AFE_IO_ETDM2_OUT:
1722                 return ETDM_SYNC_FROM_OUT2;
1723         case MT8188_AFE_IO_ETDM3_OUT:
1724                 return ETDM_SYNC_FROM_OUT3;
1725         default:
1726                 return -EINVAL;
1727         }
1728 }
1729
1730 static int mt8188_etdm_sync_mode_slv(struct mtk_base_afe *afe, int dai_id)
1731 {
1732         struct mt8188_afe_private *afe_priv = afe->platform_priv;
1733         struct mtk_dai_etdm_priv *etdm_data;
1734         unsigned int reg = 0;
1735         unsigned int mask;
1736         unsigned int val;
1737         int cowork_source_sel;
1738
1739         if (!is_valid_etdm_dai(dai_id))
1740                 return -EINVAL;
1741         etdm_data = afe_priv->dai_priv[dai_id];
1742
1743         cowork_source_sel = etdm_cowork_slv_sel(etdm_data->cowork_source_id,
1744                                                 true);
1745         if (cowork_source_sel < 0)
1746                 return cowork_source_sel;
1747
1748         switch (dai_id) {
1749         case MT8188_AFE_IO_ETDM1_IN:
1750                 reg = ETDM_COWORK_CON1;
1751                 mask = ETDM_IN1_SLAVE_SEL_MASK;
1752                 val = FIELD_PREP(ETDM_IN1_SLAVE_SEL_MASK, cowork_source_sel);
1753                 break;
1754         case MT8188_AFE_IO_ETDM2_IN:
1755                 reg = ETDM_COWORK_CON2;
1756                 mask = ETDM_IN2_SLAVE_SEL_MASK;
1757                 val = FIELD_PREP(ETDM_IN2_SLAVE_SEL_MASK, cowork_source_sel);
1758                 break;
1759         case MT8188_AFE_IO_ETDM1_OUT:
1760                 reg = ETDM_COWORK_CON0;
1761                 mask = ETDM_OUT1_SLAVE_SEL_MASK;
1762                 val = FIELD_PREP(ETDM_OUT1_SLAVE_SEL_MASK, cowork_source_sel);
1763                 break;
1764         case MT8188_AFE_IO_ETDM2_OUT:
1765                 reg = ETDM_COWORK_CON2;
1766                 mask = ETDM_OUT2_SLAVE_SEL_MASK;
1767                 val = FIELD_PREP(ETDM_OUT2_SLAVE_SEL_MASK, cowork_source_sel);
1768                 break;
1769         case MT8188_AFE_IO_ETDM3_OUT:
1770                 reg = ETDM_COWORK_CON2;
1771                 mask = ETDM_OUT3_SLAVE_SEL_MASK;
1772                 val = FIELD_PREP(ETDM_OUT3_SLAVE_SEL_MASK, cowork_source_sel);
1773                 break;
1774         default:
1775                 return 0;
1776         }
1777
1778         regmap_update_bits(afe->regmap, reg, mask, val);
1779
1780         return 0;
1781 }
1782
1783 static int mt8188_etdm_sync_mode_mst(struct mtk_base_afe *afe, int dai_id)
1784 {
1785         struct mt8188_afe_private *afe_priv = afe->platform_priv;
1786         struct mtk_dai_etdm_priv *etdm_data;
1787         struct etdm_con_reg etdm_reg;
1788         unsigned int reg = 0;
1789         unsigned int mask;
1790         unsigned int val;
1791         int cowork_source_sel;
1792         int ret;
1793
1794         if (!is_valid_etdm_dai(dai_id))
1795                 return -EINVAL;
1796         etdm_data = afe_priv->dai_priv[dai_id];
1797
1798         cowork_source_sel = etdm_cowork_sync_sel(etdm_data->cowork_source_id);
1799         if (cowork_source_sel < 0)
1800                 return cowork_source_sel;
1801
1802         switch (dai_id) {
1803         case MT8188_AFE_IO_ETDM1_IN:
1804                 reg = ETDM_COWORK_CON1;
1805                 mask = ETDM_IN1_SYNC_SEL_MASK;
1806                 val = FIELD_PREP(ETDM_IN1_SYNC_SEL_MASK, cowork_source_sel);
1807                 break;
1808         case MT8188_AFE_IO_ETDM2_IN:
1809                 reg = ETDM_COWORK_CON2;
1810                 mask = ETDM_IN2_SYNC_SEL_MASK;
1811                 val = FIELD_PREP(ETDM_IN2_SYNC_SEL_MASK, cowork_source_sel);
1812                 break;
1813         case MT8188_AFE_IO_ETDM1_OUT:
1814                 reg = ETDM_COWORK_CON0;
1815                 mask = ETDM_OUT1_SYNC_SEL_MASK;
1816                 val = FIELD_PREP(ETDM_OUT1_SYNC_SEL_MASK, cowork_source_sel);
1817                 break;
1818         case MT8188_AFE_IO_ETDM2_OUT:
1819                 reg = ETDM_COWORK_CON2;
1820                 mask = ETDM_OUT2_SYNC_SEL_MASK;
1821                 val = FIELD_PREP(ETDM_OUT2_SYNC_SEL_MASK, cowork_source_sel);
1822                 break;
1823         case MT8188_AFE_IO_ETDM3_OUT:
1824                 reg = ETDM_COWORK_CON2;
1825                 mask = ETDM_OUT3_SYNC_SEL_MASK;
1826                 val = FIELD_PREP(ETDM_OUT3_SYNC_SEL_MASK, cowork_source_sel);
1827                 break;
1828         default:
1829                 return 0;
1830         }
1831
1832         ret = get_etdm_reg(dai_id, &etdm_reg);
1833         if (ret < 0)
1834                 return ret;
1835
1836         regmap_update_bits(afe->regmap, reg, mask, val);
1837
1838         regmap_set_bits(afe->regmap, etdm_reg.con0, ETDM_CON0_SYNC_MODE);
1839
1840         return 0;
1841 }
1842
1843 static int mt8188_etdm_sync_mode_configure(struct mtk_base_afe *afe, int dai_id)
1844 {
1845         struct mt8188_afe_private *afe_priv = afe->platform_priv;
1846         struct mtk_dai_etdm_priv *etdm_data;
1847
1848         if (!is_valid_etdm_dai(dai_id))
1849                 return -EINVAL;
1850         etdm_data = afe_priv->dai_priv[dai_id];
1851
1852         if (etdm_data->cowork_source_id == COWORK_ETDM_NONE)
1853                 return 0;
1854
1855         if (etdm_data->slave_mode)
1856                 mt8188_etdm_sync_mode_slv(afe, dai_id);
1857         else
1858                 mt8188_etdm_sync_mode_mst(afe, dai_id);
1859
1860         return 0;
1861 }
1862
1863 /* dai ops */
1864 static int mtk_dai_etdm_fifo_mode(struct mtk_base_afe *afe,
1865                                   int dai_id, unsigned int rate)
1866 {
1867         unsigned int mode = 0;
1868         unsigned int reg = 0;
1869         unsigned int val = 0;
1870         unsigned int mask = (ETDM_IN_AFIFO_MODE_MASK | ETDM_IN_USE_AFIFO);
1871
1872         if (rate != 0)
1873                 mode = mt8188_afe_fs_timing(rate);
1874
1875         switch (dai_id) {
1876         case MT8188_AFE_IO_ETDM1_IN:
1877                 reg = ETDM_IN1_AFIFO_CON;
1878                 if (rate == 0)
1879                         mode = MT8188_ETDM_IN1_1X_EN;
1880                 break;
1881         case MT8188_AFE_IO_ETDM2_IN:
1882                 reg = ETDM_IN2_AFIFO_CON;
1883                 if (rate == 0)
1884                         mode = MT8188_ETDM_IN2_1X_EN;
1885                 break;
1886         default:
1887                 return -EINVAL;
1888         }
1889
1890         val = (mode | ETDM_IN_USE_AFIFO);
1891
1892         regmap_update_bits(afe->regmap, reg, mask, val);
1893         return 0;
1894 }
1895
1896 static int mtk_dai_etdm_in_configure(struct mtk_base_afe *afe,
1897                                      unsigned int rate,
1898                                      unsigned int channels,
1899                                      int dai_id)
1900 {
1901         struct mt8188_afe_private *afe_priv = afe->platform_priv;
1902         struct mtk_dai_etdm_priv *etdm_data;
1903         struct etdm_con_reg etdm_reg;
1904         bool slave_mode;
1905         unsigned int data_mode;
1906         unsigned int lrck_width;
1907         unsigned int val = 0;
1908         unsigned int mask = 0;
1909         int ret;
1910         int i;
1911
1912         if (!is_valid_etdm_dai(dai_id))
1913                 return -EINVAL;
1914         etdm_data = afe_priv->dai_priv[dai_id];
1915         slave_mode = etdm_data->slave_mode;
1916         data_mode = etdm_data->data_mode;
1917         lrck_width = etdm_data->lrck_width;
1918
1919         dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
1920                 __func__, rate, channels, dai_id);
1921
1922         ret = get_etdm_reg(dai_id, &etdm_reg);
1923         if (ret < 0)
1924                 return ret;
1925
1926         /* afifo */
1927         if (slave_mode)
1928                 mtk_dai_etdm_fifo_mode(afe, dai_id, 0);
1929         else
1930                 mtk_dai_etdm_fifo_mode(afe, dai_id, rate);
1931
1932         /* con1 */
1933         if (lrck_width > 0) {
1934                 mask |= (ETDM_IN_CON1_LRCK_AUTO_MODE |
1935                         ETDM_IN_CON1_LRCK_WIDTH_MASK);
1936                 val |= FIELD_PREP(ETDM_IN_CON1_LRCK_WIDTH_MASK, lrck_width - 1);
1937         }
1938         regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
1939
1940         mask = 0;
1941         val = 0;
1942
1943         /* con2 */
1944         if (!slave_mode) {
1945                 mask |= ETDM_IN_CON2_UPDATE_GAP_MASK;
1946                 if (rate == 352800 || rate == 384000)
1947                         val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 4);
1948                 else
1949                         val |= FIELD_PREP(ETDM_IN_CON2_UPDATE_GAP_MASK, 3);
1950         }
1951         mask |= (ETDM_IN_CON2_MULTI_IP_2CH_MODE |
1952                 ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK);
1953         if (data_mode == MTK_DAI_ETDM_DATA_MULTI_PIN) {
1954                 val |= ETDM_IN_CON2_MULTI_IP_2CH_MODE |
1955                        FIELD_PREP(ETDM_IN_CON2_MULTI_IP_TOTAL_CH_MASK, channels - 1);
1956         }
1957         regmap_update_bits(afe->regmap, etdm_reg.con2, mask, val);
1958
1959         mask = 0;
1960         val = 0;
1961
1962         /* con3 */
1963         mask |= ETDM_IN_CON3_DISABLE_OUT_MASK;
1964         for (i = 0; i < channels; i += 2) {
1965                 if (etdm_data->in_disable_ch[i] &&
1966                     etdm_data->in_disable_ch[i + 1])
1967                         val |= ETDM_IN_CON3_DISABLE_OUT(i >> 1);
1968         }
1969         if (!slave_mode) {
1970                 mask |= ETDM_IN_CON3_FS_MASK;
1971                 val |= FIELD_PREP(ETDM_IN_CON3_FS_MASK, get_etdm_fs_timing(rate));
1972         }
1973         regmap_update_bits(afe->regmap, etdm_reg.con3, mask, val);
1974
1975         mask = 0;
1976         val = 0;
1977
1978         /* con4 */
1979         mask |= (ETDM_IN_CON4_MASTER_LRCK_INV | ETDM_IN_CON4_MASTER_BCK_INV |
1980                 ETDM_IN_CON4_SLAVE_LRCK_INV | ETDM_IN_CON4_SLAVE_BCK_INV);
1981         if (slave_mode) {
1982                 if (etdm_data->lrck_inv)
1983                         val |= ETDM_IN_CON4_SLAVE_LRCK_INV;
1984                 if (etdm_data->bck_inv)
1985                         val |= ETDM_IN_CON4_SLAVE_BCK_INV;
1986         } else {
1987                 if (etdm_data->lrck_inv)
1988                         val |= ETDM_IN_CON4_MASTER_LRCK_INV;
1989                 if (etdm_data->bck_inv)
1990                         val |= ETDM_IN_CON4_MASTER_BCK_INV;
1991         }
1992         regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
1993
1994         mask = 0;
1995         val = 0;
1996
1997         /* con5 */
1998         mask |= ETDM_IN_CON5_LR_SWAP_MASK;
1999         mask |= ETDM_IN_CON5_ENABLE_ODD_MASK;
2000         for (i = 0; i < channels; i += 2) {
2001                 if (etdm_data->in_disable_ch[i] &&
2002                     !etdm_data->in_disable_ch[i + 1]) {
2003                         val |= ETDM_IN_CON5_LR_SWAP(i >> 1);
2004                         val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
2005                 } else if (!etdm_data->in_disable_ch[i] &&
2006                            etdm_data->in_disable_ch[i + 1]) {
2007                         val |= ETDM_IN_CON5_ENABLE_ODD(i >> 1);
2008                 }
2009         }
2010         regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
2011         return 0;
2012 }
2013
2014 static int mtk_dai_etdm_out_configure(struct mtk_base_afe *afe,
2015                                       unsigned int rate,
2016                                       unsigned int channels,
2017                                       int dai_id)
2018 {
2019         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2020         struct mtk_dai_etdm_priv *etdm_data;
2021         struct etdm_con_reg etdm_reg;
2022         bool slave_mode;
2023         unsigned int lrck_width;
2024         unsigned int val = 0;
2025         unsigned int mask = 0;
2026         int fs = 0;
2027         int ret;
2028
2029         if (!is_valid_etdm_dai(dai_id))
2030                 return -EINVAL;
2031         etdm_data = afe_priv->dai_priv[dai_id];
2032         slave_mode = etdm_data->slave_mode;
2033         lrck_width = etdm_data->lrck_width;
2034
2035         dev_dbg(afe->dev, "%s rate %u channels %u, id %d\n",
2036                 __func__, rate, channels, dai_id);
2037
2038         ret = get_etdm_reg(dai_id, &etdm_reg);
2039         if (ret < 0)
2040                 return ret;
2041
2042         /* con0 */
2043         mask = ETDM_OUT_CON0_RELATCH_DOMAIN_MASK;
2044         val = FIELD_PREP(ETDM_OUT_CON0_RELATCH_DOMAIN_MASK,
2045                          ETDM_RELATCH_TIMING_A1A2SYS);
2046         regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
2047
2048         mask = 0;
2049         val = 0;
2050
2051         /* con1 */
2052         if (lrck_width > 0) {
2053                 mask |= (ETDM_OUT_CON1_LRCK_AUTO_MODE |
2054                         ETDM_OUT_CON1_LRCK_WIDTH_MASK);
2055                 val |= FIELD_PREP(ETDM_OUT_CON1_LRCK_WIDTH_MASK, lrck_width - 1);
2056         }
2057         regmap_update_bits(afe->regmap, etdm_reg.con1, mask, val);
2058
2059         mask = 0;
2060         val = 0;
2061
2062         if (!slave_mode) {
2063                 /* con4 */
2064                 mask |= ETDM_OUT_CON4_FS_MASK;
2065                 val |= FIELD_PREP(ETDM_OUT_CON4_FS_MASK, get_etdm_fs_timing(rate));
2066         }
2067
2068         mask |= ETDM_OUT_CON4_RELATCH_EN_MASK;
2069         if (dai_id == MT8188_AFE_IO_ETDM1_OUT)
2070                 fs = MT8188_ETDM_OUT1_1X_EN;
2071         else if (dai_id == MT8188_AFE_IO_ETDM2_OUT)
2072                 fs = MT8188_ETDM_OUT2_1X_EN;
2073
2074         val |= FIELD_PREP(ETDM_OUT_CON4_RELATCH_EN_MASK, fs);
2075
2076         regmap_update_bits(afe->regmap, etdm_reg.con4, mask, val);
2077
2078         mask = 0;
2079         val = 0;
2080
2081         /* con5 */
2082         mask |= (ETDM_OUT_CON5_MASTER_LRCK_INV | ETDM_OUT_CON5_MASTER_BCK_INV |
2083                 ETDM_OUT_CON5_SLAVE_LRCK_INV | ETDM_OUT_CON5_SLAVE_BCK_INV);
2084         if (slave_mode) {
2085                 if (etdm_data->lrck_inv)
2086                         val |= ETDM_OUT_CON5_SLAVE_LRCK_INV;
2087                 if (etdm_data->bck_inv)
2088                         val |= ETDM_OUT_CON5_SLAVE_BCK_INV;
2089         } else {
2090                 if (etdm_data->lrck_inv)
2091                         val |= ETDM_OUT_CON5_MASTER_LRCK_INV;
2092                 if (etdm_data->bck_inv)
2093                         val |= ETDM_OUT_CON5_MASTER_BCK_INV;
2094         }
2095         regmap_update_bits(afe->regmap, etdm_reg.con5, mask, val);
2096
2097         return 0;
2098 }
2099
2100 static int mtk_dai_etdm_configure(struct mtk_base_afe *afe,
2101                                   unsigned int rate,
2102                                   unsigned int channels,
2103                                   unsigned int bit_width,
2104                                   int dai_id)
2105 {
2106         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2107         struct mtk_dai_etdm_priv *etdm_data;
2108         struct etdm_con_reg etdm_reg;
2109         bool slave_mode;
2110         unsigned int etdm_channels;
2111         unsigned int val = 0;
2112         unsigned int mask = 0;
2113         unsigned int bck;
2114         unsigned int wlen = get_etdm_wlen(bit_width);
2115         int ret;
2116
2117         if (!is_valid_etdm_dai(dai_id))
2118                 return -EINVAL;
2119         etdm_data = afe_priv->dai_priv[dai_id];
2120         slave_mode = etdm_data->slave_mode;
2121         etdm_data->rate = rate;
2122
2123         ret = get_etdm_reg(dai_id, &etdm_reg);
2124         if (ret < 0)
2125                 return ret;
2126
2127         dev_dbg(afe->dev, "%s fmt %u data %u lrck %d-%u bck %d, slv %u\n",
2128                 __func__, etdm_data->format, etdm_data->data_mode,
2129                 etdm_data->lrck_inv, etdm_data->lrck_width, etdm_data->bck_inv,
2130                 etdm_data->slave_mode);
2131         dev_dbg(afe->dev, "%s rate %u channels %u bitwidth %u, id %d\n",
2132                 __func__, rate, channels, bit_width, dai_id);
2133
2134         etdm_channels = (etdm_data->data_mode == MTK_DAI_ETDM_DATA_ONE_PIN) ?
2135                         get_etdm_ch_fixup(channels) : 2;
2136
2137         bck = rate * etdm_channels * wlen;
2138         if (bck > MT8188_ETDM_NORMAL_MAX_BCK_RATE) {
2139                 dev_err(afe->dev, "%s bck rate %u not support\n",
2140                         __func__, bck);
2141                 return -EINVAL;
2142         }
2143
2144         /* con0 */
2145         mask |= ETDM_CON0_BIT_LEN_MASK;
2146         val |= FIELD_PREP(ETDM_CON0_BIT_LEN_MASK, bit_width - 1);
2147         mask |= ETDM_CON0_WORD_LEN_MASK;
2148         val |= FIELD_PREP(ETDM_CON0_WORD_LEN_MASK, wlen - 1);
2149         mask |= ETDM_CON0_FORMAT_MASK;
2150         val |= FIELD_PREP(ETDM_CON0_FORMAT_MASK, etdm_data->format);
2151         mask |= ETDM_CON0_CH_NUM_MASK;
2152         val |= FIELD_PREP(ETDM_CON0_CH_NUM_MASK, etdm_channels - 1);
2153
2154         mask |= ETDM_CON0_SLAVE_MODE;
2155         if (slave_mode) {
2156                 if (dai_id == MT8188_AFE_IO_ETDM1_OUT) {
2157                         dev_err(afe->dev, "%s id %d only support master mode\n",
2158                                 __func__, dai_id);
2159                         return -EINVAL;
2160                 }
2161                 val |= ETDM_CON0_SLAVE_MODE;
2162         }
2163         regmap_update_bits(afe->regmap, etdm_reg.con0, mask, val);
2164
2165         if (get_etdm_dir(dai_id) == ETDM_IN)
2166                 mtk_dai_etdm_in_configure(afe, rate, channels, dai_id);
2167         else
2168                 mtk_dai_etdm_out_configure(afe, rate, channels, dai_id);
2169
2170         return 0;
2171 }
2172
2173 static int mtk_dai_etdm_hw_params(struct snd_pcm_substream *substream,
2174                                   struct snd_pcm_hw_params *params,
2175                                   struct snd_soc_dai *dai)
2176 {
2177         unsigned int rate = params_rate(params);
2178         unsigned int bit_width = params_width(params);
2179         unsigned int channels = params_channels(params);
2180         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2181         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2182         struct mtk_dai_etdm_priv *mst_etdm_data;
2183         int mst_dai_id;
2184         int slv_dai_id;
2185         int ret;
2186         int i;
2187
2188         dev_dbg(afe->dev, "%s '%s' period %u-%u\n",
2189                 __func__, snd_pcm_stream_str(substream),
2190                 params_period_size(params), params_periods(params));
2191
2192         if (is_cowork_mode(dai)) {
2193                 mst_dai_id = get_etdm_cowork_master_id(dai);
2194                 if (!is_valid_etdm_dai(mst_dai_id))
2195                         return -EINVAL;
2196
2197                 mst_etdm_data = afe_priv->dai_priv[mst_dai_id];
2198                 if (mst_etdm_data->slots)
2199                         channels = mst_etdm_data->slots;
2200
2201                 ret = mtk_dai_etdm_configure(afe, rate, channels,
2202                                              bit_width, mst_dai_id);
2203                 if (ret)
2204                         return ret;
2205
2206                 for (i = 0; i < mst_etdm_data->cowork_slv_count; i++) {
2207                         slv_dai_id = mst_etdm_data->cowork_slv_id[i];
2208                         ret = mtk_dai_etdm_configure(afe, rate, channels,
2209                                                      bit_width, slv_dai_id);
2210                         if (ret)
2211                                 return ret;
2212
2213                         ret = mt8188_etdm_sync_mode_configure(afe, slv_dai_id);
2214                         if (ret)
2215                                 return ret;
2216                 }
2217         } else {
2218                 if (!is_valid_etdm_dai(dai->id))
2219                         return -EINVAL;
2220                 mst_etdm_data = afe_priv->dai_priv[dai->id];
2221                 if (mst_etdm_data->slots)
2222                         channels = mst_etdm_data->slots;
2223
2224                 ret = mtk_dai_etdm_configure(afe, rate, channels,
2225                                              bit_width, dai->id);
2226                 if (ret)
2227                         return ret;
2228         }
2229
2230         return 0;
2231 }
2232
2233 static int mtk_dai_etdm_cal_mclk(struct mtk_base_afe *afe, int freq, int dai_id)
2234 {
2235         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2236         struct mtk_dai_etdm_priv *etdm_data;
2237         int apll_rate;
2238         int apll;
2239
2240         if (!is_valid_etdm_dai(dai_id))
2241                 return -EINVAL;
2242         etdm_data = afe_priv->dai_priv[dai_id];
2243
2244         if (freq == 0) {
2245                 etdm_data->mclk_freq = freq;
2246                 return 0;
2247         }
2248
2249         if (etdm_data->mclk_fixed_apll == 0)
2250                 apll = mt8188_afe_get_default_mclk_source_by_rate(freq);
2251         else
2252                 apll = etdm_data->mclk_apll;
2253
2254         apll_rate = mt8188_afe_get_mclk_source_rate(afe, apll);
2255
2256         if (freq > apll_rate) {
2257                 dev_err(afe->dev, "freq %d > apll rate %d\n", freq, apll_rate);
2258                 return -EINVAL;
2259         }
2260
2261         if (apll_rate % freq != 0) {
2262                 dev_err(afe->dev, "APLL%d cannot generate freq Hz\n", apll);
2263                 return -EINVAL;
2264         }
2265
2266         if (etdm_data->mclk_fixed_apll == 0)
2267                 etdm_data->mclk_apll = apll;
2268         etdm_data->mclk_freq = freq;
2269
2270         return 0;
2271 }
2272
2273 static int mtk_dai_etdm_set_sysclk(struct snd_soc_dai *dai,
2274                                    int clk_id, unsigned int freq, int dir)
2275 {
2276         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2277         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2278         struct mtk_dai_etdm_priv *etdm_data;
2279         int dai_id;
2280
2281         dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
2282                 __func__, dai->id, freq, dir);
2283         if (is_cowork_mode(dai))
2284                 dai_id = get_etdm_cowork_master_id(dai);
2285         else
2286                 dai_id = dai->id;
2287
2288         if (!is_valid_etdm_dai(dai_id))
2289                 return -EINVAL;
2290         etdm_data = afe_priv->dai_priv[dai_id];
2291         etdm_data->mclk_dir = dir;
2292         return mtk_dai_etdm_cal_mclk(afe, freq, dai_id);
2293 }
2294
2295 static int mtk_dai_etdm_set_tdm_slot(struct snd_soc_dai *dai,
2296                                      unsigned int tx_mask, unsigned int rx_mask,
2297                                      int slots, int slot_width)
2298 {
2299         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2300         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2301         struct mtk_dai_etdm_priv *etdm_data;
2302         int dai_id;
2303
2304         if (is_cowork_mode(dai))
2305                 dai_id = get_etdm_cowork_master_id(dai);
2306         else
2307                 dai_id = dai->id;
2308
2309         if (!is_valid_etdm_dai(dai_id))
2310                 return -EINVAL;
2311         etdm_data = afe_priv->dai_priv[dai_id];
2312
2313         dev_dbg(dai->dev, "%s id %d slot_width %d\n",
2314                 __func__, dai->id, slot_width);
2315
2316         etdm_data->slots = slots;
2317         etdm_data->lrck_width = slot_width;
2318         return 0;
2319 }
2320
2321 static int mtk_dai_etdm_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2322 {
2323         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2324         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2325         struct mtk_dai_etdm_priv *etdm_data;
2326
2327         if (!is_valid_etdm_dai(dai->id))
2328                 return -EINVAL;
2329         etdm_data = afe_priv->dai_priv[dai->id];
2330
2331         switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
2332         case SND_SOC_DAIFMT_I2S:
2333                 etdm_data->format = MTK_DAI_ETDM_FORMAT_I2S;
2334                 break;
2335         case SND_SOC_DAIFMT_LEFT_J:
2336                 etdm_data->format = MTK_DAI_ETDM_FORMAT_LJ;
2337                 break;
2338         case SND_SOC_DAIFMT_RIGHT_J:
2339                 etdm_data->format = MTK_DAI_ETDM_FORMAT_RJ;
2340                 break;
2341         case SND_SOC_DAIFMT_DSP_A:
2342                 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPA;
2343                 break;
2344         case SND_SOC_DAIFMT_DSP_B:
2345                 etdm_data->format = MTK_DAI_ETDM_FORMAT_DSPB;
2346                 break;
2347         default:
2348                 return -EINVAL;
2349         }
2350
2351         switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
2352         case SND_SOC_DAIFMT_NB_NF:
2353                 etdm_data->bck_inv = false;
2354                 etdm_data->lrck_inv = false;
2355                 break;
2356         case SND_SOC_DAIFMT_NB_IF:
2357                 etdm_data->bck_inv = false;
2358                 etdm_data->lrck_inv = true;
2359                 break;
2360         case SND_SOC_DAIFMT_IB_NF:
2361                 etdm_data->bck_inv = true;
2362                 etdm_data->lrck_inv = false;
2363                 break;
2364         case SND_SOC_DAIFMT_IB_IF:
2365                 etdm_data->bck_inv = true;
2366                 etdm_data->lrck_inv = true;
2367                 break;
2368         default:
2369                 return -EINVAL;
2370         }
2371
2372         switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
2373         case SND_SOC_DAIFMT_BC_FC:
2374                 etdm_data->slave_mode = true;
2375                 break;
2376         case SND_SOC_DAIFMT_BP_FP:
2377                 etdm_data->slave_mode = false;
2378                 break;
2379         default:
2380                 return -EINVAL;
2381         }
2382
2383         return 0;
2384 }
2385
2386 static unsigned int mtk_dai_get_dptx_ch_en(unsigned int channel)
2387 {
2388         switch (channel) {
2389         case 1 ... 2:
2390                 return AFE_DPTX_CON_CH_EN_2CH;
2391         case 3 ... 4:
2392                 return AFE_DPTX_CON_CH_EN_4CH;
2393         case 5 ... 6:
2394                 return AFE_DPTX_CON_CH_EN_6CH;
2395         case 7 ... 8:
2396                 return AFE_DPTX_CON_CH_EN_8CH;
2397         default:
2398                 return AFE_DPTX_CON_CH_EN_2CH;
2399         }
2400 }
2401
2402 static unsigned int mtk_dai_get_dptx_ch(unsigned int ch)
2403 {
2404         return (ch > 2) ?
2405                 AFE_DPTX_CON_CH_NUM_8CH : AFE_DPTX_CON_CH_NUM_2CH;
2406 }
2407
2408 static unsigned int mtk_dai_get_dptx_wlen(snd_pcm_format_t format)
2409 {
2410         return snd_pcm_format_physical_width(format) <= 16 ?
2411                 AFE_DPTX_CON_16BIT : AFE_DPTX_CON_24BIT;
2412 }
2413
2414 static int mtk_dai_hdmitx_dptx_hw_params(struct snd_pcm_substream *substream,
2415                                          struct snd_pcm_hw_params *params,
2416                                          struct snd_soc_dai *dai)
2417 {
2418         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2419         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2420         struct mtk_dai_etdm_priv *etdm_data;
2421         unsigned int rate = params_rate(params);
2422         unsigned int channels = params_channels(params);
2423         snd_pcm_format_t format = params_format(params);
2424         int width = snd_pcm_format_physical_width(format);
2425         int ret;
2426
2427         if (!is_valid_etdm_dai(dai->id))
2428                 return -EINVAL;
2429         etdm_data = afe_priv->dai_priv[dai->id];
2430
2431         /* dptx configure */
2432         if (dai->id == MT8188_AFE_IO_DPTX) {
2433                 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2434                                    AFE_DPTX_CON_CH_EN_MASK,
2435                                    mtk_dai_get_dptx_ch_en(channels));
2436                 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2437                                    AFE_DPTX_CON_CH_NUM_MASK,
2438                                    mtk_dai_get_dptx_ch(channels));
2439                 regmap_update_bits(afe->regmap, AFE_DPTX_CON,
2440                                    AFE_DPTX_CON_16BIT_MASK,
2441                                    mtk_dai_get_dptx_wlen(format));
2442
2443                 if (mtk_dai_get_dptx_ch(channels) == AFE_DPTX_CON_CH_NUM_8CH) {
2444                         etdm_data->data_mode = MTK_DAI_ETDM_DATA_ONE_PIN;
2445                         channels = 8;
2446                 } else {
2447                         channels = 2;
2448                 }
2449         } else {
2450                 etdm_data->data_mode = MTK_DAI_ETDM_DATA_MULTI_PIN;
2451         }
2452
2453         ret = mtk_dai_etdm_configure(afe, rate, channels, width, dai->id);
2454
2455         return ret;
2456 }
2457
2458 static int mtk_dai_hdmitx_dptx_set_sysclk(struct snd_soc_dai *dai,
2459                                           int clk_id,
2460                                           unsigned int freq,
2461                                           int dir)
2462 {
2463         struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
2464         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2465         struct mtk_dai_etdm_priv *etdm_data;
2466
2467         if (!is_valid_etdm_dai(dai->id))
2468                 return -EINVAL;
2469         etdm_data = afe_priv->dai_priv[dai->id];
2470
2471         dev_dbg(dai->dev, "%s id %d freq %u, dir %d\n",
2472                 __func__, dai->id, freq, dir);
2473
2474         etdm_data->mclk_dir = dir;
2475         return mtk_dai_etdm_cal_mclk(afe, freq, dai->id);
2476 }
2477
2478 static const struct snd_soc_dai_ops mtk_dai_etdm_ops = {
2479         .hw_params = mtk_dai_etdm_hw_params,
2480         .set_sysclk = mtk_dai_etdm_set_sysclk,
2481         .set_fmt = mtk_dai_etdm_set_fmt,
2482         .set_tdm_slot = mtk_dai_etdm_set_tdm_slot,
2483 };
2484
2485 static const struct snd_soc_dai_ops mtk_dai_hdmitx_dptx_ops = {
2486         .hw_params      = mtk_dai_hdmitx_dptx_hw_params,
2487         .set_sysclk     = mtk_dai_hdmitx_dptx_set_sysclk,
2488         .set_fmt        = mtk_dai_etdm_set_fmt,
2489 };
2490
2491 /* dai driver */
2492 #define MTK_ETDM_RATES (SNDRV_PCM_RATE_8000_192000)
2493
2494 #define MTK_ETDM_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
2495                           SNDRV_PCM_FMTBIT_S24_LE |\
2496                           SNDRV_PCM_FMTBIT_S32_LE)
2497
2498 static struct snd_soc_dai_driver mtk_dai_etdm_driver[] = {
2499         {
2500                 .name = "DPTX",
2501                 .id = MT8188_AFE_IO_DPTX,
2502                 .playback = {
2503                         .stream_name = "DPTX",
2504                         .channels_min = 1,
2505                         .channels_max = 8,
2506                         .rates = MTK_ETDM_RATES,
2507                         .formats = MTK_ETDM_FORMATS,
2508                 },
2509                 .ops = &mtk_dai_hdmitx_dptx_ops,
2510         },
2511         {
2512                 .name = "ETDM1_IN",
2513                 .id = MT8188_AFE_IO_ETDM1_IN,
2514                 .capture = {
2515                         .stream_name = "ETDM1_IN",
2516                         .channels_min = 1,
2517                         .channels_max = 16,
2518                         .rates = MTK_ETDM_RATES,
2519                         .formats = MTK_ETDM_FORMATS,
2520                 },
2521                 .ops = &mtk_dai_etdm_ops,
2522         },
2523         {
2524                 .name = "ETDM2_IN",
2525                 .id = MT8188_AFE_IO_ETDM2_IN,
2526                 .capture = {
2527                         .stream_name = "ETDM2_IN",
2528                         .channels_min = 1,
2529                         .channels_max = 16,
2530                         .rates = MTK_ETDM_RATES,
2531                         .formats = MTK_ETDM_FORMATS,
2532                 },
2533                 .ops = &mtk_dai_etdm_ops,
2534         },
2535         {
2536                 .name = "ETDM1_OUT",
2537                 .id = MT8188_AFE_IO_ETDM1_OUT,
2538                 .playback = {
2539                         .stream_name = "ETDM1_OUT",
2540                         .channels_min = 1,
2541                         .channels_max = 16,
2542                         .rates = MTK_ETDM_RATES,
2543                         .formats = MTK_ETDM_FORMATS,
2544                 },
2545                 .ops = &mtk_dai_etdm_ops,
2546         },
2547         {
2548                 .name = "ETDM2_OUT",
2549                 .id = MT8188_AFE_IO_ETDM2_OUT,
2550                 .playback = {
2551                         .stream_name = "ETDM2_OUT",
2552                         .channels_min = 1,
2553                         .channels_max = 16,
2554                         .rates = MTK_ETDM_RATES,
2555                         .formats = MTK_ETDM_FORMATS,
2556                 },
2557                 .ops = &mtk_dai_etdm_ops,
2558         },
2559         {
2560                 .name = "ETDM3_OUT",
2561                 .id = MT8188_AFE_IO_ETDM3_OUT,
2562                 .playback = {
2563                         .stream_name = "ETDM3_OUT",
2564                         .channels_min = 1,
2565                         .channels_max = 8,
2566                         .rates = MTK_ETDM_RATES,
2567                         .formats = MTK_ETDM_FORMATS,
2568                 },
2569                 .ops = &mtk_dai_hdmitx_dptx_ops,
2570         },
2571 };
2572
2573 static void mt8188_etdm_update_sync_info(struct mtk_base_afe *afe)
2574 {
2575         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2576         struct mtk_dai_etdm_priv *etdm_data;
2577         struct mtk_dai_etdm_priv *mst_data;
2578         int mst_dai_id;
2579         int i;
2580
2581         for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {
2582                 etdm_data = afe_priv->dai_priv[i];
2583                 if (etdm_data->cowork_source_id != COWORK_ETDM_NONE) {
2584                         mst_dai_id = etdm_data->cowork_source_id;
2585                         mst_data = afe_priv->dai_priv[mst_dai_id];
2586                         if (mst_data->cowork_source_id != COWORK_ETDM_NONE)
2587                                 dev_err(afe->dev, "%s [%d] wrong sync source\n",
2588                                         __func__, i);
2589                         mst_data->cowork_slv_id[mst_data->cowork_slv_count] = i;
2590                         mst_data->cowork_slv_count++;
2591                 }
2592         }
2593 }
2594
2595 static void mt8188_dai_etdm_parse_of(struct mtk_base_afe *afe)
2596 {
2597         const struct device_node *of_node = afe->dev->of_node;
2598         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2599         struct mtk_dai_etdm_priv *etdm_data;
2600         char prop[48];
2601         u8 disable_chn[MT8188_ETDM_MAX_CHANNELS];
2602         int max_chn = MT8188_ETDM_MAX_CHANNELS;
2603         unsigned int sync_id;
2604         u32 sel;
2605         int ret;
2606         int dai_id;
2607         int i, j;
2608         struct {
2609                 const char *name;
2610                 const unsigned int sync_id;
2611         } of_afe_etdms[MT8188_AFE_IO_ETDM_NUM] = {
2612                 {"etdm-in1", ETDM_SYNC_FROM_IN1},
2613                 {"etdm-in2", ETDM_SYNC_FROM_IN2},
2614                 {"etdm-out1", ETDM_SYNC_FROM_OUT1},
2615                 {"etdm-out2", ETDM_SYNC_FROM_OUT2},
2616                 {"etdm-out3", ETDM_SYNC_FROM_OUT3},
2617         };
2618
2619         for (i = 0; i < MT8188_AFE_IO_ETDM_NUM; i++) {
2620                 dai_id = ETDM_TO_DAI_ID(i);
2621                 etdm_data = afe_priv->dai_priv[dai_id];
2622
2623                 snprintf(prop, sizeof(prop), "mediatek,%s-multi-pin-mode",
2624                          of_afe_etdms[i].name);
2625
2626                 etdm_data->data_mode = of_property_read_bool(of_node, prop);
2627
2628                 snprintf(prop, sizeof(prop), "mediatek,%s-cowork-source",
2629                          of_afe_etdms[i].name);
2630
2631                 ret = of_property_read_u32(of_node, prop, &sel);
2632                 if (ret == 0) {
2633                         if (sel >= MT8188_AFE_IO_ETDM_NUM) {
2634                                 dev_err(afe->dev, "%s invalid id=%d\n",
2635                                         __func__, sel);
2636                                 etdm_data->cowork_source_id = COWORK_ETDM_NONE;
2637                         } else {
2638                                 sync_id = of_afe_etdms[sel].sync_id;
2639                                 etdm_data->cowork_source_id =
2640                                         sync_to_dai_id(sync_id);
2641                         }
2642                 } else {
2643                         etdm_data->cowork_source_id = COWORK_ETDM_NONE;
2644                 }
2645         }
2646
2647         /* etdm in only */
2648         for (i = 0; i < 2; i++) {
2649                 dai_id = ETDM_TO_DAI_ID(i);
2650                 etdm_data = afe_priv->dai_priv[dai_id];
2651
2652                 snprintf(prop, sizeof(prop), "mediatek,%s-chn-disabled",
2653                          of_afe_etdms[i].name);
2654
2655                 ret = of_property_read_variable_u8_array(of_node, prop,
2656                                                          disable_chn,
2657                                                          1, max_chn);
2658                 if (ret < 0)
2659                         continue;
2660
2661                 for (j = 0; j < ret; j++) {
2662                         if (disable_chn[j] >= MT8188_ETDM_MAX_CHANNELS)
2663                                 dev_err(afe->dev, "%s [%d] invalid chn %u\n",
2664                                         __func__, j, disable_chn[j]);
2665                         else
2666                                 etdm_data->in_disable_ch[disable_chn[j]] = true;
2667                 }
2668         }
2669         mt8188_etdm_update_sync_info(afe);
2670 }
2671
2672 static int init_etdm_priv_data(struct mtk_base_afe *afe)
2673 {
2674         struct mt8188_afe_private *afe_priv = afe->platform_priv;
2675         struct mtk_dai_etdm_priv *etdm_priv;
2676         int i;
2677
2678         for (i = MT8188_AFE_IO_ETDM_START; i < MT8188_AFE_IO_ETDM_END; i++) {
2679                 etdm_priv = devm_kzalloc(afe->dev,
2680                                          sizeof(struct mtk_dai_etdm_priv),
2681                                          GFP_KERNEL);
2682                 if (!etdm_priv)
2683                         return -ENOMEM;
2684
2685                 afe_priv->dai_priv[i] = etdm_priv;
2686         }
2687
2688         afe_priv->dai_priv[MT8188_AFE_IO_DPTX] =
2689                 afe_priv->dai_priv[MT8188_AFE_IO_ETDM3_OUT];
2690
2691         mt8188_dai_etdm_parse_of(afe);
2692         return 0;
2693 }
2694
2695 int mt8188_dai_etdm_register(struct mtk_base_afe *afe)
2696 {
2697         struct mtk_base_afe_dai *dai;
2698
2699         dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
2700         if (!dai)
2701                 return -ENOMEM;
2702
2703         list_add(&dai->list, &afe->sub_dais);
2704
2705         dai->dai_drivers = mtk_dai_etdm_driver;
2706         dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_etdm_driver);
2707
2708         dai->dapm_widgets = mtk_dai_etdm_widgets;
2709         dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_etdm_widgets);
2710         dai->dapm_routes = mtk_dai_etdm_routes;
2711         dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_etdm_routes);
2712         dai->controls = mtk_dai_etdm_controls;
2713         dai->num_controls = ARRAY_SIZE(mtk_dai_etdm_controls);
2714
2715         return init_etdm_priv_data(afe);
2716 }