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