GNU Linux-libre 5.19-rc6-gnu
[releases.git] / sound / soc / mediatek / mt8192 / mt8192-mt6359-rt1015-rt5682.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // mt8192-mt6359-rt1015-rt5682.c  --
4 //      MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver
5 //
6 // Copyright (c) 2020 MediaTek Inc.
7 // Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
8 //
9
10 #include <linux/input.h>
11 #include <linux/module.h>
12 #include <linux/of_device.h>
13 #include <linux/pm_runtime.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/mt6359.h"
20 #include "../../codecs/rt1015.h"
21 #include "../../codecs/rt5682.h"
22 #include "../common/mtk-afe-platform-driver.h"
23 #include "mt8192-afe-common.h"
24 #include "mt8192-afe-clk.h"
25 #include "mt8192-afe-gpio.h"
26
27 #define RT1015_CODEC_DAI        "rt1015-aif"
28 #define RT1015_DEV0_NAME        "rt1015.1-0028"
29 #define RT1015_DEV1_NAME        "rt1015.1-0029"
30
31 #define RT1015_RT5682_CARD_NAME "mt8192_mt6359_rt1015_rt5682"
32 #define RT1015P_RT5682_CARD_NAME "mt8192_mt6359_rt1015p_rt5682"
33 #define RT1015P_RT5682S_CARD_NAME "mt8192_mt6359_rt1015p_rt5682s"
34
35 #define RT1015_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015_rt5682"
36 #define RT1015P_RT5682_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682"
37 #define RT1015P_RT5682S_OF_NAME "mediatek,mt8192_mt6359_rt1015p_rt5682s"
38
39 struct mt8192_mt6359_priv {
40         struct snd_soc_jack headset_jack;
41         struct snd_soc_jack hdmi_jack;
42 };
43
44 static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
45                                        struct snd_pcm_hw_params *params)
46 {
47         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
48         struct snd_soc_card *card = rtd->card;
49         struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
50         struct snd_soc_dai *codec_dai;
51         unsigned int rate = params_rate(params);
52         unsigned int mclk_fs_ratio = 128;
53         unsigned int mclk_fs = rate * mclk_fs_ratio;
54         int ret, i;
55
56         for_each_rtd_codec_dais(rtd, i, codec_dai) {
57                 ret = snd_soc_dai_set_pll(codec_dai, 0,
58                                           RT1015_PLL_S_BCLK,
59                                           params_rate(params) * 64,
60                                           params_rate(params) * 256);
61                 if (ret) {
62                         dev_err(card->dev, "failed to set pll\n");
63                         return ret;
64                 }
65
66                 ret = snd_soc_dai_set_sysclk(codec_dai,
67                                              RT1015_SCLK_S_PLL,
68                                              params_rate(params) * 256,
69                                              SND_SOC_CLOCK_IN);
70                 if (ret) {
71                         dev_err(card->dev, "failed to set sysclk\n");
72                         return ret;
73                 }
74         }
75
76         return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
77 }
78
79 static int mt8192_rt5682x_i2s_hw_params(struct snd_pcm_substream *substream,
80                                         struct snd_pcm_hw_params *params)
81 {
82         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
83         struct snd_soc_card *card = rtd->card;
84         struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
85         struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
86         unsigned int rate = params_rate(params);
87         unsigned int mclk_fs_ratio = 128;
88         unsigned int mclk_fs = rate * mclk_fs_ratio;
89         int bitwidth;
90         int ret;
91
92         bitwidth = snd_pcm_format_width(params_format(params));
93         if (bitwidth < 0) {
94                 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
95                 return bitwidth;
96         }
97
98         ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
99         if (ret) {
100                 dev_err(card->dev, "failed to set tdm slot\n");
101                 return ret;
102         }
103
104         ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
105                                   RT5682_PLL1_S_BCLK1,
106                                   params_rate(params) * 64,
107                                   params_rate(params) * 512);
108         if (ret) {
109                 dev_err(card->dev, "failed to set pll\n");
110                 return ret;
111         }
112
113         ret = snd_soc_dai_set_sysclk(codec_dai,
114                                      RT5682_SCLK_S_PLL1,
115                                      params_rate(params) * 512,
116                                      SND_SOC_CLOCK_IN);
117         if (ret) {
118                 dev_err(card->dev, "failed to set sysclk\n");
119                 return ret;
120         }
121
122         return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
123 }
124
125 static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {
126         .hw_params = mt8192_rt1015_i2s_hw_params,
127 };
128
129 static const struct snd_soc_ops mt8192_rt5682x_i2s_ops = {
130         .hw_params = mt8192_rt5682x_i2s_hw_params,
131 };
132
133 static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
134 {
135         struct snd_soc_component *cmpnt_afe =
136                 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
137         struct snd_soc_component *cmpnt_codec =
138                 asoc_rtd_to_codec(rtd, 0)->component;
139         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
140         struct mt8192_afe_private *afe_priv = afe->platform_priv;
141         int phase;
142         unsigned int monitor;
143         int test_done_1, test_done_2, test_done_3;
144         int cycle_1, cycle_2, cycle_3;
145         int prev_cycle_1, prev_cycle_2, prev_cycle_3;
146         int chosen_phase_1, chosen_phase_2, chosen_phase_3;
147         int counter;
148         int mtkaif_calib_ok;
149
150         dev_info(afe->dev, "%s(), start\n", __func__);
151
152         pm_runtime_get_sync(afe->dev);
153         mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
154         mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
155         mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
156         mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
157
158         mt6359_mtkaif_calibration_enable(cmpnt_codec);
159
160         /* set clock protocol 2 */
161         regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
162         regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);
163
164         /* set test type to synchronizer pulse */
165         regmap_update_bits(afe_priv->topckgen,
166                            CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
167
168         mtkaif_calib_ok = true;
169         afe_priv->mtkaif_calibration_num_phase = 42;    /* mt6359: 0 ~ 42 */
170         afe_priv->mtkaif_chosen_phase[0] = -1;
171         afe_priv->mtkaif_chosen_phase[1] = -1;
172         afe_priv->mtkaif_chosen_phase[2] = -1;
173
174         for (phase = 0;
175              phase <= afe_priv->mtkaif_calibration_num_phase &&
176              mtkaif_calib_ok;
177              phase++) {
178                 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
179                                                     phase, phase, phase);
180
181                 regmap_update_bits(afe_priv->topckgen,
182                                    CKSYS_AUD_TOP_CFG, 0x1, 0x1);
183
184                 test_done_1 = 0;
185                 test_done_2 = 0;
186                 test_done_3 = 0;
187                 cycle_1 = -1;
188                 cycle_2 = -1;
189                 cycle_3 = -1;
190                 counter = 0;
191                 while (test_done_1 == 0 ||
192                        test_done_2 == 0 ||
193                        test_done_3 == 0) {
194                         regmap_read(afe_priv->topckgen,
195                                     CKSYS_AUD_TOP_MON, &monitor);
196
197                         test_done_1 = (monitor >> 28) & 0x1;
198                         test_done_2 = (monitor >> 29) & 0x1;
199                         test_done_3 = (monitor >> 30) & 0x1;
200                         if (test_done_1 == 1)
201                                 cycle_1 = monitor & 0xf;
202
203                         if (test_done_2 == 1)
204                                 cycle_2 = (monitor >> 4) & 0xf;
205
206                         if (test_done_3 == 1)
207                                 cycle_3 = (monitor >> 8) & 0xf;
208
209                         /* handle if never test done */
210                         if (++counter > 10000) {
211                                 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
212                                         __func__,
213                                         cycle_1, cycle_2, cycle_3, monitor);
214                                 mtkaif_calib_ok = false;
215                                 break;
216                         }
217                 }
218
219                 if (phase == 0) {
220                         prev_cycle_1 = cycle_1;
221                         prev_cycle_2 = cycle_2;
222                         prev_cycle_3 = cycle_3;
223                 }
224
225                 if (cycle_1 != prev_cycle_1 &&
226                     afe_priv->mtkaif_chosen_phase[0] < 0) {
227                         afe_priv->mtkaif_chosen_phase[0] = phase - 1;
228                         afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;
229                 }
230
231                 if (cycle_2 != prev_cycle_2 &&
232                     afe_priv->mtkaif_chosen_phase[1] < 0) {
233                         afe_priv->mtkaif_chosen_phase[1] = phase - 1;
234                         afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;
235                 }
236
237                 if (cycle_3 != prev_cycle_3 &&
238                     afe_priv->mtkaif_chosen_phase[2] < 0) {
239                         afe_priv->mtkaif_chosen_phase[2] = phase - 1;
240                         afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;
241                 }
242
243                 regmap_update_bits(afe_priv->topckgen,
244                                    CKSYS_AUD_TOP_CFG, 0x1, 0x0);
245
246                 if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&
247                     afe_priv->mtkaif_chosen_phase[1] >= 0 &&
248                     afe_priv->mtkaif_chosen_phase[2] >= 0)
249                         break;
250         }
251
252         if (afe_priv->mtkaif_chosen_phase[0] < 0)
253                 chosen_phase_1 = 0;
254         else
255                 chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];
256
257         if (afe_priv->mtkaif_chosen_phase[1] < 0)
258                 chosen_phase_2 = 0;
259         else
260                 chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];
261
262         if (afe_priv->mtkaif_chosen_phase[2] < 0)
263                 chosen_phase_3 = 0;
264         else
265                 chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];
266
267         mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
268                                             chosen_phase_1,
269                                             chosen_phase_2,
270                                             chosen_phase_3);
271
272         /* disable rx fifo */
273         regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
274
275         mt6359_mtkaif_calibration_disable(cmpnt_codec);
276
277         mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
278         mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
279         mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
280         mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
281         pm_runtime_put(afe->dev);
282
283         dev_info(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
284                  __func__,
285                  afe_priv->mtkaif_chosen_phase[0],
286                  afe_priv->mtkaif_chosen_phase[1],
287                  afe_priv->mtkaif_chosen_phase[2]);
288
289         return 0;
290 }
291
292 static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
293 {
294         struct snd_soc_component *cmpnt_afe =
295                 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
296         struct snd_soc_component *cmpnt_codec =
297                 asoc_rtd_to_codec(rtd, 0)->component;
298         struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
299         struct mt8192_afe_private *afe_priv = afe->platform_priv;
300
301         /* set mtkaif protocol */
302         mt6359_set_mtkaif_protocol(cmpnt_codec,
303                                    MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
304         afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;
305
306         /* mtkaif calibration */
307         mt8192_mt6359_mtkaif_calibration(rtd);
308
309         return 0;
310 }
311
312 static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
313 {
314         struct snd_soc_component *cmpnt_codec =
315                 asoc_rtd_to_codec(rtd, 0)->component;
316         struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
317         struct snd_soc_jack *jack = &priv->headset_jack;
318         int ret;
319
320         ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
321                                     SND_JACK_HEADSET | SND_JACK_BTN_0 |
322                                     SND_JACK_BTN_1 | SND_JACK_BTN_2 |
323                                     SND_JACK_BTN_3,
324                                     jack);
325         if (ret) {
326                 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
327                 return ret;
328         }
329
330         snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
331         snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
332         snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
333         snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
334
335         return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
336 };
337
338 static int mt8192_mt6359_hdmi_init(struct snd_soc_pcm_runtime *rtd)
339 {
340         struct snd_soc_component *cmpnt_codec =
341                 asoc_rtd_to_codec(rtd, 0)->component;
342         struct mt8192_mt6359_priv *priv = snd_soc_card_get_drvdata(rtd->card);
343         int ret;
344
345         ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
346                                     &priv->hdmi_jack);
347         if (ret) {
348                 dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
349                 return ret;
350         }
351
352         return snd_soc_component_set_jack(cmpnt_codec, &priv->hdmi_jack, NULL);
353 }
354
355 static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
356                                       struct snd_pcm_hw_params *params)
357 {
358         /* fix BE i2s format to S24_LE, clean param mask first */
359         snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
360                              0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
361
362         params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
363
364         return 0;
365 }
366
367 static int
368 mt8192_mt6359_cap1_startup(struct snd_pcm_substream *substream)
369 {
370         static const unsigned int channels[] = {
371                 1, 2, 4
372         };
373         static const struct snd_pcm_hw_constraint_list constraints_channels = {
374                 .count = ARRAY_SIZE(channels),
375                 .list = channels,
376                 .mask = 0,
377         };
378         static const unsigned int rates[] = {
379                 8000, 16000, 32000, 48000, 96000, 192000
380         };
381         static const struct snd_pcm_hw_constraint_list constraints_rates = {
382                 .count = ARRAY_SIZE(rates),
383                 .list  = rates,
384                 .mask = 0,
385         };
386
387         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
388         struct snd_pcm_runtime *runtime = substream->runtime;
389         int ret;
390
391         ret = snd_pcm_hw_constraint_list(runtime, 0,
392                                          SNDRV_PCM_HW_PARAM_CHANNELS,
393                                          &constraints_channels);
394         if (ret < 0) {
395                 dev_err(rtd->dev, "hw_constraint_list channels failed\n");
396                 return ret;
397         }
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         return 0;
408 }
409
410 static const struct snd_soc_ops mt8192_mt6359_capture1_ops = {
411         .startup = mt8192_mt6359_cap1_startup,
412 };
413
414 static int
415 mt8192_mt6359_rt5682_startup(struct snd_pcm_substream *substream)
416 {
417         static const unsigned int channels[] = {
418                 1, 2
419         };
420         static const struct snd_pcm_hw_constraint_list constraints_channels = {
421                 .count = ARRAY_SIZE(channels),
422                 .list = channels,
423                 .mask = 0,
424         };
425         static const unsigned int rates[] = {
426                 48000
427         };
428         static const struct snd_pcm_hw_constraint_list constraints_rates = {
429                 .count = ARRAY_SIZE(rates),
430                 .list  = rates,
431                 .mask = 0,
432         };
433
434         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
435         struct snd_pcm_runtime *runtime = substream->runtime;
436         int ret;
437
438         ret = snd_pcm_hw_constraint_list(runtime, 0,
439                                          SNDRV_PCM_HW_PARAM_CHANNELS,
440                                          &constraints_channels);
441         if (ret < 0) {
442                 dev_err(rtd->dev, "hw_constraint_list channels failed\n");
443                 return ret;
444         }
445
446         ret = snd_pcm_hw_constraint_list(runtime, 0,
447                                          SNDRV_PCM_HW_PARAM_RATE,
448                                          &constraints_rates);
449         if (ret < 0) {
450                 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
451                 return ret;
452         }
453
454         return 0;
455 }
456
457 static const struct snd_soc_ops mt8192_mt6359_rt5682_ops = {
458         .startup = mt8192_mt6359_rt5682_startup,
459 };
460
461 /* FE */
462 SND_SOC_DAILINK_DEFS(playback1,
463                      DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
464                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
465                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
466
467 SND_SOC_DAILINK_DEFS(playback12,
468                      DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
469                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
470                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
471
472 SND_SOC_DAILINK_DEFS(playback2,
473                      DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
474                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
475                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
476
477 SND_SOC_DAILINK_DEFS(playback3,
478                      DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
479                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
480                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
481
482 SND_SOC_DAILINK_DEFS(playback4,
483                      DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
484                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
485                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
486
487 SND_SOC_DAILINK_DEFS(playback5,
488                      DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
489                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
490                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
491
492 SND_SOC_DAILINK_DEFS(playback6,
493                      DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
494                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
495                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
496
497 SND_SOC_DAILINK_DEFS(playback7,
498                      DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
499                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
500                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
501
502 SND_SOC_DAILINK_DEFS(playback8,
503                      DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
504                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
505                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
506
507 SND_SOC_DAILINK_DEFS(playback9,
508                      DAILINK_COMP_ARRAY(COMP_CPU("DL9")),
509                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
510                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
511
512 SND_SOC_DAILINK_DEFS(capture1,
513                      DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
514                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
515                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
516
517 SND_SOC_DAILINK_DEFS(capture2,
518                      DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
519                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
520                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
521
522 SND_SOC_DAILINK_DEFS(capture3,
523                      DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
524                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
525                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
526
527 SND_SOC_DAILINK_DEFS(capture4,
528                      DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
529                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
530                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
531
532 SND_SOC_DAILINK_DEFS(capture5,
533                      DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
534                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
535                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
536
537 SND_SOC_DAILINK_DEFS(capture6,
538                      DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
539                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
540                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
541
542 SND_SOC_DAILINK_DEFS(capture7,
543                      DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
544                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
545                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
546
547 SND_SOC_DAILINK_DEFS(capture8,
548                      DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
549                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
550                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
551
552 SND_SOC_DAILINK_DEFS(capture_mono1,
553                      DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
554                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
555                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
556
557 SND_SOC_DAILINK_DEFS(capture_mono2,
558                      DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),
559                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
560                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
561
562 SND_SOC_DAILINK_DEFS(capture_mono3,
563                      DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),
564                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
565                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
566
567 SND_SOC_DAILINK_DEFS(playback_hdmi,
568                      DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
569                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
570                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
571
572 /* BE */
573 SND_SOC_DAILINK_DEFS(primary_codec,
574                      DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
575                      DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
576                                                    "mt6359-snd-codec-aif1"),
577                                         COMP_CODEC("dmic-codec",
578                                                    "dmic-hifi")),
579                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
580
581 SND_SOC_DAILINK_DEFS(primary_codec_ch34,
582                      DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),
583                      DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
584                                                    "mt6359-snd-codec-aif2")),
585                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
586
587 SND_SOC_DAILINK_DEFS(ap_dmic,
588                      DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),
589                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
590                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
591
592 SND_SOC_DAILINK_DEFS(ap_dmic_ch34,
593                      DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),
594                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
595                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
596
597 SND_SOC_DAILINK_DEFS(i2s0,
598                      DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
599                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
600                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
601
602 SND_SOC_DAILINK_DEFS(i2s1,
603                      DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
604                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
605                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
606
607 SND_SOC_DAILINK_DEFS(i2s2,
608                      DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
609                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
610                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
611
612 SND_SOC_DAILINK_DEFS(i2s3,
613                      DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
614                      DAILINK_COMP_ARRAY(COMP_EMPTY()),
615                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
616
617 SND_SOC_DAILINK_DEFS(i2s5,
618                      DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
619                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
620                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
621
622 SND_SOC_DAILINK_DEFS(i2s6,
623                      DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),
624                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
625                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
626
627 SND_SOC_DAILINK_DEFS(i2s7,
628                      DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),
629                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
630                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
631
632 SND_SOC_DAILINK_DEFS(i2s8,
633                      DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),
634                      DAILINK_COMP_ARRAY(COMP_EMPTY()),
635                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
636
637 SND_SOC_DAILINK_DEFS(i2s9,
638                      DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),
639                      DAILINK_COMP_ARRAY(COMP_EMPTY()),
640                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
641
642 SND_SOC_DAILINK_DEFS(connsys_i2s,
643                      DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
644                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
645                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
646
647 SND_SOC_DAILINK_DEFS(pcm1,
648                      DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
649                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
650                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
651
652 SND_SOC_DAILINK_DEFS(pcm2,
653                      DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
654                      DAILINK_COMP_ARRAY(COMP_DUMMY()),
655                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
656
657 SND_SOC_DAILINK_DEFS(tdm,
658                      DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
659                      DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),
660                      DAILINK_COMP_ARRAY(COMP_EMPTY()));
661
662 static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
663         /* Front End DAI links */
664         {
665                 .name = "Playback_1",
666                 .stream_name = "Playback_1",
667                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
668                             SND_SOC_DPCM_TRIGGER_PRE},
669                 .dynamic = 1,
670                 .dpcm_playback = 1,
671                 SND_SOC_DAILINK_REG(playback1),
672         },
673         {
674                 .name = "Playback_12",
675                 .stream_name = "Playback_12",
676                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
677                             SND_SOC_DPCM_TRIGGER_PRE},
678                 .dynamic = 1,
679                 .dpcm_playback = 1,
680                 SND_SOC_DAILINK_REG(playback12),
681         },
682         {
683                 .name = "Playback_2",
684                 .stream_name = "Playback_2",
685                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
686                             SND_SOC_DPCM_TRIGGER_PRE},
687                 .dynamic = 1,
688                 .dpcm_playback = 1,
689                 SND_SOC_DAILINK_REG(playback2),
690         },
691         {
692                 .name = "Playback_3",
693                 .stream_name = "Playback_3",
694                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
695                             SND_SOC_DPCM_TRIGGER_PRE},
696                 .dynamic = 1,
697                 .dpcm_playback = 1,
698                 .ops = &mt8192_mt6359_rt5682_ops,
699                 SND_SOC_DAILINK_REG(playback3),
700         },
701         {
702                 .name = "Playback_4",
703                 .stream_name = "Playback_4",
704                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
705                             SND_SOC_DPCM_TRIGGER_PRE},
706                 .dynamic = 1,
707                 .dpcm_playback = 1,
708                 SND_SOC_DAILINK_REG(playback4),
709         },
710         {
711                 .name = "Playback_5",
712                 .stream_name = "Playback_5",
713                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
714                             SND_SOC_DPCM_TRIGGER_PRE},
715                 .dynamic = 1,
716                 .dpcm_playback = 1,
717                 SND_SOC_DAILINK_REG(playback5),
718         },
719         {
720                 .name = "Playback_6",
721                 .stream_name = "Playback_6",
722                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
723                             SND_SOC_DPCM_TRIGGER_PRE},
724                 .dynamic = 1,
725                 .dpcm_playback = 1,
726                 SND_SOC_DAILINK_REG(playback6),
727         },
728         {
729                 .name = "Playback_7",
730                 .stream_name = "Playback_7",
731                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
732                             SND_SOC_DPCM_TRIGGER_PRE},
733                 .dynamic = 1,
734                 .dpcm_playback = 1,
735                 SND_SOC_DAILINK_REG(playback7),
736         },
737         {
738                 .name = "Playback_8",
739                 .stream_name = "Playback_8",
740                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
741                             SND_SOC_DPCM_TRIGGER_PRE},
742                 .dynamic = 1,
743                 .dpcm_playback = 1,
744                 SND_SOC_DAILINK_REG(playback8),
745         },
746         {
747                 .name = "Playback_9",
748                 .stream_name = "Playback_9",
749                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
750                             SND_SOC_DPCM_TRIGGER_PRE},
751                 .dynamic = 1,
752                 .dpcm_playback = 1,
753                 SND_SOC_DAILINK_REG(playback9),
754         },
755         {
756                 .name = "Capture_1",
757                 .stream_name = "Capture_1",
758                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
759                             SND_SOC_DPCM_TRIGGER_PRE},
760                 .dynamic = 1,
761                 .dpcm_capture = 1,
762                 .ops = &mt8192_mt6359_capture1_ops,
763                 SND_SOC_DAILINK_REG(capture1),
764         },
765         {
766                 .name = "Capture_2",
767                 .stream_name = "Capture_2",
768                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
769                             SND_SOC_DPCM_TRIGGER_PRE},
770                 .dynamic = 1,
771                 .dpcm_capture = 1,
772                 .ops = &mt8192_mt6359_rt5682_ops,
773                 SND_SOC_DAILINK_REG(capture2),
774         },
775         {
776                 .name = "Capture_3",
777                 .stream_name = "Capture_3",
778                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
779                             SND_SOC_DPCM_TRIGGER_PRE},
780                 .dynamic = 1,
781                 .dpcm_capture = 1,
782                 SND_SOC_DAILINK_REG(capture3),
783         },
784         {
785                 .name = "Capture_4",
786                 .stream_name = "Capture_4",
787                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
788                             SND_SOC_DPCM_TRIGGER_PRE},
789                 .dynamic = 1,
790                 .dpcm_capture = 1,
791                 SND_SOC_DAILINK_REG(capture4),
792         },
793         {
794                 .name = "Capture_5",
795                 .stream_name = "Capture_5",
796                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
797                             SND_SOC_DPCM_TRIGGER_PRE},
798                 .dynamic = 1,
799                 .dpcm_capture = 1,
800                 SND_SOC_DAILINK_REG(capture5),
801         },
802         {
803                 .name = "Capture_6",
804                 .stream_name = "Capture_6",
805                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
806                             SND_SOC_DPCM_TRIGGER_PRE},
807                 .dynamic = 1,
808                 .dpcm_capture = 1,
809                 SND_SOC_DAILINK_REG(capture6),
810         },
811         {
812                 .name = "Capture_7",
813                 .stream_name = "Capture_7",
814                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
815                             SND_SOC_DPCM_TRIGGER_PRE},
816                 .dynamic = 1,
817                 .dpcm_capture = 1,
818                 SND_SOC_DAILINK_REG(capture7),
819         },
820         {
821                 .name = "Capture_8",
822                 .stream_name = "Capture_8",
823                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
824                             SND_SOC_DPCM_TRIGGER_PRE},
825                 .dynamic = 1,
826                 .dpcm_capture = 1,
827                 SND_SOC_DAILINK_REG(capture8),
828         },
829         {
830                 .name = "Capture_Mono_1",
831                 .stream_name = "Capture_Mono_1",
832                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
833                             SND_SOC_DPCM_TRIGGER_PRE},
834                 .dynamic = 1,
835                 .dpcm_capture = 1,
836                 SND_SOC_DAILINK_REG(capture_mono1),
837         },
838         {
839                 .name = "Capture_Mono_2",
840                 .stream_name = "Capture_Mono_2",
841                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
842                             SND_SOC_DPCM_TRIGGER_PRE},
843                 .dynamic = 1,
844                 .dpcm_capture = 1,
845                 SND_SOC_DAILINK_REG(capture_mono2),
846         },
847         {
848                 .name = "Capture_Mono_3",
849                 .stream_name = "Capture_Mono_3",
850                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
851                             SND_SOC_DPCM_TRIGGER_PRE},
852                 .dynamic = 1,
853                 .dpcm_capture = 1,
854                 SND_SOC_DAILINK_REG(capture_mono3),
855         },
856         {
857                 .name = "playback_hdmi",
858                 .stream_name = "Playback_HDMI",
859                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
860                             SND_SOC_DPCM_TRIGGER_PRE},
861                 .dynamic = 1,
862                 .dpcm_playback = 1,
863                 SND_SOC_DAILINK_REG(playback_hdmi),
864         },
865         /* Back End DAI links */
866         {
867                 .name = "Primary Codec",
868                 .no_pcm = 1,
869                 .dpcm_playback = 1,
870                 .dpcm_capture = 1,
871                 .ignore_suspend = 1,
872                 .init = mt8192_mt6359_init,
873                 SND_SOC_DAILINK_REG(primary_codec),
874         },
875         {
876                 .name = "Primary Codec CH34",
877                 .no_pcm = 1,
878                 .dpcm_playback = 1,
879                 .dpcm_capture = 1,
880                 .ignore_suspend = 1,
881                 SND_SOC_DAILINK_REG(primary_codec_ch34),
882         },
883         {
884                 .name = "AP_DMIC",
885                 .no_pcm = 1,
886                 .dpcm_capture = 1,
887                 .ignore_suspend = 1,
888                 SND_SOC_DAILINK_REG(ap_dmic),
889         },
890         {
891                 .name = "AP_DMIC_CH34",
892                 .no_pcm = 1,
893                 .dpcm_capture = 1,
894                 .ignore_suspend = 1,
895                 SND_SOC_DAILINK_REG(ap_dmic_ch34),
896         },
897         {
898                 .name = "I2S0",
899                 .no_pcm = 1,
900                 .dpcm_capture = 1,
901                 .ignore_suspend = 1,
902                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
903                 SND_SOC_DAILINK_REG(i2s0),
904         },
905         {
906                 .name = "I2S1",
907                 .no_pcm = 1,
908                 .dpcm_playback = 1,
909                 .ignore_suspend = 1,
910                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
911                 SND_SOC_DAILINK_REG(i2s1),
912         },
913         {
914                 .name = "I2S2",
915                 .no_pcm = 1,
916                 .dpcm_capture = 1,
917                 .ignore_suspend = 1,
918                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
919                 SND_SOC_DAILINK_REG(i2s2),
920         },
921         {
922                 .name = "I2S3",
923                 .no_pcm = 1,
924                 .dpcm_playback = 1,
925                 .ignore_suspend = 1,
926                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
927                 SND_SOC_DAILINK_REG(i2s3),
928         },
929         {
930                 .name = "I2S5",
931                 .no_pcm = 1,
932                 .dpcm_playback = 1,
933                 .ignore_suspend = 1,
934                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
935                 SND_SOC_DAILINK_REG(i2s5),
936         },
937         {
938                 .name = "I2S6",
939                 .no_pcm = 1,
940                 .dpcm_capture = 1,
941                 .ignore_suspend = 1,
942                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
943                 SND_SOC_DAILINK_REG(i2s6),
944         },
945         {
946                 .name = "I2S7",
947                 .no_pcm = 1,
948                 .dpcm_playback = 1,
949                 .ignore_suspend = 1,
950                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
951                 SND_SOC_DAILINK_REG(i2s7),
952         },
953         {
954                 .name = "I2S8",
955                 .no_pcm = 1,
956                 .dpcm_capture = 1,
957                 .ignore_suspend = 1,
958                 .init = mt8192_rt5682_init,
959                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
960                 SND_SOC_DAILINK_REG(i2s8),
961                 .ops = &mt8192_rt5682x_i2s_ops,
962         },
963         {
964                 .name = "I2S9",
965                 .no_pcm = 1,
966                 .dpcm_playback = 1,
967                 .ignore_suspend = 1,
968                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
969                 SND_SOC_DAILINK_REG(i2s9),
970                 .ops = &mt8192_rt5682x_i2s_ops,
971         },
972         {
973                 .name = "CONNSYS_I2S",
974                 .no_pcm = 1,
975                 .dpcm_capture = 1,
976                 .ignore_suspend = 1,
977                 SND_SOC_DAILINK_REG(connsys_i2s),
978         },
979         {
980                 .name = "PCM 1",
981                 .no_pcm = 1,
982                 .dpcm_playback = 1,
983                 .dpcm_capture = 1,
984                 .ignore_suspend = 1,
985                 SND_SOC_DAILINK_REG(pcm1),
986         },
987         {
988                 .name = "PCM 2",
989                 .no_pcm = 1,
990                 .dpcm_playback = 1,
991                 .dpcm_capture = 1,
992                 .ignore_suspend = 1,
993                 SND_SOC_DAILINK_REG(pcm2),
994         },
995         {
996                 .name = "TDM",
997                 .no_pcm = 1,
998                 .dai_fmt = SND_SOC_DAIFMT_DSP_A |
999                            SND_SOC_DAIFMT_IB_NF |
1000                            SND_SOC_DAIFMT_CBM_CFM,
1001                 .dpcm_playback = 1,
1002                 .ignore_suspend = 1,
1003                 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
1004                 .ignore = 1,
1005                 .init = mt8192_mt6359_hdmi_init,
1006                 SND_SOC_DAILINK_REG(tdm),
1007         },
1008 };
1009
1010 static const struct snd_soc_dapm_widget
1011 mt8192_mt6359_rt1015_rt5682_widgets[] = {
1012         SND_SOC_DAPM_SPK("Left Spk", NULL),
1013         SND_SOC_DAPM_SPK("Right Spk", NULL),
1014         SND_SOC_DAPM_HP("Headphone Jack", NULL),
1015         SND_SOC_DAPM_MIC("Headset Mic", NULL),
1016         SND_SOC_DAPM_OUTPUT("TDM Out"),
1017 };
1018
1019 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
1020         /* speaker */
1021         { "Left Spk", NULL, "Left SPO" },
1022         { "Right Spk", NULL, "Right SPO" },
1023         /* headset */
1024         { "Headphone Jack", NULL, "HPOL" },
1025         { "Headphone Jack", NULL, "HPOR" },
1026         { "IN1P", NULL, "Headset Mic" },
1027         /* TDM */
1028         { "TDM Out", NULL, "TDM" },
1029 };
1030
1031 static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
1032         SOC_DAPM_PIN_SWITCH("Left Spk"),
1033         SOC_DAPM_PIN_SWITCH("Right Spk"),
1034         SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1035         SOC_DAPM_PIN_SWITCH("Headset Mic"),
1036 };
1037
1038 static struct snd_soc_codec_conf rt1015_amp_conf[] = {
1039         {
1040                 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
1041                 .name_prefix = "Left",
1042         },
1043         {
1044                 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
1045                 .name_prefix = "Right",
1046         },
1047 };
1048
1049 static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {
1050         .name = RT1015_RT5682_CARD_NAME,
1051         .owner = THIS_MODULE,
1052         .dai_link = mt8192_mt6359_dai_links,
1053         .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1054         .controls = mt8192_mt6359_rt1015_rt5682_controls,
1055         .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),
1056         .dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,
1057         .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),
1058         .dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,
1059         .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),
1060         .codec_conf = rt1015_amp_conf,
1061         .num_configs = ARRAY_SIZE(rt1015_amp_conf),
1062 };
1063
1064 static const struct snd_soc_dapm_widget mt8192_mt6359_rt1015p_rt5682x_widgets[] = {
1065         SND_SOC_DAPM_SPK("Speakers", NULL),
1066         SND_SOC_DAPM_HP("Headphone Jack", NULL),
1067         SND_SOC_DAPM_MIC("Headset Mic", NULL),
1068 };
1069
1070 static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682x_routes[] = {
1071         /* speaker */
1072         { "Speakers", NULL, "Speaker" },
1073         /* headset */
1074         { "Headphone Jack", NULL, "HPOL" },
1075         { "Headphone Jack", NULL, "HPOR" },
1076         { "IN1P", NULL, "Headset Mic" },
1077 };
1078
1079 static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682x_controls[] = {
1080         SOC_DAPM_PIN_SWITCH("Speakers"),
1081         SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1082         SOC_DAPM_PIN_SWITCH("Headset Mic"),
1083 };
1084
1085 static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682x_card = {
1086         .owner = THIS_MODULE,
1087         .dai_link = mt8192_mt6359_dai_links,
1088         .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1089         .controls = mt8192_mt6359_rt1015p_rt5682x_controls,
1090         .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_controls),
1091         .dapm_widgets = mt8192_mt6359_rt1015p_rt5682x_widgets,
1092         .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_widgets),
1093         .dapm_routes = mt8192_mt6359_rt1015p_rt5682x_routes,
1094         .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682x_routes),
1095 };
1096
1097 static int mt8192_mt6359_card_set_be_link(struct snd_soc_card *card,
1098                                           struct snd_soc_dai_link *link,
1099                                           struct device_node *node,
1100                                           char *link_name)
1101 {
1102         int ret;
1103
1104         if (node && strcmp(link->name, link_name) == 0) {
1105                 ret = snd_soc_of_get_dai_link_codecs(card->dev, node, link);
1106                 if (ret < 0) {
1107                         dev_err_probe(card->dev, ret, "get dai link codecs fail\n");
1108                         return ret;
1109                 }
1110         }
1111
1112         return 0;
1113 }
1114
1115 static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
1116 {
1117         struct snd_soc_card *card;
1118         struct device_node *platform_node, *hdmi_codec, *headset_codec, *speaker_codec;
1119         int ret, i;
1120         struct snd_soc_dai_link *dai_link;
1121         struct mt8192_mt6359_priv *priv;
1122
1123         card = (struct snd_soc_card *)of_device_get_match_data(&pdev->dev);
1124         if (!card)
1125                 return -EINVAL;
1126         card->dev = &pdev->dev;
1127
1128         if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682_OF_NAME))
1129                 card->name = RT1015P_RT5682_CARD_NAME;
1130         else if (of_device_is_compatible(pdev->dev.of_node, RT1015P_RT5682S_OF_NAME))
1131                 card->name = RT1015P_RT5682S_CARD_NAME;
1132         else
1133                 dev_dbg(&pdev->dev, "No need to set card name\n");
1134
1135         hdmi_codec = of_parse_phandle(pdev->dev.of_node, "mediatek,hdmi-codec", 0);
1136         if (!hdmi_codec)
1137                 dev_dbg(&pdev->dev, "The machine has no hdmi-codec\n");
1138
1139         platform_node = of_parse_phandle(pdev->dev.of_node, "mediatek,platform", 0);
1140         if (!platform_node) {
1141                 ret = -EINVAL;
1142                 dev_err_probe(&pdev->dev, ret, "Property 'platform' missing or invalid\n");
1143                 goto err_platform_node;
1144         }
1145
1146         speaker_codec = of_get_child_by_name(pdev->dev.of_node, "speaker-codecs");
1147         if (!speaker_codec) {
1148                 ret = -EINVAL;
1149                 dev_err_probe(&pdev->dev, ret, "Property 'speaker-codecs' missing or invalid\n");
1150                 goto err_speaker_codec;
1151         }
1152
1153         headset_codec = of_get_child_by_name(pdev->dev.of_node, "headset-codec");
1154         if (!headset_codec) {
1155                 ret = -EINVAL;
1156                 dev_err_probe(&pdev->dev, ret, "Property 'headset-codec' missing or invalid\n");
1157                 goto err_headset_codec;
1158         }
1159
1160         for_each_card_prelinks(card, i, dai_link) {
1161                 ret = mt8192_mt6359_card_set_be_link(card, dai_link, speaker_codec, "I2S3");
1162                 if (ret) {
1163                         dev_err_probe(&pdev->dev, ret, "%s set speaker_codec fail\n",
1164                                       dai_link->name);
1165                         goto err_probe;
1166                 }
1167
1168                 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S8");
1169                 if (ret) {
1170                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1171                                       dai_link->name);
1172                         goto err_probe;
1173                 }
1174
1175                 ret = mt8192_mt6359_card_set_be_link(card, dai_link, headset_codec, "I2S9");
1176                 if (ret) {
1177                         dev_err_probe(&pdev->dev, ret, "%s set headset_codec fail\n",
1178                                       dai_link->name);
1179                         goto err_probe;
1180                 }
1181
1182                 if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0) {
1183                         dai_link->codecs->of_node = hdmi_codec;
1184                         dai_link->ignore = 0;
1185                 }
1186
1187                 if (strcmp(dai_link->codecs[0].dai_name, RT1015_CODEC_DAI) == 0)
1188                         dai_link->ops = &mt8192_rt1015_i2s_ops;
1189
1190                 if (!dai_link->platforms->name)
1191                         dai_link->platforms->of_node = platform_node;
1192         }
1193
1194         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1195         if (!priv) {
1196                 ret = -ENOMEM;
1197                 goto err_probe;
1198         }
1199         snd_soc_card_set_drvdata(card, priv);
1200
1201         ret = mt8192_afe_gpio_init(&pdev->dev);
1202         if (ret) {
1203                 dev_err_probe(&pdev->dev, ret, "%s init gpio error\n", __func__);
1204                 goto err_probe;
1205         }
1206
1207         ret = devm_snd_soc_register_card(&pdev->dev, card);
1208         if (ret)
1209                 dev_err_probe(&pdev->dev, ret, "%s snd_soc_register_card fail\n", __func__);
1210
1211 err_probe:
1212         of_node_put(headset_codec);
1213 err_headset_codec:
1214         of_node_put(speaker_codec);
1215 err_speaker_codec:
1216         of_node_put(platform_node);
1217 err_platform_node:
1218         of_node_put(hdmi_codec);
1219         return ret;
1220 }
1221
1222 #ifdef CONFIG_OF
1223 static const struct of_device_id mt8192_mt6359_dt_match[] = {
1224         {
1225                 .compatible = RT1015_RT5682_OF_NAME,
1226                 .data = &mt8192_mt6359_rt1015_rt5682_card,
1227         },
1228         {
1229                 .compatible = RT1015P_RT5682_OF_NAME,
1230                 .data = &mt8192_mt6359_rt1015p_rt5682x_card,
1231         },
1232         {
1233                 .compatible = RT1015P_RT5682S_OF_NAME,
1234                 .data = &mt8192_mt6359_rt1015p_rt5682x_card,
1235         },
1236         {}
1237 };
1238 #endif
1239
1240 static const struct dev_pm_ops mt8192_mt6359_pm_ops = {
1241         .poweroff = snd_soc_poweroff,
1242         .restore = snd_soc_resume,
1243 };
1244
1245 static struct platform_driver mt8192_mt6359_driver = {
1246         .driver = {
1247                 .name = "mt8192_mt6359",
1248 #ifdef CONFIG_OF
1249                 .of_match_table = mt8192_mt6359_dt_match,
1250 #endif
1251                 .pm = &mt8192_mt6359_pm_ops,
1252         },
1253         .probe = mt8192_mt6359_dev_probe,
1254 };
1255
1256 module_platform_driver(mt8192_mt6359_driver);
1257
1258 /* Module information */
1259 MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");
1260 MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1261 MODULE_LICENSE("GPL v2");
1262 MODULE_ALIAS("mt8192_mt6359 soc card");