arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / sound / soc / mediatek / mt8188 / mt8188-mt6359.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * mt8188-mt6359.c  --  MT8188-MT6359 ALSA SoC machine driver
4  *
5  * Copyright (c) 2022 MediaTek Inc.
6  * Author: Trevor Wu <trevor.wu@mediatek.com>
7  */
8
9 #include <linux/bitfield.h>
10 #include <linux/input.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/pm_runtime.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/soc.h>
17 #include "mt8188-afe-common.h"
18 #include "../../codecs/nau8825.h"
19 #include "../../codecs/mt6359.h"
20 #include "../../codecs/rt5682.h"
21 #include "../common/mtk-afe-platform-driver.h"
22 #include "../common/mtk-soundcard-driver.h"
23 #include "../common/mtk-dsp-sof-common.h"
24 #include "../common/mtk-soc-card.h"
25
26 #define CKSYS_AUD_TOP_CFG       0x032c
27  #define RG_TEST_ON             BIT(0)
28  #define RG_TEST_TYPE           BIT(2)
29 #define CKSYS_AUD_TOP_MON       0x0330
30  #define TEST_MISO_COUNT_1      GENMASK(3, 0)
31  #define TEST_MISO_COUNT_2      GENMASK(7, 4)
32  #define TEST_MISO_DONE_1       BIT(28)
33  #define TEST_MISO_DONE_2       BIT(29)
34
35 #define NAU8825_HS_PRESENT      BIT(0)
36 #define RT5682S_HS_PRESENT      BIT(1)
37 /*
38  * Maxim MAX98390
39  */
40 #define MAX98390_CODEC_DAI     "max98390-aif1"
41 #define MAX98390_DEV0_NAME     "max98390.0-0038" /* rear right */
42 #define MAX98390_DEV1_NAME     "max98390.0-0039" /* rear left */
43 #define MAX98390_DEV2_NAME     "max98390.0-003a" /* front right */
44 #define MAX98390_DEV3_NAME     "max98390.0-003b" /* front left */
45
46 /*
47  * Nau88l25
48  */
49 #define NAU8825_CODEC_DAI  "nau8825-hifi"
50
51 #define SOF_DMA_DL2 "SOF_DMA_DL2"
52 #define SOF_DMA_DL3 "SOF_DMA_DL3"
53 #define SOF_DMA_UL4 "SOF_DMA_UL4"
54 #define SOF_DMA_UL5 "SOF_DMA_UL5"
55
56 #define RT5682S_CODEC_DAI     "rt5682s-aif1"
57
58 /* FE */
59 SND_SOC_DAILINK_DEFS(playback2,
60                      DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
61                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
62                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
63
64 SND_SOC_DAILINK_DEFS(playback3,
65                      DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
66                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
67                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
68
69 SND_SOC_DAILINK_DEFS(playback6,
70                      DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
71                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
72                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
73
74 SND_SOC_DAILINK_DEFS(playback7,
75                      DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
76                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
77                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
78
79 SND_SOC_DAILINK_DEFS(playback8,
80                      DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
81                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
82                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
83
84 SND_SOC_DAILINK_DEFS(playback10,
85                      DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
86                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
87                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
88
89 SND_SOC_DAILINK_DEFS(playback11,
90                      DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
91                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
92                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
93
94 SND_SOC_DAILINK_DEFS(capture1,
95                      DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
96                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
97                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
98
99 SND_SOC_DAILINK_DEFS(capture2,
100                      DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
101                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
102                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
103
104 SND_SOC_DAILINK_DEFS(capture3,
105                      DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
106                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
107                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
108
109 SND_SOC_DAILINK_DEFS(capture4,
110                      DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
111                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
112                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
113
114 SND_SOC_DAILINK_DEFS(capture5,
115                      DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
116                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
117                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
118
119 SND_SOC_DAILINK_DEFS(capture6,
120                      DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
121                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
122                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
123
124 SND_SOC_DAILINK_DEFS(capture8,
125                      DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
126                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
127                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
128
129 SND_SOC_DAILINK_DEFS(capture9,
130                      DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
131                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
132                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
133
134 SND_SOC_DAILINK_DEFS(capture10,
135                      DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
136                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
137                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
138
139 /* BE */
140 SND_SOC_DAILINK_DEFS(dl_src,
141                      DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
142                      DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
143                                                    "mt6359-snd-codec-aif1")),
144                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
145
146 SND_SOC_DAILINK_DEFS(dptx,
147                      DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
148                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
149                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
150
151 SND_SOC_DAILINK_DEFS(etdm1_in,
152                      DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
153                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
154                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
155
156 SND_SOC_DAILINK_DEFS(etdm2_in,
157                      DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
158                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
159                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
160
161 SND_SOC_DAILINK_DEFS(etdm1_out,
162                      DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
163                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
164                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
165
166 SND_SOC_DAILINK_DEFS(etdm2_out,
167                      DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
168                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
169                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
170
171 SND_SOC_DAILINK_DEFS(etdm3_out,
172                      DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
173                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
174                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
175
176 SND_SOC_DAILINK_DEFS(pcm1,
177                      DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
178                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
179                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
180
181 SND_SOC_DAILINK_DEFS(ul_src,
182                      DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
183                      DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
184                                                    "mt6359-snd-codec-aif1"),
185                                         COMP_CODEC("dmic-codec",
186                                                    "dmic-hifi")),
187                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
188
189 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
190                      DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
191                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
192                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
193
194 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
195                      DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
196                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
197                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
198
199 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
200                      DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
201                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
202                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
203
204 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
205                      DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
206                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
207                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
208
209 static const struct sof_conn_stream g_sof_conn_streams[] = {
210         {
211                 .sof_link = "AFE_SOF_DL2",
212                 .sof_dma = SOF_DMA_DL2,
213                 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
214         },
215         {
216                 .sof_link = "AFE_SOF_DL3",
217                 .sof_dma = SOF_DMA_DL3,
218                 .stream_dir = SNDRV_PCM_STREAM_PLAYBACK
219         },
220         {
221                 .sof_link = "AFE_SOF_UL4",
222                 .sof_dma = SOF_DMA_UL4,
223                 .stream_dir = SNDRV_PCM_STREAM_CAPTURE
224         },
225         {
226                 .sof_link = "AFE_SOF_UL5",
227                 .sof_dma = SOF_DMA_UL5,
228                 .stream_dir = SNDRV_PCM_STREAM_CAPTURE
229         },
230 };
231
232 struct mt8188_mt6359_priv {
233         struct snd_soc_jack dp_jack;
234         struct snd_soc_jack hdmi_jack;
235         struct snd_soc_jack headset_jack;
236         void *private_data;
237 };
238
239 static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
240         {
241                 .pin = "HDMI",
242                 .mask = SND_JACK_LINEOUT,
243         },
244 };
245
246 static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
247         {
248                 .pin = "DP",
249                 .mask = SND_JACK_LINEOUT,
250         },
251 };
252
253 static struct snd_soc_jack_pin nau8825_jack_pins[] = {
254         {
255                 .pin    = "Headphone Jack",
256                 .mask   = SND_JACK_HEADPHONE,
257         },
258         {
259                 .pin    = "Headset Mic",
260                 .mask   = SND_JACK_MICROPHONE,
261         },
262 };
263
264 struct mt8188_card_data {
265         const char *name;
266         unsigned long quirk;
267 };
268
269 static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
270         SOC_DAPM_PIN_SWITCH("Ext Spk"),
271 };
272
273 static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
274         SND_SOC_DAPM_SPK("Ext Spk", NULL),
275 };
276
277 static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
278         SOC_DAPM_PIN_SWITCH("Left Spk"),
279         SOC_DAPM_PIN_SWITCH("Right Spk"),
280 };
281
282 static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
283         SND_SOC_DAPM_SPK("Left Spk", NULL),
284         SND_SOC_DAPM_SPK("Right Spk", NULL),
285 };
286
287 static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
288         SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
289         SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
290 };
291
292 static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
293         SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
294         SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
295 };
296
297 static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
298         SND_SOC_DAPM_HP("Headphone", NULL),
299         SND_SOC_DAPM_MIC("Headset Mic", NULL),
300         SND_SOC_DAPM_SINK("HDMI"),
301         SND_SOC_DAPM_SINK("DP"),
302         SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
303         SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
304         SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
305         SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
306
307         /* dynamic pinctrl */
308         SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
309         SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
310         SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
311 };
312
313 static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
314         SOC_DAPM_PIN_SWITCH("Headphone"),
315         SOC_DAPM_PIN_SWITCH("Headset Mic"),
316 };
317
318 static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
319         SND_SOC_DAPM_HP("Headphone Jack", NULL),
320 };
321
322 static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
323         SOC_DAPM_PIN_SWITCH("Headphone Jack"),
324 };
325
326 static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
327         /* SOF Uplink */
328         {SOF_DMA_UL4, NULL, "O034"},
329         {SOF_DMA_UL4, NULL, "O035"},
330         {SOF_DMA_UL5, NULL, "O036"},
331         {SOF_DMA_UL5, NULL, "O037"},
332         /* SOF Downlink */
333         {"I070", NULL, SOF_DMA_DL2},
334         {"I071", NULL, SOF_DMA_DL2},
335         {"I020", NULL, SOF_DMA_DL3},
336         {"I021", NULL, SOF_DMA_DL3},
337 };
338
339 static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
340 {
341         struct snd_soc_component *cmpnt_afe =
342                 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
343         struct snd_soc_component *cmpnt_codec =
344                 snd_soc_rtd_to_codec(rtd, 0)->component;
345         struct snd_soc_dapm_widget *pin_w = NULL, *w;
346         struct mtk_base_afe *afe;
347         struct mt8188_afe_private *afe_priv;
348         struct mtkaif_param *param;
349         int chosen_phase_1, chosen_phase_2;
350         int prev_cycle_1, prev_cycle_2;
351         u8 test_done_1, test_done_2;
352         int cycle_1, cycle_2;
353         int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
354         int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
355         int mtkaif_calibration_num_phase;
356         bool mtkaif_calibration_ok;
357         u32 monitor = 0;
358         int counter;
359         int phase;
360         int i;
361
362         if (!cmpnt_afe)
363                 return -EINVAL;
364
365         afe = snd_soc_component_get_drvdata(cmpnt_afe);
366         afe_priv = afe->platform_priv;
367         param = &afe_priv->mtkaif_params;
368
369         dev_dbg(afe->dev, "%s(), start\n", __func__);
370
371         param->mtkaif_calibration_ok = false;
372         for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
373                 param->mtkaif_chosen_phase[i] = -1;
374                 param->mtkaif_phase_cycle[i] = 0;
375                 mtkaif_chosen_phase[i] = -1;
376                 mtkaif_phase_cycle[i] = 0;
377         }
378
379         if (IS_ERR(afe_priv->topckgen)) {
380                 dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
381                          __func__);
382                 return 0;
383         }
384
385         for_each_card_widgets(rtd->card, w) {
386                 if (!strcmp(w->name, "MTKAIF_PIN")) {
387                         pin_w = w;
388                         break;
389                 }
390         }
391
392         if (pin_w)
393                 dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
394         else
395                 dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
396
397         pm_runtime_get_sync(afe->dev);
398         mt6359_mtkaif_calibration_enable(cmpnt_codec);
399
400         /* set test type to synchronizer pulse */
401         regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
402         mtkaif_calibration_num_phase = 42;      /* mt6359: 0 ~ 42 */
403         mtkaif_calibration_ok = true;
404
405         for (phase = 0;
406              phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
407              phase++) {
408                 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
409                                                     phase, phase, phase);
410
411                 regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
412
413                 test_done_1 = 0;
414                 test_done_2 = 0;
415
416                 cycle_1 = -1;
417                 cycle_2 = -1;
418
419                 counter = 0;
420                 while (!(test_done_1 & test_done_2)) {
421                         regmap_read(afe_priv->topckgen,
422                                     CKSYS_AUD_TOP_MON, &monitor);
423                         test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
424                         test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
425
426                         if (test_done_1 == 1)
427                                 cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
428
429                         if (test_done_2 == 1)
430                                 cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
431
432                         /* handle if never test done */
433                         if (++counter > 10000) {
434                                 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
435                                         __func__, cycle_1, cycle_2, monitor);
436                                 mtkaif_calibration_ok = false;
437                                 break;
438                         }
439                 }
440
441                 if (phase == 0) {
442                         prev_cycle_1 = cycle_1;
443                         prev_cycle_2 = cycle_2;
444                 }
445
446                 if (cycle_1 != prev_cycle_1 &&
447                     mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
448                         mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
449                         mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
450                 }
451
452                 if (cycle_2 != prev_cycle_2 &&
453                     mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
454                         mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
455                         mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
456                 }
457
458                 regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
459
460                 if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
461                     mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
462                         break;
463         }
464
465         if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
466                 mtkaif_calibration_ok = false;
467                 chosen_phase_1 = 0;
468         } else {
469                 chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
470         }
471
472         if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
473                 mtkaif_calibration_ok = false;
474                 chosen_phase_2 = 0;
475         } else {
476                 chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
477         }
478
479         mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
480                                             chosen_phase_1,
481                                             chosen_phase_2,
482                                             0);
483
484         mt6359_mtkaif_calibration_disable(cmpnt_codec);
485         pm_runtime_put(afe->dev);
486
487         param->mtkaif_calibration_ok = mtkaif_calibration_ok;
488         param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
489         param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
490
491         for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
492                 param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
493
494         if (pin_w)
495                 dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
496
497         dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
498                 __func__, param->mtkaif_calibration_ok);
499
500         return 0;
501 }
502
503 static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
504 {
505         struct snd_soc_component *cmpnt_codec =
506                 snd_soc_rtd_to_codec(rtd, 0)->component;
507
508         /* set mtkaif protocol */
509         mt6359_set_mtkaif_protocol(cmpnt_codec,
510                                    MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
511
512         /* mtkaif calibration */
513         mt8188_mt6359_mtkaif_calibration(rtd);
514
515         return 0;
516 }
517
518 enum {
519         DAI_LINK_DL2_FE,
520         DAI_LINK_DL3_FE,
521         DAI_LINK_DL6_FE,
522         DAI_LINK_DL7_FE,
523         DAI_LINK_DL8_FE,
524         DAI_LINK_DL10_FE,
525         DAI_LINK_DL11_FE,
526         DAI_LINK_UL1_FE,
527         DAI_LINK_UL2_FE,
528         DAI_LINK_UL3_FE,
529         DAI_LINK_UL4_FE,
530         DAI_LINK_UL5_FE,
531         DAI_LINK_UL6_FE,
532         DAI_LINK_UL8_FE,
533         DAI_LINK_UL9_FE,
534         DAI_LINK_UL10_FE,
535         DAI_LINK_DL_SRC_BE,
536         DAI_LINK_DPTX_BE,
537         DAI_LINK_ETDM1_IN_BE,
538         DAI_LINK_ETDM2_IN_BE,
539         DAI_LINK_ETDM1_OUT_BE,
540         DAI_LINK_ETDM2_OUT_BE,
541         DAI_LINK_ETDM3_OUT_BE,
542         DAI_LINK_PCM1_BE,
543         DAI_LINK_UL_SRC_BE,
544         DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
545         DAI_LINK_SOF_START,
546         DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
547         DAI_LINK_SOF_DL3_BE,
548         DAI_LINK_SOF_UL4_BE,
549         DAI_LINK_SOF_UL5_BE,
550         DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
551 };
552
553 #define DAI_LINK_REGULAR_NUM    (DAI_LINK_REGULAR_LAST + 1)
554
555 static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
556                                  struct snd_pcm_hw_params *params)
557 {
558         struct snd_soc_pcm_runtime *rtd = substream->private_data;
559         unsigned int rate = params_rate(params);
560         unsigned int mclk_fs_ratio = 256;
561         unsigned int mclk_fs = rate * mclk_fs_ratio;
562         struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
563
564         return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
565 }
566
567 static const struct snd_soc_ops mt8188_dptx_ops = {
568         .hw_params = mt8188_dptx_hw_params,
569 };
570
571 static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
572                                        struct snd_pcm_hw_params *params)
573 {
574         /* fix BE i2s format to 32bit, clean param mask first */
575         snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
576                              0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
577
578         params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
579
580         return 0;
581 }
582
583 static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
584 {
585         struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
586         struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
587         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
588         int ret = 0;
589
590         ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
591                                          SND_JACK_LINEOUT, &priv->hdmi_jack,
592                                          mt8188_hdmi_jack_pins,
593                                          ARRAY_SIZE(mt8188_hdmi_jack_pins));
594         if (ret) {
595                 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
596                 return ret;
597         }
598
599         ret = snd_soc_component_set_jack(component, &priv->hdmi_jack, NULL);
600         if (ret) {
601                 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
602                         __func__, component->name, ret);
603                 return ret;
604         }
605
606         return 0;
607 }
608
609 static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
610 {
611         struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
612         struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
613         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
614         int ret = 0;
615
616         ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT,
617                                          &priv->dp_jack, mt8188_dp_jack_pins,
618                                          ARRAY_SIZE(mt8188_dp_jack_pins));
619         if (ret) {
620                 dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
621                 return ret;
622         }
623
624         ret = snd_soc_component_set_jack(component, &priv->dp_jack, NULL);
625         if (ret) {
626                 dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
627                         __func__, component->name, ret);
628                 return ret;
629         }
630
631         return 0;
632 }
633
634 static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
635 {
636         struct snd_soc_card *card = rtd->card;
637         int ret = 0;
638
639         ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets,
640                                         ARRAY_SIZE(mt8188_dumb_spk_widgets));
641         if (ret) {
642                 dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
643                 return ret;
644         }
645
646         ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
647                                         ARRAY_SIZE(mt8188_dumb_spk_controls));
648         if (ret) {
649                 dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
650                 return ret;
651         }
652
653         return 0;
654 }
655
656 static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
657                                      struct snd_pcm_hw_params *params)
658 {
659         struct snd_soc_pcm_runtime *rtd = substream->private_data;
660         unsigned int bit_width = params_width(params);
661         struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
662         struct snd_soc_dai *codec_dai;
663         int i;
664
665         snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
666
667         for_each_rtd_codec_dais(rtd, i, codec_dai) {
668                 if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
669                         snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
670
671                 if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
672                         snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
673
674                 if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
675                         snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
676
677                 if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
678                         snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
679         }
680         return 0;
681 }
682
683 static const struct snd_soc_ops mt8188_max98390_ops = {
684         .hw_params = mt8188_max98390_hw_params,
685 };
686
687 static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
688 {
689         struct snd_soc_card *card = rtd->card;
690         int ret;
691
692         /* add regular speakers dapm route */
693         ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets,
694                                         ARRAY_SIZE(mt8188_dual_spk_widgets));
695         if (ret) {
696                 dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
697                 return ret;
698         }
699
700         ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
701                                         ARRAY_SIZE(mt8188_dual_spk_controls));
702         if (ret) {
703                 dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
704                 return ret;
705         }
706
707         if (rtd->dai_link->num_codecs <= 2)
708                 return 0;
709
710         /* add widgets/controls/dapm for rear speakers */
711         ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets,
712                                         ARRAY_SIZE(mt8188_rear_spk_widgets));
713         if (ret) {
714                 dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
715                 /* Don't need to add routes if widget addition failed */
716                 return ret;
717         }
718
719         ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
720                                         ARRAY_SIZE(mt8188_rear_spk_controls));
721         if (ret) {
722                 dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
723                 return ret;
724         }
725
726         return 0;
727 }
728
729 static int mt8188_nau8825_codec_init(struct snd_soc_pcm_runtime *rtd)
730 {
731         struct snd_soc_card *card = rtd->card;
732         struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
733         struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
734         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
735         struct snd_soc_jack *jack = &priv->headset_jack;
736         int ret;
737
738         ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
739                                         ARRAY_SIZE(mt8188_nau8825_widgets));
740         if (ret) {
741                 dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
742                 return ret;
743         }
744
745         ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
746                                         ARRAY_SIZE(mt8188_nau8825_controls));
747         if (ret) {
748                 dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
749                 return ret;
750         }
751
752         ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
753                                          SND_JACK_HEADSET | SND_JACK_BTN_0 |
754                                          SND_JACK_BTN_1 | SND_JACK_BTN_2 |
755                                          SND_JACK_BTN_3,
756                                          jack,
757                                          nau8825_jack_pins,
758                                          ARRAY_SIZE(nau8825_jack_pins));
759         if (ret) {
760                 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
761                 return ret;
762         }
763
764         snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
765         snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
766         snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
767         snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
768         ret = snd_soc_component_set_jack(component, jack, NULL);
769
770         if (ret) {
771                 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
772                 return ret;
773         }
774
775         return 0;
776 };
777
778 static int mt8188_rt5682s_codec_init(struct snd_soc_pcm_runtime *rtd)
779 {
780         struct snd_soc_card *card = rtd->card;
781         struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
782         struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
783         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
784         struct snd_soc_jack *jack = &priv->headset_jack;
785         int ret;
786
787         ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
788                                         ARRAY_SIZE(mt8188_nau8825_widgets));
789         if (ret) {
790                 dev_err(rtd->dev, "unable to add rt5682s card widget, ret %d\n", ret);
791                 return ret;
792         }
793
794         ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
795                                         ARRAY_SIZE(mt8188_nau8825_controls));
796         if (ret) {
797                 dev_err(rtd->dev, "unable to add rt5682s card controls, ret %d\n", ret);
798                 return ret;
799         }
800
801         ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
802                                          SND_JACK_HEADSET | SND_JACK_BTN_0 |
803                                          SND_JACK_BTN_1 | SND_JACK_BTN_2 |
804                                          SND_JACK_BTN_3,
805                                          jack,
806                                          nau8825_jack_pins,
807                                          ARRAY_SIZE(nau8825_jack_pins));
808         if (ret) {
809                 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
810                 return ret;
811         }
812
813         snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
814         snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
815         snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
816         snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
817         ret = snd_soc_component_set_jack(component, jack, NULL);
818
819         if (ret) {
820                 dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
821                 return ret;
822         }
823
824         return 0;
825 };
826
827 static void mt8188_nau8825_codec_exit(struct snd_soc_pcm_runtime *rtd)
828 {
829         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
830
831         snd_soc_component_set_jack(component, NULL, NULL);
832 }
833
834 static void mt8188_rt5682s_codec_exit(struct snd_soc_pcm_runtime *rtd)
835 {
836         struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
837
838         snd_soc_component_set_jack(component, NULL, NULL);
839 }
840
841 static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
842                                     struct snd_pcm_hw_params *params)
843 {
844         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
845         struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
846         unsigned int rate = params_rate(params);
847         unsigned int bit_width = params_width(params);
848         int clk_freq, ret;
849
850         clk_freq = rate * 2 * bit_width;
851
852         /* Configure clock for codec */
853         ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
854                                      SND_SOC_CLOCK_IN);
855         if (ret < 0) {
856                 dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
857                 return ret;
858         }
859
860         /* Configure pll for codec */
861         ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
862                                   params_rate(params) * 256);
863         if (ret < 0) {
864                 dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
865                 return ret;
866         }
867
868         return 0;
869 }
870
871 static const struct snd_soc_ops mt8188_nau8825_ops = {
872         .hw_params = mt8188_nau8825_hw_params,
873 };
874
875 static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
876                                         struct snd_pcm_hw_params *params)
877 {
878         struct snd_soc_pcm_runtime *rtd = substream->private_data;
879         struct snd_soc_card *card = rtd->card;
880         struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
881         struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
882         unsigned int rate = params_rate(params);
883         int bitwidth;
884         int ret;
885
886         bitwidth = snd_pcm_format_width(params_format(params));
887         if (bitwidth < 0) {
888                 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
889                 return bitwidth;
890         }
891
892         ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
893         if (ret) {
894                 dev_err(card->dev, "failed to set tdm slot\n");
895                 return ret;
896         }
897
898         ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
899                                   rate * 32, rate * 512);
900         if (ret) {
901                 dev_err(card->dev, "failed to set pll\n");
902                 return ret;
903         }
904
905         ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
906                                      rate * 512, SND_SOC_CLOCK_IN);
907         if (ret) {
908                 dev_err(card->dev, "failed to set sysclk\n");
909                 return ret;
910         }
911
912         return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
913                                       SND_SOC_CLOCK_OUT);
914 }
915
916 static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
917         .hw_params = mt8188_rt5682s_i2s_hw_params,
918 };
919
920 static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
921                                    struct snd_pcm_hw_params *params)
922 {
923         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
924         struct snd_soc_component *cmpnt_afe = NULL;
925         struct snd_soc_pcm_runtime *runtime;
926
927         /* find afe component */
928         for_each_card_rtds(rtd->card, runtime) {
929                 cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
930                 if (cmpnt_afe)
931                         break;
932         }
933
934         if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
935                 dev_err(rtd->dev, "afe pm runtime is not active!!\n");
936                 return -EINVAL;
937         }
938
939         return 0;
940 }
941
942 static const struct snd_soc_ops mt8188_sof_be_ops = {
943         .hw_params = mt8188_sof_be_hw_params,
944 };
945
946 static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
947         /* FE */
948         [DAI_LINK_DL2_FE] = {
949                 .name = "DL2_FE",
950                 .stream_name = "DL2 Playback",
951                 .trigger = {
952                         SND_SOC_DPCM_TRIGGER_POST,
953                         SND_SOC_DPCM_TRIGGER_POST,
954                 },
955                 .dynamic = 1,
956                 .dpcm_playback = 1,
957                 .dpcm_merged_chan = 1,
958                 .dpcm_merged_rate = 1,
959                 .dpcm_merged_format = 1,
960                 SND_SOC_DAILINK_REG(playback2),
961         },
962         [DAI_LINK_DL3_FE] = {
963                 .name = "DL3_FE",
964                 .stream_name = "DL3 Playback",
965                 .trigger = {
966                         SND_SOC_DPCM_TRIGGER_POST,
967                         SND_SOC_DPCM_TRIGGER_POST,
968                 },
969                 .dynamic = 1,
970                 .dpcm_playback = 1,
971                 .dpcm_merged_chan = 1,
972                 .dpcm_merged_rate = 1,
973                 .dpcm_merged_format = 1,
974                 SND_SOC_DAILINK_REG(playback3),
975         },
976         [DAI_LINK_DL6_FE] = {
977                 .name = "DL6_FE",
978                 .stream_name = "DL6 Playback",
979                 .trigger = {
980                         SND_SOC_DPCM_TRIGGER_POST,
981                         SND_SOC_DPCM_TRIGGER_POST,
982                 },
983                 .dynamic = 1,
984                 .dpcm_playback = 1,
985                 .dpcm_merged_chan = 1,
986                 .dpcm_merged_rate = 1,
987                 .dpcm_merged_format = 1,
988                 SND_SOC_DAILINK_REG(playback6),
989         },
990         [DAI_LINK_DL7_FE] = {
991                 .name = "DL7_FE",
992                 .stream_name = "DL7 Playback",
993                 .trigger = {
994                         SND_SOC_DPCM_TRIGGER_PRE,
995                         SND_SOC_DPCM_TRIGGER_PRE,
996                 },
997                 .dynamic = 1,
998                 .dpcm_playback = 1,
999                 SND_SOC_DAILINK_REG(playback7),
1000         },
1001         [DAI_LINK_DL8_FE] = {
1002                 .name = "DL8_FE",
1003                 .stream_name = "DL8 Playback",
1004                 .trigger = {
1005                         SND_SOC_DPCM_TRIGGER_POST,
1006                         SND_SOC_DPCM_TRIGGER_POST,
1007                 },
1008                 .dynamic = 1,
1009                 .dpcm_playback = 1,
1010                 SND_SOC_DAILINK_REG(playback8),
1011         },
1012         [DAI_LINK_DL10_FE] = {
1013                 .name = "DL10_FE",
1014                 .stream_name = "DL10 Playback",
1015                 .trigger = {
1016                         SND_SOC_DPCM_TRIGGER_POST,
1017                         SND_SOC_DPCM_TRIGGER_POST,
1018                 },
1019                 .dynamic = 1,
1020                 .dpcm_playback = 1,
1021                 SND_SOC_DAILINK_REG(playback10),
1022         },
1023         [DAI_LINK_DL11_FE] = {
1024                 .name = "DL11_FE",
1025                 .stream_name = "DL11 Playback",
1026                 .trigger = {
1027                         SND_SOC_DPCM_TRIGGER_POST,
1028                         SND_SOC_DPCM_TRIGGER_POST,
1029                 },
1030                 .dynamic = 1,
1031                 .dpcm_playback = 1,
1032                 SND_SOC_DAILINK_REG(playback11),
1033         },
1034         [DAI_LINK_UL1_FE] = {
1035                 .name = "UL1_FE",
1036                 .stream_name = "UL1 Capture",
1037                 .trigger = {
1038                         SND_SOC_DPCM_TRIGGER_PRE,
1039                         SND_SOC_DPCM_TRIGGER_PRE,
1040                 },
1041                 .dynamic = 1,
1042                 .dpcm_capture = 1,
1043                 SND_SOC_DAILINK_REG(capture1),
1044         },
1045         [DAI_LINK_UL2_FE] = {
1046                 .name = "UL2_FE",
1047                 .stream_name = "UL2 Capture",
1048                 .trigger = {
1049                         SND_SOC_DPCM_TRIGGER_POST,
1050                         SND_SOC_DPCM_TRIGGER_POST,
1051                 },
1052                 .dynamic = 1,
1053                 .dpcm_capture = 1,
1054                 SND_SOC_DAILINK_REG(capture2),
1055         },
1056         [DAI_LINK_UL3_FE] = {
1057                 .name = "UL3_FE",
1058                 .stream_name = "UL3 Capture",
1059                 .trigger = {
1060                         SND_SOC_DPCM_TRIGGER_POST,
1061                         SND_SOC_DPCM_TRIGGER_POST,
1062                 },
1063                 .dynamic = 1,
1064                 .dpcm_capture = 1,
1065                 SND_SOC_DAILINK_REG(capture3),
1066         },
1067         [DAI_LINK_UL4_FE] = {
1068                 .name = "UL4_FE",
1069                 .stream_name = "UL4 Capture",
1070                 .trigger = {
1071                         SND_SOC_DPCM_TRIGGER_POST,
1072                         SND_SOC_DPCM_TRIGGER_POST,
1073                 },
1074                 .dynamic = 1,
1075                 .dpcm_capture = 1,
1076                 .dpcm_merged_chan = 1,
1077                 .dpcm_merged_rate = 1,
1078                 .dpcm_merged_format = 1,
1079                 SND_SOC_DAILINK_REG(capture4),
1080         },
1081         [DAI_LINK_UL5_FE] = {
1082                 .name = "UL5_FE",
1083                 .stream_name = "UL5 Capture",
1084                 .trigger = {
1085                         SND_SOC_DPCM_TRIGGER_POST,
1086                         SND_SOC_DPCM_TRIGGER_POST,
1087                 },
1088                 .dynamic = 1,
1089                 .dpcm_capture = 1,
1090                 .dpcm_merged_chan = 1,
1091                 .dpcm_merged_rate = 1,
1092                 .dpcm_merged_format = 1,
1093                 SND_SOC_DAILINK_REG(capture5),
1094         },
1095         [DAI_LINK_UL6_FE] = {
1096                 .name = "UL6_FE",
1097                 .stream_name = "UL6 Capture",
1098                 .trigger = {
1099                         SND_SOC_DPCM_TRIGGER_PRE,
1100                         SND_SOC_DPCM_TRIGGER_PRE,
1101                 },
1102                 .dynamic = 1,
1103                 .dpcm_capture = 1,
1104                 SND_SOC_DAILINK_REG(capture6),
1105         },
1106         [DAI_LINK_UL8_FE] = {
1107                 .name = "UL8_FE",
1108                 .stream_name = "UL8 Capture",
1109                 .trigger = {
1110                         SND_SOC_DPCM_TRIGGER_POST,
1111                         SND_SOC_DPCM_TRIGGER_POST,
1112                 },
1113                 .dynamic = 1,
1114                 .dpcm_capture = 1,
1115                 SND_SOC_DAILINK_REG(capture8),
1116         },
1117         [DAI_LINK_UL9_FE] = {
1118                 .name = "UL9_FE",
1119                 .stream_name = "UL9 Capture",
1120                 .trigger = {
1121                         SND_SOC_DPCM_TRIGGER_POST,
1122                         SND_SOC_DPCM_TRIGGER_POST,
1123                 },
1124                 .dynamic = 1,
1125                 .dpcm_capture = 1,
1126                 SND_SOC_DAILINK_REG(capture9),
1127         },
1128         [DAI_LINK_UL10_FE] = {
1129                 .name = "UL10_FE",
1130                 .stream_name = "UL10 Capture",
1131                 .trigger = {
1132                         SND_SOC_DPCM_TRIGGER_POST,
1133                         SND_SOC_DPCM_TRIGGER_POST,
1134                 },
1135                 .dynamic = 1,
1136                 .dpcm_capture = 1,
1137                 SND_SOC_DAILINK_REG(capture10),
1138         },
1139         /* BE */
1140         [DAI_LINK_DL_SRC_BE] = {
1141                 .name = "DL_SRC_BE",
1142                 .no_pcm = 1,
1143                 .dpcm_playback = 1,
1144                 SND_SOC_DAILINK_REG(dl_src),
1145         },
1146         [DAI_LINK_DPTX_BE] = {
1147                 .name = "DPTX_BE",
1148                 .ops = &mt8188_dptx_ops,
1149                 .be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
1150                 .no_pcm = 1,
1151                 .dpcm_playback = 1,
1152                 SND_SOC_DAILINK_REG(dptx),
1153         },
1154         [DAI_LINK_ETDM1_IN_BE] = {
1155                 .name = "ETDM1_IN_BE",
1156                 .no_pcm = 1,
1157                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1158                         SND_SOC_DAIFMT_NB_NF |
1159                         SND_SOC_DAIFMT_CBP_CFP,
1160                 .dpcm_capture = 1,
1161                 .ignore_suspend = 1,
1162                 SND_SOC_DAILINK_REG(etdm1_in),
1163         },
1164         [DAI_LINK_ETDM2_IN_BE] = {
1165                 .name = "ETDM2_IN_BE",
1166                 .no_pcm = 1,
1167                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1168                         SND_SOC_DAIFMT_NB_NF |
1169                         SND_SOC_DAIFMT_CBP_CFP,
1170                 .dpcm_capture = 1,
1171                 SND_SOC_DAILINK_REG(etdm2_in),
1172         },
1173         [DAI_LINK_ETDM1_OUT_BE] = {
1174                 .name = "ETDM1_OUT_BE",
1175                 .no_pcm = 1,
1176                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1177                         SND_SOC_DAIFMT_NB_NF |
1178                         SND_SOC_DAIFMT_CBC_CFC,
1179                 .dpcm_playback = 1,
1180                 SND_SOC_DAILINK_REG(etdm1_out),
1181         },
1182         [DAI_LINK_ETDM2_OUT_BE] = {
1183                 .name = "ETDM2_OUT_BE",
1184                 .no_pcm = 1,
1185                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1186                         SND_SOC_DAIFMT_NB_NF |
1187                         SND_SOC_DAIFMT_CBC_CFC,
1188                 .dpcm_playback = 1,
1189                 SND_SOC_DAILINK_REG(etdm2_out),
1190         },
1191         [DAI_LINK_ETDM3_OUT_BE] = {
1192                 .name = "ETDM3_OUT_BE",
1193                 .no_pcm = 1,
1194                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1195                         SND_SOC_DAIFMT_NB_NF |
1196                         SND_SOC_DAIFMT_CBC_CFC,
1197                 .dpcm_playback = 1,
1198                 SND_SOC_DAILINK_REG(etdm3_out),
1199         },
1200         [DAI_LINK_PCM1_BE] = {
1201                 .name = "PCM1_BE",
1202                 .no_pcm = 1,
1203                 .dai_fmt = SND_SOC_DAIFMT_I2S |
1204                         SND_SOC_DAIFMT_NB_NF |
1205                         SND_SOC_DAIFMT_CBC_CFC,
1206                 .dpcm_playback = 1,
1207                 .dpcm_capture = 1,
1208                 SND_SOC_DAILINK_REG(pcm1),
1209         },
1210         [DAI_LINK_UL_SRC_BE] = {
1211                 .name = "UL_SRC_BE",
1212                 .no_pcm = 1,
1213                 .dpcm_capture = 1,
1214                 SND_SOC_DAILINK_REG(ul_src),
1215         },
1216
1217         /* SOF BE */
1218         [DAI_LINK_SOF_DL2_BE] = {
1219                 .name = "AFE_SOF_DL2",
1220                 .no_pcm = 1,
1221                 .dpcm_playback = 1,
1222                 .ops = &mt8188_sof_be_ops,
1223                 SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1224         },
1225         [DAI_LINK_SOF_DL3_BE] = {
1226                 .name = "AFE_SOF_DL3",
1227                 .no_pcm = 1,
1228                 .dpcm_playback = 1,
1229                 .ops = &mt8188_sof_be_ops,
1230                 SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1231         },
1232         [DAI_LINK_SOF_UL4_BE] = {
1233                 .name = "AFE_SOF_UL4",
1234                 .no_pcm = 1,
1235                 .dpcm_capture = 1,
1236                 .ops = &mt8188_sof_be_ops,
1237                 SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1238         },
1239         [DAI_LINK_SOF_UL5_BE] = {
1240                 .name = "AFE_SOF_UL5",
1241                 .no_pcm = 1,
1242                 .dpcm_capture = 1,
1243                 .ops = &mt8188_sof_be_ops,
1244                 SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1245         },
1246 };
1247
1248 static void mt8188_fixup_controls(struct snd_soc_card *card)
1249 {
1250         struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1251         struct mt8188_mt6359_priv *priv = soc_card_data->mach_priv;
1252         struct mt8188_card_data *card_data = (struct mt8188_card_data *)priv->private_data;
1253         struct snd_kcontrol *kctl;
1254
1255         if (card_data->quirk & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT)) {
1256                 struct snd_soc_dapm_widget *w, *next_w;
1257
1258                 for_each_card_widgets_safe(card, w, next_w) {
1259                         if (strcmp(w->name, "Headphone"))
1260                                 continue;
1261
1262                         snd_soc_dapm_free_widget(w);
1263                 }
1264
1265                 kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
1266                 if (kctl)
1267                         snd_ctl_remove(card->snd_card, kctl);
1268                 else
1269                         dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
1270         }
1271 }
1272
1273 static struct snd_soc_card mt8188_mt6359_soc_card = {
1274         .owner = THIS_MODULE,
1275         .dai_link = mt8188_mt6359_dai_links,
1276         .num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
1277         .dapm_widgets = mt8188_mt6359_widgets,
1278         .num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
1279         .dapm_routes = mt8188_mt6359_routes,
1280         .num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
1281         .controls = mt8188_mt6359_controls,
1282         .num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
1283         .fixup_controls = mt8188_fixup_controls,
1284 };
1285
1286 static int mt8188_mt6359_dev_probe(struct platform_device *pdev)
1287 {
1288         struct snd_soc_card *card = &mt8188_mt6359_soc_card;
1289         struct device_node *platform_node;
1290         struct device_node *adsp_node;
1291         struct mtk_soc_card_data *soc_card_data;
1292         struct mt8188_mt6359_priv *priv;
1293         struct mt8188_card_data *card_data;
1294         struct snd_soc_dai_link *dai_link;
1295         bool init_mt6359 = false;
1296         bool init_nau8825 = false;
1297         bool init_rt5682s = false;
1298         bool init_max98390 = false;
1299         bool init_dumb = false;
1300         int ret, i;
1301
1302         card_data = (struct mt8188_card_data *)of_device_get_match_data(&pdev->dev);
1303         card->dev = &pdev->dev;
1304
1305         ret = snd_soc_of_parse_card_name(card, "model");
1306         if (ret)
1307                 return dev_err_probe(&pdev->dev, ret, "%s new card name parsing error\n",
1308                                      __func__);
1309
1310         if (!card->name)
1311                 card->name = card_data->name;
1312
1313         if (of_property_read_bool(pdev->dev.of_node, "audio-routing")) {
1314                 ret = snd_soc_of_parse_audio_routing(card, "audio-routing");
1315                 if (ret)
1316                         return ret;
1317         }
1318
1319         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1320         if (!priv)
1321                 return -ENOMEM;
1322
1323         soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*card_data), GFP_KERNEL);
1324         if (!soc_card_data)
1325                 return -ENOMEM;
1326
1327         soc_card_data->mach_priv = priv;
1328
1329         adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1330         if (adsp_node) {
1331                 struct mtk_sof_priv *sof_priv;
1332
1333                 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1334                 if (!sof_priv) {
1335                         ret = -ENOMEM;
1336                         goto err_adsp_node;
1337                 }
1338                 sof_priv->conn_streams = g_sof_conn_streams;
1339                 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
1340                 soc_card_data->sof_priv = sof_priv;
1341                 card->probe = mtk_sof_card_probe;
1342                 card->late_probe = mtk_sof_card_late_probe;
1343                 if (!card->topology_shortname_created) {
1344                         snprintf(card->topology_shortname, 32, "sof-%s", card->name);
1345                         card->topology_shortname_created = true;
1346                 }
1347                 card->name = card->topology_shortname;
1348         }
1349
1350         if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1351                 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
1352                                                "mediatek,dai-link",
1353                                                mt8188_mt6359_dai_links,
1354                                                ARRAY_SIZE(mt8188_mt6359_dai_links));
1355                 if (ret) {
1356                         dev_err_probe(&pdev->dev, ret, "Parse dai-link fail\n");
1357                         goto err_adsp_node;
1358                 }
1359         } else {
1360                 if (!adsp_node)
1361                         card->num_links = DAI_LINK_REGULAR_NUM;
1362         }
1363
1364         platform_node = of_parse_phandle(pdev->dev.of_node,
1365                                          "mediatek,platform", 0);
1366         if (!platform_node) {
1367                 ret = dev_err_probe(&pdev->dev, -EINVAL,
1368                                     "Property 'platform' missing or invalid\n");
1369                 goto err_adsp_node;
1370
1371         }
1372
1373         ret = parse_dai_link_info(card);
1374         if (ret)
1375                 goto err;
1376
1377         for_each_card_prelinks(card, i, dai_link) {
1378                 if (!dai_link->platforms->name) {
1379                         if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && adsp_node)
1380                                 dai_link->platforms->of_node = adsp_node;
1381                         else
1382                                 dai_link->platforms->of_node = platform_node;
1383                 }
1384
1385                 if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1386                         if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
1387                                 dai_link->init = mt8188_dptx_codec_init;
1388                 } else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1389                         if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai"))
1390                                 dai_link->init = mt8188_hdmi_codec_init;
1391                 } else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1392                            strcmp(dai_link->name, "UL_SRC_BE") == 0) {
1393                         if (!init_mt6359) {
1394                                 dai_link->init = mt8188_mt6359_init;
1395                                 init_mt6359 = true;
1396                         }
1397                 } else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1398                            strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1399                            strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1400                            strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1401                         if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1402                                 dai_link->ops = &mt8188_max98390_ops;
1403                                 if (!init_max98390) {
1404                                         dai_link->init = mt8188_max98390_codec_init;
1405                                         init_max98390 = true;
1406                                 }
1407                         } else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
1408                                 dai_link->ops = &mt8188_nau8825_ops;
1409                                 if (!init_nau8825) {
1410                                         dai_link->init = mt8188_nau8825_codec_init;
1411                                         dai_link->exit = mt8188_nau8825_codec_exit;
1412                                         init_nau8825 = true;
1413                                 }
1414                         } else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1415                                 dai_link->ops = &mt8188_rt5682s_i2s_ops;
1416                                 if (!init_rt5682s) {
1417                                         dai_link->init = mt8188_rt5682s_codec_init;
1418                                         dai_link->exit = mt8188_rt5682s_codec_exit;
1419                                         init_rt5682s = true;
1420                                 }
1421                         } else {
1422                                 if (strcmp(dai_link->codecs->dai_name, "snd-soc-dummy-dai")) {
1423                                         if (!init_dumb) {
1424                                                 dai_link->init = mt8188_dumb_amp_init;
1425                                                 init_dumb = true;
1426                                         }
1427                                 }
1428                         }
1429                 }
1430         }
1431
1432         priv->private_data = card_data;
1433         snd_soc_card_set_drvdata(card, soc_card_data);
1434
1435         ret = devm_snd_soc_register_card(&pdev->dev, card);
1436         if (ret)
1437                 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n",
1438                               __func__);
1439 err:
1440         of_node_put(platform_node);
1441         clean_card_reference(card);
1442
1443 err_adsp_node:
1444         of_node_put(adsp_node);
1445
1446         return ret;
1447 }
1448
1449 static struct mt8188_card_data mt8188_evb_card = {
1450         .name = "mt8188_mt6359",
1451 };
1452
1453 static struct mt8188_card_data mt8188_nau8825_card = {
1454         .name = "mt8188_nau8825",
1455         .quirk = NAU8825_HS_PRESENT,
1456 };
1457
1458 static struct mt8188_card_data mt8188_rt5682s_card = {
1459         .name = "mt8188_rt5682s",
1460         .quirk = RT5682S_HS_PRESENT,
1461 };
1462
1463 static const struct of_device_id mt8188_mt6359_dt_match[] = {
1464         { .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1465         { .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1466         { .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1467         { /* sentinel */ },
1468 };
1469 MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
1470
1471 static struct platform_driver mt8188_mt6359_driver = {
1472         .driver = {
1473                 .name = "mt8188_mt6359",
1474                 .of_match_table = mt8188_mt6359_dt_match,
1475                 .pm = &snd_soc_pm_ops,
1476         },
1477         .probe = mt8188_mt6359_dev_probe,
1478 };
1479
1480 module_platform_driver(mt8188_mt6359_driver);
1481
1482 /* Module information */
1483 MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
1484 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1485 MODULE_LICENSE("GPL");
1486 MODULE_ALIAS("mt8188 mt6359 soc card");