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