arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / sound / soc / mediatek / mt8186 / mt8186-mt6366-rt1019-rt5682s.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // mt8186-mt6366-rt1019-rt5682s.c
4 //      --  MT8186-MT6366-RT1019-RT5682S ALSA SoC machine driver
5 //
6 // Copyright (c) 2022 MediaTek Inc.
7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
8 //
9
10 #include <linux/gpio/consumer.h>
11 #include <linux/input.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/rt5682.h>
17 #include <sound/soc.h>
18
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"
28
29 #define RT1019_CODEC_DAI        "HiFi"
30 #define RT1019_DEV0_NAME        "rt1019p"
31
32 #define RT5682S_CODEC_DAI       "rt5682s-aif1"
33 #define RT5682S_DEV0_NAME       "rt5682s.5-001a"
34
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"
39
40 struct mt8186_mt6366_rt1019_rt5682s_priv {
41         struct snd_soc_jack headset_jack, hdmi_jack;
42         struct gpio_desc *dmic_sel;
43         int dmic_switch;
44 };
45
46 /* Headset jack detection DAPM pins */
47 static struct snd_soc_jack_pin mt8186_jack_pins[] = {
48         {
49                 .pin = "Headphone",
50                 .mask = SND_JACK_HEADPHONE,
51         },
52         {
53                 .pin = "Headset Mic",
54                 .mask = SND_JACK_MICROPHONE,
55         },
56 };
57
58 static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
59         {
60                 .dlc = COMP_CODEC_CONF("mt6358-sound"),
61                 .name_prefix = "Mt6366",
62         },
63         {
64                 .dlc = COMP_CODEC_CONF("bt-sco"),
65                 .name_prefix = "Mt8186 bt",
66         },
67         {
68                 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
69                 .name_prefix = "Mt8186 hdmi",
70         },
71 };
72
73 static int dmic_get(struct snd_kcontrol *kcontrol,
74                     struct snd_ctl_elem_value *ucontrol)
75 {
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;
80
81         ucontrol->value.integer.value[0] = priv->dmic_switch;
82         return 0;
83 }
84
85 static int dmic_set(struct snd_kcontrol *kcontrol,
86                     struct snd_ctl_elem_value *ucontrol)
87 {
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;
92
93         priv->dmic_switch = ucontrol->value.integer.value[0];
94         if (priv->dmic_sel) {
95                 gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
96                 dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
97                          priv->dmic_switch);
98         }
99         return 0;
100 }
101
102 static const char * const dmic_mux_text[] = {
103         "Front Mic",
104         "Rear Mic",
105 };
106
107 static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
108                             SND_SOC_NOPM, 0, dmic_mux_text);
109
110 static const struct snd_kcontrol_new mt8186_dmic_mux_control =
111         SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
112                           dmic_get, dmic_set);
113
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),
117 };
118
119 static const struct snd_soc_dapm_route dmic_map[] = {
120         /* digital mics */
121         {"Dmic Mux", "Front Mic", "DMIC"},
122         {"Dmic Mux", "Rear Mic", "DMIC"},
123 };
124
125 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
126 {
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;
130         int ret;
131
132         ret = mt8186_mt6366_init(rtd);
133
134         if (ret) {
135                 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
136                 return ret;
137         }
138
139         if (!priv->dmic_sel) {
140                 dev_dbg(card->dev, "dmic_sel is null\n");
141                 return 0;
142         }
143
144         ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
145                                         ARRAY_SIZE(dmic_widgets));
146         if (ret) {
147                 dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
148                 /* Don't need to add routes if widget addition failed */
149                 return ret;
150         }
151
152         ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
153                                       ARRAY_SIZE(dmic_map));
154
155         if (ret)
156                 dev_err(card->dev, "DMic map addition failed: %d\n", ret);
157
158         return ret;
159 }
160
161 static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
162 {
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;
172         int ret;
173         int type;
174
175         ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
176         if (ret) {
177                 dev_err(rtd->dev, "Failed to set up shared clocks\n");
178                 return ret;
179         }
180
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 |
184                                     SND_JACK_BTN_3,
185                                     jack, mt8186_jack_pins,
186                                     ARRAY_SIZE(mt8186_jack_pins));
187         if (ret) {
188                 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
189                 return ret;
190         }
191
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);
196
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);
199 }
200
201 static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
202                                         struct snd_pcm_hw_params *params)
203 {
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;
211         int bitwidth;
212         int ret;
213
214         bitwidth = snd_pcm_format_width(params_format(params));
215         if (bitwidth < 0) {
216                 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
217                 return bitwidth;
218         }
219
220         ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
221         if (ret) {
222                 dev_err(card->dev, "failed to set tdm slot\n");
223                 return ret;
224         }
225
226         ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
227                                   RT5682_PLL1_S_BCLK1,
228                                   params_rate(params) * 64,
229                                   params_rate(params) * 512);
230         if (ret) {
231                 dev_err(card->dev, "failed to set pll\n");
232                 return ret;
233         }
234
235         ret = snd_soc_dai_set_sysclk(codec_dai,
236                                      RT5682_SCLK_S_PLL1,
237                                      params_rate(params) * 512,
238                                      SND_SOC_CLOCK_IN);
239         if (ret) {
240                 dev_err(card->dev, "failed to set sysclk\n");
241                 return ret;
242         }
243
244         return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
245 }
246
247 static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
248         .hw_params = mt8186_rt5682s_i2s_hw_params,
249 };
250
251 static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
252 {
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;
261         int ret;
262
263         ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
264         if (ret) {
265                 dev_err(rtd->dev, "Failed to set up shared clocks\n");
266                 return ret;
267         }
268
269         ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, &priv->hdmi_jack);
270         if (ret) {
271                 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
272                 return ret;
273         }
274
275         return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
276 }
277
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)
281 {
282         struct snd_interval *channels = hw_param_interval(params,
283                 SNDRV_PCM_HW_PARAM_CHANNELS);
284
285         dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
286
287         /* fix BE i2s channel to 2 channel */
288         channels->min = 2;
289         channels->max = 2;
290
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);
294
295         params_set_format(params, fmt);
296
297         return 0;
298 }
299
300 static int mt8186_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
301                                       struct snd_pcm_hw_params *params)
302 {
303         return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
304 }
305
306 static int mt8186_it6505_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
307                                              struct snd_pcm_hw_params *params)
308 {
309         return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
310 }
311
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)
315 {
316         int ret;
317
318         ret = mtk_sof_dai_link_fixup(rtd, params);
319
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);
326
327         return ret;
328 }
329
330 static int mt8186_mt6366_rt1019_rt5682s_playback_startup(struct snd_pcm_substream *substream)
331 {
332         static const unsigned int rates[] = {
333                 48000
334         };
335         static const unsigned int channels[] = {
336                 2
337         };
338         static const struct snd_pcm_hw_constraint_list constraints_rates = {
339                 .count = ARRAY_SIZE(rates),
340                 .list  = rates,
341                 .mask = 0,
342         };
343         static const struct snd_pcm_hw_constraint_list constraints_channels = {
344                 .count = ARRAY_SIZE(channels),
345                 .list  = channels,
346                 .mask = 0,
347         };
348
349         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
350         struct snd_pcm_runtime *runtime = substream->runtime;
351         int ret;
352
353         ret = snd_pcm_hw_constraint_list(runtime, 0,
354                                          SNDRV_PCM_HW_PARAM_RATE,
355                                          &constraints_rates);
356         if (ret < 0) {
357                 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
358                 return ret;
359         }
360
361         ret = snd_pcm_hw_constraint_list(runtime, 0,
362                                          SNDRV_PCM_HW_PARAM_CHANNELS,
363                                          &constraints_channels);
364         if (ret < 0) {
365                 dev_err(rtd->dev, "hw_constraint_list channel failed\n");
366                 return ret;
367         }
368
369         return 0;
370 }
371
372 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_playback_ops = {
373         .startup = mt8186_mt6366_rt1019_rt5682s_playback_startup,
374 };
375
376 static int mt8186_mt6366_rt1019_rt5682s_capture_startup(struct snd_pcm_substream *substream)
377 {
378         static const unsigned int rates[] = {
379                 48000
380         };
381         static const unsigned int channels[] = {
382                 1, 2
383         };
384         static const struct snd_pcm_hw_constraint_list constraints_rates = {
385                 .count = ARRAY_SIZE(rates),
386                 .list  = rates,
387                 .mask = 0,
388         };
389         static const struct snd_pcm_hw_constraint_list constraints_channels = {
390                 .count = ARRAY_SIZE(channels),
391                 .list  = channels,
392                 .mask = 0,
393         };
394
395         struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
396         struct snd_pcm_runtime *runtime = substream->runtime;
397         int ret;
398
399         ret = snd_pcm_hw_constraint_list(runtime, 0,
400                                          SNDRV_PCM_HW_PARAM_RATE,
401                                          &constraints_rates);
402         if (ret < 0) {
403                 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
404                 return ret;
405         }
406
407         ret = snd_pcm_hw_constraint_list(runtime, 0,
408                                          SNDRV_PCM_HW_PARAM_CHANNELS,
409                                          &constraints_channels);
410         if (ret < 0) {
411                 dev_err(rtd->dev, "hw_constraint_list channel failed\n");
412                 return ret;
413         }
414
415         return 0;
416 }
417
418 static const struct snd_soc_ops mt8186_mt6366_rt1019_rt5682s_capture_ops = {
419         .startup = mt8186_mt6366_rt1019_rt5682s_capture_startup,
420 };
421
422 /* FE */
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()));
427
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()));
432
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()));
437
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()));
442
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()));
447
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()));
452
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()));
457
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()));
462
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()));
467
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()));
472
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()));
477
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()));
482
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()));
487
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()));
492
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()));
497
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()));
502
503 /* hostless */
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()));
520
521 /* BE */
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",
527                                                    "dmic-hifi")),
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()));
573
574 /* hostless */
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()));
607
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()));
612
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()));
617
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()));
622
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},
628 };
629
630 static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
631         /* Front End DAI links */
632         {
633                 .name = "Playback_1",
634                 .stream_name = "Playback_1",
635                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
636                             SND_SOC_DPCM_TRIGGER_PRE},
637                 .dynamic = 1,
638                 .dpcm_playback = 1,
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),
644         },
645         {
646                 .name = "Playback_12",
647                 .stream_name = "Playback_12",
648                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
649                             SND_SOC_DPCM_TRIGGER_PRE},
650                 .dynamic = 1,
651                 .dpcm_playback = 1,
652                 SND_SOC_DAILINK_REG(playback12),
653         },
654         {
655                 .name = "Playback_2",
656                 .stream_name = "Playback_2",
657                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
658                             SND_SOC_DPCM_TRIGGER_PRE},
659                 .dynamic = 1,
660                 .dpcm_playback = 1,
661                 .dpcm_merged_format = 1,
662                 .dpcm_merged_chan = 1,
663                 .dpcm_merged_rate = 1,
664                 SND_SOC_DAILINK_REG(playback2),
665         },
666         {
667                 .name = "Playback_3",
668                 .stream_name = "Playback_3",
669                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
670                             SND_SOC_DPCM_TRIGGER_PRE},
671                 .dynamic = 1,
672                 .dpcm_playback = 1,
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),
678         },
679         {
680                 .name = "Playback_4",
681                 .stream_name = "Playback_4",
682                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
683                             SND_SOC_DPCM_TRIGGER_PRE},
684                 .dynamic = 1,
685                 .dpcm_playback = 1,
686                 SND_SOC_DAILINK_REG(playback4),
687         },
688         {
689                 .name = "Playback_5",
690                 .stream_name = "Playback_5",
691                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
692                             SND_SOC_DPCM_TRIGGER_PRE},
693                 .dynamic = 1,
694                 .dpcm_playback = 1,
695                 SND_SOC_DAILINK_REG(playback5),
696         },
697         {
698                 .name = "Playback_6",
699                 .stream_name = "Playback_6",
700                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
701                             SND_SOC_DPCM_TRIGGER_PRE},
702                 .dynamic = 1,
703                 .dpcm_playback = 1,
704                 SND_SOC_DAILINK_REG(playback6),
705         },
706         {
707                 .name = "Playback_7",
708                 .stream_name = "Playback_7",
709                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
710                             SND_SOC_DPCM_TRIGGER_PRE},
711                 .dynamic = 1,
712                 .dpcm_playback = 1,
713                 SND_SOC_DAILINK_REG(playback7),
714         },
715         {
716                 .name = "Playback_8",
717                 .stream_name = "Playback_8",
718                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
719                             SND_SOC_DPCM_TRIGGER_PRE},
720                 .dynamic = 1,
721                 .dpcm_playback = 1,
722                 SND_SOC_DAILINK_REG(playback8),
723         },
724         {
725                 .name = "Capture_1",
726                 .stream_name = "Capture_1",
727                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
728                             SND_SOC_DPCM_TRIGGER_PRE},
729                 .dynamic = 1,
730                 .dpcm_capture = 1,
731                 SND_SOC_DAILINK_REG(capture1),
732         },
733         {
734                 .name = "Capture_2",
735                 .stream_name = "Capture_2",
736                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
737                             SND_SOC_DPCM_TRIGGER_PRE},
738                 .dynamic = 1,
739                 .dpcm_capture = 1,
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),
745         },
746         {
747                 .name = "Capture_3",
748                 .stream_name = "Capture_3",
749                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
750                             SND_SOC_DPCM_TRIGGER_PRE},
751                 .dynamic = 1,
752                 .dpcm_capture = 1,
753                 SND_SOC_DAILINK_REG(capture3),
754         },
755         {
756                 .name = "Capture_4",
757                 .stream_name = "Capture_4",
758                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
759                             SND_SOC_DPCM_TRIGGER_PRE},
760                 .dynamic = 1,
761                 .dpcm_capture = 1,
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),
767         },
768         {
769                 .name = "Capture_5",
770                 .stream_name = "Capture_5",
771                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
772                             SND_SOC_DPCM_TRIGGER_PRE},
773                 .dynamic = 1,
774                 .dpcm_capture = 1,
775                 SND_SOC_DAILINK_REG(capture5),
776         },
777         {
778                 .name = "Capture_6",
779                 .stream_name = "Capture_6",
780                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
781                             SND_SOC_DPCM_TRIGGER_PRE},
782                 .dynamic = 1,
783                 .dpcm_capture = 1,
784                 .dpcm_merged_format = 1,
785                 .dpcm_merged_chan = 1,
786                 .dpcm_merged_rate = 1,
787                 SND_SOC_DAILINK_REG(capture6),
788         },
789         {
790                 .name = "Capture_7",
791                 .stream_name = "Capture_7",
792                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
793                             SND_SOC_DPCM_TRIGGER_PRE},
794                 .dynamic = 1,
795                 .dpcm_capture = 1,
796                 SND_SOC_DAILINK_REG(capture7),
797         },
798         {
799                 .name = "Hostless_LPBK",
800                 .stream_name = "Hostless_LPBK",
801                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
802                             SND_SOC_DPCM_TRIGGER_PRE},
803                 .dynamic = 1,
804                 .dpcm_playback = 1,
805                 .dpcm_capture = 1,
806                 .ignore_suspend = 1,
807                 SND_SOC_DAILINK_REG(hostless_lpbk),
808         },
809         {
810                 .name = "Hostless_FM",
811                 .stream_name = "Hostless_FM",
812                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
813                             SND_SOC_DPCM_TRIGGER_PRE},
814                 .dynamic = 1,
815                 .dpcm_playback = 1,
816                 .dpcm_capture = 1,
817                 .ignore_suspend = 1,
818                 SND_SOC_DAILINK_REG(hostless_fm),
819         },
820         {
821                 .name = "Hostless_SRC_1",
822                 .stream_name = "Hostless_SRC_1",
823                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
824                             SND_SOC_DPCM_TRIGGER_PRE},
825                 .dynamic = 1,
826                 .dpcm_playback = 1,
827                 .dpcm_capture = 1,
828                 .ignore_suspend = 1,
829                 SND_SOC_DAILINK_REG(hostless_src1),
830         },
831         {
832                 .name = "Hostless_SRC_Bargein",
833                 .stream_name = "Hostless_SRC_Bargein",
834                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
835                             SND_SOC_DPCM_TRIGGER_PRE},
836                 .dynamic = 1,
837                 .dpcm_playback = 1,
838                 .dpcm_capture = 1,
839                 .ignore_suspend = 1,
840                 SND_SOC_DAILINK_REG(hostless_src_bargein),
841         },
842         {
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},
847                 .dynamic = 1,
848                 .dpcm_capture = 1,
849                 .ignore_suspend = 1,
850                 SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
851         },
852         {
853                 .name = "Hostless_SRC_AAudio",
854                 .stream_name = "Hostless_SRC_AAudio",
855                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
856                             SND_SOC_DPCM_TRIGGER_PRE},
857                 .dynamic = 1,
858                 .dpcm_playback = 1,
859                 .dpcm_capture = 1,
860                 .ignore_suspend = 1,
861                 SND_SOC_DAILINK_REG(hostless_src_aaudio),
862         },
863         /* Back End DAI links */
864         {
865                 .name = "Primary Codec",
866                 .no_pcm = 1,
867                 .dpcm_playback = 1,
868                 .dpcm_capture = 1,
869                 .ignore_suspend = 1,
870                 .init = primary_codec_init,
871                 SND_SOC_DAILINK_REG(adda),
872         },
873         {
874                 .name = "I2S3",
875                 .no_pcm = 1,
876                 .dai_fmt = SND_SOC_DAIFMT_I2S |
877                            SND_SOC_DAIFMT_IB_IF |
878                            SND_SOC_DAIFMT_CBM_CFM,
879                 .dpcm_playback = 1,
880                 .ignore_suspend = 1,
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),
884         },
885         {
886                 .name = "I2S0",
887                 .no_pcm = 1,
888                 .dpcm_capture = 1,
889                 .ignore_suspend = 1,
890                 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
891                 .ops = &mt8186_rt5682s_i2s_ops,
892                 SND_SOC_DAILINK_REG(i2s0),
893         },
894         {
895                 .name = "I2S1",
896                 .no_pcm = 1,
897                 .dpcm_playback = 1,
898                 .ignore_suspend = 1,
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),
903         },
904         {
905                 .name = "I2S2",
906                 .no_pcm = 1,
907                 .dpcm_capture = 1,
908                 .ignore_suspend = 1,
909                 .be_hw_params_fixup = mt8186_i2s_hw_params_fixup,
910                 SND_SOC_DAILINK_REG(i2s2),
911         },
912         {
913                 .name = "HW Gain 1",
914                 .no_pcm = 1,
915                 .dpcm_playback = 1,
916                 .dpcm_capture = 1,
917                 .ignore_suspend = 1,
918                 SND_SOC_DAILINK_REG(hw_gain1),
919         },
920         {
921                 .name = "HW Gain 2",
922                 .no_pcm = 1,
923                 .dpcm_playback = 1,
924                 .dpcm_capture = 1,
925                 .ignore_suspend = 1,
926                 SND_SOC_DAILINK_REG(hw_gain2),
927         },
928         {
929                 .name = "HW_SRC_1",
930                 .no_pcm = 1,
931                 .dpcm_playback = 1,
932                 .dpcm_capture = 1,
933                 .ignore_suspend = 1,
934                 SND_SOC_DAILINK_REG(hw_src1),
935         },
936         {
937                 .name = "HW_SRC_2",
938                 .no_pcm = 1,
939                 .dpcm_playback = 1,
940                 .dpcm_capture = 1,
941                 .ignore_suspend = 1,
942                 SND_SOC_DAILINK_REG(hw_src2),
943         },
944         {
945                 .name = "CONNSYS_I2S",
946                 .no_pcm = 1,
947                 .dpcm_capture = 1,
948                 .ignore_suspend = 1,
949                 SND_SOC_DAILINK_REG(connsys_i2s),
950         },
951         {
952                 .name = "PCM 1",
953                 .dai_fmt = SND_SOC_DAIFMT_I2S |
954                            SND_SOC_DAIFMT_NB_IF,
955                 .no_pcm = 1,
956                 .dpcm_playback = 1,
957                 .dpcm_capture = 1,
958                 .ignore_suspend = 1,
959                 SND_SOC_DAILINK_REG(pcm1),
960         },
961         {
962                 .name = "TDM IN",
963                 .no_pcm = 1,
964                 .dpcm_capture = 1,
965                 .ignore_suspend = 1,
966                 SND_SOC_DAILINK_REG(tdm_in),
967         },
968         /* dummy BE for ul memif to record from dl memif */
969         {
970                 .name = "Hostless_UL1",
971                 .no_pcm = 1,
972                 .dpcm_capture = 1,
973                 .ignore_suspend = 1,
974                 SND_SOC_DAILINK_REG(hostless_ul1),
975         },
976         {
977                 .name = "Hostless_UL2",
978                 .no_pcm = 1,
979                 .dpcm_capture = 1,
980                 .ignore_suspend = 1,
981                 SND_SOC_DAILINK_REG(hostless_ul2),
982         },
983         {
984                 .name = "Hostless_UL3",
985                 .no_pcm = 1,
986                 .dpcm_capture = 1,
987                 .ignore_suspend = 1,
988                 SND_SOC_DAILINK_REG(hostless_ul3),
989         },
990         {
991                 .name = "Hostless_UL5",
992                 .no_pcm = 1,
993                 .dpcm_capture = 1,
994                 .ignore_suspend = 1,
995                 SND_SOC_DAILINK_REG(hostless_ul5),
996         },
997         {
998                 .name = "Hostless_UL6",
999                 .no_pcm = 1,
1000                 .dpcm_capture = 1,
1001                 .ignore_suspend = 1,
1002                 SND_SOC_DAILINK_REG(hostless_ul6),
1003         },
1004         /* SOF BE */
1005         {
1006                 .name = "AFE_SOF_DL1",
1007                 .no_pcm = 1,
1008                 .dpcm_playback = 1,
1009                 SND_SOC_DAILINK_REG(AFE_SOF_DL1),
1010         },
1011         {
1012                 .name = "AFE_SOF_DL2",
1013                 .no_pcm = 1,
1014                 .dpcm_playback = 1,
1015                 SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1016         },
1017         {
1018                 .name = "AFE_SOF_UL1",
1019                 .no_pcm = 1,
1020                 .dpcm_capture = 1,
1021                 SND_SOC_DAILINK_REG(AFE_SOF_UL1),
1022         },
1023         {
1024                 .name = "AFE_SOF_UL2",
1025                 .no_pcm = 1,
1026                 .dpcm_capture = 1,
1027                 SND_SOC_DAILINK_REG(AFE_SOF_UL2),
1028         },
1029 };
1030
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),
1041 };
1042
1043 static const struct snd_soc_dapm_route
1044 mt8186_mt6366_rt1019_rt5682s_routes[] = {
1045         /* SPK */
1046         { "Speakers", NULL, "Speaker" },
1047         /* Headset */
1048         { "Headphone", NULL, "HPOL" },
1049         { "Headphone", NULL, "HPOR" },
1050         { "IN1P", NULL, "Headset Mic" },
1051         /* HDMI */
1052         { "HDMI1", NULL, "TX" },
1053         /* SOF Uplink */
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"},
1058         /* SOF Downlink */
1059         {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1060         {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1061 };
1062
1063 static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {
1064         /* SPK */
1065         {"Speakers", NULL, "SPOL"},
1066         {"Speakers", NULL, "SPOR"},
1067         /* Headset */
1068         { "Headphone", NULL, "HPOL" },
1069         { "Headphone", NULL, "HPOR" },
1070         { "IN1P", NULL, "Headset Mic" },
1071         { "IN1N", NULL, "Headset Mic"},
1072         /* HDMI */
1073         { "HDMI1", NULL, "TX" },
1074         /* SOF Uplink */
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"},
1079         /* SOF Downlink */
1080         {"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1081         {"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1082 };
1083
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"),
1090 };
1091
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),
1105 };
1106
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),
1120 };
1121
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),
1135 };
1136
1137 static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
1138 {
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;
1144         int sof_on = 0;
1145         int ret, i;
1146
1147         card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
1148         if (!card)
1149                 return -EINVAL;
1150         card->dev = &pdev->dev;
1151
1152         soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
1153         if (!soc_card_data)
1154                 return -ENOMEM;
1155         mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
1156         if (!mach_priv)
1157                 return -ENOMEM;
1158
1159         soc_card_data->mach_priv = mach_priv;
1160
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);
1167         }
1168
1169         adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1170         if (adsp_node) {
1171                 struct mtk_sof_priv *sof_priv;
1172
1173                 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1174                 if (!sof_priv) {
1175                         ret = -ENOMEM;
1176                         goto err_adsp_node;
1177                 }
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;
1187                 }
1188                 card->name = card->topology_shortname;
1189                 sof_on = 1;
1190         } else {
1191                 dev_dbg(&pdev->dev, "Probe without adsp\n");
1192         }
1193
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));
1199                 if (ret) {
1200                         dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1201                         goto err_adsp_node;
1202                 }
1203         } else {
1204                 if (!sof_on)
1205                         card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
1206                                         - ARRAY_SIZE(g_sof_conn_streams);
1207         }
1208
1209         platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1210         if (!platform_node) {
1211                 ret = -EINVAL;
1212                 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1213                 goto err_platform_node;
1214         }
1215
1216         playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
1217         if (!playback_codec) {
1218                 ret = -EINVAL;
1219                 dev_err_probe(&pdev->dev, ret, "Property 'playback-codecs' missing or invalid\n");
1220                 goto err_playback_codec;
1221         }
1222
1223         headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1224         if (!headset_codec) {
1225                 ret = -EINVAL;
1226                 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1227                 goto err_headset_codec;
1228         }
1229
1230         for_each_card_prelinks(card, i, dai_link) {
1231                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
1232                 if (ret) {
1233                         dev_err_probe(&pdev->dev, ret, "%s set playback_codec fail\n",
1234                                       dai_link->name);
1235                         goto err_probe;
1236                 }
1237
1238                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
1239                 if (ret) {
1240                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1241                                       dai_link->name);
1242                         goto err_probe;
1243                 }
1244
1245                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
1246                 if (ret) {
1247                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1248                                       dai_link->name);
1249                         goto err_probe;
1250                 }
1251
1252                 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1253                         dai_link->platforms->of_node = adsp_node;
1254
1255                 if (!dai_link->platforms->name && !dai_link->platforms->of_node)
1256                         dai_link->platforms->of_node = platform_node;
1257         }
1258
1259         snd_soc_card_set_drvdata(card, soc_card_data);
1260
1261         ret = mt8186_afe_gpio_init(&pdev->dev);
1262         if (ret) {
1263                 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1264                 goto err_probe;
1265         }
1266
1267         ret = devm_snd_soc_register_card(&pdev->dev, card);
1268         if (ret)
1269                 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1270
1271 err_probe:
1272         of_node_put(headset_codec);
1273 err_headset_codec:
1274         of_node_put(playback_codec);
1275 err_playback_codec:
1276         of_node_put(platform_node);
1277 err_platform_node:
1278 err_adsp_node:
1279         of_node_put(adsp_node);
1280
1281         return ret;
1282 }
1283
1284 #if IS_ENABLED(CONFIG_OF)
1285 static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
1286         {
1287                 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1288                 .data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
1289         },
1290         {
1291                 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1292                 .data = &mt8186_mt6366_rt5682s_max98360_soc_card,
1293         },
1294         {
1295                 .compatible = "mediatek,mt8186-mt6366-rt5650-sound",
1296                 .data = &mt8186_mt6366_rt5650_soc_card,
1297         },
1298         {}
1299 };
1300 MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match);
1301 #endif
1302
1303 static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
1304         .driver = {
1305                 .name = "mt8186_mt6366_rt1019_rt5682s",
1306 #if IS_ENABLED(CONFIG_OF)
1307                 .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
1308 #endif
1309                 .pm = &snd_soc_pm_ops,
1310         },
1311         .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
1312 };
1313
1314 module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
1315
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");