ASoC: mediatek: mt8186: Move some prints to debug level
[linux-block.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.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>
20
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"
30
31 #define RT1019_CODEC_DAI        "HiFi"
32 #define RT1019_DEV0_NAME        "rt1019p"
33
34 #define RT5682S_CODEC_DAI       "rt5682s-aif1"
35 #define RT5682S_DEV0_NAME       "rt5682s.5-001a"
36
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"
41
42 struct mt8186_mt6366_rt1019_rt5682s_priv {
43         struct snd_soc_jack headset_jack, hdmi_jack;
44         struct gpio_desc *dmic_sel;
45         int dmic_switch;
46 };
47
48 /* Headset jack detection DAPM pins */
49 static struct snd_soc_jack_pin mt8186_jack_pins[] = {
50         {
51                 .pin = "Headphone",
52                 .mask = SND_JACK_HEADPHONE,
53         },
54         {
55                 .pin = "Headset Mic",
56                 .mask = SND_JACK_MICROPHONE,
57         },
58 };
59
60 static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
61         {
62                 .dlc = COMP_CODEC_CONF("mt6358-sound"),
63                 .name_prefix = "Mt6366",
64         },
65         {
66                 .dlc = COMP_CODEC_CONF("bt-sco"),
67                 .name_prefix = "Mt8186 bt",
68         },
69         {
70                 .dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
71                 .name_prefix = "Mt8186 hdmi",
72         },
73 };
74
75 static int dmic_get(struct snd_kcontrol *kcontrol,
76                     struct snd_ctl_elem_value *ucontrol)
77 {
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;
82
83         ucontrol->value.integer.value[0] = priv->dmic_switch;
84         return 0;
85 }
86
87 static int dmic_set(struct snd_kcontrol *kcontrol,
88                     struct snd_ctl_elem_value *ucontrol)
89 {
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;
94
95         priv->dmic_switch = ucontrol->value.integer.value[0];
96         if (priv->dmic_sel) {
97                 gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
98                 dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
99                          priv->dmic_switch);
100         }
101         return 0;
102 }
103
104 static const char * const dmic_mux_text[] = {
105         "Front Mic",
106         "Rear Mic",
107 };
108
109 static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
110                             SND_SOC_NOPM, 0, dmic_mux_text);
111
112 static const struct snd_kcontrol_new mt8186_dmic_mux_control =
113         SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
114                           dmic_get, dmic_set);
115
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),
119 };
120
121 static const struct snd_soc_dapm_route dmic_map[] = {
122         /* digital mics */
123         {"Dmic Mux", "Front Mic", "DMIC"},
124         {"Dmic Mux", "Rear Mic", "DMIC"},
125 };
126
127 static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
128 {
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;
132         int ret;
133
134         ret = mt8186_mt6366_init(rtd);
135
136         if (ret) {
137                 dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
138                 return ret;
139         }
140
141         if (!priv->dmic_sel) {
142                 dev_dbg(card->dev, "dmic_sel is null\n");
143                 return 0;
144         }
145
146         ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
147                                         ARRAY_SIZE(dmic_widgets));
148         if (ret) {
149                 dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
150                 /* Don't need to add routes if widget addition failed */
151                 return ret;
152         }
153
154         ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
155                                       ARRAY_SIZE(dmic_map));
156
157         if (ret)
158                 dev_err(card->dev, "DMic map addition failed: %d\n", ret);
159
160         return ret;
161 }
162
163 static int mt8186_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
164 {
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;
174         int ret;
175
176         ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
177         if (ret) {
178                 dev_err(rtd->dev, "Failed to set up shared clocks\n");
179                 return ret;
180         }
181
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 |
185                                     SND_JACK_BTN_3,
186                                     jack, mt8186_jack_pins,
187                                     ARRAY_SIZE(mt8186_jack_pins));
188         if (ret) {
189                 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
190                 return ret;
191         }
192
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);
197
198         return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
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 = 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;
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                 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;
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 = asoc_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 = asoc_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_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"),
1069 };
1070
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),
1084 };
1085
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),
1099 };
1100
1101 static int mt8186_mt6366_rt1019_rt5682s_dev_probe(struct platform_device *pdev)
1102 {
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;
1108         int sof_on = 0;
1109         int ret, i;
1110
1111         card = (struct snd_soc_card *)device_get_match_data(&pdev->dev);
1112         if (!card)
1113                 return -EINVAL;
1114         card->dev = &pdev->dev;
1115
1116         soc_card_data = devm_kzalloc(&pdev->dev, sizeof(*soc_card_data), GFP_KERNEL);
1117         if (!soc_card_data)
1118                 return -ENOMEM;
1119         mach_priv = devm_kzalloc(&pdev->dev, sizeof(*mach_priv), GFP_KERNEL);
1120         if (!mach_priv)
1121                 return -ENOMEM;
1122
1123         soc_card_data->mach_priv = mach_priv;
1124
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);
1131         }
1132
1133         adsp_node = of_parse_phandle(pdev->dev.of_node, "mediatek,adsp", 0);
1134         if (adsp_node) {
1135                 struct mtk_sof_priv *sof_priv;
1136
1137                 sof_priv = devm_kzalloc(&pdev->dev, sizeof(*sof_priv), GFP_KERNEL);
1138                 if (!sof_priv) {
1139                         ret = -ENOMEM;
1140                         goto err_adsp_node;
1141                 }
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;
1151                 }
1152                 card->name = card->topology_shortname;
1153                 sof_on = 1;
1154         } else {
1155                 dev_dbg(&pdev->dev, "Probe without adsp\n");
1156         }
1157
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));
1163                 if (ret) {
1164                         dev_dbg(&pdev->dev, "Parse dai-link fail\n");
1165                         goto err_adsp_node;
1166                 }
1167         } else {
1168                 if (!sof_on)
1169                         card->num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links)
1170                                         - ARRAY_SIZE(g_sof_conn_streams);
1171         }
1172
1173         platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1174         if (!platform_node) {
1175                 ret = -EINVAL;
1176                 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1177                 goto err_platform_node;
1178         }
1179
1180         playback_codec = of_get_child_by_name(pdev->dev.of_node, "playback-codecs");
1181         if (!playback_codec) {
1182                 ret = -EINVAL;
1183                 dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1184                 goto err_playback_codec;
1185         }
1186
1187         headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1188         if (!headset_codec) {
1189                 ret = -EINVAL;
1190                 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1191                 goto err_headset_codec;
1192         }
1193
1194         for_each_card_prelinks(card, i, dai_link) {
1195                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
1196                 if (ret) {
1197                         dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1198                                       dai_link->name);
1199                         goto err_probe;
1200                 }
1201
1202                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
1203                 if (ret) {
1204                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1205                                       dai_link->name);
1206                         goto err_probe;
1207                 }
1208
1209                 ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
1210                 if (ret) {
1211                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1212                                       dai_link->name);
1213                         goto err_probe;
1214                 }
1215
1216                 if (!strncmp(dai_link->name, "AFE_SOF", strlen("AFE_SOF")) && sof_on)
1217                         dai_link->platforms->of_node = adsp_node;
1218
1219                 if (!dai_link->platforms->name && !dai_link->platforms->of_node)
1220                         dai_link->platforms->of_node = platform_node;
1221         }
1222
1223         snd_soc_card_set_drvdata(card, soc_card_data);
1224
1225         ret = mt8186_afe_gpio_init(&pdev->dev);
1226         if (ret) {
1227                 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1228                 goto err_probe;
1229         }
1230
1231         ret = devm_snd_soc_register_card(&pdev->dev, card);
1232         if (ret)
1233                 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1234
1235 err_probe:
1236         of_node_put(headset_codec);
1237 err_headset_codec:
1238         of_node_put(playback_codec);
1239 err_playback_codec:
1240         of_node_put(platform_node);
1241 err_platform_node:
1242 err_adsp_node:
1243         of_node_put(adsp_node);
1244
1245         return ret;
1246 }
1247
1248 #if IS_ENABLED(CONFIG_OF)
1249 static const struct of_device_id mt8186_mt6366_rt1019_rt5682s_dt_match[] = {
1250         {
1251                 .compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1252                 .data = &mt8186_mt6366_rt1019_rt5682s_soc_card,
1253         },
1254         {
1255                 .compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1256                 .data = &mt8186_mt6366_rt5682s_max98360_soc_card,
1257         },
1258         {}
1259 };
1260 MODULE_DEVICE_TABLE(of, mt8186_mt6366_rt1019_rt5682s_dt_match);
1261 #endif
1262
1263 static struct platform_driver mt8186_mt6366_rt1019_rt5682s_driver = {
1264         .driver = {
1265                 .name = "mt8186_mt6366_rt1019_rt5682s",
1266 #if IS_ENABLED(CONFIG_OF)
1267                 .of_match_table = mt8186_mt6366_rt1019_rt5682s_dt_match,
1268 #endif
1269                 .pm = &snd_soc_pm_ops,
1270         },
1271         .probe = mt8186_mt6366_rt1019_rt5682s_dev_probe,
1272 };
1273
1274 module_platform_driver(mt8186_mt6366_rt1019_rt5682s_driver);
1275
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");