1 // SPDX-License-Identifier: GPL-2.0
3 // mt8186-mt6366-rt1019-rt5682s.c
4 // -- MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver
6 // Copyright (c) 2022 MediaTek Inc.
7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
10 #include <linux/gpio.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/input.h>
13 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/pm_runtime.h>
16 #include <sound/jack.h>
17 #include <sound/pcm_params.h>
18 #include <sound/rt5682.h>
19 #include <sound/soc.h>
21 #include "../../codecs/mt6358.h"
22 #include "../../codecs/rt5682.h"
23 #include "../common/mtk-afe-platform-driver.h"
24 #include "../common/mtk-dsp-sof-common.h"
25 #include "../common/mtk-soc-card.h"
26 #include "mt8186-afe-common.h"
27 #include "mt8186-afe-clk.h"
28 #include "mt8186-afe-gpio.h"
29 #include "mt8186-mt6366-common.h"
31 #define RT1019_CODEC_DAI "HiFi"
32 #define RT1019_DEV0_NAME "rt1019p"
34 #define RT5682S_CODEC_DAI "rt5682s-aif1"
35 #define RT5682S_DEV0_NAME "rt5682s.5-001a"
37 #define SOF_DMA_DL1 "SOF_DMA_DL1"
38 #define SOF_DMA_DL2 "SOF_DMA_DL2"
39 #define SOF_DMA_UL1 "SOF_DMA_UL1"
40 #define SOF_DMA_UL2 "SOF_DMA_UL2"
42 struct mt8186_mt6366_rt1019_rt5682s_priv {
43 struct snd_soc_jack headset_jack, hdmi_jack;
44 struct gpio_desc *dmic_sel;
48 /* Headset jack detection DAPM pins */
49 static struct snd_soc_jack_pin mt8186_jack_pins[] = {
52 .mask = SND_JACK_HEADPHONE,
56 .mask = SND_JACK_MICROPHONE,
60 static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
62 .dlc = COMP_CODEC_CONF("mt6358-sound"),
63 .name_prefix = "Mt6366",
66 .dlc = COMP_CODEC_CONF("bt-sco"),
67 .name_prefix = "Mt8186 bt",
70 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
71 .name_prefix = "Mt8186 hdmi",
75 static int dmic_get(struct snd_kcontrol *kcontrol,
76 struct snd_ctl_elem_value *ucontrol)
78 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
79 struct mtk_soc_card_data *soc_card_data =
80 snd_soc_card_get_drvdata(dapm->card);
81 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
83 ucontrol->value.integer.value[0] = priv->dmic_switch;
87 static int dmic_set(struct snd_kcontrol *kcontrol,
88 struct snd_ctl_elem_value *ucontrol)
90 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
91 struct mtk_soc_card_data *soc_card_data =
92 snd_soc_card_get_drvdata(dapm->card);
93 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
95 priv->dmic_switch = ucontrol->value.integer.value[0];
97 gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
98 dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
104 static const char * const dmic_mux_text[] = {
109 static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
110 SND_SOC_NOPM, 0, dmic_mux_text);
112 static const struct snd_kcontrol_new mt8186_dmic_mux_control =
113 SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
116 static const struct snd_soc_dapm_widget dmic_widgets[] = {
117 SND_SOC_DAPM_MIC("DMIC", NULL),
118 SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),
121 static const struct snd_soc_dapm_route dmic_map[] = {
123 {"Dmic Mux", "Front Mic", "DMIC"},
124 {"Dmic Mux", "Rear Mic", "DMIC"},
127 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
129 struct snd_soc_card *card = rtd->card;
130 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
131 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
134 ret = mt8186_mt6366_init(rtd);
137 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
141 if (!priv->dmic_sel) {
142 dev_dbg(card->dev, "dmic_sel is null\n");
146 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
147 ARRAY_SIZE(dmic_widgets));
149 dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
150 /* Don't need to add routes if widget addition failed */
154 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
155 ARRAY_SIZE(dmic_map));
158 dev_err(card->dev, "DMic map addition failed: %d\n", ret);
163 static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
165 struct snd_soc_component *cmpnt_afe =
166 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
167 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
168 struct mtk_soc_card_data *soc_card_data =
169 snd_soc_card_get_drvdata(rtd->card);
170 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
171 struct snd_soc_jack *jack = &priv->headset_jack;
172 struct snd_soc_component *cmpnt_codec =
173 asoc_rtd_to_codec(rtd, 0)->component;
176 ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
178 dev_err(rtd->dev, "Failed to set up shared clocks\n");
182 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
183 SND_JACK_HEADSET | SND_JACK_BTN_0 |
184 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
186 jack, mt8186_jack_pins,
187 ARRAY_SIZE(mt8186_jack_pins));
189 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
193 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
194 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
195 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
196 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
198 return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
201 static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
202 struct snd_pcm_hw_params *params)
204 struct snd_soc_pcm_runtime *rtd = substream->private_data;
205 struct snd_soc_card *card = rtd->card;
206 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
207 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
208 unsigned int rate = params_rate(params);
209 unsigned int mclk_fs_ratio = 128;
210 unsigned int mclk_fs = rate * mclk_fs_ratio;
214 bitwidth = snd_pcm_format_width(params_format(params));
216 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
220 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
222 dev_err(card->dev, "failed to set tdm slot\n");
226 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
228 params_rate(params) * 64,
229 params_rate(params) * 512);
231 dev_err(card->dev, "failed to set pll\n");
235 ret = snd_soc_dai_set_sysclk(codec_dai,
237 params_rate(params) * 512,
240 dev_err(card->dev, "failed to set sysclk\n");
244 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
247 static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
248 .hw_params = mt8186_rt5682s_i2s_hw_params,
251 static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
253 struct snd_soc_component *cmpnt_afe =
254 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
255 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
256 struct snd_soc_component *cmpnt_codec =
257 asoc_rtd_to_codec(rtd, 0)->component;
258 struct mtk_soc_card_data *soc_card_data =
259 snd_soc_card_get_drvdata(rtd->card);
260 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
263 ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
265 dev_err(rtd->dev, "Failed to set up shared clocks\n");
269 ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack);
271 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
275 return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
278 static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
279 struct snd_pcm_hw_params *params,
280 snd_pcm_format_t fmt)
282 struct snd_interval *channels = hw_param_interval(params,
283 SNDRV_PCM_HW_PARAM_CHANNELS);
285 dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
287 /* fix BE i2s channel to 2 channel */
291 /* clean param mask first */
292 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
293 0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
295 params_set_format(params, fmt);
300 static int mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
301 struct snd_pcm_hw_params *params)
303 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
306 static int mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
307 struct snd_pcm_hw_params *params)
309 return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
312 /* fixup the BE DAI link to match any values from topology */
313 static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
314 struct snd_pcm_hw_params *params)
318 ret = mtk_sof_dai_link_fixup(rtd, params);
320 if (!strcmp(rtd->dai_link->name, "I2S0") ||
321 !strcmp(rtd->dai_link->name, "I2S1") ||
322 !strcmp(rtd->dai_link->name, "I2S2"))
323 mt8186_i2s_hw_params_fixup(rtd, params);
324 else if (!strcmp(rtd->dai_link->name, "I2S3"))
325 mt8186_it6505_i2s_hw_params_fixup(rtd, params);
330 static int mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream *substream)
332 static const unsigned int rates[] = {
335 static const unsigned int channels[] = {
338 static const struct snd_pcm_hw_constraint_list constraints_rates = {
339 .count = ARRAY_SIZE(rates),
343 static const struct snd_pcm_hw_constraint_list constraints_channels = {
344 .count = ARRAY_SIZE(channels),
349 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
350 struct snd_pcm_runtime *runtime = substream->runtime;
353 ret = snd_pcm_hw_constraint_list(runtime, 0,
354 SNDRV_PCM_HW_PARAM_RATE,
357 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
361 ret = snd_pcm_hw_constraint_list(runtime, 0,
362 SNDRV_PCM_HW_PARAM_CHANNELS,
363 &constraints_channels);
365 dev_err(rtd->dev, "hw_constraint_list channel failed\n");
372 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_playback_ops = {
373 .startup = mt8186_mt6366_rt1019_rt5682s_playback_startup,
376 static int mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream *substream)
378 static const unsigned int rates[] = {
381 static const unsigned int channels[] = {
384 static const struct snd_pcm_hw_constraint_list constraints_rates = {
385 .count = ARRAY_SIZE(rates),
389 static const struct snd_pcm_hw_constraint_list constraints_channels = {
390 .count = ARRAY_SIZE(channels),
395 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
396 struct snd_pcm_runtime *runtime = substream->runtime;
399 ret = snd_pcm_hw_constraint_list(runtime, 0,
400 SNDRV_PCM_HW_PARAM_RATE,
403 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
407 ret = snd_pcm_hw_constraint_list(runtime, 0,
408 SNDRV_PCM_HW_PARAM_CHANNELS,
409 &constraints_channels);
411 dev_err(rtd->dev, "hw_constraint_list channel failed\n");
418 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_capture_ops = {
419 .startup = mt8186_mt6366_rt1019_rt5682s_capture_startup,
423 SND_SOC_DAILINK_DEFS(playback1,
424 DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
425 DAILINK_COMP_ARRAY(COMP_DUMMY()),
426 DAILINK_COMP_ARRAY(COMP_EMPTY()));
428 SND_SOC_DAILINK_DEFS(playback12,
429 DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
430 DAILINK_COMP_ARRAY(COMP_DUMMY()),
431 DAILINK_COMP_ARRAY(COMP_EMPTY()));
433 SND_SOC_DAILINK_DEFS(playback2,
434 DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
435 DAILINK_COMP_ARRAY(COMP_DUMMY()),
436 DAILINK_COMP_ARRAY(COMP_EMPTY()));
438 SND_SOC_DAILINK_DEFS(playback3,
439 DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
440 DAILINK_COMP_ARRAY(COMP_DUMMY()),
441 DAILINK_COMP_ARRAY(COMP_EMPTY()));
443 SND_SOC_DAILINK_DEFS(playback4,
444 DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
445 DAILINK_COMP_ARRAY(COMP_DUMMY()),
446 DAILINK_COMP_ARRAY(COMP_EMPTY()));
448 SND_SOC_DAILINK_DEFS(playback5,
449 DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
450 DAILINK_COMP_ARRAY(COMP_DUMMY()),
451 DAILINK_COMP_ARRAY(COMP_EMPTY()));
453 SND_SOC_DAILINK_DEFS(playback6,
454 DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
455 DAILINK_COMP_ARRAY(COMP_DUMMY()),
456 DAILINK_COMP_ARRAY(COMP_EMPTY()));
458 SND_SOC_DAILINK_DEFS(playback7,
459 DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
460 DAILINK_COMP_ARRAY(COMP_DUMMY()),
461 DAILINK_COMP_ARRAY(COMP_EMPTY()));
463 SND_SOC_DAILINK_DEFS(playback8,
464 DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
465 DAILINK_COMP_ARRAY(COMP_DUMMY()),
466 DAILINK_COMP_ARRAY(COMP_EMPTY()));
468 SND_SOC_DAILINK_DEFS(capture1,
469 DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
470 DAILINK_COMP_ARRAY(COMP_DUMMY()),
471 DAILINK_COMP_ARRAY(COMP_EMPTY()));
473 SND_SOC_DAILINK_DEFS(capture2,
474 DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
475 DAILINK_COMP_ARRAY(COMP_DUMMY()),
476 DAILINK_COMP_ARRAY(COMP_EMPTY()));
478 SND_SOC_DAILINK_DEFS(capture3,
479 DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
480 DAILINK_COMP_ARRAY(COMP_DUMMY()),
481 DAILINK_COMP_ARRAY(COMP_EMPTY()));
483 SND_SOC_DAILINK_DEFS(capture4,
484 DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
485 DAILINK_COMP_ARRAY(COMP_DUMMY()),
486 DAILINK_COMP_ARRAY(COMP_EMPTY()));
488 SND_SOC_DAILINK_DEFS(capture5,
489 DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
490 DAILINK_COMP_ARRAY(COMP_DUMMY()),
491 DAILINK_COMP_ARRAY(COMP_EMPTY()));
493 SND_SOC_DAILINK_DEFS(capture6,
494 DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
495 DAILINK_COMP_ARRAY(COMP_DUMMY()),
496 DAILINK_COMP_ARRAY(COMP_EMPTY()));
498 SND_SOC_DAILINK_DEFS(capture7,
499 DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
500 DAILINK_COMP_ARRAY(COMP_DUMMY()),
501 DAILINK_COMP_ARRAY(COMP_EMPTY()));
504 SND_SOC_DAILINK_DEFS(hostless_lpbk,
505 DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
506 DAILINK_COMP_ARRAY(COMP_DUMMY()),
507 DAILINK_COMP_ARRAY(COMP_EMPTY()));
508 SND_SOC_DAILINK_DEFS(hostless_fm,
509 DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
510 DAILINK_COMP_ARRAY(COMP_DUMMY()),
511 DAILINK_COMP_ARRAY(COMP_EMPTY()));
512 SND_SOC_DAILINK_DEFS(hostless_src1,
513 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),
514 DAILINK_COMP_ARRAY(COMP_DUMMY()),
515 DAILINK_COMP_ARRAY(COMP_EMPTY()));
516 SND_SOC_DAILINK_DEFS(hostless_src_bargein,
517 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),
518 DAILINK_COMP_ARRAY(COMP_DUMMY()),
519 DAILINK_COMP_ARRAY(COMP_EMPTY()));
522 SND_SOC_DAILINK_DEFS(adda,
523 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
524 DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
525 "mt6358-snd-codec-aif1"),
526 COMP_CODEC("dmic-codec",
528 DAILINK_COMP_ARRAY(COMP_EMPTY()));
529 SND_SOC_DAILINK_DEFS(i2s0,
530 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
531 DAILINK_COMP_ARRAY(COMP_EMPTY()),
532 DAILINK_COMP_ARRAY(COMP_EMPTY()));
533 SND_SOC_DAILINK_DEFS(i2s1,
534 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
535 DAILINK_COMP_ARRAY(COMP_EMPTY()),
536 DAILINK_COMP_ARRAY(COMP_EMPTY()));
537 SND_SOC_DAILINK_DEFS(i2s2,
538 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
539 DAILINK_COMP_ARRAY(COMP_DUMMY()),
540 DAILINK_COMP_ARRAY(COMP_EMPTY()));
541 SND_SOC_DAILINK_DEFS(i2s3,
542 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
543 DAILINK_COMP_ARRAY(COMP_EMPTY()),
544 DAILINK_COMP_ARRAY(COMP_EMPTY()));
545 SND_SOC_DAILINK_DEFS(hw_gain1,
546 DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),
547 DAILINK_COMP_ARRAY(COMP_DUMMY()),
548 DAILINK_COMP_ARRAY(COMP_EMPTY()));
549 SND_SOC_DAILINK_DEFS(hw_gain2,
550 DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),
551 DAILINK_COMP_ARRAY(COMP_DUMMY()),
552 DAILINK_COMP_ARRAY(COMP_EMPTY()));
553 SND_SOC_DAILINK_DEFS(hw_src1,
554 DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),
555 DAILINK_COMP_ARRAY(COMP_DUMMY()),
556 DAILINK_COMP_ARRAY(COMP_EMPTY()));
557 SND_SOC_DAILINK_DEFS(hw_src2,
558 DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),
559 DAILINK_COMP_ARRAY(COMP_DUMMY()),
560 DAILINK_COMP_ARRAY(COMP_EMPTY()));
561 SND_SOC_DAILINK_DEFS(connsys_i2s,
562 DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
563 DAILINK_COMP_ARRAY(COMP_DUMMY()),
564 DAILINK_COMP_ARRAY(COMP_EMPTY()));
565 SND_SOC_DAILINK_DEFS(pcm1,
566 DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
567 DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
568 DAILINK_COMP_ARRAY(COMP_EMPTY()));
569 SND_SOC_DAILINK_DEFS(tdm_in,
570 DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
571 DAILINK_COMP_ARRAY(COMP_DUMMY()),
572 DAILINK_COMP_ARRAY(COMP_EMPTY()));
575 SND_SOC_DAILINK_DEFS(hostless_ul1,
576 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
577 DAILINK_COMP_ARRAY(COMP_DUMMY()),
578 DAILINK_COMP_ARRAY(COMP_EMPTY()));
579 SND_SOC_DAILINK_DEFS(hostless_ul2,
580 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
581 DAILINK_COMP_ARRAY(COMP_DUMMY()),
582 DAILINK_COMP_ARRAY(COMP_EMPTY()));
583 SND_SOC_DAILINK_DEFS(hostless_ul3,
584 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
585 DAILINK_COMP_ARRAY(COMP_DUMMY()),
586 DAILINK_COMP_ARRAY(COMP_EMPTY()));
587 SND_SOC_DAILINK_DEFS(hostless_ul5,
588 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
589 DAILINK_COMP_ARRAY(COMP_DUMMY()),
590 DAILINK_COMP_ARRAY(COMP_EMPTY()));
591 SND_SOC_DAILINK_DEFS(hostless_ul6,
592 DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
593 DAILINK_COMP_ARRAY(COMP_DUMMY()),
594 DAILINK_COMP_ARRAY(COMP_EMPTY()));
595 SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,
596 DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
597 DAILINK_COMP_ARRAY(COMP_DUMMY()),
598 DAILINK_COMP_ARRAY(COMP_EMPTY()));
599 SND_SOC_DAILINK_DEFS(hostless_src_aaudio,
600 DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
601 DAILINK_COMP_ARRAY(COMP_DUMMY()),
602 DAILINK_COMP_ARRAY(COMP_EMPTY()));
603 SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,
604 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),
605 DAILINK_COMP_ARRAY(COMP_DUMMY()),
606 DAILINK_COMP_ARRAY(COMP_EMPTY()));
608 SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
609 DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
610 DAILINK_COMP_ARRAY(COMP_DUMMY()),
611 DAILINK_COMP_ARRAY(COMP_EMPTY()));
613 SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,
614 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),
615 DAILINK_COMP_ARRAY(COMP_DUMMY()),
616 DAILINK_COMP_ARRAY(COMP_EMPTY()));
618 SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,
619 DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),
620 DAILINK_COMP_ARRAY(COMP_DUMMY()),
621 DAILINK_COMP_ARRAY(COMP_EMPTY()));
623 static const struct sof_conn_stream g_sof_conn_streams[] = {
624 { "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},
625 { "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
626 { "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},
627 { "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},
630 static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
631 /* Front End DAI links */
633 .name = "Playback_1",
634 .stream_name = "Playback_1",
635 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
636 SND_SOC_DPCM_TRIGGER_PRE},
639 .dpcm_merged_format = 1,
640 .dpcm_merged_chan = 1,
641 .dpcm_merged_rate = 1,
642 .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
643 SND_SOC_DAILINK_REG(playback1),
646 .name = "Playback_12",
647 .stream_name = "Playback_12",
648 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
649 SND_SOC_DPCM_TRIGGER_PRE},
652 SND_SOC_DAILINK_REG(playback12),
655 .name = "Playback_2",
656 .stream_name = "Playback_2",
657 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
658 SND_SOC_DPCM_TRIGGER_PRE},
661 .dpcm_merged_format = 1,
662 .dpcm_merged_chan = 1,
663 .dpcm_merged_rate = 1,
664 SND_SOC_DAILINK_REG(playback2),
667 .name = "Playback_3",
668 .stream_name = "Playback_3",
669 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
670 SND_SOC_DPCM_TRIGGER_PRE},
673 .dpcm_merged_format = 1,
674 .dpcm_merged_chan = 1,
675 .dpcm_merged_rate = 1,
676 .ops = &mt8186_mt6366_rt1019_rt5682s_playback_ops,
677 SND_SOC_DAILINK_REG(playback3),
680 .name = "Playback_4",
681 .stream_name = "Playback_4",
682 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
683 SND_SOC_DPCM_TRIGGER_PRE},
686 SND_SOC_DAILINK_REG(playback4),
689 .name = "Playback_5",
690 .stream_name = "Playback_5",
691 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
692 SND_SOC_DPCM_TRIGGER_PRE},
695 SND_SOC_DAILINK_REG(playback5),
698 .name = "Playback_6",
699 .stream_name = "Playback_6",
700 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
701 SND_SOC_DPCM_TRIGGER_PRE},
704 SND_SOC_DAILINK_REG(playback6),
707 .name = "Playback_7",
708 .stream_name = "Playback_7",
709 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
710 SND_SOC_DPCM_TRIGGER_PRE},
713 SND_SOC_DAILINK_REG(playback7),
716 .name = "Playback_8",
717 .stream_name = "Playback_8",
718 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
719 SND_SOC_DPCM_TRIGGER_PRE},
722 SND_SOC_DAILINK_REG(playback8),
726 .stream_name = "Capture_1",
727 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
728 SND_SOC_DPCM_TRIGGER_PRE},
731 SND_SOC_DAILINK_REG(capture1),
735 .stream_name = "Capture_2",
736 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
737 SND_SOC_DPCM_TRIGGER_PRE},
740 .dpcm_merged_format = 1,
741 .dpcm_merged_chan = 1,
742 .dpcm_merged_rate = 1,
743 .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
744 SND_SOC_DAILINK_REG(capture2),
748 .stream_name = "Capture_3",
749 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
750 SND_SOC_DPCM_TRIGGER_PRE},
753 SND_SOC_DAILINK_REG(capture3),
757 .stream_name = "Capture_4",
758 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
759 SND_SOC_DPCM_TRIGGER_PRE},
762 .dpcm_merged_format = 1,
763 .dpcm_merged_chan = 1,
764 .dpcm_merged_rate = 1,
765 .ops = &mt8186_mt6366_rt1019_rt5682s_capture_ops,
766 SND_SOC_DAILINK_REG(capture4),
770 .stream_name = "Capture_5",
771 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
772 SND_SOC_DPCM_TRIGGER_PRE},
775 SND_SOC_DAILINK_REG(capture5),
779 .stream_name = "Capture_6",
780 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
781 SND_SOC_DPCM_TRIGGER_PRE},
784 .dpcm_merged_format = 1,
785 .dpcm_merged_chan = 1,
786 .dpcm_merged_rate = 1,
787 SND_SOC_DAILINK_REG(capture6),
791 .stream_name = "Capture_7",
792 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
793 SND_SOC_DPCM_TRIGGER_PRE},
796 SND_SOC_DAILINK_REG(capture7),
799 .name = "Hostless_LPBK",
800 .stream_name = "Hostless_LPBK",
801 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
802 SND_SOC_DPCM_TRIGGER_PRE},
807 SND_SOC_DAILINK_REG(hostless_lpbk),
810 .name = "Hostless_FM",
811 .stream_name = "Hostless_FM",
812 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
813 SND_SOC_DPCM_TRIGGER_PRE},
818 SND_SOC_DAILINK_REG(hostless_fm),
821 .name = "Hostless_SRC_1",
822 .stream_name = "Hostless_SRC_1",
823 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
824 SND_SOC_DPCM_TRIGGER_PRE},
829 SND_SOC_DAILINK_REG(hostless_src1),
832 .name = "Hostless_SRC_Bargein",
833 .stream_name = "Hostless_SRC_Bargein",
834 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
835 SND_SOC_DPCM_TRIGGER_PRE},
840 SND_SOC_DAILINK_REG(hostless_src_bargein),
843 .name = "Hostless_HW_Gain_AAudio",
844 .stream_name = "Hostless_HW_Gain_AAudio",
845 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
846 SND_SOC_DPCM_TRIGGER_PRE},
850 SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
853 .name = "Hostless_SRC_AAudio",
854 .stream_name = "Hostless_SRC_AAudio",
855 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
856 SND_SOC_DPCM_TRIGGER_PRE},
861 SND_SOC_DAILINK_REG(hostless_src_aaudio),
863 /* Back End DAI links */
865 .name = "Primary Codec",
870 .init = primary_codec_init,
871 SND_SOC_DAILINK_REG(adda),
876 .dai_fmt = SND_SOC_DAIFMT_I2S |
877 SND_SOC_DAIFMT_IB_IF |
878 SND_SOC_DAIFMT_CBM_CFM,
881 .init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,
882 .be_hw_params_fixup = mt8186_it6505_i2s_hw_params_fixup,
883 SND_SOC_DAILINK_REG(i2s3),
890 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
891 .ops = &mt8186_rt5682s_i2s_ops,
892 SND_SOC_DAILINK_REG(i2s0),
899 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
900 .init = mt8186_rt5682s_init,
901 .ops = &mt8186_rt5682s_i2s_ops,
902 SND_SOC_DAILINK_REG(i2s1),
909 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
910 SND_SOC_DAILINK_REG(i2s2),
918 SND_SOC_DAILINK_REG(hw_gain1),
926 SND_SOC_DAILINK_REG(hw_gain2),
934 SND_SOC_DAILINK_REG(hw_src1),
942 SND_SOC_DAILINK_REG(hw_src2),
945 .name = "CONNSYS_I2S",
949 SND_SOC_DAILINK_REG(connsys_i2s),
953 .dai_fmt = SND_SOC_DAIFMT_I2S |
954 SND_SOC_DAIFMT_NB_IF,
959 SND_SOC_DAILINK_REG(pcm1),
966 SND_SOC_DAILINK_REG(tdm_in),
968 /* dummy BE for ul memif to record from dl memif */
970 .name = "Hostless_UL1",
974 SND_SOC_DAILINK_REG(hostless_ul1),
977 .name = "Hostless_UL2",
981 SND_SOC_DAILINK_REG(hostless_ul2),
984 .name = "Hostless_UL3",
988 SND_SOC_DAILINK_REG(hostless_ul3),
991 .name = "Hostless_UL5",
995 SND_SOC_DAILINK_REG(hostless_ul5),
998 .name = "Hostless_UL6",
1001 .ignore_suspend = 1,
1002 SND_SOC_DAILINK_REG(hostless_ul6),
1006 .name = "AFE_SOF_DL1",
1009 SND_SOC_DAILINK_REG(AFE_SOF_DL1),
1012 .name = "AFE_SOF_DL2",
1015 SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1018 .name = "AFE_SOF_UL1",
1021 SND_SOC_DAILINK_REG(AFE_SOF_UL1),
1024 .name = "AFE_SOF_UL2",
1027 SND_SOC_DAILINK_REG(AFE_SOF_UL2),
1031 static const struct snd_soc_dapm_widget
1032 mt8186_mt6366_rt1019_rt5682s_widgets[] = {
1033 SND_SOC_DAPM_SPK("Speakers", NULL),
1034 SND_SOC_DAPM_HP("Headphone", NULL),
1035 SND_SOC_DAPM_MIC("Headset Mic", NULL),
1036 SND_SOC_DAPM_OUTPUT("HDMI1"),
1037 SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1038 SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1039 SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1040 SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1043 static const struct snd_soc_dapm_route
1044 mt8186_mt6366_rt1019_rt5682s_routes[] = {
1046 { "Speakers", NULL, "Speaker" },
1048 { "Headphone", NULL, "HPOL" },
1049 { "Headphone", NULL, "HPOR" },
1050 { "IN1P", NULL, "Headset Mic" },
1052 { "HDMI1", NULL, "TX" },
1054 {SOF_DMA_UL1, NULL, "UL1_CH1"},
1055 {SOF_DMA_UL1, NULL, "UL1_CH2"},
1056 {SOF_DMA_UL2, NULL, "UL2_CH1"},
1057 {SOF_DMA_UL2, NULL, "UL2_CH2"},
1059 {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1060 {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1063 static const struct snd_kcontrol_new
1064 mt8186_mt6366_rt1019_rt5682s_controls[] = {
1065 SOC_DAPM_PIN_SWITCH("Speakers"),
1066 SOC_DAPM_PIN_SWITCH("Headphone"),
1067 SOC_DAPM_PIN_SWITCH("Headset Mic"),
1068 SOC_DAPM_PIN_SWITCH("HDMI1"),
1071 static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
1072 .name = "mt8186_rt1019_rt5682s",
1073 .owner = THIS_MODULE,
1074 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1075 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1076 .controls = mt8186_mt6366_rt1019_rt5682s_controls,
1077 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1078 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1079 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1080 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1081 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1082 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1083 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1086 static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
1087 .name = "mt8186_rt5682s_max98360",
1088 .owner = THIS_MODULE,
1089 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1090 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1091 .controls = mt8186_mt6366_rt1019_rt5682s_controls,
1092 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1093 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1094 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1095 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1096 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1097 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1098 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1101 static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
1103 struct snd_soc_card *card;
1104 struct snd_soc_dai_link *dai_link;
1105 struct mtk_soc_card_data *soc_card_data;
1106 struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
1107 struct device_node *platform_node, *headset_codec, *playback_codec, *adsp_node;
1111 card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
1114 card->dev = &pdev->dev;
1116 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
1119 mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
1123 soc_card_data->mach_priv = mach_priv;
1125 mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev,
1126 "dmic", GPIOD_OUT_LOW);
1127 if (IS_ERR(mach_priv->dmic_sel)) {
1128 dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n",
1129 PTR_ERR(mach_priv->dmic_sel));
1130 return PTR_ERR(mach_priv->dmic_sel);
1133 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1135 struct mtk_sof_priv *sof_priv;
1137 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1142 sof_priv->conn_streams = g_sof_conn_streams;
1143 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
1144 sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup;
1145 soc_card_data->sof_priv = sof_priv;
1146 card->probe = mtk_sof_card_probe;
1147 card->late_probe = mtk_sof_card_late_probe;
1148 if (!card->topology_shortname_created) {
1149 snprintf(card->topology_shortname, 32, "sof-%s", card->name);
1150 card->topology_shortname_created = true;
1152 card->name = card->topology_shortname;
1155 dev_dbg(&pdev->dev, "Probe without adsp\n");
1158 if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1159 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
1160 "mediatek,dai-link",
1161 mt8186_mt6366_rt1019_rt5682s_dai_links,
1162 ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links));
1164 dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1169 card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
1170 - ARRAY_SIZE(g_sof_conn_streams);
1173 platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1174 if (!platform_node) {
1176 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1177 goto err_platform_node;
1180 playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
1181 if (!playback_codec) {
1183 dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1184 goto err_playback_codec;
1187 headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1188 if (!headset_codec) {
1190 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1191 goto err_headset_codec;
1194 for_each_card_prelinks(card, i, dai_link) {
1195 ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
1197 dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1202 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
1204 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1209 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
1211 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1216 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1217 dai_link->platforms->of_node = adsp_node;
1219 if (!dai_link->platforms->name && !dai_link->platforms->of_node)
1220 dai_link->platforms->of_node = platform_node;
1223 snd_soc_card_set_drvdata(card, soc_card_data);
1225 ret = mt8186_afe_gpio_init(&pdev->dev);
1227 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1231 ret = devm_snd_soc_register_card(&pdev->dev, card);
1233 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1236 of_node_put(headset_codec);
1238 of_node_put(playback_codec);
1240 of_node_put(platform_node);
1243 of_node_put(adsp_node);
1248 #if IS_ENABLED(CONFIG_OF)
1249 static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
1251 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1252 .data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
1255 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1256 .data = &mt8186_mt6366_rt5682s_max98360_soc_card,
1260 MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match);
1263 static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
1265 .name = "mt8186_mt6366_rt1019_rt5682s",
1266 #if IS_ENABLED(CONFIG_OF)
1267 .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
1269 .pm = &snd_soc_pm_ops,
1271 .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
1274 module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
1276 /* Module information */
1277 MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver");
1278 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1279 MODULE_LICENSE("GPL v2");
1280 MODULE_ALIAS("mt8186_mt6366_rt1019_rt5682s soc card");