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