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

source code of linux/sound/soc/mediatek/mt8195/mt8195-mt6359.c