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