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