Merge tag 'edac_updates_for_5.9_pt2' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / sound / soc / mediatek / mt8183 / mt8183-da7219-max98357.c
1 // SPDX-License-Identifier: GPL-2.0
2 //
3 // mt8183-da7219-max98357.c
4 //      --  MT8183-DA7219-MAX98357 ALSA SoC machine driver
5 //
6 // Copyright (c) 2018 MediaTek Inc.
7 // Author: Shunli Wang <shunli.wang@mediatek.com>
8
9 #include <linux/input.h>
10 #include <linux/module.h>
11 #include <linux/of_device.h>
12 #include <linux/pinctrl/consumer.h>
13 #include <sound/hdmi-codec.h>
14 #include <sound/jack.h>
15 #include <sound/pcm_params.h>
16 #include <sound/soc.h>
17
18 #include "../../codecs/da7219-aad.h"
19 #include "../../codecs/da7219.h"
20 #include "../../codecs/rt1015.h"
21 #include "mt8183-afe-common.h"
22
23 #define DA7219_CODEC_DAI "da7219-hifi"
24 #define DA7219_DEV_NAME "da7219.5-001a"
25 #define RT1015_CODEC_DAI "rt1015-aif"
26 #define RT1015_DEV0_NAME "rt1015.6-0028"
27 #define RT1015_DEV1_NAME "rt1015.6-0029"
28
29 struct mt8183_da7219_max98357_priv {
30         struct snd_soc_jack headset_jack, hdmi_jack;
31 };
32
33 static int mt8183_mt6358_i2s_hw_params(struct snd_pcm_substream *substream,
34                                        struct snd_pcm_hw_params *params)
35 {
36         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
37         unsigned int rate = params_rate(params);
38         unsigned int mclk_fs_ratio = 128;
39         unsigned int mclk_fs = rate * mclk_fs_ratio;
40
41         return snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0),
42                                       0, mclk_fs, SND_SOC_CLOCK_OUT);
43 }
44
45 static const struct snd_soc_ops mt8183_mt6358_i2s_ops = {
46         .hw_params = mt8183_mt6358_i2s_hw_params,
47 };
48
49 static int mt8183_da7219_i2s_hw_params(struct snd_pcm_substream *substream,
50                                        struct snd_pcm_hw_params *params)
51 {
52         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
53         struct snd_soc_dai *codec_dai;
54         unsigned int rate = params_rate(params);
55         unsigned int mclk_fs_ratio = 256;
56         unsigned int mclk_fs = rate * mclk_fs_ratio;
57         unsigned int freq;
58         int ret = 0, j;
59
60         ret = snd_soc_dai_set_sysclk(asoc_rtd_to_cpu(rtd, 0), 0,
61                                      mclk_fs, SND_SOC_CLOCK_OUT);
62         if (ret < 0)
63                 dev_err(rtd->dev, "failed to set cpu dai sysclk\n");
64
65         for_each_rtd_codec_dais(rtd, j, codec_dai) {
66                 if (!strcmp(codec_dai->component->name, DA7219_DEV_NAME)) {
67                         ret = snd_soc_dai_set_sysclk(codec_dai,
68                                                      DA7219_CLKSRC_MCLK,
69                                                      mclk_fs,
70                                                      SND_SOC_CLOCK_IN);
71                         if (ret < 0)
72                                 dev_err(rtd->dev, "failed to set sysclk\n");
73
74                         if ((rate % 8000) == 0)
75                                 freq = DA7219_PLL_FREQ_OUT_98304;
76                         else
77                                 freq = DA7219_PLL_FREQ_OUT_90316;
78
79                         ret = snd_soc_dai_set_pll(codec_dai, 0,
80                                                   DA7219_SYSCLK_PLL_SRM,
81                                                   0, freq);
82                         if (ret)
83                                 dev_err(rtd->dev, "failed to start PLL: %d\n",
84                                         ret);
85                 }
86         }
87
88         return ret;
89 }
90
91 static int mt8183_da7219_hw_free(struct snd_pcm_substream *substream)
92 {
93         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
94         struct snd_soc_dai *codec_dai;
95         int ret = 0, j;
96
97         for_each_rtd_codec_dais(rtd, j, codec_dai) {
98                 if (!strcmp(codec_dai->component->name, DA7219_DEV_NAME)) {
99                         ret = snd_soc_dai_set_pll(codec_dai,
100                                                   0, DA7219_SYSCLK_MCLK, 0, 0);
101                         if (ret < 0) {
102                                 dev_err(rtd->dev, "failed to stop PLL: %d\n",
103                                         ret);
104                                 break;
105                         }
106                 }
107         }
108
109         return ret;
110 }
111
112 static const struct snd_soc_ops mt8183_da7219_i2s_ops = {
113         .hw_params = mt8183_da7219_i2s_hw_params,
114         .hw_free = mt8183_da7219_hw_free,
115 };
116
117 static int
118 mt8183_da7219_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
119                                    struct snd_pcm_hw_params *params)
120 {
121         struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
122         unsigned int rate = params_rate(params);
123         struct snd_soc_dai *codec_dai;
124         int ret = 0, i;
125
126         for_each_rtd_codec_dais(rtd, i, codec_dai) {
127                 if (!strcmp(codec_dai->component->name, RT1015_DEV0_NAME) ||
128                     !strcmp(codec_dai->component->name, RT1015_DEV1_NAME)) {
129                         ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
130                         if (ret) {
131                                 dev_err(rtd->dev, "failed to set bclk ratio\n");
132                                 return ret;
133                         }
134
135                         ret = snd_soc_dai_set_pll(codec_dai, 0,
136                                                   RT1015_PLL_S_BCLK,
137                                                   rate * 64, rate * 256);
138                         if (ret) {
139                                 dev_err(rtd->dev, "failed to set pll\n");
140                                 return ret;
141                         }
142
143                         ret = snd_soc_dai_set_sysclk(codec_dai,
144                                                      RT1015_SCLK_S_PLL,
145                                                      rate * 256,
146                                                      SND_SOC_CLOCK_IN);
147                         if (ret) {
148                                 dev_err(rtd->dev, "failed to set sysclk\n");
149                                 return ret;
150                         }
151                 }
152         }
153
154         return mt8183_da7219_i2s_hw_params(substream, params);
155 }
156
157 static const struct snd_soc_ops mt8183_da7219_rt1015_i2s_ops = {
158         .hw_params = mt8183_da7219_rt1015_i2s_hw_params,
159         .hw_free = mt8183_da7219_hw_free,
160 };
161
162 static int mt8183_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
163                                       struct snd_pcm_hw_params *params)
164 {
165         /* fix BE i2s format to 32bit, clean param mask first */
166         snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
167                              0, SNDRV_PCM_FORMAT_LAST);
168
169         params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
170
171         return 0;
172 }
173
174 static int mt8183_rt1015_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
175                                              struct snd_pcm_hw_params *params)
176 {
177         /* fix BE i2s format to 32bit, clean param mask first */
178         snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
179                              0, SNDRV_PCM_FORMAT_LAST);
180
181         params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
182
183         return 0;
184 }
185
186 static int
187 mt8183_da7219_max98357_startup(
188         struct snd_pcm_substream *substream)
189 {
190         static const unsigned int rates[] = {
191                 48000,
192         };
193         static const struct snd_pcm_hw_constraint_list constraints_rates = {
194                 .count = ARRAY_SIZE(rates),
195                 .list  = rates,
196                 .mask = 0,
197         };
198         static const unsigned int channels[] = {
199                 2,
200         };
201         static const struct snd_pcm_hw_constraint_list constraints_channels = {
202                 .count = ARRAY_SIZE(channels),
203                 .list = channels,
204                 .mask = 0,
205         };
206
207         struct snd_pcm_runtime *runtime = substream->runtime;
208
209         snd_pcm_hw_constraint_list(runtime, 0,
210                         SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
211         runtime->hw.channels_max = 2;
212         snd_pcm_hw_constraint_list(runtime, 0,
213                         SNDRV_PCM_HW_PARAM_CHANNELS,
214                         &constraints_channels);
215
216         runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
217         snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
218
219         return 0;
220 }
221
222 static const struct snd_soc_ops mt8183_da7219_max98357_ops = {
223         .startup = mt8183_da7219_max98357_startup,
224 };
225
226 static int
227 mt8183_da7219_max98357_bt_sco_startup(
228         struct snd_pcm_substream *substream)
229 {
230         static const unsigned int rates[] = {
231                 8000, 16000
232         };
233         static const struct snd_pcm_hw_constraint_list constraints_rates = {
234                 .count = ARRAY_SIZE(rates),
235                 .list  = rates,
236                 .mask = 0,
237         };
238         static const unsigned int channels[] = {
239                 1,
240         };
241         static const struct snd_pcm_hw_constraint_list constraints_channels = {
242                 .count = ARRAY_SIZE(channels),
243                 .list = channels,
244                 .mask = 0,
245         };
246
247         struct snd_pcm_runtime *runtime = substream->runtime;
248
249         snd_pcm_hw_constraint_list(runtime, 0,
250                         SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
251         runtime->hw.channels_max = 1;
252         snd_pcm_hw_constraint_list(runtime, 0,
253                         SNDRV_PCM_HW_PARAM_CHANNELS,
254                         &constraints_channels);
255
256         runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
257         snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
258
259         return 0;
260 }
261
262 static const struct snd_soc_ops mt8183_da7219_max98357_bt_sco_ops = {
263         .startup = mt8183_da7219_max98357_bt_sco_startup,
264 };
265
266 /* FE */
267 SND_SOC_DAILINK_DEFS(playback1,
268         DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
269         DAILINK_COMP_ARRAY(COMP_DUMMY()),
270         DAILINK_COMP_ARRAY(COMP_EMPTY()));
271
272 SND_SOC_DAILINK_DEFS(playback2,
273         DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
274         DAILINK_COMP_ARRAY(COMP_DUMMY()),
275         DAILINK_COMP_ARRAY(COMP_EMPTY()));
276
277 SND_SOC_DAILINK_DEFS(playback3,
278         DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
279         DAILINK_COMP_ARRAY(COMP_DUMMY()),
280         DAILINK_COMP_ARRAY(COMP_EMPTY()));
281
282 SND_SOC_DAILINK_DEFS(capture1,
283         DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
284         DAILINK_COMP_ARRAY(COMP_DUMMY()),
285         DAILINK_COMP_ARRAY(COMP_EMPTY()));
286
287 SND_SOC_DAILINK_DEFS(capture2,
288         DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
289         DAILINK_COMP_ARRAY(COMP_DUMMY()),
290         DAILINK_COMP_ARRAY(COMP_EMPTY()));
291
292 SND_SOC_DAILINK_DEFS(capture3,
293         DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
294         DAILINK_COMP_ARRAY(COMP_DUMMY()),
295         DAILINK_COMP_ARRAY(COMP_EMPTY()));
296
297 SND_SOC_DAILINK_DEFS(capture_mono,
298         DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
299         DAILINK_COMP_ARRAY(COMP_DUMMY()),
300         DAILINK_COMP_ARRAY(COMP_EMPTY()));
301
302 SND_SOC_DAILINK_DEFS(playback_hdmi,
303         DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
304         DAILINK_COMP_ARRAY(COMP_DUMMY()),
305         DAILINK_COMP_ARRAY(COMP_EMPTY()));
306
307 /* BE */
308 SND_SOC_DAILINK_DEFS(primary_codec,
309         DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
310         DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound", "mt6358-snd-codec-aif1")),
311         DAILINK_COMP_ARRAY(COMP_EMPTY()));
312
313 SND_SOC_DAILINK_DEFS(pcm1,
314         DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
315         DAILINK_COMP_ARRAY(COMP_DUMMY()),
316         DAILINK_COMP_ARRAY(COMP_EMPTY()));
317
318 SND_SOC_DAILINK_DEFS(pcm2,
319         DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
320         DAILINK_COMP_ARRAY(COMP_DUMMY()),
321         DAILINK_COMP_ARRAY(COMP_EMPTY()));
322
323 SND_SOC_DAILINK_DEFS(i2s0,
324         DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
325         DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm")),
326         DAILINK_COMP_ARRAY(COMP_EMPTY()));
327
328 SND_SOC_DAILINK_DEFS(i2s1,
329         DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
330         DAILINK_COMP_ARRAY(COMP_DUMMY()),
331         DAILINK_COMP_ARRAY(COMP_EMPTY()));
332
333 SND_SOC_DAILINK_DEFS(i2s2,
334         DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
335         DAILINK_COMP_ARRAY(COMP_CODEC(DA7219_DEV_NAME, DA7219_CODEC_DAI)),
336         DAILINK_COMP_ARRAY(COMP_EMPTY()));
337
338 SND_SOC_DAILINK_DEFS(i2s3_max98357a,
339         DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
340         DAILINK_COMP_ARRAY(COMP_CODEC("max98357a", "HiFi"),
341                            COMP_CODEC(DA7219_DEV_NAME, DA7219_CODEC_DAI)),
342         DAILINK_COMP_ARRAY(COMP_EMPTY()));
343
344 SND_SOC_DAILINK_DEFS(i2s3_rt1015,
345         DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
346         DAILINK_COMP_ARRAY(COMP_CODEC(RT1015_DEV0_NAME, RT1015_CODEC_DAI),
347                            COMP_CODEC(RT1015_DEV1_NAME, RT1015_CODEC_DAI),
348                            COMP_CODEC(DA7219_DEV_NAME, DA7219_CODEC_DAI)),
349         DAILINK_COMP_ARRAY(COMP_EMPTY()));
350
351 SND_SOC_DAILINK_DEFS(i2s5,
352         DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
353         DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm")),
354         DAILINK_COMP_ARRAY(COMP_EMPTY()));
355
356 SND_SOC_DAILINK_DEFS(tdm,
357         DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
358         DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "i2s-hifi")),
359         DAILINK_COMP_ARRAY(COMP_EMPTY()));
360
361 static int mt8183_da7219_max98357_hdmi_init(struct snd_soc_pcm_runtime *rtd)
362 {
363         struct mt8183_da7219_max98357_priv *priv =
364                 snd_soc_card_get_drvdata(rtd->card);
365         int ret;
366
367         ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT,
368                                     &priv->hdmi_jack, NULL, 0);
369         if (ret)
370                 return ret;
371
372         return hdmi_codec_set_jack_detect(asoc_rtd_to_codec(rtd, 0)->component,
373                                           &priv->hdmi_jack);
374 }
375
376 static struct snd_soc_dai_link mt8183_da7219_dai_links[] = {
377         /* FE */
378         {
379                 .name = "Playback_1",
380                 .stream_name = "Playback_1",
381                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
382                             SND_SOC_DPCM_TRIGGER_PRE},
383                 .dynamic = 1,
384                 .dpcm_playback = 1,
385                 .ops = &mt8183_da7219_max98357_ops,
386                 SND_SOC_DAILINK_REG(playback1),
387         },
388         {
389                 .name = "Playback_2",
390                 .stream_name = "Playback_2",
391                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
392                             SND_SOC_DPCM_TRIGGER_PRE},
393                 .dynamic = 1,
394                 .dpcm_playback = 1,
395                 .ops = &mt8183_da7219_max98357_bt_sco_ops,
396                 SND_SOC_DAILINK_REG(playback2),
397         },
398         {
399                 .name = "Playback_3",
400                 .stream_name = "Playback_3",
401                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
402                             SND_SOC_DPCM_TRIGGER_PRE},
403                 .dynamic = 1,
404                 .dpcm_playback = 1,
405                 SND_SOC_DAILINK_REG(playback3),
406         },
407         {
408                 .name = "Capture_1",
409                 .stream_name = "Capture_1",
410                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
411                             SND_SOC_DPCM_TRIGGER_PRE},
412                 .dynamic = 1,
413                 .dpcm_capture = 1,
414                 .ops = &mt8183_da7219_max98357_bt_sco_ops,
415                 SND_SOC_DAILINK_REG(capture1),
416         },
417         {
418                 .name = "Capture_2",
419                 .stream_name = "Capture_2",
420                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
421                             SND_SOC_DPCM_TRIGGER_PRE},
422                 .dynamic = 1,
423                 .dpcm_capture = 1,
424                 SND_SOC_DAILINK_REG(capture2),
425         },
426         {
427                 .name = "Capture_3",
428                 .stream_name = "Capture_3",
429                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
430                             SND_SOC_DPCM_TRIGGER_PRE},
431                 .dynamic = 1,
432                 .dpcm_capture = 1,
433                 .ops = &mt8183_da7219_max98357_ops,
434                 SND_SOC_DAILINK_REG(capture3),
435         },
436         {
437                 .name = "Capture_Mono_1",
438                 .stream_name = "Capture_Mono_1",
439                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
440                             SND_SOC_DPCM_TRIGGER_PRE},
441                 .dynamic = 1,
442                 .dpcm_capture = 1,
443                 SND_SOC_DAILINK_REG(capture_mono),
444         },
445         {
446                 .name = "Playback_HDMI",
447                 .stream_name = "Playback_HDMI",
448                 .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
449                             SND_SOC_DPCM_TRIGGER_PRE},
450                 .dynamic = 1,
451                 .dpcm_playback = 1,
452                 SND_SOC_DAILINK_REG(playback_hdmi),
453         },
454         /* BE */
455         {
456                 .name = "Primary Codec",
457                 .no_pcm = 1,
458                 .dpcm_playback = 1,
459                 .dpcm_capture = 1,
460                 .ignore_suspend = 1,
461                 SND_SOC_DAILINK_REG(primary_codec),
462         },
463         {
464                 .name = "PCM 1",
465                 .no_pcm = 1,
466                 .dpcm_playback = 1,
467                 .dpcm_capture = 1,
468                 .ignore_suspend = 1,
469                 SND_SOC_DAILINK_REG(pcm1),
470         },
471         {
472                 .name = "PCM 2",
473                 .no_pcm = 1,
474                 .dpcm_playback = 1,
475                 .dpcm_capture = 1,
476                 .ignore_suspend = 1,
477                 SND_SOC_DAILINK_REG(pcm2),
478         },
479         {
480                 .name = "I2S0",
481                 .no_pcm = 1,
482                 .dpcm_capture = 1,
483                 .ignore_suspend = 1,
484                 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
485                 .ops = &mt8183_mt6358_i2s_ops,
486                 SND_SOC_DAILINK_REG(i2s0),
487         },
488         {
489                 .name = "I2S1",
490                 .no_pcm = 1,
491                 .dpcm_playback = 1,
492                 .ignore_suspend = 1,
493                 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
494                 .ops = &mt8183_mt6358_i2s_ops,
495                 SND_SOC_DAILINK_REG(i2s1),
496         },
497         {
498                 .name = "I2S2",
499                 .no_pcm = 1,
500                 .dpcm_capture = 1,
501                 .ignore_suspend = 1,
502                 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
503                 .ops = &mt8183_da7219_i2s_ops,
504                 SND_SOC_DAILINK_REG(i2s2),
505         },
506         {
507                 .name = "I2S3",
508                 .no_pcm = 1,
509                 .dpcm_playback = 1,
510                 .ignore_suspend = 1,
511         },
512         {
513                 .name = "I2S5",
514                 .no_pcm = 1,
515                 .dpcm_playback = 1,
516                 .ignore_suspend = 1,
517                 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
518                 .ops = &mt8183_mt6358_i2s_ops,
519                 SND_SOC_DAILINK_REG(i2s5),
520         },
521         {
522                 .name = "TDM",
523                 .no_pcm = 1,
524                 .dai_fmt = SND_SOC_DAIFMT_I2S |
525                            SND_SOC_DAIFMT_IB_IF |
526                            SND_SOC_DAIFMT_CBM_CFM,
527                 .dpcm_playback = 1,
528                 .ignore_suspend = 1,
529                 .be_hw_params_fixup = mt8183_i2s_hw_params_fixup,
530                 .init = mt8183_da7219_max98357_hdmi_init,
531                 SND_SOC_DAILINK_REG(tdm),
532         },
533 };
534
535 static int
536 mt8183_da7219_max98357_headset_init(struct snd_soc_component *component)
537 {
538         int ret;
539         struct mt8183_da7219_max98357_priv *priv =
540                         snd_soc_card_get_drvdata(component->card);
541
542         /* Enable Headset and 4 Buttons Jack detection */
543         ret = snd_soc_card_jack_new(component->card,
544                                     "Headset Jack",
545                                     SND_JACK_HEADSET |
546                                     SND_JACK_BTN_0 | SND_JACK_BTN_1 |
547                                     SND_JACK_BTN_2 | SND_JACK_BTN_3,
548                                     &priv->headset_jack,
549                                     NULL, 0);
550         if (ret)
551                 return ret;
552
553         snd_jack_set_key(
554                 priv->headset_jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
555         snd_jack_set_key(
556                 priv->headset_jack.jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
557         snd_jack_set_key(
558                 priv->headset_jack.jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
559         snd_jack_set_key(
560                 priv->headset_jack.jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
561
562         da7219_aad_jack_det(component, &priv->headset_jack);
563
564         return 0;
565 }
566
567 static struct snd_soc_aux_dev mt8183_da7219_max98357_headset_dev = {
568         .dlc = COMP_EMPTY(),
569         .init = mt8183_da7219_max98357_headset_init,
570 };
571
572 static struct snd_soc_codec_conf mt6358_codec_conf[] = {
573         {
574                 .dlc = COMP_CODEC_CONF("mt6358-sound"),
575                 .name_prefix = "Mt6358",
576         },
577 };
578
579 static const struct snd_kcontrol_new mt8183_da7219_max98357_snd_controls[] = {
580         SOC_DAPM_PIN_SWITCH("Speakers"),
581 };
582
583 static const
584 struct snd_soc_dapm_widget mt8183_da7219_max98357_dapm_widgets[] = {
585         SND_SOC_DAPM_SPK("Speakers", NULL),
586         SND_SOC_DAPM_PINCTRL("TDM_OUT_PINCTRL",
587                              "aud_tdm_out_on", "aud_tdm_out_off"),
588 };
589
590 static const struct snd_soc_dapm_route mt8183_da7219_max98357_dapm_routes[] = {
591         {"Speakers", NULL, "Speaker"},
592         {"I2S Playback", NULL, "TDM_OUT_PINCTRL"},
593 };
594
595 static struct snd_soc_card mt8183_da7219_max98357_card = {
596         .name = "mt8183_da7219_max98357",
597         .owner = THIS_MODULE,
598         .controls = mt8183_da7219_max98357_snd_controls,
599         .num_controls = ARRAY_SIZE(mt8183_da7219_max98357_snd_controls),
600         .dapm_widgets = mt8183_da7219_max98357_dapm_widgets,
601         .num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_max98357_dapm_widgets),
602         .dapm_routes = mt8183_da7219_max98357_dapm_routes,
603         .num_dapm_routes = ARRAY_SIZE(mt8183_da7219_max98357_dapm_routes),
604         .dai_link = mt8183_da7219_dai_links,
605         .num_links = ARRAY_SIZE(mt8183_da7219_dai_links),
606         .aux_dev = &mt8183_da7219_max98357_headset_dev,
607         .num_aux_devs = 1,
608         .codec_conf = mt6358_codec_conf,
609         .num_configs = ARRAY_SIZE(mt6358_codec_conf),
610 };
611
612 static struct snd_soc_codec_conf mt8183_da7219_rt1015_codec_conf[] = {
613         {
614                 .dlc = COMP_CODEC_CONF("mt6358-sound"),
615                 .name_prefix = "Mt6358",
616         },
617         {
618                 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
619                 .name_prefix = "Left",
620         },
621         {
622                 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
623                 .name_prefix = "Right",
624         },
625 };
626
627 static struct snd_soc_card mt8183_da7219_rt1015_card = {
628         .name = "mt8183_da7219_rt1015",
629         .owner = THIS_MODULE,
630         .controls = mt8183_da7219_max98357_snd_controls,
631         .num_controls = ARRAY_SIZE(mt8183_da7219_max98357_snd_controls),
632         .dapm_widgets = mt8183_da7219_max98357_dapm_widgets,
633         .num_dapm_widgets = ARRAY_SIZE(mt8183_da7219_max98357_dapm_widgets),
634         .dapm_routes = mt8183_da7219_max98357_dapm_routes,
635         .num_dapm_routes = ARRAY_SIZE(mt8183_da7219_max98357_dapm_routes),
636         .dai_link = mt8183_da7219_dai_links,
637         .num_links = ARRAY_SIZE(mt8183_da7219_dai_links),
638         .aux_dev = &mt8183_da7219_max98357_headset_dev,
639         .num_aux_devs = 1,
640         .codec_conf = mt8183_da7219_rt1015_codec_conf,
641         .num_configs = ARRAY_SIZE(mt8183_da7219_rt1015_codec_conf),
642 };
643
644 static int mt8183_da7219_max98357_dev_probe(struct platform_device *pdev)
645 {
646         struct snd_soc_card *card;
647         struct device_node *platform_node, *hdmi_codec;
648         struct snd_soc_dai_link *dai_link;
649         struct mt8183_da7219_max98357_priv *priv;
650         struct pinctrl *pinctrl;
651         const struct of_device_id *match;
652         int ret, i;
653
654         platform_node = of_parse_phandle(pdev->dev.of_node,
655                                          "mediatek,platform", 0);
656         if (!platform_node) {
657                 dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
658                 return -EINVAL;
659         }
660
661         match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
662         if (!match || !match->data)
663                 return -EINVAL;
664
665         card = (struct snd_soc_card *)match->data;
666         card->dev = &pdev->dev;
667
668         hdmi_codec = of_parse_phandle(pdev->dev.of_node,
669                                       "mediatek,hdmi-codec", 0);
670
671         for_each_card_prelinks(card, i, dai_link) {
672                 if (strcmp(dai_link->name, "I2S3") == 0) {
673                         if (card == &mt8183_da7219_max98357_card) {
674                                 dai_link->be_hw_params_fixup =
675                                         mt8183_i2s_hw_params_fixup;
676                                 dai_link->ops = &mt8183_mt6358_i2s_ops;
677                                 dai_link->cpus = i2s3_max98357a_cpus;
678                                 dai_link->num_cpus =
679                                         ARRAY_SIZE(i2s3_max98357a_cpus);
680                                 dai_link->codecs = i2s3_max98357a_codecs;
681                                 dai_link->num_codecs =
682                                         ARRAY_SIZE(i2s3_max98357a_codecs);
683                                 dai_link->platforms = i2s3_max98357a_platforms;
684                                 dai_link->num_platforms =
685                                         ARRAY_SIZE(i2s3_max98357a_platforms);
686                         } else if (card == &mt8183_da7219_rt1015_card) {
687                                 dai_link->be_hw_params_fixup =
688                                         mt8183_rt1015_i2s_hw_params_fixup;
689                                 dai_link->ops = &mt8183_da7219_rt1015_i2s_ops;
690                                 dai_link->cpus = i2s3_rt1015_cpus;
691                                 dai_link->num_cpus =
692                                         ARRAY_SIZE(i2s3_rt1015_cpus);
693                                 dai_link->codecs = i2s3_rt1015_codecs;
694                                 dai_link->num_codecs =
695                                         ARRAY_SIZE(i2s3_rt1015_codecs);
696                                 dai_link->platforms = i2s3_rt1015_platforms;
697                                 dai_link->num_platforms =
698                                         ARRAY_SIZE(i2s3_rt1015_platforms);
699                         }
700                 }
701
702                 if (hdmi_codec && strcmp(dai_link->name, "TDM") == 0)
703                         dai_link->codecs->of_node = hdmi_codec;
704
705                 if (!dai_link->platforms->name)
706                         dai_link->platforms->of_node = platform_node;
707         }
708
709         mt8183_da7219_max98357_headset_dev.dlc.of_node =
710                 of_parse_phandle(pdev->dev.of_node,
711                                  "mediatek,headset-codec", 0);
712         if (!mt8183_da7219_max98357_headset_dev.dlc.of_node) {
713                 dev_err(&pdev->dev,
714                         "Property 'mediatek,headset-codec' missing/invalid\n");
715                 return -EINVAL;
716         }
717
718         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
719         if (!priv)
720                 return -ENOMEM;
721
722         snd_soc_card_set_drvdata(card, priv);
723
724         pinctrl = devm_pinctrl_get_select(&pdev->dev, PINCTRL_STATE_DEFAULT);
725         if (IS_ERR(pinctrl)) {
726                 ret = PTR_ERR(pinctrl);
727                 dev_err(&pdev->dev, "%s failed to select default state %d\n",
728                         __func__, ret);
729                 return ret;
730         }
731
732         return devm_snd_soc_register_card(&pdev->dev, card);
733 }
734
735 #ifdef CONFIG_OF
736 static const struct of_device_id mt8183_da7219_max98357_dt_match[] = {
737         {
738                 .compatible = "mediatek,mt8183_da7219_max98357",
739                 .data = &mt8183_da7219_max98357_card,
740         },
741         {
742                 .compatible = "mediatek,mt8183_da7219_rt1015",
743                 .data = &mt8183_da7219_rt1015_card,
744         },
745         {}
746 };
747 #endif
748
749 static struct platform_driver mt8183_da7219_max98357_driver = {
750         .driver = {
751                 .name = "mt8183_da7219",
752 #ifdef CONFIG_OF
753                 .of_match_table = mt8183_da7219_max98357_dt_match,
754 #endif
755         },
756         .probe = mt8183_da7219_max98357_dev_probe,
757 };
758
759 module_platform_driver(mt8183_da7219_max98357_driver);
760
761 /* Module information */
762 MODULE_DESCRIPTION("MT8183-DA7219-MAX98357 ALSA SoC machine driver");
763 MODULE_AUTHOR("Shunli Wang <shunli.wang@mediatek.com>");
764 MODULE_LICENSE("GPL v2");
765 MODULE_ALIAS("mt8183_da7219_max98357 soc card");