1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * mt8195-mt6359.c  --
4  *	MT8195-MT6359 ALSA SoC machine driver code
5  *
6  * Copyright (c) 2022 MediaTek Inc.
7  * Author: Trevor Wu <trevor.wu@mediatek.com>
8  *	   YC Hung <yc.hung@mediatek.com>
9  */
10 
11 #include <linux/input.h>
12 #include <linux/module.h>
13 #include <linux/of_device.h>
14 #include <linux/pm_runtime.h>
15 #include <sound/jack.h>
16 #include <sound/pcm_params.h>
17 #include <sound/rt5682.h>
18 #include <sound/soc.h>
19 #include "../../codecs/mt6359.h"
20 #include "../../codecs/rt1011.h"
21 #include "../../codecs/rt5682.h"
22 #include "../common/mtk-afe-platform-driver.h"
23 #include "mt8195-afe-clk.h"
24 #include "mt8195-afe-common.h"
25 
26 #define RT1011_SPEAKER_AMP_PRESENT		BIT(0)
27 #define RT1019_SPEAKER_AMP_PRESENT		BIT(1)
28 
29 #define RT1011_CODEC_DAI	"rt1011-aif"
30 #define RT1011_DEV0_NAME	"rt1011.2-0038"
31 #define RT1011_DEV1_NAME	"rt1011.2-0039"
32 
33 #define RT1019_CODEC_DAI	"HiFi"
34 #define RT1019_DEV0_NAME	"rt1019p"
35 
36 #define RT5682_CODEC_DAI	"rt5682-aif1"
37 #define RT5682_DEV0_NAME	"rt5682.2-001a"
38 
39 #define RT5682S_CODEC_DAI	"rt5682s-aif1"
40 #define RT5682S_DEV0_NAME	"rt5682s.2-001a"
41 
42 #define SOF_DMA_DL2 "SOF_DMA_DL2"
43 #define SOF_DMA_DL3 "SOF_DMA_DL3"
44 #define SOF_DMA_UL4 "SOF_DMA_UL4"
45 #define SOF_DMA_UL5 "SOF_DMA_UL5"
46 
47 struct mt8195_card_data {
48 	const char *name;
49 	unsigned long quirk;
50 };
51 
52 struct sof_conn_stream {
53 	const char *normal_link;
54 	const char *sof_link;
55 	const char *sof_dma;
56 	int stream_dir;
57 };
58 
59 struct mt8195_mt6359_priv {
60 	struct snd_soc_jack headset_jack;
61 	struct snd_soc_jack dp_jack;
62 	struct snd_soc_jack hdmi_jack;
63 	struct clk *i2so1_mclk;
64 };
65 
66 static const struct snd_soc_dapm_widget mt8195_mt6359_widgets[] = {
67 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
68 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
69 	SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
70 	SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
71 	SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
72 	SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
73 };
74 
75 static const struct snd_soc_dapm_route mt8195_mt6359_routes[] = {
76 	/* headset */
77 	{ "Headphone Jack", NULL, "HPOL" },
78 	{ "Headphone Jack", NULL, "HPOR" },
79 	{ "IN1P", NULL, "Headset Mic" },
80 	/* SOF Uplink */
81 	{SOF_DMA_UL4, NULL, "O034"},
82 	{SOF_DMA_UL4, NULL, "O035"},
83 	{SOF_DMA_UL5, NULL, "O036"},
84 	{SOF_DMA_UL5, NULL, "O037"},
85 	/* SOF Downlink */
86 	{"I070", NULL, SOF_DMA_DL2},
87 	{"I071", NULL, SOF_DMA_DL2},
88 	{"I020", NULL, SOF_DMA_DL3},
89 	{"I021", NULL, SOF_DMA_DL3},
90 };
91 
92 static const struct snd_kcontrol_new mt8195_mt6359_controls[] = {
93 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
94 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
95 };
96 
97 static const struct snd_soc_dapm_widget mt8195_dual_speaker_widgets[] = {
98 	SND_SOC_DAPM_SPK("Left Speaker", NULL),
99 	SND_SOC_DAPM_SPK("Right Speaker", NULL),
100 };
101 
102 static const struct snd_kcontrol_new mt8195_dual_speaker_controls[] = {
103 	SOC_DAPM_PIN_SWITCH("Left Speaker"),
104 	SOC_DAPM_PIN_SWITCH("Right Speaker"),
105 };
106 
107 static const struct snd_soc_dapm_widget mt8195_speaker_widgets[] = {
108 	SND_SOC_DAPM_SPK("Speakers", NULL),
109 };
110 
111 static const struct snd_kcontrol_new mt8195_speaker_controls[] = {
112 	SOC_DAPM_PIN_SWITCH("Speakers"),
113 };
114 
115 static const struct snd_soc_dapm_route mt8195_rt1011_routes[] = {
116 	{ "Left Speaker", NULL, "Left SPO" },
117 	{ "Right Speaker", NULL, "Right SPO" },
118 };
119 
120 static const struct snd_soc_dapm_route mt8195_rt1019_routes[] = {
121 	{ "Speakers", NULL, "Speaker" },
122 };
123 
124 #define CKSYS_AUD_TOP_CFG 0x032c
125 #define CKSYS_AUD_TOP_MON 0x0330
126 
127 static int mt8195_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
128 {
129 	struct snd_soc_component *cmpnt_afe =
130 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
131 	struct snd_soc_component *cmpnt_codec =
132 		asoc_rtd_to_codec(rtd, 0)->component;
133 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
134 	struct mt8195_afe_private *afe_priv = afe->platform_priv;
135 	struct mtkaif_param *param = &afe_priv->mtkaif_params;
136 	int chosen_phase_1, chosen_phase_2, chosen_phase_3;
137 	int prev_cycle_1, prev_cycle_2, prev_cycle_3;
138 	int test_done_1, test_done_2, test_done_3;
139 	int cycle_1, cycle_2, cycle_3;
140 	int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM];
141 	int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM];
142 	int mtkaif_calibration_num_phase;
143 	bool mtkaif_calibration_ok;
144 	unsigned int monitor;
145 	int counter;
146 	int phase;
147 	int i;
148 
149 	dev_dbg(afe->dev, "%s(), start\n", __func__);
150 
151 	param->mtkaif_calibration_ok = false;
152 	for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) {
153 		param->mtkaif_chosen_phase[i] = -1;
154 		param->mtkaif_phase_cycle[i] = 0;
155 		mtkaif_chosen_phase[i] = -1;
156 		mtkaif_phase_cycle[i] = 0;
157 	}
158 
159 	if (IS_ERR(afe_priv->topckgen)) {
160 		dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
161 			 __func__);
162 		return 0;
163 	}
164 
165 	pm_runtime_get_sync(afe->dev);
166 	mt6359_mtkaif_calibration_enable(cmpnt_codec);
167 
168 	/* set test type to synchronizer pulse */
169 	regmap_update_bits(afe_priv->topckgen,
170 			   CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
171 	mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
172 	mtkaif_calibration_ok = true;
173 
174 	for (phase = 0;
175 	     phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
176 	     phase++) {
177 		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
178 						    phase, phase, phase);
179 
180 		regmap_update_bits(afe_priv->topckgen,
181 				   CKSYS_AUD_TOP_CFG, 0x1, 0x1);
182 
183 		test_done_1 = 0;
184 		test_done_2 = 0;
185 		test_done_3 = 0;
186 		cycle_1 = -1;
187 		cycle_2 = -1;
188 		cycle_3 = -1;
189 		counter = 0;
190 		while (!(test_done_1 & test_done_2 & test_done_3)) {
191 			regmap_read(afe_priv->topckgen,
192 				    CKSYS_AUD_TOP_MON, &monitor);
193 			test_done_1 = (monitor >> 28) & 0x1;
194 			test_done_2 = (monitor >> 29) & 0x1;
195 			test_done_3 = (monitor >> 30) & 0x1;
196 			if (test_done_1 == 1)
197 				cycle_1 = monitor & 0xf;
198 
199 			if (test_done_2 == 1)
200 				cycle_2 = (monitor >> 4) & 0xf;
201 
202 			if (test_done_3 == 1)
203 				cycle_3 = (monitor >> 8) & 0xf;
204 
205 			/* handle if never test done */
206 			if (++counter > 10000) {
207 				dev_info(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
208 					 __func__,
209 					 cycle_1, cycle_2, cycle_3, monitor);
210 				mtkaif_calibration_ok = false;
211 				break;
212 			}
213 		}
214 
215 		if (phase == 0) {
216 			prev_cycle_1 = cycle_1;
217 			prev_cycle_2 = cycle_2;
218 			prev_cycle_3 = cycle_3;
219 		}
220 
221 		if (cycle_1 != prev_cycle_1 &&
222 		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
223 			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = phase - 1;
224 			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] = prev_cycle_1;
225 		}
226 
227 		if (cycle_2 != prev_cycle_2 &&
228 		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
229 			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = phase - 1;
230 			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] = prev_cycle_2;
231 		}
232 
233 		if (cycle_3 != prev_cycle_3 &&
234 		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
235 			mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = phase - 1;
236 			mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] = prev_cycle_3;
237 		}
238 
239 		regmap_update_bits(afe_priv->topckgen,
240 				   CKSYS_AUD_TOP_CFG, 0x1, 0x0);
241 
242 		if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] >= 0 &&
243 		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] >= 0 &&
244 		    mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] >= 0)
245 			break;
246 	}
247 
248 	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
249 		mtkaif_calibration_ok = false;
250 		chosen_phase_1 = 0;
251 	} else {
252 		chosen_phase_1 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0];
253 	}
254 
255 	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
256 		mtkaif_calibration_ok = false;
257 		chosen_phase_2 = 0;
258 	} else {
259 		chosen_phase_2 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1];
260 	}
261 
262 	if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
263 		mtkaif_calibration_ok = false;
264 		chosen_phase_3 = 0;
265 	} else {
266 		chosen_phase_3 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2];
267 	}
268 
269 	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
270 					    chosen_phase_1,
271 					    chosen_phase_2,
272 					    chosen_phase_3);
273 
274 	mt6359_mtkaif_calibration_disable(cmpnt_codec);
275 	pm_runtime_put(afe->dev);
276 
277 	param->mtkaif_calibration_ok = mtkaif_calibration_ok;
278 	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = chosen_phase_1;
279 	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = chosen_phase_2;
280 	param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = chosen_phase_3;
281 	for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++)
282 		param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
283 
284 	dev_info(afe->dev, "%s(), end, calibration ok %d\n",
285 		 __func__, param->mtkaif_calibration_ok);
286 
287 	return 0;
288 }
289 
290 static int mt8195_mt6359_init(struct snd_soc_pcm_runtime *rtd)
291 {
292 	struct snd_soc_component *cmpnt_codec =
293 		asoc_rtd_to_codec(rtd, 0)->component;
294 
295 	/* set mtkaif protocol */
296 	mt6359_set_mtkaif_protocol(cmpnt_codec,
297 				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
298 
299 	/* mtkaif calibration */
300 	mt8195_mt6359_mtkaif_calibration(rtd);
301 
302 	return 0;
303 }
304 
305 static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream)
306 {
307 	static const unsigned int rates[] = {
308 		48000
309 	};
310 	static const unsigned int channels[] = {
311 		2, 4, 6, 8
312 	};
313 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
314 		.count = ARRAY_SIZE(rates),
315 		.list  = rates,
316 		.mask = 0,
317 	};
318 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
319 		.count = ARRAY_SIZE(channels),
320 		.list  = channels,
321 		.mask = 0,
322 	};
323 
324 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
325 	struct snd_pcm_runtime *runtime = substream->runtime;
326 	int ret;
327 
328 	ret = snd_pcm_hw_constraint_list(runtime, 0,
329 					 SNDRV_PCM_HW_PARAM_RATE,
330 					 &constraints_rates);
331 	if (ret < 0) {
332 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
333 		return ret;
334 	}
335 
336 	ret = snd_pcm_hw_constraint_list(runtime, 0,
337 					 SNDRV_PCM_HW_PARAM_CHANNELS,
338 					 &constraints_channels);
339 	if (ret < 0) {
340 		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
341 		return ret;
342 	}
343 
344 	return 0;
345 }
346 
347 static const struct snd_soc_ops mt8195_hdmitx_dptx_playback_ops = {
348 	.startup = mt8195_hdmitx_dptx_startup,
349 };
350 
351 static int mt8195_dptx_hw_params(struct snd_pcm_substream *substream,
352 				 struct snd_pcm_hw_params *params)
353 {
354 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
355 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
356 
357 	return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256,
358 				      SND_SOC_CLOCK_OUT);
359 }
360 
361 static const struct snd_soc_ops mt8195_dptx_ops = {
362 	.hw_params = mt8195_dptx_hw_params,
363 };
364 
365 static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
366 {
367 	struct mt8195_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
368 	struct snd_soc_component *cmpnt_codec =
369 		asoc_rtd_to_codec(rtd, 0)->component;
370 	int ret;
371 
372 	ret = snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_LINEOUT,
373 				    &priv->dp_jack, NULL, 0);
374 	if (ret)
375 		return ret;
376 
377 	return snd_soc_component_set_jack(cmpnt_codec, &priv->dp_jack, NULL);
378 }
379 
380 static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
381 {
382 	struct mt8195_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
383 	struct snd_soc_component *cmpnt_codec =
384 		asoc_rtd_to_codec(rtd, 0)->component;
385 	int ret;
386 
387 	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
388 				    &priv->hdmi_jack, NULL, 0);
389 	if (ret)
390 		return ret;
391 
392 	return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
393 }
394 
395 static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
396 				       struct snd_pcm_hw_params *params)
397 {
398 	/* fix BE i2s format to S24_LE, clean param mask first */
399 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
400 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
401 
402 	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
403 
404 	return 0;
405 }
406 
407 static int mt8195_playback_startup(struct snd_pcm_substream *substream)
408 {
409 	static const unsigned int rates[] = {
410 		48000
411 	};
412 	static const unsigned int channels[] = {
413 		2
414 	};
415 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
416 		.count = ARRAY_SIZE(rates),
417 		.list  = rates,
418 		.mask = 0,
419 	};
420 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
421 		.count = ARRAY_SIZE(channels),
422 		.list  = channels,
423 		.mask = 0,
424 	};
425 
426 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
427 	struct snd_pcm_runtime *runtime = substream->runtime;
428 	int ret;
429 
430 	ret = snd_pcm_hw_constraint_list(runtime, 0,
431 					 SNDRV_PCM_HW_PARAM_RATE,
432 					 &constraints_rates);
433 	if (ret < 0) {
434 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
435 		return ret;
436 	}
437 
438 	ret = snd_pcm_hw_constraint_list(runtime, 0,
439 					 SNDRV_PCM_HW_PARAM_CHANNELS,
440 					 &constraints_channels);
441 	if (ret < 0) {
442 		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
443 		return ret;
444 	}
445 
446 	return 0;
447 }
448 
449 static const struct snd_soc_ops mt8195_playback_ops = {
450 	.startup = mt8195_playback_startup,
451 };
452 
453 static int mt8195_capture_startup(struct snd_pcm_substream *substream)
454 {
455 	static const unsigned int rates[] = {
456 		48000
457 	};
458 	static const unsigned int channels[] = {
459 		1, 2
460 	};
461 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
462 		.count = ARRAY_SIZE(rates),
463 		.list  = rates,
464 		.mask = 0,
465 	};
466 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
467 		.count = ARRAY_SIZE(channels),
468 		.list  = channels,
469 		.mask = 0,
470 	};
471 
472 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
473 	struct snd_pcm_runtime *runtime = substream->runtime;
474 	int ret;
475 
476 	ret = snd_pcm_hw_constraint_list(runtime, 0,
477 					 SNDRV_PCM_HW_PARAM_RATE,
478 					 &constraints_rates);
479 	if (ret < 0) {
480 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
481 		return ret;
482 	}
483 
484 	ret = snd_pcm_hw_constraint_list(runtime, 0,
485 					 SNDRV_PCM_HW_PARAM_CHANNELS,
486 					 &constraints_channels);
487 	if (ret < 0) {
488 		dev_err(rtd->dev, "hw_constraint_list channel failed\n");
489 		return ret;
490 	}
491 
492 	return 0;
493 }
494 
495 static const struct snd_soc_ops mt8195_capture_ops = {
496 	.startup = mt8195_capture_startup,
497 };
498 
499 static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream,
500 					struct snd_pcm_hw_params *params)
501 {
502 	struct snd_soc_pcm_runtime *rtd = substream->private_data;
503 	struct snd_soc_card *card = rtd->card;
504 	struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
505 	struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
506 	unsigned int rate = params_rate(params);
507 	int bitwidth;
508 	int ret;
509 
510 	bitwidth = snd_pcm_format_width(params_format(params));
511 	if (bitwidth < 0) {
512 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
513 		return bitwidth;
514 	}
515 
516 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
517 	if (ret) {
518 		dev_err(card->dev, "failed to set tdm slot\n");
519 		return ret;
520 	}
521 
522 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK,
523 				  rate * 256, rate * 512);
524 	if (ret) {
525 		dev_err(card->dev, "failed to set pll\n");
526 		return ret;
527 	}
528 
529 	ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
530 				     rate * 512, SND_SOC_CLOCK_IN);
531 	if (ret) {
532 		dev_err(card->dev, "failed to set sysclk\n");
533 		return ret;
534 	}
535 
536 	return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256,
537 				      SND_SOC_CLOCK_OUT);
538 }
539 
540 static const struct snd_soc_ops mt8195_rt5682_etdm_ops = {
541 	.hw_params = mt8195_rt5682_etdm_hw_params,
542 };
543 
544 static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd)
545 {
546 	struct snd_soc_component *cmpnt_codec =
547 		asoc_rtd_to_codec(rtd, 0)->component;
548 	struct mt8195_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
549 	struct snd_soc_jack *jack = &priv->headset_jack;
550 	struct snd_soc_component *cmpnt_afe =
551 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
552 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
553 	struct mt8195_afe_private *afe_priv = afe->platform_priv;
554 	int ret;
555 
556 	priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2];
557 
558 	ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
559 				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
560 				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
561 				    SND_JACK_BTN_3,
562 				    jack, NULL, 0);
563 	if (ret) {
564 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
565 		return ret;
566 	}
567 
568 	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
569 	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
570 	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
571 	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
572 
573 	ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
574 	if (ret) {
575 		dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
576 		return ret;
577 	}
578 
579 	return 0;
580 };
581 
582 static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream,
583 					struct snd_pcm_hw_params *params)
584 {
585 	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
586 	struct snd_soc_dai *codec_dai;
587 	struct snd_soc_card *card = rtd->card;
588 	int srate, i, ret;
589 
590 	srate = params_rate(params);
591 
592 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
593 		ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK,
594 					  64 * srate, 256 * srate);
595 		if (ret < 0) {
596 			dev_err(card->dev, "codec_dai clock not set\n");
597 			return ret;
598 		}
599 
600 		ret = snd_soc_dai_set_sysclk(codec_dai,
601 					     RT1011_FS_SYS_PRE_S_PLL1,
602 					     256 * srate, SND_SOC_CLOCK_IN);
603 		if (ret < 0) {
604 			dev_err(card->dev, "codec_dai clock not set\n");
605 			return ret;
606 		}
607 	}
608 	return 0;
609 }
610 
611 static const struct snd_soc_ops mt8195_rt1011_etdm_ops = {
612 	.hw_params = mt8195_rt1011_etdm_hw_params,
613 };
614 
615 static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd)
616 {
617 	struct snd_soc_card *card = rtd->card;
618 	int ret;
619 
620 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
621 					ARRAY_SIZE(mt8195_dual_speaker_widgets));
622 	if (ret) {
623 		dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
624 		/* Don't need to add routes if widget addition failed */
625 		return ret;
626 	}
627 
628 	ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
629 					ARRAY_SIZE(mt8195_dual_speaker_controls));
630 	if (ret) {
631 		dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
632 		return ret;
633 	}
634 
635 	ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1011_routes,
636 				      ARRAY_SIZE(mt8195_rt1011_routes));
637 	if (ret)
638 		dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
639 
640 	return ret;
641 }
642 
643 static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd)
644 {
645 	struct snd_soc_card *card = rtd->card;
646 	int ret;
647 
648 	ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_speaker_widgets,
649 					ARRAY_SIZE(mt8195_speaker_widgets));
650 	if (ret) {
651 		dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
652 		/* Don't need to add routes if widget addition failed */
653 		return ret;
654 	}
655 
656 	ret = snd_soc_add_card_controls(card, mt8195_speaker_controls,
657 					ARRAY_SIZE(mt8195_speaker_controls));
658 	if (ret) {
659 		dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
660 		return ret;
661 	}
662 
663 	ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1019_routes,
664 				      ARRAY_SIZE(mt8195_rt1019_routes));
665 	if (ret)
666 		dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
667 
668 	return ret;
669 }
670 
671 static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
672 				       struct snd_pcm_hw_params *params)
673 {
674 	/* fix BE i2s format to S24_LE, clean param mask first */
675 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
676 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
677 
678 	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
679 
680 	return 0;
681 }
682 
683 static int mt8195_set_bias_level_post(struct snd_soc_card *card,
684 	struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
685 {
686 	struct snd_soc_component *component = dapm->component;
687 	struct mt8195_mt6359_priv *priv = snd_soc_card_get_drvdata(card);
688 	int ret;
689 
690 	/*
691 	 * It's required to control mclk directly in the set_bias_level_post
692 	 * function for rt5682 and rt5682s codec, or the unexpected pop happens
693 	 * at the end of playback.
694 	 */
695 	if (!component ||
696 	    (strcmp(component->name, RT5682_DEV0_NAME) &&
697 	    strcmp(component->name, RT5682S_DEV0_NAME)))
698 		return 0;
699 
700 	switch (level) {
701 	case SND_SOC_BIAS_OFF:
702 		if (!__clk_is_enabled(priv->i2so1_mclk))
703 			return 0;
704 
705 		clk_disable_unprepare(priv->i2so1_mclk);
706 		dev_dbg(card->dev, "Disable i2so1 mclk\n");
707 		break;
708 	case SND_SOC_BIAS_ON:
709 		ret = clk_prepare_enable(priv->i2so1_mclk);
710 		if (ret) {
711 			dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret);
712 			return ret;
713 		}
714 		dev_dbg(card->dev, "Enable i2so1 mclk\n");
715 		break;
716 	default:
717 		break;
718 	}
719 
720 	return 0;
721 }
722 
723 enum {
724 	DAI_LINK_DL2_FE,
725 	DAI_LINK_DL3_FE,
726 	DAI_LINK_DL6_FE,
727 	DAI_LINK_DL7_FE,
728 	DAI_LINK_DL8_FE,
729 	DAI_LINK_DL10_FE,
730 	DAI_LINK_DL11_FE,
731 	DAI_LINK_UL1_FE,
732 	DAI_LINK_UL2_FE,
733 	DAI_LINK_UL3_FE,
734 	DAI_LINK_UL4_FE,
735 	DAI_LINK_UL5_FE,
736 	DAI_LINK_UL6_FE,
737 	DAI_LINK_UL8_FE,
738 	DAI_LINK_UL9_FE,
739 	DAI_LINK_UL10_FE,
740 	DAI_LINK_DL_SRC_BE,
741 	DAI_LINK_DPTX_BE,
742 	DAI_LINK_ETDM1_IN_BE,
743 	DAI_LINK_ETDM2_IN_BE,
744 	DAI_LINK_ETDM1_OUT_BE,
745 	DAI_LINK_ETDM2_OUT_BE,
746 	DAI_LINK_ETDM3_OUT_BE,
747 	DAI_LINK_PCM1_BE,
748 	DAI_LINK_UL_SRC1_BE,
749 	DAI_LINK_UL_SRC2_BE,
750 	DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE,
751 	DAI_LINK_SOF_START,
752 	DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
753 	DAI_LINK_SOF_DL3_BE,
754 	DAI_LINK_SOF_UL4_BE,
755 	DAI_LINK_SOF_UL5_BE,
756 	DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
757 };
758 
759 #define	DAI_LINK_REGULAR_NUM	(DAI_LINK_REGULAR_LAST + 1)
760 
761 /* FE */
762 SND_SOC_DAILINK_DEFS(DL2_FE,
763 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
764 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
765 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
766 
767 SND_SOC_DAILINK_DEFS(DL3_FE,
768 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
769 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
770 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
771 
772 SND_SOC_DAILINK_DEFS(DL6_FE,
773 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
774 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
775 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
776 
777 SND_SOC_DAILINK_DEFS(DL7_FE,
778 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
779 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
780 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
781 
782 SND_SOC_DAILINK_DEFS(DL8_FE,
783 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
784 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
785 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
786 
787 SND_SOC_DAILINK_DEFS(DL10_FE,
788 		     DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
789 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
790 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
791 
792 SND_SOC_DAILINK_DEFS(DL11_FE,
793 		     DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
794 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
795 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
796 
797 SND_SOC_DAILINK_DEFS(UL1_FE,
798 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
799 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
800 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
801 
802 SND_SOC_DAILINK_DEFS(UL2_FE,
803 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
804 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
805 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
806 
807 SND_SOC_DAILINK_DEFS(UL3_FE,
808 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
809 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
810 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
811 
812 SND_SOC_DAILINK_DEFS(UL4_FE,
813 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
814 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
815 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
816 
817 SND_SOC_DAILINK_DEFS(UL5_FE,
818 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
819 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
820 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
821 
822 SND_SOC_DAILINK_DEFS(UL6_FE,
823 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
824 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
825 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
826 
827 SND_SOC_DAILINK_DEFS(UL8_FE,
828 		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
829 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
830 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
831 
832 SND_SOC_DAILINK_DEFS(UL9_FE,
833 		     DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
834 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
835 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
836 
837 SND_SOC_DAILINK_DEFS(UL10_FE,
838 		     DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
839 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
840 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
841 
842 /* BE */
843 SND_SOC_DAILINK_DEFS(DL_SRC_BE,
844 		     DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
845 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
846 						   "mt6359-snd-codec-aif1")),
847 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
848 
849 SND_SOC_DAILINK_DEFS(DPTX_BE,
850 		     DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
851 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
852 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
853 
854 SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
855 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
856 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
857 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
858 
859 SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
860 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
861 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
862 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
863 
864 SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
865 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
866 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
867 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
868 
869 SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
870 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
871 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
872 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
873 
874 SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE,
875 		     DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
876 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
877 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
878 
879 SND_SOC_DAILINK_DEFS(PCM1_BE,
880 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
881 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
882 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
883 
884 SND_SOC_DAILINK_DEFS(UL_SRC1_BE,
885 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")),
886 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
887 						   "mt6359-snd-codec-aif1"),
888 					COMP_CODEC("dmic-codec",
889 						   "dmic-hifi")),
890 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
891 
892 SND_SOC_DAILINK_DEFS(UL_SRC2_BE,
893 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")),
894 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
895 						   "mt6359-snd-codec-aif2")),
896 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
897 
898 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
899 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
900 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
901 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
902 
903 SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
904 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
905 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
906 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
907 
908 SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
909 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
910 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
911 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
912 
913 SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
914 		     DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
915 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
916 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
917 
918 /* codec */
919 SND_SOC_DAILINK_DEF(rt1019_comps,
920 		    DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME,
921 						  RT1019_CODEC_DAI)));
922 
923 SND_SOC_DAILINK_DEF(rt1011_comps,
924 		    DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME,
925 						  RT1011_CODEC_DAI),
926 				       COMP_CODEC(RT1011_DEV1_NAME,
927 						  RT1011_CODEC_DAI)));
928 
929 static const struct sof_conn_stream g_sof_conn_streams[] = {
930 	{ "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
931 	{ "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK},
932 	{ "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE},
933 	{ "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE},
934 };
935 
936 static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
937 	/* FE */
938 	[DAI_LINK_DL2_FE] = {
939 		.name = "DL2_FE",
940 		.stream_name = "DL2 Playback",
941 		.trigger = {
942 			SND_SOC_DPCM_TRIGGER_POST,
943 			SND_SOC_DPCM_TRIGGER_POST,
944 		},
945 		.dynamic = 1,
946 		.dpcm_playback = 1,
947 		.ops = &mt8195_playback_ops,
948 		SND_SOC_DAILINK_REG(DL2_FE),
949 	},
950 	[DAI_LINK_DL3_FE] = {
951 		.name = "DL3_FE",
952 		.stream_name = "DL3 Playback",
953 		.trigger = {
954 			SND_SOC_DPCM_TRIGGER_POST,
955 			SND_SOC_DPCM_TRIGGER_POST,
956 		},
957 		.dynamic = 1,
958 		.dpcm_playback = 1,
959 		.ops = &mt8195_playback_ops,
960 		SND_SOC_DAILINK_REG(DL3_FE),
961 	},
962 	[DAI_LINK_DL6_FE] = {
963 		.name = "DL6_FE",
964 		.stream_name = "DL6 Playback",
965 		.trigger = {
966 			SND_SOC_DPCM_TRIGGER_POST,
967 			SND_SOC_DPCM_TRIGGER_POST,
968 		},
969 		.dynamic = 1,
970 		.dpcm_playback = 1,
971 		.ops = &mt8195_playback_ops,
972 		SND_SOC_DAILINK_REG(DL6_FE),
973 	},
974 	[DAI_LINK_DL7_FE] = {
975 		.name = "DL7_FE",
976 		.stream_name = "DL7 Playback",
977 		.trigger = {
978 			SND_SOC_DPCM_TRIGGER_PRE,
979 			SND_SOC_DPCM_TRIGGER_PRE,
980 		},
981 		.dynamic = 1,
982 		.dpcm_playback = 1,
983 		SND_SOC_DAILINK_REG(DL7_FE),
984 	},
985 	[DAI_LINK_DL8_FE] = {
986 		.name = "DL8_FE",
987 		.stream_name = "DL8 Playback",
988 		.trigger = {
989 			SND_SOC_DPCM_TRIGGER_POST,
990 			SND_SOC_DPCM_TRIGGER_POST,
991 		},
992 		.dynamic = 1,
993 		.dpcm_playback = 1,
994 		.ops = &mt8195_playback_ops,
995 		SND_SOC_DAILINK_REG(DL8_FE),
996 	},
997 	[DAI_LINK_DL10_FE] = {
998 		.name = "DL10_FE",
999 		.stream_name = "DL10 Playback",
1000 		.trigger = {
1001 			SND_SOC_DPCM_TRIGGER_POST,
1002 			SND_SOC_DPCM_TRIGGER_POST,
1003 		},
1004 		.dynamic = 1,
1005 		.dpcm_playback = 1,
1006 		.ops = &mt8195_hdmitx_dptx_playback_ops,
1007 		SND_SOC_DAILINK_REG(DL10_FE),
1008 	},
1009 	[DAI_LINK_DL11_FE] = {
1010 		.name = "DL11_FE",
1011 		.stream_name = "DL11 Playback",
1012 		.trigger = {
1013 			SND_SOC_DPCM_TRIGGER_POST,
1014 			SND_SOC_DPCM_TRIGGER_POST,
1015 		},
1016 		.dynamic = 1,
1017 		.dpcm_playback = 1,
1018 		.ops = &mt8195_playback_ops,
1019 		SND_SOC_DAILINK_REG(DL11_FE),
1020 	},
1021 	[DAI_LINK_UL1_FE] = {
1022 		.name = "UL1_FE",
1023 		.stream_name = "UL1 Capture",
1024 		.trigger = {
1025 			SND_SOC_DPCM_TRIGGER_PRE,
1026 			SND_SOC_DPCM_TRIGGER_PRE,
1027 		},
1028 		.dynamic = 1,
1029 		.dpcm_capture = 1,
1030 		SND_SOC_DAILINK_REG(UL1_FE),
1031 	},
1032 	[DAI_LINK_UL2_FE] = {
1033 		.name = "UL2_FE",
1034 		.stream_name = "UL2 Capture",
1035 		.trigger = {
1036 			SND_SOC_DPCM_TRIGGER_POST,
1037 			SND_SOC_DPCM_TRIGGER_POST,
1038 		},
1039 		.dynamic = 1,
1040 		.dpcm_capture = 1,
1041 		.ops = &mt8195_capture_ops,
1042 		SND_SOC_DAILINK_REG(UL2_FE),
1043 	},
1044 	[DAI_LINK_UL3_FE] = {
1045 		.name = "UL3_FE",
1046 		.stream_name = "UL3 Capture",
1047 		.trigger = {
1048 			SND_SOC_DPCM_TRIGGER_POST,
1049 			SND_SOC_DPCM_TRIGGER_POST,
1050 		},
1051 		.dynamic = 1,
1052 		.dpcm_capture = 1,
1053 		.ops = &mt8195_capture_ops,
1054 		SND_SOC_DAILINK_REG(UL3_FE),
1055 	},
1056 	[DAI_LINK_UL4_FE] = {
1057 		.name = "UL4_FE",
1058 		.stream_name = "UL4 Capture",
1059 		.trigger = {
1060 			SND_SOC_DPCM_TRIGGER_POST,
1061 			SND_SOC_DPCM_TRIGGER_POST,
1062 		},
1063 		.dynamic = 1,
1064 		.dpcm_capture = 1,
1065 		.ops = &mt8195_capture_ops,
1066 		SND_SOC_DAILINK_REG(UL4_FE),
1067 	},
1068 	[DAI_LINK_UL5_FE] = {
1069 		.name = "UL5_FE",
1070 		.stream_name = "UL5 Capture",
1071 		.trigger = {
1072 			SND_SOC_DPCM_TRIGGER_POST,
1073 			SND_SOC_DPCM_TRIGGER_POST,
1074 		},
1075 		.dynamic = 1,
1076 		.dpcm_capture = 1,
1077 		.ops = &mt8195_capture_ops,
1078 		SND_SOC_DAILINK_REG(UL5_FE),
1079 	},
1080 	[DAI_LINK_UL6_FE] = {
1081 		.name = "UL6_FE",
1082 		.stream_name = "UL6 Capture",
1083 		.trigger = {
1084 			SND_SOC_DPCM_TRIGGER_PRE,
1085 			SND_SOC_DPCM_TRIGGER_PRE,
1086 		},
1087 		.dynamic = 1,
1088 		.dpcm_capture = 1,
1089 		SND_SOC_DAILINK_REG(UL6_FE),
1090 	},
1091 	[DAI_LINK_UL8_FE] = {
1092 		.name = "UL8_FE",
1093 		.stream_name = "UL8 Capture",
1094 		.trigger = {
1095 			SND_SOC_DPCM_TRIGGER_POST,
1096 			SND_SOC_DPCM_TRIGGER_POST,
1097 		},
1098 		.dynamic = 1,
1099 		.dpcm_capture = 1,
1100 		.ops = &mt8195_capture_ops,
1101 		SND_SOC_DAILINK_REG(UL8_FE),
1102 	},
1103 	[DAI_LINK_UL9_FE] = {
1104 		.name = "UL9_FE",
1105 		.stream_name = "UL9 Capture",
1106 		.trigger = {
1107 			SND_SOC_DPCM_TRIGGER_POST,
1108 			SND_SOC_DPCM_TRIGGER_POST,
1109 		},
1110 		.dynamic = 1,
1111 		.dpcm_capture = 1,
1112 		.ops = &mt8195_capture_ops,
1113 		SND_SOC_DAILINK_REG(UL9_FE),
1114 	},
1115 	[DAI_LINK_UL10_FE] = {
1116 		.name = "UL10_FE",
1117 		.stream_name = "UL10 Capture",
1118 		.trigger = {
1119 			SND_SOC_DPCM_TRIGGER_POST,
1120 			SND_SOC_DPCM_TRIGGER_POST,
1121 		},
1122 		.dynamic = 1,
1123 		.dpcm_capture = 1,
1124 		.ops = &mt8195_capture_ops,
1125 		SND_SOC_DAILINK_REG(UL10_FE),
1126 	},
1127 	/* BE */
1128 	[DAI_LINK_DL_SRC_BE] = {
1129 		.name = "DL_SRC_BE",
1130 		.no_pcm = 1,
1131 		.dpcm_playback = 1,
1132 		SND_SOC_DAILINK_REG(DL_SRC_BE),
1133 	},
1134 	[DAI_LINK_DPTX_BE] = {
1135 		.name = "DPTX_BE",
1136 		.no_pcm = 1,
1137 		.dpcm_playback = 1,
1138 		.ops = &mt8195_dptx_ops,
1139 		.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
1140 		SND_SOC_DAILINK_REG(DPTX_BE),
1141 	},
1142 	[DAI_LINK_ETDM1_IN_BE] = {
1143 		.name = "ETDM1_IN_BE",
1144 		.no_pcm = 1,
1145 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1146 			SND_SOC_DAIFMT_NB_NF |
1147 			SND_SOC_DAIFMT_CBS_CFS,
1148 		.dpcm_capture = 1,
1149 		SND_SOC_DAILINK_REG(ETDM1_IN_BE),
1150 	},
1151 	[DAI_LINK_ETDM2_IN_BE] = {
1152 		.name = "ETDM2_IN_BE",
1153 		.no_pcm = 1,
1154 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1155 			SND_SOC_DAIFMT_NB_NF |
1156 			SND_SOC_DAIFMT_CBS_CFS,
1157 		.dpcm_capture = 1,
1158 		.init = mt8195_rt5682_init,
1159 		.ops = &mt8195_rt5682_etdm_ops,
1160 		.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1161 		SND_SOC_DAILINK_REG(ETDM2_IN_BE),
1162 	},
1163 	[DAI_LINK_ETDM1_OUT_BE] = {
1164 		.name = "ETDM1_OUT_BE",
1165 		.no_pcm = 1,
1166 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1167 			SND_SOC_DAIFMT_NB_NF |
1168 			SND_SOC_DAIFMT_CBS_CFS,
1169 		.dpcm_playback = 1,
1170 		.ops = &mt8195_rt5682_etdm_ops,
1171 		.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1172 		SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
1173 	},
1174 	[DAI_LINK_ETDM2_OUT_BE] = {
1175 		.name = "ETDM2_OUT_BE",
1176 		.no_pcm = 1,
1177 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1178 			SND_SOC_DAIFMT_NB_NF |
1179 			SND_SOC_DAIFMT_CBS_CFS,
1180 		.dpcm_playback = 1,
1181 		SND_SOC_DAILINK_REG(ETDM2_OUT_BE),
1182 	},
1183 	[DAI_LINK_ETDM3_OUT_BE] = {
1184 		.name = "ETDM3_OUT_BE",
1185 		.no_pcm = 1,
1186 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1187 			SND_SOC_DAIFMT_NB_NF |
1188 			SND_SOC_DAIFMT_CBS_CFS,
1189 		.dpcm_playback = 1,
1190 		SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
1191 	},
1192 	[DAI_LINK_PCM1_BE] = {
1193 		.name = "PCM1_BE",
1194 		.no_pcm = 1,
1195 		.dai_fmt = SND_SOC_DAIFMT_I2S |
1196 			SND_SOC_DAIFMT_NB_NF |
1197 			SND_SOC_DAIFMT_CBS_CFS,
1198 		.dpcm_playback = 1,
1199 		.dpcm_capture = 1,
1200 		SND_SOC_DAILINK_REG(PCM1_BE),
1201 	},
1202 	[DAI_LINK_UL_SRC1_BE] = {
1203 		.name = "UL_SRC1_BE",
1204 		.no_pcm = 1,
1205 		.dpcm_capture = 1,
1206 		SND_SOC_DAILINK_REG(UL_SRC1_BE),
1207 	},
1208 	[DAI_LINK_UL_SRC2_BE] = {
1209 		.name = "UL_SRC2_BE",
1210 		.no_pcm = 1,
1211 		.dpcm_capture = 1,
1212 		SND_SOC_DAILINK_REG(UL_SRC2_BE),
1213 	},
1214 	/* SOF BE */
1215 	[DAI_LINK_SOF_DL2_BE] = {
1216 		.name = "AFE_SOF_DL2",
1217 		.no_pcm = 1,
1218 		.dpcm_playback = 1,
1219 		SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1220 	},
1221 	[DAI_LINK_SOF_DL3_BE] = {
1222 		.name = "AFE_SOF_DL3",
1223 		.no_pcm = 1,
1224 		.dpcm_playback = 1,
1225 		SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1226 	},
1227 	[DAI_LINK_SOF_UL4_BE] = {
1228 		.name = "AFE_SOF_UL4",
1229 		.no_pcm = 1,
1230 		.dpcm_capture = 1,
1231 		SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1232 	},
1233 	[DAI_LINK_SOF_UL5_BE] = {
1234 		.name = "AFE_SOF_UL5",
1235 		.no_pcm = 1,
1236 		.dpcm_capture = 1,
1237 		SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1238 	},
1239 };
1240 
1241 static struct snd_soc_codec_conf rt1011_codec_conf[] = {
1242 	{
1243 		.dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME),
1244 		.name_prefix = "Left",
1245 	},
1246 	{
1247 		.dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME),
1248 		.name_prefix = "Right",
1249 	},
1250 };
1251 
1252 static struct snd_soc_card mt8195_mt6359_soc_card = {
1253 	.owner = THIS_MODULE,
1254 	.dai_link = mt8195_mt6359_dai_links,
1255 	.num_links = ARRAY_SIZE(mt8195_mt6359_dai_links),
1256 	.controls = mt8195_mt6359_controls,
1257 	.num_controls = ARRAY_SIZE(mt8195_mt6359_controls),
1258 	.dapm_widgets = mt8195_mt6359_widgets,
1259 	.num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets),
1260 	.dapm_routes = mt8195_mt6359_routes,
1261 	.num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes),
1262 	.set_bias_level_post = mt8195_set_bias_level_post,
1263 };
1264 
1265 /* fixup the BE DAI link to match any values from topology */
1266 static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
1267 				 struct snd_pcm_hw_params *params)
1268 {
1269 	struct snd_soc_card *card = rtd->card;
1270 	struct snd_soc_dai_link *sof_dai_link = NULL;
1271 	struct snd_soc_pcm_runtime *runtime;
1272 	struct snd_soc_dai *cpu_dai;
1273 	int i, j, ret = 0;
1274 
1275 	for (i = 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) {
1276 		const struct sof_conn_stream *conn = &g_sof_conn_streams[i];
1277 
1278 		if (strcmp(rtd->dai_link->name, conn->normal_link))
1279 			continue;
1280 
1281 		for_each_card_rtds(card, runtime) {
1282 			if (strcmp(runtime->dai_link->name, conn->sof_link))
1283 				continue;
1284 
1285 			for_each_rtd_cpu_dais(runtime, j, cpu_dai) {
1286 				if (cpu_dai->stream_active[conn->stream_dir] > 0) {
1287 					sof_dai_link = runtime->dai_link;
1288 					break;
1289 				}
1290 			}
1291 			break;
1292 		}
1293 
1294 		if (sof_dai_link && sof_dai_link->be_hw_params_fixup)
1295 			ret = sof_dai_link->be_hw_params_fixup(runtime, params);
1296 
1297 		break;
1298 	}
1299 
1300 	if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") ||
1301 	    !strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) {
1302 		mt8195_etdm_hw_params_fixup(runtime, params);
1303 	}
1304 
1305 	return ret;
1306 }
1307 
1308 static int mt8195_mt6359_card_late_probe(struct snd_soc_card *card)
1309 {
1310 	struct snd_soc_pcm_runtime *runtime;
1311 	struct snd_soc_component *sof_comp = NULL;
1312 	int i;
1313 
1314 	/* 1. find sof component */
1315 	for_each_card_rtds(card, runtime) {
1316 		for (i = 0; i < runtime->num_components; i++) {
1317 			if (!runtime->components[i]->driver->name)
1318 				continue;
1319 			if (!strcmp(runtime->components[i]->driver->name, "sof-audio-component")) {
1320 				sof_comp = runtime->components[i];
1321 				break;
1322 			}
1323 		}
1324 	}
1325 
1326 	if (!sof_comp) {
1327 		dev_info(card->dev, " probe without component\n");
1328 		return 0;
1329 	}
1330 	/* 2. add route path and fixup callback */
1331 	for (i = 0; i < ARRAY_SIZE(g_sof_conn_streams); i++) {
1332 		const struct sof_conn_stream *conn = &g_sof_conn_streams[i];
1333 		struct snd_soc_pcm_runtime *sof_rtd = NULL;
1334 		struct snd_soc_pcm_runtime *normal_rtd = NULL;
1335 		struct snd_soc_pcm_runtime *rtd = NULL;
1336 
1337 		for_each_card_rtds(card, rtd) {
1338 			if (!strcmp(rtd->dai_link->name, conn->sof_link)) {
1339 				sof_rtd = rtd;
1340 				continue;
1341 			}
1342 			if (!strcmp(rtd->dai_link->name, conn->normal_link)) {
1343 				normal_rtd = rtd;
1344 				continue;
1345 			}
1346 			if (normal_rtd && sof_rtd)
1347 				break;
1348 		}
1349 		if (normal_rtd && sof_rtd) {
1350 			int j;
1351 			struct snd_soc_dai *cpu_dai;
1352 
1353 			for_each_rtd_cpu_dais(sof_rtd, j, cpu_dai) {
1354 				struct snd_soc_dapm_route route;
1355 				struct snd_soc_dapm_path *p = NULL;
1356 				struct snd_soc_dapm_widget *play_widget =
1357 					cpu_dai->playback_widget;
1358 				struct snd_soc_dapm_widget *cap_widget =
1359 					cpu_dai->capture_widget;
1360 				memset(&route, 0, sizeof(route));
1361 				if (conn->stream_dir == SNDRV_PCM_STREAM_CAPTURE &&
1362 				    cap_widget) {
1363 					snd_soc_dapm_widget_for_each_sink_path(cap_widget, p) {
1364 						route.source = conn->sof_dma;
1365 						route.sink = p->sink->name;
1366 						snd_soc_dapm_add_routes(&card->dapm, &route, 1);
1367 					}
1368 				} else if (conn->stream_dir == SNDRV_PCM_STREAM_PLAYBACK &&
1369 						play_widget){
1370 					snd_soc_dapm_widget_for_each_source_path(play_widget, p) {
1371 						route.source = p->source->name;
1372 						route.sink = conn->sof_dma;
1373 						snd_soc_dapm_add_routes(&card->dapm, &route, 1);
1374 					}
1375 				} else {
1376 					dev_err(cpu_dai->dev, "stream dir and widget not pair\n");
1377 				}
1378 			}
1379 			normal_rtd->dai_link->be_hw_params_fixup = mt8195_dai_link_fixup;
1380 		}
1381 	}
1382 
1383 	return 0;
1384 }
1385 
1386 static int mt8195_dailink_parse_of(struct snd_soc_card *card, struct device_node *np,
1387 				   const char *propname)
1388 {
1389 	struct device *dev = card->dev;
1390 	struct snd_soc_dai_link *link;
1391 	const char *dai_name = NULL;
1392 	int i, j, ret, num_links;
1393 
1394 	num_links = of_property_count_strings(np, "mediatek,dai-link");
1395 
1396 	if (num_links < 0 || num_links > ARRAY_SIZE(mt8195_mt6359_dai_links)) {
1397 		dev_dbg(dev, "number of dai-link is invalid\n");
1398 		return -EINVAL;
1399 	}
1400 
1401 	card->dai_link = devm_kcalloc(dev, num_links, sizeof(*link), GFP_KERNEL);
1402 	if (!card->dai_link)
1403 		return -ENOMEM;
1404 
1405 	card->num_links = 0;
1406 	link = card->dai_link;
1407 
1408 	for (i = 0; i < num_links; i++) {
1409 		ret = of_property_read_string_index(np, propname, i, &dai_name);
1410 		if (ret) {
1411 			dev_dbg(dev, "ASoC: Property '%s' index %d could not be read: %d\n",
1412 				propname, i, ret);
1413 			return -EINVAL;
1414 		}
1415 
1416 		for (j = 0; j < ARRAY_SIZE(mt8195_mt6359_dai_links); j++) {
1417 			if (!strcmp(dai_name, mt8195_mt6359_dai_links[j].name)) {
1418 				memcpy(link, &mt8195_mt6359_dai_links[j],
1419 				       sizeof(struct snd_soc_dai_link));
1420 				link++;
1421 				card->num_links++;
1422 				break;
1423 			}
1424 		}
1425 	}
1426 
1427 	if (card->num_links != num_links)
1428 		return -EINVAL;
1429 
1430 	return 0;
1431 }
1432 
1433 static int mt8195_mt6359_dev_probe(struct platform_device *pdev)
1434 {
1435 	struct snd_soc_card *card = &mt8195_mt6359_soc_card;
1436 	struct snd_soc_dai_link *dai_link;
1437 	struct mt8195_mt6359_priv *priv;
1438 	struct device_node *platform_node, *adsp_node, *dp_node, *hdmi_node;
1439 	struct mt8195_card_data *card_data;
1440 	int is5682s = 0;
1441 	int init6359 = 0;
1442 	int sof_on = 0;
1443 	int ret, i;
1444 
1445 	card_data = (struct mt8195_card_data *)of_device_get_match_data(&pdev->dev);
1446 	card->dev = &pdev->dev;
1447 
1448 	ret = snd_soc_of_parse_card_name(card, "model");
1449 	if (ret) {
1450 		dev_err(&pdev->dev, "%s new card name parsing error %d\n",
1451 			__func__, ret);
1452 		return ret;
1453 	}
1454 
1455 	if (!card->name)
1456 		card->name = card_data->name;
1457 
1458 	if (strstr(card->name, "_5682s"))
1459 		is5682s = 1;
1460 
1461 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1462 	if (!priv)
1463 		return -ENOMEM;
1464 
1465 	if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1466 		ret = mt8195_dailink_parse_of(card, pdev->dev.of_node,
1467 					      "mediatek,dai-link");
1468 		if (ret) {
1469 			dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1470 			return -EINVAL;
1471 		}
1472 	} else {
1473 		if (!sof_on)
1474 			card->num_links = DAI_LINK_REGULAR_NUM;
1475 	}
1476 
1477 	platform_node = of_parse_phandle(pdev->dev.of_node,
1478 					 "mediatek,platform", 0);
1479 	if (!platform_node) {
1480 		dev_dbg(&pdev->dev, "Property 'platform' missing or invalid\n");
1481 		return -EINVAL;
1482 	}
1483 
1484 	adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1485 	if (adsp_node)
1486 		sof_on = 1;
1487 
1488 	dp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,dptx-codec", 0);
1489 	hdmi_node = of_parse_phandle(pdev->dev.of_node,
1490 				     "mediatek,hdmi-codec", 0);
1491 
1492 	for_each_card_prelinks(card, i, dai_link) {
1493 		if (!dai_link->platforms->name) {
1494 			if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1495 				dai_link->platforms->of_node = adsp_node;
1496 			else
1497 				dai_link->platforms->of_node = platform_node;
1498 		}
1499 
1500 		if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1501 			if (!dp_node) {
1502 				dev_dbg(&pdev->dev, "No property 'dptx-codec'\n");
1503 			} else {
1504 				dai_link->codecs->of_node = dp_node;
1505 				dai_link->codecs->name = NULL;
1506 				dai_link->codecs->dai_name = "i2s-hifi";
1507 				dai_link->init = mt8195_dptx_codec_init;
1508 			}
1509 		} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1510 			if (!hdmi_node) {
1511 				dev_dbg(&pdev->dev, "No property 'hdmi-codec'\n");
1512 			} else {
1513 				dai_link->codecs->of_node = hdmi_node;
1514 				dai_link->codecs->name = NULL;
1515 				dai_link->codecs->dai_name = "i2s-hifi";
1516 				dai_link->init = mt8195_hdmi_codec_init;
1517 			}
1518 		} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1519 			   strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1520 			dai_link->codecs->name =
1521 				is5682s ? RT5682S_DEV0_NAME : RT5682_DEV0_NAME;
1522 			dai_link->codecs->dai_name =
1523 				is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1524 		} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1525 			   strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1526 			   strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1527 			if (!init6359) {
1528 				dai_link->init = mt8195_mt6359_init;
1529 				init6359 = 1;
1530 			}
1531 		} else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) {
1532 			switch (card_data->quirk) {
1533 			case RT1011_SPEAKER_AMP_PRESENT:
1534 				dai_link->codecs = rt1011_comps;
1535 				dai_link->num_codecs = ARRAY_SIZE(rt1011_comps);
1536 				dai_link->init = mt8195_rt1011_init;
1537 				dai_link->ops = &mt8195_rt1011_etdm_ops;
1538 				dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup;
1539 				card->codec_conf = rt1011_codec_conf;
1540 				card->num_configs = ARRAY_SIZE(rt1011_codec_conf);
1541 				break;
1542 			case RT1019_SPEAKER_AMP_PRESENT:
1543 				dai_link->codecs = rt1019_comps;
1544 				dai_link->num_codecs = ARRAY_SIZE(rt1019_comps);
1545 				dai_link->init = mt8195_rt1019_init;
1546 				break;
1547 			default:
1548 				break;
1549 			}
1550 		}
1551 	}
1552 
1553 	if (sof_on)
1554 		card->late_probe = mt8195_mt6359_card_late_probe;
1555 
1556 	snd_soc_card_set_drvdata(card, priv);
1557 
1558 	ret = devm_snd_soc_register_card(&pdev->dev, card);
1559 
1560 	of_node_put(platform_node);
1561 	of_node_put(adsp_node);
1562 	of_node_put(dp_node);
1563 	of_node_put(hdmi_node);
1564 	return ret;
1565 }
1566 
1567 static struct mt8195_card_data mt8195_mt6359_rt1019_rt5682_card = {
1568 	.name = "mt8195_r1019_5682",
1569 	.quirk = RT1019_SPEAKER_AMP_PRESENT,
1570 };
1571 
1572 static struct mt8195_card_data mt8195_mt6359_rt1011_rt5682_card = {
1573 	.name = "mt8195_r1011_5682",
1574 	.quirk = RT1011_SPEAKER_AMP_PRESENT,
1575 };
1576 
1577 #ifdef CONFIG_OF
1578 static const struct of_device_id mt8195_mt6359_dt_match[] = {
1579 	{
1580 		.compatible = "mediatek,mt8195_mt6359_rt1019_rt5682",
1581 		.data = &mt8195_mt6359_rt1019_rt5682_card,
1582 	},
1583 	{
1584 		.compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",
1585 		.data = &mt8195_mt6359_rt1011_rt5682_card,
1586 	},
1587 };
1588 #endif
1589 
1590 static const struct dev_pm_ops mt8195_mt6359_pm_ops = {
1591 	.poweroff = snd_soc_poweroff,
1592 	.restore = snd_soc_resume,
1593 };
1594 
1595 static struct platform_driver mt8195_mt6359_driver = {
1596 	.driver = {
1597 		.name = "mt8195_mt6359",
1598 #ifdef CONFIG_OF
1599 		.of_match_table = mt8195_mt6359_dt_match,
1600 #endif
1601 		.pm = &mt8195_mt6359_pm_ops,
1602 	},
1603 	.probe = mt8195_mt6359_dev_probe,
1604 };
1605 
1606 module_platform_driver(mt8195_mt6359_driver);
1607 
1608 /* Module information */
1609 MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver");
1610 MODULE_AUTHOR("Trevor Wu <trevor.wu@mediatek.com>");
1611 MODULE_AUTHOR("YC Hung <yc.hung@mediatek.com>");
1612 MODULE_LICENSE("GPL");
1613 MODULE_ALIAS("mt8195_mt6359 soc card");
1614