xref: /linux/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c (revision ae22a94997b8a03dcb3c922857c203246711f9d4)
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // mt8192-mt6359-rt1015-rt5682.c  --
4 //	MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver
5 //
6 // Copyright (c) 2020 MediaTek Inc.
7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
8 //
9 
10 #include <linux/input.h>
11 #include <linux/module.h>
12 #include <linux/of.h>
13 #include <linux/pm_runtime.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/rt5682.h>
17 #include <sound/soc.h>
18 
19 #include "../../codecs/mt6359.h"
20 #include "../../codecs/rt1015.h"
21 #include "../../codecs/rt5682.h"
22 #include "../common/mtk-afe-platform-driver.h"
23 #include "mt8192-afe-common.h"
24 #include "mt8192-afe-clk.h"
25 #include "mt8192-afe-gpio.h"
26 
27 #define DRIVER_NAME "mt8192_mt6359"
28 
29 #define RT1015_CODEC_DAI	"rt1015-aif"
30 #define RT1015_DEV0_NAME	"rt1015.1-0028"
31 #define RT1015_DEV1_NAME	"rt1015.1-0029"
32 
33 #define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682"
34 #define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682"
35 #define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s"
36 
37 #define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682"
38 #define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"
39 #define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"
40 
41 struct mt8192_mt6359_priv {
42 	struct snd_soc_jack headset_jack;
43 	struct snd_soc_jack hdmi_jack;
44 };
45 
46 /* Headset jack detection DAPM pins */
47 static struct snd_soc_jack_pin mt8192_jack_pins[] = {
48 	{
49 		.pin = "Headphone Jack",
50 		.mask = SND_JACK_HEADPHONE,
51 	},
52 	{
53 		.pin = "Headset Mic",
54 		.mask = SND_JACK_MICROPHONE,
55 	},
56 };
57 
58 static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
59 				       struct snd_pcm_hw_params *params)
60 {
61 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
62 	struct snd_soc_card *card = rtd->card;
63 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
64 	struct snd_soc_dai *codec_dai;
65 	unsigned int rate = params_rate(params);
66 	unsigned int mclk_fs_ratio = 128;
67 	unsigned int mclk_fs = rate * mclk_fs_ratio;
68 	int ret, i;
69 
70 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
71 		ret = snd_soc_dai_set_pll(codec_dai, 0,
72 					  RT1015_PLL_S_BCLK,
73 					  params_rate(params) * 64,
74 					  params_rate(params) * 256);
75 		if (ret) {
76 			dev_err(card->dev, "failed to set pll\n");
77 			return ret;
78 		}
79 
80 		ret = snd_soc_dai_set_sysclk(codec_dai,
81 					     RT1015_SCLK_S_PLL,
82 					     params_rate(params) * 256,
83 					     SND_SOC_CLOCK_IN);
84 		if (ret) {
85 			dev_err(card->dev, "failed to set sysclk\n");
86 			return ret;
87 		}
88 	}
89 
90 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
91 }
92 
93 static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream,
94 					struct snd_pcm_hw_params *params)
95 {
96 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
97 	struct snd_soc_card *card = rtd->card;
98 	struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
99 	struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
100 	unsigned int rate = params_rate(params);
101 	unsigned int mclk_fs_ratio = 128;
102 	unsigned int mclk_fs = rate * mclk_fs_ratio;
103 	int bitwidth;
104 	int ret;
105 
106 	bitwidth = snd_pcm_format_width(params_format(params));
107 	if (bitwidth < 0) {
108 		dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
109 		return bitwidth;
110 	}
111 
112 	ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
113 	if (ret) {
114 		dev_err(card->dev, "failed to set tdm slot\n");
115 		return ret;
116 	}
117 
118 	ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
119 				  RT5682_PLL1_S_BCLK1,
120 				  params_rate(params) * 64,
121 				  params_rate(params) * 512);
122 	if (ret) {
123 		dev_err(card->dev, "failed to set pll\n");
124 		return ret;
125 	}
126 
127 	ret = snd_soc_dai_set_sysclk(codec_dai,
128 				     RT5682_SCLK_S_PLL1,
129 				     params_rate(params) * 512,
130 				     SND_SOC_CLOCK_IN);
131 	if (ret) {
132 		dev_err(card->dev, "failed to set sysclk\n");
133 		return ret;
134 	}
135 
136 	return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
137 }
138 
139 static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {
140 	.hw_params = mt8192_rt1015_i2s_hw_params,
141 };
142 
143 static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = {
144 	.hw_params = mt8192_rt5682x_i2s_hw_params,
145 };
146 
147 static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
148 {
149 	struct snd_soc_component *cmpnt_afe =
150 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
151 	struct snd_soc_component *cmpnt_codec =
152 		snd_soc_rtd_to_codec(rtd, 0)->component;
153 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
154 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
155 	int phase;
156 	unsigned int monitor;
157 	int test_done_1, test_done_2, test_done_3;
158 	int cycle_1, cycle_2, cycle_3;
159 	int prev_cycle_1, prev_cycle_2, prev_cycle_3;
160 	int chosen_phase_1, chosen_phase_2, chosen_phase_3;
161 	int counter;
162 	int mtkaif_calib_ok;
163 
164 	pm_runtime_get_sync(afe->dev);
165 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
166 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
167 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
168 	mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
169 
170 	mt6359_mtkaif_calibration_enable(cmpnt_codec);
171 
172 	/* set clock protocol 2 */
173 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
174 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);
175 
176 	/* set test type to synchronizer pulse */
177 	regmap_update_bits(afe_priv->topckgen,
178 			   CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
179 
180 	mtkaif_calib_ok = true;
181 	afe_priv->mtkaif_calibration_num_phase = 42;	/* mt6359: 0 ~ 42 */
182 	afe_priv->mtkaif_chosen_phase[0] = -1;
183 	afe_priv->mtkaif_chosen_phase[1] = -1;
184 	afe_priv->mtkaif_chosen_phase[2] = -1;
185 
186 	for (phase = 0;
187 	     phase <= afe_priv->mtkaif_calibration_num_phase &&
188 	     mtkaif_calib_ok;
189 	     phase++) {
190 		mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
191 						    phase, phase, phase);
192 
193 		regmap_update_bits(afe_priv->topckgen,
194 				   CKSYS_AUD_TOP_CFG, 0x1, 0x1);
195 
196 		test_done_1 = 0;
197 		test_done_2 = 0;
198 		test_done_3 = 0;
199 		cycle_1 = -1;
200 		cycle_2 = -1;
201 		cycle_3 = -1;
202 		counter = 0;
203 		while (test_done_1 == 0 ||
204 		       test_done_2 == 0 ||
205 		       test_done_3 == 0) {
206 			regmap_read(afe_priv->topckgen,
207 				    CKSYS_AUD_TOP_MON, &monitor);
208 
209 			test_done_1 = (monitor >> 28) & 0x1;
210 			test_done_2 = (monitor >> 29) & 0x1;
211 			test_done_3 = (monitor >> 30) & 0x1;
212 			if (test_done_1 == 1)
213 				cycle_1 = monitor & 0xf;
214 
215 			if (test_done_2 == 1)
216 				cycle_2 = (monitor >> 4) & 0xf;
217 
218 			if (test_done_3 == 1)
219 				cycle_3 = (monitor >> 8) & 0xf;
220 
221 			/* handle if never test done */
222 			if (++counter > 10000) {
223 				dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
224 					__func__,
225 					cycle_1, cycle_2, cycle_3, monitor);
226 				mtkaif_calib_ok = false;
227 				break;
228 			}
229 		}
230 
231 		if (phase == 0) {
232 			prev_cycle_1 = cycle_1;
233 			prev_cycle_2 = cycle_2;
234 			prev_cycle_3 = cycle_3;
235 		}
236 
237 		if (cycle_1 != prev_cycle_1 &&
238 		    afe_priv->mtkaif_chosen_phase[0] < 0) {
239 			afe_priv->mtkaif_chosen_phase[0] = phase - 1;
240 			afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;
241 		}
242 
243 		if (cycle_2 != prev_cycle_2 &&
244 		    afe_priv->mtkaif_chosen_phase[1] < 0) {
245 			afe_priv->mtkaif_chosen_phase[1] = phase - 1;
246 			afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;
247 		}
248 
249 		if (cycle_3 != prev_cycle_3 &&
250 		    afe_priv->mtkaif_chosen_phase[2] < 0) {
251 			afe_priv->mtkaif_chosen_phase[2] = phase - 1;
252 			afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;
253 		}
254 
255 		regmap_update_bits(afe_priv->topckgen,
256 				   CKSYS_AUD_TOP_CFG, 0x1, 0x0);
257 
258 		if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&
259 		    afe_priv->mtkaif_chosen_phase[1] >= 0 &&
260 		    afe_priv->mtkaif_chosen_phase[2] >= 0)
261 			break;
262 	}
263 
264 	if (afe_priv->mtkaif_chosen_phase[0] < 0)
265 		chosen_phase_1 = 0;
266 	else
267 		chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];
268 
269 	if (afe_priv->mtkaif_chosen_phase[1] < 0)
270 		chosen_phase_2 = 0;
271 	else
272 		chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];
273 
274 	if (afe_priv->mtkaif_chosen_phase[2] < 0)
275 		chosen_phase_3 = 0;
276 	else
277 		chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];
278 
279 	mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
280 					    chosen_phase_1,
281 					    chosen_phase_2,
282 					    chosen_phase_3);
283 
284 	/* disable rx fifo */
285 	regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
286 
287 	mt6359_mtkaif_calibration_disable(cmpnt_codec);
288 
289 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
290 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
291 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
292 	mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
293 	pm_runtime_put(afe->dev);
294 
295 	dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
296 		__func__,
297 		afe_priv->mtkaif_chosen_phase[0],
298 		afe_priv->mtkaif_chosen_phase[1],
299 		afe_priv->mtkaif_chosen_phase[2]);
300 
301 	return 0;
302 }
303 
304 static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
305 {
306 	struct snd_soc_component *cmpnt_afe =
307 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
308 	struct snd_soc_component *cmpnt_codec =
309 		snd_soc_rtd_to_codec(rtd, 0)->component;
310 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
311 	struct mt8192_afe_private *afe_priv = afe->platform_priv;
312 
313 	/* set mtkaif protocol */
314 	mt6359_set_mtkaif_protocol(cmpnt_codec,
315 				   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
316 	afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;
317 
318 	/* mtkaif calibration */
319 	mt8192_mt6359_mtkaif_calibration(rtd);
320 
321 	return 0;
322 }
323 
324 static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
325 {
326 	struct snd_soc_component *cmpnt_afe =
327 		snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
328 	struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
329 	struct snd_soc_component *cmpnt_codec =
330 		snd_soc_rtd_to_codec(rtd, 0)->component;
331 	struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
332 	struct snd_soc_jack *jack = &priv->headset_jack;
333 	int ret;
334 
335 	ret = mt8192_dai_i2s_set_share(afe, "I2S8", "I2S9");
336 	if (ret) {
337 		dev_err(rtd->dev, "Failed to set up shared clocks\n");
338 		return ret;
339 	}
340 
341 	ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
342 				    SND_JACK_HEADSET | SND_JACK_BTN_0 |
343 				    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
344 				    SND_JACK_BTN_3,
345 				    jack, mt8192_jack_pins,
346 				    ARRAY_SIZE(mt8192_jack_pins));
347 	if (ret) {
348 		dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
349 		return ret;
350 	}
351 
352 	snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
353 	snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
354 	snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
355 	snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
356 
357 	return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
358 };
359 
360 static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)
361 {
362 	struct snd_soc_component *cmpnt_codec =
363 		snd_soc_rtd_to_codec(rtd, 0)->component;
364 	struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
365 	int ret;
366 
367 	ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
368 				    &priv->hdmi_jack);
369 	if (ret) {
370 		dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
371 		return ret;
372 	}
373 
374 	return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
375 }
376 
377 static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
378 				      struct snd_pcm_hw_params *params)
379 {
380 	/* fix BE i2s format to S24_LE, clean param mask first */
381 	snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
382 			     0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
383 
384 	params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
385 
386 	return 0;
387 }
388 
389 static int
390 mt8192_mt6359_cap1_startup(struct snd_pcm_substream *substream)
391 {
392 	static const unsigned int channels[] = {
393 		1, 2, 4
394 	};
395 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
396 		.count = ARRAY_SIZE(channels),
397 		.list = channels,
398 		.mask = 0,
399 	};
400 	static const unsigned int rates[] = {
401 		8000, 16000, 32000, 48000, 96000, 192000
402 	};
403 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
404 		.count = ARRAY_SIZE(rates),
405 		.list  = rates,
406 		.mask = 0,
407 	};
408 
409 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
410 	struct snd_pcm_runtime *runtime = substream->runtime;
411 	int ret;
412 
413 	ret = snd_pcm_hw_constraint_list(runtime, 0,
414 					 SNDRV_PCM_HW_PARAM_CHANNELS,
415 					 &constraints_channels);
416 	if (ret < 0) {
417 		dev_err(rtd->dev, "hw_constraint_list channels failed\n");
418 		return ret;
419 	}
420 
421 	ret = snd_pcm_hw_constraint_list(runtime, 0,
422 					 SNDRV_PCM_HW_PARAM_RATE,
423 					 &constraints_rates);
424 	if (ret < 0) {
425 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
426 		return ret;
427 	}
428 
429 	return 0;
430 }
431 
432 static const struct snd_soc_ops mt8192_mt6359_capture1_ops = {
433 	.startup = mt8192_mt6359_cap1_startup,
434 };
435 
436 static int
437 mt8192_mt6359_rt5682_startup(struct snd_pcm_substream *substream)
438 {
439 	static const unsigned int channels[] = {
440 		1, 2
441 	};
442 	static const struct snd_pcm_hw_constraint_list constraints_channels = {
443 		.count = ARRAY_SIZE(channels),
444 		.list = channels,
445 		.mask = 0,
446 	};
447 	static const unsigned int rates[] = {
448 		48000
449 	};
450 	static const struct snd_pcm_hw_constraint_list constraints_rates = {
451 		.count = ARRAY_SIZE(rates),
452 		.list  = rates,
453 		.mask = 0,
454 	};
455 
456 	struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
457 	struct snd_pcm_runtime *runtime = substream->runtime;
458 	int ret;
459 
460 	ret = snd_pcm_hw_constraint_list(runtime, 0,
461 					 SNDRV_PCM_HW_PARAM_CHANNELS,
462 					 &constraints_channels);
463 	if (ret < 0) {
464 		dev_err(rtd->dev, "hw_constraint_list channels failed\n");
465 		return ret;
466 	}
467 
468 	ret = snd_pcm_hw_constraint_list(runtime, 0,
469 					 SNDRV_PCM_HW_PARAM_RATE,
470 					 &constraints_rates);
471 	if (ret < 0) {
472 		dev_err(rtd->dev, "hw_constraint_list rate failed\n");
473 		return ret;
474 	}
475 
476 	return 0;
477 }
478 
479 static const struct snd_soc_ops mt8192_mt6359_rt5682_ops = {
480 	.startup = mt8192_mt6359_rt5682_startup,
481 };
482 
483 /* FE */
484 SND_SOC_DAILINK_DEFS(playback1,
485 		     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
486 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
487 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
488 
489 SND_SOC_DAILINK_DEFS(playback12,
490 		     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
491 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
492 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
493 
494 SND_SOC_DAILINK_DEFS(playback2,
495 		     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
496 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
497 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
498 
499 SND_SOC_DAILINK_DEFS(playback3,
500 		     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
501 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
502 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
503 
504 SND_SOC_DAILINK_DEFS(playback4,
505 		     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
506 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
507 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
508 
509 SND_SOC_DAILINK_DEFS(playback5,
510 		     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
511 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
512 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
513 
514 SND_SOC_DAILINK_DEFS(playback6,
515 		     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
516 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
517 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
518 
519 SND_SOC_DAILINK_DEFS(playback7,
520 		     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
521 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
522 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
523 
524 SND_SOC_DAILINK_DEFS(playback8,
525 		     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
526 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
527 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
528 
529 SND_SOC_DAILINK_DEFS(playback9,
530 		     DAILINK_COMP_ARRAY(COMP_CPU("DL9")),
531 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
532 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
533 
534 SND_SOC_DAILINK_DEFS(capture1,
535 		     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
536 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
537 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
538 
539 SND_SOC_DAILINK_DEFS(capture2,
540 		     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
541 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
542 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
543 
544 SND_SOC_DAILINK_DEFS(capture3,
545 		     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
546 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
547 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
548 
549 SND_SOC_DAILINK_DEFS(capture4,
550 		     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
551 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
552 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
553 
554 SND_SOC_DAILINK_DEFS(capture5,
555 		     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
556 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
557 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
558 
559 SND_SOC_DAILINK_DEFS(capture6,
560 		     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
561 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
562 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
563 
564 SND_SOC_DAILINK_DEFS(capture7,
565 		     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
566 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
567 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
568 
569 SND_SOC_DAILINK_DEFS(capture8,
570 		     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
571 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
572 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
573 
574 SND_SOC_DAILINK_DEFS(capture_mono1,
575 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
576 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
577 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
578 
579 SND_SOC_DAILINK_DEFS(capture_mono2,
580 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),
581 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
582 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
583 
584 SND_SOC_DAILINK_DEFS(capture_mono3,
585 		     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),
586 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
587 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
588 
589 SND_SOC_DAILINK_DEFS(playback_hdmi,
590 		     DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
591 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
592 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
593 
594 /* BE */
595 SND_SOC_DAILINK_DEFS(primary_codec,
596 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
597 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
598 						   "mt6359-snd-codec-aif1"),
599 					COMP_CODEC("dmic-codec",
600 						   "dmic-hifi")),
601 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
602 
603 SND_SOC_DAILINK_DEFS(primary_codec_ch34,
604 		     DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),
605 		     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
606 						   "mt6359-snd-codec-aif2")),
607 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
608 
609 SND_SOC_DAILINK_DEFS(ap_dmic,
610 		     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),
611 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
612 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
613 
614 SND_SOC_DAILINK_DEFS(ap_dmic_ch34,
615 		     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),
616 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
617 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
618 
619 SND_SOC_DAILINK_DEFS(i2s0,
620 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
621 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
622 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
623 
624 SND_SOC_DAILINK_DEFS(i2s1,
625 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
626 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
627 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
628 
629 SND_SOC_DAILINK_DEFS(i2s2,
630 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
631 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
632 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
633 
634 SND_SOC_DAILINK_DEFS(i2s3,
635 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
636 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
637 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
638 
639 SND_SOC_DAILINK_DEFS(i2s5,
640 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
641 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
642 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
643 
644 SND_SOC_DAILINK_DEFS(i2s6,
645 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),
646 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
647 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
648 
649 SND_SOC_DAILINK_DEFS(i2s7,
650 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),
651 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
652 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
653 
654 SND_SOC_DAILINK_DEFS(i2s8,
655 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),
656 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
657 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
658 
659 SND_SOC_DAILINK_DEFS(i2s9,
660 		     DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),
661 		     DAILINK_COMP_ARRAY(COMP_EMPTY()),
662 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
663 
664 SND_SOC_DAILINK_DEFS(connsys_i2s,
665 		     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
666 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
667 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
668 
669 SND_SOC_DAILINK_DEFS(pcm1,
670 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
671 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
672 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
673 
674 SND_SOC_DAILINK_DEFS(pcm2,
675 		     DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
676 		     DAILINK_COMP_ARRAY(COMP_DUMMY()),
677 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
678 
679 SND_SOC_DAILINK_DEFS(tdm,
680 		     DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
681 		     DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),
682 		     DAILINK_COMP_ARRAY(COMP_EMPTY()));
683 
684 static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
685 	/* Front End DAI links */
686 	{
687 		.name = "Playback_1",
688 		.stream_name = "Playback_1",
689 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
690 			    SND_SOC_DPCM_TRIGGER_PRE},
691 		.dynamic = 1,
692 		.dpcm_playback = 1,
693 		SND_SOC_DAILINK_REG(playback1),
694 	},
695 	{
696 		.name = "Playback_12",
697 		.stream_name = "Playback_12",
698 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
699 			    SND_SOC_DPCM_TRIGGER_PRE},
700 		.dynamic = 1,
701 		.dpcm_playback = 1,
702 		SND_SOC_DAILINK_REG(playback12),
703 	},
704 	{
705 		.name = "Playback_2",
706 		.stream_name = "Playback_2",
707 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
708 			    SND_SOC_DPCM_TRIGGER_PRE},
709 		.dynamic = 1,
710 		.dpcm_playback = 1,
711 		SND_SOC_DAILINK_REG(playback2),
712 	},
713 	{
714 		.name = "Playback_3",
715 		.stream_name = "Playback_3",
716 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
717 			    SND_SOC_DPCM_TRIGGER_PRE},
718 		.dynamic = 1,
719 		.dpcm_playback = 1,
720 		.ops = &mt8192_mt6359_rt5682_ops,
721 		SND_SOC_DAILINK_REG(playback3),
722 	},
723 	{
724 		.name = "Playback_4",
725 		.stream_name = "Playback_4",
726 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
727 			    SND_SOC_DPCM_TRIGGER_PRE},
728 		.dynamic = 1,
729 		.dpcm_playback = 1,
730 		SND_SOC_DAILINK_REG(playback4),
731 	},
732 	{
733 		.name = "Playback_5",
734 		.stream_name = "Playback_5",
735 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
736 			    SND_SOC_DPCM_TRIGGER_PRE},
737 		.dynamic = 1,
738 		.dpcm_playback = 1,
739 		SND_SOC_DAILINK_REG(playback5),
740 	},
741 	{
742 		.name = "Playback_6",
743 		.stream_name = "Playback_6",
744 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
745 			    SND_SOC_DPCM_TRIGGER_PRE},
746 		.dynamic = 1,
747 		.dpcm_playback = 1,
748 		SND_SOC_DAILINK_REG(playback6),
749 	},
750 	{
751 		.name = "Playback_7",
752 		.stream_name = "Playback_7",
753 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
754 			    SND_SOC_DPCM_TRIGGER_PRE},
755 		.dynamic = 1,
756 		.dpcm_playback = 1,
757 		SND_SOC_DAILINK_REG(playback7),
758 	},
759 	{
760 		.name = "Playback_8",
761 		.stream_name = "Playback_8",
762 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
763 			    SND_SOC_DPCM_TRIGGER_PRE},
764 		.dynamic = 1,
765 		.dpcm_playback = 1,
766 		SND_SOC_DAILINK_REG(playback8),
767 	},
768 	{
769 		.name = "Playback_9",
770 		.stream_name = "Playback_9",
771 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
772 			    SND_SOC_DPCM_TRIGGER_PRE},
773 		.dynamic = 1,
774 		.dpcm_playback = 1,
775 		SND_SOC_DAILINK_REG(playback9),
776 	},
777 	{
778 		.name = "Capture_1",
779 		.stream_name = "Capture_1",
780 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
781 			    SND_SOC_DPCM_TRIGGER_PRE},
782 		.dynamic = 1,
783 		.dpcm_capture = 1,
784 		.ops = &mt8192_mt6359_capture1_ops,
785 		SND_SOC_DAILINK_REG(capture1),
786 	},
787 	{
788 		.name = "Capture_2",
789 		.stream_name = "Capture_2",
790 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
791 			    SND_SOC_DPCM_TRIGGER_PRE},
792 		.dynamic = 1,
793 		.dpcm_capture = 1,
794 		.ops = &mt8192_mt6359_rt5682_ops,
795 		SND_SOC_DAILINK_REG(capture2),
796 	},
797 	{
798 		.name = "Capture_3",
799 		.stream_name = "Capture_3",
800 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
801 			    SND_SOC_DPCM_TRIGGER_PRE},
802 		.dynamic = 1,
803 		.dpcm_capture = 1,
804 		SND_SOC_DAILINK_REG(capture3),
805 	},
806 	{
807 		.name = "Capture_4",
808 		.stream_name = "Capture_4",
809 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
810 			    SND_SOC_DPCM_TRIGGER_PRE},
811 		.dynamic = 1,
812 		.dpcm_capture = 1,
813 		SND_SOC_DAILINK_REG(capture4),
814 	},
815 	{
816 		.name = "Capture_5",
817 		.stream_name = "Capture_5",
818 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
819 			    SND_SOC_DPCM_TRIGGER_PRE},
820 		.dynamic = 1,
821 		.dpcm_capture = 1,
822 		SND_SOC_DAILINK_REG(capture5),
823 	},
824 	{
825 		.name = "Capture_6",
826 		.stream_name = "Capture_6",
827 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
828 			    SND_SOC_DPCM_TRIGGER_PRE},
829 		.dynamic = 1,
830 		.dpcm_capture = 1,
831 		SND_SOC_DAILINK_REG(capture6),
832 	},
833 	{
834 		.name = "Capture_7",
835 		.stream_name = "Capture_7",
836 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
837 			    SND_SOC_DPCM_TRIGGER_PRE},
838 		.dynamic = 1,
839 		.dpcm_capture = 1,
840 		SND_SOC_DAILINK_REG(capture7),
841 	},
842 	{
843 		.name = "Capture_8",
844 		.stream_name = "Capture_8",
845 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
846 			    SND_SOC_DPCM_TRIGGER_PRE},
847 		.dynamic = 1,
848 		.dpcm_capture = 1,
849 		SND_SOC_DAILINK_REG(capture8),
850 	},
851 	{
852 		.name = "Capture_Mono_1",
853 		.stream_name = "Capture_Mono_1",
854 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
855 			    SND_SOC_DPCM_TRIGGER_PRE},
856 		.dynamic = 1,
857 		.dpcm_capture = 1,
858 		SND_SOC_DAILINK_REG(capture_mono1),
859 	},
860 	{
861 		.name = "Capture_Mono_2",
862 		.stream_name = "Capture_Mono_2",
863 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
864 			    SND_SOC_DPCM_TRIGGER_PRE},
865 		.dynamic = 1,
866 		.dpcm_capture = 1,
867 		SND_SOC_DAILINK_REG(capture_mono2),
868 	},
869 	{
870 		.name = "Capture_Mono_3",
871 		.stream_name = "Capture_Mono_3",
872 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
873 			    SND_SOC_DPCM_TRIGGER_PRE},
874 		.dynamic = 1,
875 		.dpcm_capture = 1,
876 		SND_SOC_DAILINK_REG(capture_mono3),
877 	},
878 	{
879 		.name = "playback_hdmi",
880 		.stream_name = "Playback_HDMI",
881 		.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
882 			    SND_SOC_DPCM_TRIGGER_PRE},
883 		.dynamic = 1,
884 		.dpcm_playback = 1,
885 		SND_SOC_DAILINK_REG(playback_hdmi),
886 	},
887 	/* Back End DAI links */
888 	{
889 		.name = "Primary Codec",
890 		.no_pcm = 1,
891 		.dpcm_playback = 1,
892 		.dpcm_capture = 1,
893 		.ignore_suspend = 1,
894 		.init = mt8192_mt6359_init,
895 		SND_SOC_DAILINK_REG(primary_codec),
896 	},
897 	{
898 		.name = "Primary Codec CH34",
899 		.no_pcm = 1,
900 		.dpcm_playback = 1,
901 		.dpcm_capture = 1,
902 		.ignore_suspend = 1,
903 		SND_SOC_DAILINK_REG(primary_codec_ch34),
904 	},
905 	{
906 		.name = "AP_DMIC",
907 		.no_pcm = 1,
908 		.dpcm_capture = 1,
909 		.ignore_suspend = 1,
910 		SND_SOC_DAILINK_REG(ap_dmic),
911 	},
912 	{
913 		.name = "AP_DMIC_CH34",
914 		.no_pcm = 1,
915 		.dpcm_capture = 1,
916 		.ignore_suspend = 1,
917 		SND_SOC_DAILINK_REG(ap_dmic_ch34),
918 	},
919 	{
920 		.name = "I2S0",
921 		.no_pcm = 1,
922 		.dpcm_capture = 1,
923 		.ignore_suspend = 1,
924 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
925 		SND_SOC_DAILINK_REG(i2s0),
926 	},
927 	{
928 		.name = "I2S1",
929 		.no_pcm = 1,
930 		.dpcm_playback = 1,
931 		.ignore_suspend = 1,
932 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
933 		SND_SOC_DAILINK_REG(i2s1),
934 	},
935 	{
936 		.name = "I2S2",
937 		.no_pcm = 1,
938 		.dpcm_capture = 1,
939 		.ignore_suspend = 1,
940 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
941 		SND_SOC_DAILINK_REG(i2s2),
942 	},
943 	{
944 		.name = "I2S3",
945 		.no_pcm = 1,
946 		.dpcm_playback = 1,
947 		.ignore_suspend = 1,
948 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
949 		SND_SOC_DAILINK_REG(i2s3),
950 	},
951 	{
952 		.name = "I2S5",
953 		.no_pcm = 1,
954 		.dpcm_playback = 1,
955 		.ignore_suspend = 1,
956 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
957 		SND_SOC_DAILINK_REG(i2s5),
958 	},
959 	{
960 		.name = "I2S6",
961 		.no_pcm = 1,
962 		.dpcm_capture = 1,
963 		.ignore_suspend = 1,
964 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
965 		SND_SOC_DAILINK_REG(i2s6),
966 	},
967 	{
968 		.name = "I2S7",
969 		.no_pcm = 1,
970 		.dpcm_playback = 1,
971 		.ignore_suspend = 1,
972 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
973 		SND_SOC_DAILINK_REG(i2s7),
974 	},
975 	{
976 		.name = "I2S8",
977 		.no_pcm = 1,
978 		.dpcm_capture = 1,
979 		.ignore_suspend = 1,
980 		.init = mt8192_rt5682_init,
981 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
982 		SND_SOC_DAILINK_REG(i2s8),
983 		.ops = &mt8192_rt5682x_i2s_ops,
984 	},
985 	{
986 		.name = "I2S9",
987 		.no_pcm = 1,
988 		.dpcm_playback = 1,
989 		.ignore_suspend = 1,
990 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
991 		SND_SOC_DAILINK_REG(i2s9),
992 		.ops = &mt8192_rt5682x_i2s_ops,
993 	},
994 	{
995 		.name = "CONNSYS_I2S",
996 		.no_pcm = 1,
997 		.dpcm_capture = 1,
998 		.ignore_suspend = 1,
999 		SND_SOC_DAILINK_REG(connsys_i2s),
1000 	},
1001 	{
1002 		.name = "PCM 1",
1003 		.no_pcm = 1,
1004 		.dpcm_playback = 1,
1005 		.dpcm_capture = 1,
1006 		.ignore_suspend = 1,
1007 		SND_SOC_DAILINK_REG(pcm1),
1008 	},
1009 	{
1010 		.name = "PCM 2",
1011 		.no_pcm = 1,
1012 		.dpcm_playback = 1,
1013 		.dpcm_capture = 1,
1014 		.ignore_suspend = 1,
1015 		SND_SOC_DAILINK_REG(pcm2),
1016 	},
1017 	{
1018 		.name = "TDM",
1019 		.no_pcm = 1,
1020 		.dai_fmt = SND_SOC_DAIFMT_DSP_A |
1021 			   SND_SOC_DAIFMT_IB_NF |
1022 			   SND_SOC_DAIFMT_CBM_CFM,
1023 		.dpcm_playback = 1,
1024 		.ignore_suspend = 1,
1025 		.be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
1026 		.ignore = 1,
1027 		.init = mt8192_mt6359_hdmi_init,
1028 		SND_SOC_DAILINK_REG(tdm),
1029 	},
1030 };
1031 
1032 static const struct snd_soc_dapm_widget
1033 mt8192_mt6359_rt1015_rt5682_widgets[] = {
1034 	SND_SOC_DAPM_SPK("Left Spk", NULL),
1035 	SND_SOC_DAPM_SPK("Right Spk", NULL),
1036 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
1037 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
1038 	SND_SOC_DAPM_OUTPUT("TDM Out"),
1039 };
1040 
1041 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
1042 	/* speaker */
1043 	{ "Left Spk", NULL, "Left SPO" },
1044 	{ "Right Spk", NULL, "Right SPO" },
1045 	/* headset */
1046 	{ "Headphone Jack", NULL, "HPOL" },
1047 	{ "Headphone Jack", NULL, "HPOR" },
1048 	{ "IN1P", NULL, "Headset Mic" },
1049 	/* TDM */
1050 	{ "TDM Out", NULL, "TDM" },
1051 };
1052 
1053 static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
1054 	SOC_DAPM_PIN_SWITCH("Left Spk"),
1055 	SOC_DAPM_PIN_SWITCH("Right Spk"),
1056 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1057 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
1058 };
1059 
1060 static struct snd_soc_codec_conf rt1015_amp_conf[] = {
1061 	{
1062 		.dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
1063 		.name_prefix = "Left",
1064 	},
1065 	{
1066 		.dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
1067 		.name_prefix = "Right",
1068 	},
1069 };
1070 
1071 static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {
1072 	.name = RT1015_RT5682_CARD_NAME,
1073 	.driver_name = DRIVER_NAME,
1074 	.owner = THIS_MODULE,
1075 	.dai_link = mt8192_mt6359_dai_links,
1076 	.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1077 	.controls = mt8192_mt6359_rt1015_rt5682_controls,
1078 	.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),
1079 	.dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,
1080 	.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),
1081 	.dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,
1082 	.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),
1083 	.codec_conf = rt1015_amp_conf,
1084 	.num_configs = ARRAY_SIZE(rt1015_amp_conf),
1085 };
1086 
1087 static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = {
1088 	SND_SOC_DAPM_SPK("Speakers", NULL),
1089 	SND_SOC_DAPM_HP("Headphone Jack", NULL),
1090 	SND_SOC_DAPM_MIC("Headset Mic", NULL),
1091 };
1092 
1093 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = {
1094 	/* speaker */
1095 	{ "Speakers", NULL, "Speaker" },
1096 	/* headset */
1097 	{ "Headphone Jack", NULL, "HPOL" },
1098 	{ "Headphone Jack", NULL, "HPOR" },
1099 	{ "IN1P", NULL, "Headset Mic" },
1100 };
1101 
1102 static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = {
1103 	SOC_DAPM_PIN_SWITCH("Speakers"),
1104 	SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1105 	SOC_DAPM_PIN_SWITCH("Headset Mic"),
1106 };
1107 
1108 static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = {
1109 	.driver_name = DRIVER_NAME,
1110 	.owner = THIS_MODULE,
1111 	.dai_link = mt8192_mt6359_dai_links,
1112 	.num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1113 	.controls = mt8192_mt6359_rt1015p_rt5682x_controls,
1114 	.num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls),
1115 	.dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets,
1116 	.num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets),
1117 	.dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes,
1118 	.num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes),
1119 };
1120 
1121 static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,
1122 					  struct snd_soc_dai_link *link,
1123 					  struct device_node *node,
1124 					  char *link_name)
1125 {
1126 	int ret;
1127 
1128 	if (node && strcmp(link->name, link_name) == 0) {
1129 		ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link);
1130 		if (ret < 0) {
1131 			dev_err_probe(card->dev, ret, "get dai link codecs fail\n");
1132 			return ret;
1133 		}
1134 	}
1135 
1136 	return 0;
1137 }
1138 
1139 static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
1140 {
1141 	struct snd_soc_card *card;
1142 	struct device_node *platform_node, *hdmi_codec, *headset_codec, *speaker_codec;
1143 	int ret, i;
1144 	struct snd_soc_dai_link *dai_link;
1145 	struct mt8192_mt6359_priv *priv;
1146 
1147 	card = (struct snd_soc_card *)of_device_get_match_data(&pdev->dev);
1148 	if (!card)
1149 		return -EINVAL;
1150 	card->dev = &pdev->dev;
1151 
1152 	if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682_OF_NAME))
1153 		card->name = RT1015P_RT5682_CARD_NAME;
1154 	else if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682S_OF_NAME))
1155 		card->name = RT1015P_RT5682S_CARD_NAME;
1156 	else
1157 		dev_dbg(&pdev->dev, "No need to set card name\n");
1158 
1159 	hdmi_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,hdmi-codec", 0);
1160 	if (!hdmi_codec)
1161 		dev_dbg(&pdev->dev, "The machine has no hdmi-codec\n");
1162 
1163 	platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1164 	if (!platform_node) {
1165 		ret = -EINVAL;
1166 		dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1167 		goto err_platform_node;
1168 	}
1169 
1170 	speaker_codec = of_get_child_by_name(pdev->dev.of_node, "speaker-codecs");
1171 	if (!speaker_codec) {
1172 		ret = -EINVAL;
1173 		dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1174 		goto err_speaker_codec;
1175 	}
1176 
1177 	headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1178 	if (!headset_codec) {
1179 		ret = -EINVAL;
1180 		dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1181 		goto err_headset_codec;
1182 	}
1183 
1184 	for_each_card_prelinks(card, i, dai_link) {
1185 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");
1186 		if (ret) {
1187 			dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1188 				      dai_link->name);
1189 			goto err_probe;
1190 		}
1191 
1192 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");
1193 		if (ret) {
1194 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1195 				      dai_link->name);
1196 			goto err_probe;
1197 		}
1198 
1199 		ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");
1200 		if (ret) {
1201 			dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1202 				      dai_link->name);
1203 			goto err_probe;
1204 		}
1205 
1206 		if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {
1207 			dai_link->codecs->of_node = hdmi_codec;
1208 			dai_link->ignore = 0;
1209 		}
1210 
1211 		if (dai_link->num_codecs && dai_link->codecs[0].dai_name &&
1212 		    strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
1213 			dai_link->ops = &mt8192_rt1015_i2s_ops;
1214 
1215 		if (!dai_link->platforms->name)
1216 			dai_link->platforms->of_node = platform_node;
1217 	}
1218 
1219 	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1220 	if (!priv) {
1221 		ret = -ENOMEM;
1222 		goto err_probe;
1223 	}
1224 	snd_soc_card_set_drvdata(card, priv);
1225 
1226 	ret = mt8192_afe_gpio_init(&pdev->dev);
1227 	if (ret) {
1228 		dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1229 		goto err_probe;
1230 	}
1231 
1232 	ret = devm_snd_soc_register_card(&pdev->dev, card);
1233 	if (ret)
1234 		dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1235 
1236 err_probe:
1237 	of_node_put(headset_codec);
1238 err_headset_codec:
1239 	of_node_put(speaker_codec);
1240 err_speaker_codec:
1241 	of_node_put(platform_node);
1242 err_platform_node:
1243 	of_node_put(hdmi_codec);
1244 	return ret;
1245 }
1246 
1247 #ifdef CONFIG_OF
1248 static const struct of_device_id mt8192_mt6359_dt_match[] = {
1249 	{
1250 		.compatible = RT1015_RT5682_OF_NAME,
1251 		.data = &mt8192_mt6359_rt1015_rt5682_card,
1252 	},
1253 	{
1254 		.compatible = RT1015P_RT5682_OF_NAME,
1255 		.data = &mt8192_mt6359_rt1015p_rt5682x_card,
1256 	},
1257 	{
1258 		.compatible = RT1015P_RT5682S_OF_NAME,
1259 		.data = &mt8192_mt6359_rt1015p_rt5682x_card,
1260 	},
1261 	{}
1262 };
1263 MODULE_DEVICE_TABLE(of, mt8192_mt6359_dt_match);
1264 #endif
1265 
1266 static const struct dev_pm_ops mt8192_mt6359_pm_ops = {
1267 	.poweroff = snd_soc_poweroff,
1268 	.restore = snd_soc_resume,
1269 };
1270 
1271 static struct platform_driver mt8192_mt6359_driver = {
1272 	.driver = {
1273 		.name = DRIVER_NAME,
1274 #ifdef CONFIG_OF
1275 		.of_match_table = mt8192_mt6359_dt_match,
1276 #endif
1277 		.pm = &mt8192_mt6359_pm_ops,
1278 	},
1279 	.probe = mt8192_mt6359_dev_probe,
1280 };
1281 
1282 module_platform_driver(mt8192_mt6359_driver);
1283 
1284 /* Module information */
1285 MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");
1286 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1287 MODULE_LICENSE("GPL v2");
1288 MODULE_ALIAS("mt8192_mt6359 soc card");
1289