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/consumer.h>
11 #include <linux/input.h>
12 #include <linux/module.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/rt5682.h>
17 #include <sound/soc.h>
19 #include "../../codecs/mt6358.h"
20 #include "../../codecs/rt5682.h"
21 #include "../common/mtk-afe-platform-driver.h"
22 #include "../common/mtk-dsp-sof-common.h"
23 #include "../common/mtk-soc-card.h"
24 #include "mt8186-afe-common.h"
25 #include "mt8186-afe-clk.h"
26 #include "mt8186-afe-gpio.h"
27 #include "mt8186-mt6366-common.h"
29 #define RT1019_CODEC_DAI "HiFi"
30 #define RT1019_DEV0_NAME "rt1019p"
32 #define RT5682S_CODEC_DAI "rt5682s-aif1"
33 #define RT5682S_DEV0_NAME "rt5682s.5-001a"
35 #define SOF_DMA_DL1 "SOF_DMA_DL1"
36 #define SOF_DMA_DL2 "SOF_DMA_DL2"
37 #define SOF_DMA_UL1 "SOF_DMA_UL1"
38 #define SOF_DMA_UL2 "SOF_DMA_UL2"
40 struct mt8186_mt6366_rt1019_rt5682s_priv {
41 struct snd_soc_jack headset_jack, hdmi_jack;
42 struct gpio_desc *dmic_sel;
46 /* Headset jack detection DAPM pins */
47 static struct snd_soc_jack_pin mt8186_jack_pins[] = {
50 .mask = SND_JACK_HEADPHONE,
54 .mask = SND_JACK_MICROPHONE,
58 static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
60 .dlc = COMP_CODEC_CONF("mt6358-sound"),
61 .name_prefix = "Mt6366",
64 .dlc = COMP_CODEC_CONF("bt-sco"),
65 .name_prefix = "Mt8186 bt",
68 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
69 .name_prefix = "Mt8186 hdmi",
73 static int dmic_get(struct snd_kcontrol *kcontrol,
74 struct snd_ctl_elem_value *ucontrol)
76 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
77 struct mtk_soc_card_data *soc_card_data =
78 snd_soc_card_get_drvdata(dapm->card);
79 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
81 ucontrol->value.integer.value[0] = priv->dmic_switch;
85 static int dmic_set(struct snd_kcontrol *kcontrol,
86 struct snd_ctl_elem_value *ucontrol)
88 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
89 struct mtk_soc_card_data *soc_card_data =
90 snd_soc_card_get_drvdata(dapm->card);
91 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
93 priv->dmic_switch = ucontrol->value.integer.value[0];
95 gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
96 dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
102 static const char * const dmic_mux_text[] = {
107 static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
108 SND_SOC_NOPM, 0, dmic_mux_text);
110 static const struct snd_kcontrol_new mt8186_dmic_mux_control =
111 SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
114 static const struct snd_soc_dapm_widget dmic_widgets[] = {
115 SND_SOC_DAPM_MIC("DMIC", NULL),
116 SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),
119 static const struct snd_soc_dapm_route dmic_map[] = {
121 {"Dmic Mux", "Front Mic", "DMIC"},
122 {"Dmic Mux", "Rear Mic", "DMIC"},
125 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
127 struct snd_soc_card *card = rtd->card;
128 struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
129 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
132 ret = mt8186_mt6366_init(rtd);
135 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
139 if (!priv->dmic_sel) {
140 dev_dbg(card->dev, "dmic_sel is null\n");
144 ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
145 ARRAY_SIZE(dmic_widgets));
147 dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
148 /* Don't need to add routes if widget addition failed */
152 ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
153 ARRAY_SIZE(dmic_map));
156 dev_err(card->dev, "DMic map addition failed: %d\n", ret);
161 static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
163 struct snd_soc_component *cmpnt_afe =
164 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
165 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
166 struct mtk_soc_card_data *soc_card_data =
167 snd_soc_card_get_drvdata(rtd->card);
168 struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
169 struct snd_soc_jack *jack = &priv->headset_jack;
170 struct snd_soc_component *cmpnt_codec =
171 snd_soc_rtd_to_codec(rtd, 0)->component;
175 ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
177 dev_err(rtd->dev, "Failed to set up shared clocks\n");
181 ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
182 SND_JACK_HEADSET | SND_JACK_BTN_0 |
183 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
185 jack, mt8186_jack_pins,
186 ARRAY_SIZE(mt8186_jack_pins));
188 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
192 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
193 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
194 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
195 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
197 type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;
198 return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);
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 = snd_soc_rtd_to_cpu(rtd, 0);
207 struct snd_soc_dai *codec_dai = snd_soc_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 snd_soc_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 = snd_soc_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 = snd_soc_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_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {
1065 {"Speakers", NULL, "SPOL"},
1066 {"Speakers", NULL, "SPOR"},
1068 { "Headphone", NULL, "HPOL" },
1069 { "Headphone", NULL, "HPOR" },
1070 { "IN1P", NULL, "Headset Mic" },
1071 { "IN1N", NULL, "Headset Mic"},
1073 { "HDMI1", NULL, "TX" },
1075 {SOF_DMA_UL1, NULL, "UL1_CH1"},
1076 {SOF_DMA_UL1, NULL, "UL1_CH2"},
1077 {SOF_DMA_UL2, NULL, "UL2_CH1"},
1078 {SOF_DMA_UL2, NULL, "UL2_CH2"},
1080 {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1081 {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1084 static const struct snd_kcontrol_new
1085 mt8186_mt6366_rt1019_rt5682s_controls[] = {
1086 SOC_DAPM_PIN_SWITCH("Speakers"),
1087 SOC_DAPM_PIN_SWITCH("Headphone"),
1088 SOC_DAPM_PIN_SWITCH("Headset Mic"),
1089 SOC_DAPM_PIN_SWITCH("HDMI1"),
1092 static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
1093 .name = "mt8186_rt1019_rt5682s",
1094 .owner = THIS_MODULE,
1095 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1096 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1097 .controls = mt8186_mt6366_rt1019_rt5682s_controls,
1098 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1099 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1100 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1101 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1102 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1103 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1104 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1107 static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
1108 .name = "mt8186_rt5682s_max98360",
1109 .owner = THIS_MODULE,
1110 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1111 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1112 .controls = mt8186_mt6366_rt1019_rt5682s_controls,
1113 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1114 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1115 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1116 .dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1117 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1118 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1119 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1122 static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {
1123 .name = "mt8186_rt5650",
1124 .owner = THIS_MODULE,
1125 .dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1126 .num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1127 .controls = mt8186_mt6366_rt1019_rt5682s_controls,
1128 .num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1129 .dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1130 .num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1131 .dapm_routes = mt8186_mt6366_rt5650_routes,
1132 .num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),
1133 .codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1134 .num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1137 static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
1139 struct snd_soc_card *card;
1140 struct snd_soc_dai_link *dai_link;
1141 struct mtk_soc_card_data *soc_card_data;
1142 struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
1143 struct device_node *platform_node, *headset_codec, *playback_codec, *adsp_node;
1147 card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
1150 card->dev = &pdev->dev;
1152 soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
1155 mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
1159 soc_card_data->mach_priv = mach_priv;
1161 mach_priv->dmic_sel = devm_gpiod_get_optional(&pdev->dev,
1162 "dmic", GPIOD_OUT_LOW);
1163 if (IS_ERR(mach_priv->dmic_sel)) {
1164 dev_err(&pdev->dev, "DMIC gpio failed err=%ld\n",
1165 PTR_ERR(mach_priv->dmic_sel));
1166 return PTR_ERR(mach_priv->dmic_sel);
1169 adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1171 struct mtk_sof_priv *sof_priv;
1173 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1178 sof_priv->conn_streams = g_sof_conn_streams;
1179 sof_priv->num_streams = ARRAY_SIZE(g_sof_conn_streams);
1180 sof_priv->sof_dai_link_fixup = mt8186_sof_dai_link_fixup;
1181 soc_card_data->sof_priv = sof_priv;
1182 card->probe = mtk_sof_card_probe;
1183 card->late_probe = mtk_sof_card_late_probe;
1184 if (!card->topology_shortname_created) {
1185 snprintf(card->topology_shortname, 32, "sof-%s", card->name);
1186 card->topology_shortname_created = true;
1188 card->name = card->topology_shortname;
1191 dev_dbg(&pdev->dev, "Probe without adsp\n");
1194 if (of_property_read_bool(pdev->dev.of_node, "mediatek,dai-link")) {
1195 ret = mtk_sof_dailink_parse_of(card, pdev->dev.of_node,
1196 "mediatek,dai-link",
1197 mt8186_mt6366_rt1019_rt5682s_dai_links,
1198 ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links));
1200 dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1205 card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
1206 - ARRAY_SIZE(g_sof_conn_streams);
1209 platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1210 if (!platform_node) {
1212 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1213 goto err_platform_node;
1216 playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
1217 if (!playback_codec) {
1219 dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n");
1220 goto err_playback_codec;
1223 headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1224 if (!headset_codec) {
1226 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1227 goto err_headset_codec;
1230 for_each_card_prelinks(card, i, dai_link) {
1231 ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
1233 dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n",
1238 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
1240 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1245 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
1247 dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1252 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1253 dai_link->platforms->of_node = adsp_node;
1255 if (!dai_link->platforms->name && !dai_link->platforms->of_node)
1256 dai_link->platforms->of_node = platform_node;
1259 snd_soc_card_set_drvdata(card, soc_card_data);
1261 ret = mt8186_afe_gpio_init(&pdev->dev);
1263 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1267 ret = devm_snd_soc_register_card(&pdev->dev, card);
1269 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1272 of_node_put(headset_codec);
1274 of_node_put(playback_codec);
1276 of_node_put(platform_node);
1279 of_node_put(adsp_node);
1284 #if IS_ENABLED(CONFIG_OF)
1285 static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
1287 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1288 .data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
1291 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1292 .data = &mt8186_mt6366_rt5682s_max98360_soc_card,
1295 .compatible = "mediatek,mt8186-mt6366-rt5650-sound",
1296 .data = &mt8186_mt6366_rt5650_soc_card,
1300 MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match);
1303 static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
1305 .name = "mt8186_mt6366_rt1019_rt5682s",
1306 #if IS_ENABLED(CONFIG_OF)
1307 .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
1309 .pm = &snd_soc_pm_ops,
1311 .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
1314 module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
1316 /* Module information */
1317 MODULE_DESCRIPTION("MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver");
1318 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1319 MODULE_LICENSE("GPL v2");
1320 MODULE_ALIAS("mt8186_mt6366_rt1019_rt5682s soc card");