1
2
3
4
5
6
7
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 RT5682_CODEC_DAI "rt5682-aif1"
32#define RT5682_DEV0_NAME "rt5682.1-001a"
33
34static struct snd_soc_jack headset_jack;
35
36static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
37 struct snd_pcm_hw_params *params)
38{
39 struct snd_soc_pcm_runtime *rtd = substream->private_data;
40 struct snd_soc_card *card = rtd->card;
41 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
42 struct snd_soc_dai *codec_dai;
43 unsigned int rate = params_rate(params);
44 unsigned int mclk_fs_ratio = 128;
45 unsigned int mclk_fs = rate * mclk_fs_ratio;
46 int ret, i;
47
48 for_each_rtd_codec_dais(rtd, i, codec_dai) {
49 ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
50 if (ret) {
51 dev_err(card->dev, "failed to set bclk ratio\n");
52 return ret;
53 }
54
55 ret = snd_soc_dai_set_pll(codec_dai, 0,
56 RT1015_PLL_S_BCLK,
57 params_rate(params) * 64,
58 params_rate(params) * 256);
59 if (ret) {
60 dev_err(card->dev, "failed to set pll\n");
61 return ret;
62 }
63
64 ret = snd_soc_dai_set_sysclk(codec_dai,
65 RT1015_SCLK_S_PLL,
66 params_rate(params) * 256,
67 SND_SOC_CLOCK_IN);
68 if (ret) {
69 dev_err(card->dev, "failed to set sysclk\n");
70 return ret;
71 }
72 }
73
74 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
75}
76
77static int mt8192_rt5682_i2s_hw_params(struct snd_pcm_substream *substream,
78 struct snd_pcm_hw_params *params)
79{
80 struct snd_soc_pcm_runtime *rtd = substream->private_data;
81 struct snd_soc_card *card = rtd->card;
82 struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
83 struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
84 unsigned int rate = params_rate(params);
85 unsigned int mclk_fs_ratio = 128;
86 unsigned int mclk_fs = rate * mclk_fs_ratio;
87 int bitwidth;
88 int ret;
89
90 bitwidth = snd_pcm_format_width(params_format(params));
91 if (bitwidth < 0) {
92 dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
93 return bitwidth;
94 }
95
96 ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
97 if (ret) {
98 dev_err(card->dev, "failed to set tdm slot\n");
99 return ret;
100 }
101
102 ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
103 RT5682_PLL1_S_BCLK1,
104 params_rate(params) * 64,
105 params_rate(params) * 512);
106 if (ret) {
107 dev_err(card->dev, "failed to set pll\n");
108 return ret;
109 }
110
111 ret = snd_soc_dai_set_sysclk(codec_dai,
112 RT5682_SCLK_S_PLL1,
113 params_rate(params) * 512,
114 SND_SOC_CLOCK_IN);
115 if (ret) {
116 dev_err(card->dev, "failed to set sysclk\n");
117 return ret;
118 }
119
120 return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
121}
122
123static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {
124 .hw_params = mt8192_rt1015_i2s_hw_params,
125};
126
127static const struct snd_soc_ops mt8192_rt5682_i2s_ops = {
128 .hw_params = mt8192_rt5682_i2s_hw_params,
129};
130
131static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
132{
133 struct snd_soc_component *cmpnt_afe =
134 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
135 struct snd_soc_component *cmpnt_codec =
136 asoc_rtd_to_codec(rtd, 0)->component;
137 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
138 struct mt8192_afe_private *afe_priv = afe->platform_priv;
139 int phase;
140 unsigned int monitor;
141 int test_done_1, test_done_2, test_done_3;
142 int cycle_1, cycle_2, cycle_3;
143 int prev_cycle_1, prev_cycle_2, prev_cycle_3;
144 int chosen_phase_1, chosen_phase_2, chosen_phase_3;
145 int counter;
146 int mtkaif_calib_ok;
147
148 dev_info(afe->dev, "%s(), start\n", __func__);
149
150 pm_runtime_get_sync(afe->dev);
151 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
152 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
153 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
154 mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
155
156 mt6359_mtkaif_calibration_enable(cmpnt_codec);
157
158
159 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
160 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);
161
162
163 regmap_update_bits(afe_priv->topckgen,
164 CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
165
166 mtkaif_calib_ok = true;
167 afe_priv->mtkaif_calibration_num_phase = 42;
168 afe_priv->mtkaif_chosen_phase[0] = -1;
169 afe_priv->mtkaif_chosen_phase[1] = -1;
170 afe_priv->mtkaif_chosen_phase[2] = -1;
171
172 for (phase = 0;
173 phase <= afe_priv->mtkaif_calibration_num_phase &&
174 mtkaif_calib_ok;
175 phase++) {
176 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
177 phase, phase, phase);
178
179 regmap_update_bits(afe_priv->topckgen,
180 CKSYS_AUD_TOP_CFG, 0x1, 0x1);
181
182 test_done_1 = 0;
183 test_done_2 = 0;
184 test_done_3 = 0;
185 cycle_1 = -1;
186 cycle_2 = -1;
187 cycle_3 = -1;
188 counter = 0;
189 while (test_done_1 == 0 ||
190 test_done_2 == 0 ||
191 test_done_3 == 0) {
192 regmap_read(afe_priv->topckgen,
193 CKSYS_AUD_TOP_MON, &monitor);
194
195 test_done_1 = (monitor >> 28) & 0x1;
196 test_done_2 = (monitor >> 29) & 0x1;
197 test_done_3 = (monitor >> 30) & 0x1;
198 if (test_done_1 == 1)
199 cycle_1 = monitor & 0xf;
200
201 if (test_done_2 == 1)
202 cycle_2 = (monitor >> 4) & 0xf;
203
204 if (test_done_3 == 1)
205 cycle_3 = (monitor >> 8) & 0xf;
206
207
208 if (++counter > 10000) {
209 dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
210 __func__,
211 cycle_1, cycle_2, cycle_3, monitor);
212 mtkaif_calib_ok = false;
213 break;
214 }
215 }
216
217 if (phase == 0) {
218 prev_cycle_1 = cycle_1;
219 prev_cycle_2 = cycle_2;
220 prev_cycle_3 = cycle_3;
221 }
222
223 if (cycle_1 != prev_cycle_1 &&
224 afe_priv->mtkaif_chosen_phase[0] < 0) {
225 afe_priv->mtkaif_chosen_phase[0] = phase - 1;
226 afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;
227 }
228
229 if (cycle_2 != prev_cycle_2 &&
230 afe_priv->mtkaif_chosen_phase[1] < 0) {
231 afe_priv->mtkaif_chosen_phase[1] = phase - 1;
232 afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;
233 }
234
235 if (cycle_3 != prev_cycle_3 &&
236 afe_priv->mtkaif_chosen_phase[2] < 0) {
237 afe_priv->mtkaif_chosen_phase[2] = phase - 1;
238 afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;
239 }
240
241 regmap_update_bits(afe_priv->topckgen,
242 CKSYS_AUD_TOP_CFG, 0x1, 0x0);
243
244 if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&
245 afe_priv->mtkaif_chosen_phase[1] >= 0 &&
246 afe_priv->mtkaif_chosen_phase[2] >= 0)
247 break;
248 }
249
250 if (afe_priv->mtkaif_chosen_phase[0] < 0)
251 chosen_phase_1 = 0;
252 else
253 chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];
254
255 if (afe_priv->mtkaif_chosen_phase[1] < 0)
256 chosen_phase_2 = 0;
257 else
258 chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];
259
260 if (afe_priv->mtkaif_chosen_phase[2] < 0)
261 chosen_phase_3 = 0;
262 else
263 chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];
264
265 mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
266 chosen_phase_1,
267 chosen_phase_2,
268 chosen_phase_3);
269
270
271 regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
272
273 mt6359_mtkaif_calibration_disable(cmpnt_codec);
274
275 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
276 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
277 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
278 mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
279 pm_runtime_put(afe->dev);
280
281 dev_info(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
282 __func__,
283 afe_priv->mtkaif_chosen_phase[0],
284 afe_priv->mtkaif_chosen_phase[1],
285 afe_priv->mtkaif_chosen_phase[2]);
286
287 return 0;
288}
289
290static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
291{
292 struct snd_soc_component *cmpnt_afe =
293 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
294 struct snd_soc_component *cmpnt_codec =
295 asoc_rtd_to_codec(rtd, 0)->component;
296 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
297 struct mt8192_afe_private *afe_priv = afe->platform_priv;
298
299
300 mt6359_set_mtkaif_protocol(cmpnt_codec,
301 MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
302 afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;
303
304
305 mt8192_mt6359_mtkaif_calibration(rtd);
306
307 return 0;
308}
309
310static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
311{
312 struct snd_soc_component *cmpnt_codec =
313 asoc_rtd_to_codec(rtd, 0)->component;
314 struct snd_soc_jack *jack = &headset_jack;
315 int ret;
316
317 ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
318 SND_JACK_HEADSET | SND_JACK_BTN_0 |
319 SND_JACK_BTN_1 | SND_JACK_BTN_2 |
320 SND_JACK_BTN_3,
321 jack, NULL, 0);
322 if (ret) {
323 dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
324 return ret;
325 }
326
327 snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
328 snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
329 snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
330 snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
331
332 ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
333 if (ret) {
334 dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
335 return ret;
336 }
337
338 return 0;
339};
340
341static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
342 struct snd_pcm_hw_params *params)
343{
344
345 snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
346 0, SNDRV_PCM_FORMAT_LAST);
347
348 params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
349
350 return 0;
351}
352
353static int
354mt8192_mt6359_rt1015_rt5682_cap1_startup(struct snd_pcm_substream *substream)
355{
356 struct snd_soc_pcm_runtime *rtd = substream->private_data;
357 struct snd_soc_component *component =
358 snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
359 struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
360 int ret;
361
362 static const unsigned int channels[] = {
363 1, 2, 4
364 };
365 static const struct snd_pcm_hw_constraint_list constraints_channels = {
366 .count = ARRAY_SIZE(channels),
367 .list = channels,
368 .mask = 0,
369 };
370 static const unsigned int rates[] = {
371 8000, 16000, 32000, 48000, 96000, 192000
372 };
373 static const struct snd_pcm_hw_constraint_list constraints_rates = {
374 .count = ARRAY_SIZE(rates),
375 .list = rates,
376 .mask = 0,
377 };
378
379 struct snd_pcm_runtime *runtime = substream->runtime;
380
381 ret = snd_pcm_hw_constraint_list(runtime, 0,
382 SNDRV_PCM_HW_PARAM_CHANNELS,
383 &constraints_channels);
384 if (ret < 0) {
385 dev_err(afe->dev, "hw_constraint_list channels failed\n");
386 return ret;
387 }
388
389 ret = snd_pcm_hw_constraint_list(runtime, 0,
390 SNDRV_PCM_HW_PARAM_RATE,
391 &constraints_rates);
392 if (ret < 0) {
393 dev_err(afe->dev, "hw_constraint_list rate failed\n");
394 return ret;
395 }
396
397 return 0;
398}
399
400static const struct snd_soc_ops mt8192_mt6359_rt1015_rt5682_capture1_ops = {
401 .startup = mt8192_mt6359_rt1015_rt5682_cap1_startup,
402};
403
404static int
405mt8192_mt6359_rt5682_startup(struct snd_pcm_substream *substream)
406{
407 static const unsigned int channels[] = {
408 1, 2
409 };
410 static const struct snd_pcm_hw_constraint_list constraints_channels = {
411 .count = ARRAY_SIZE(channels),
412 .list = channels,
413 .mask = 0,
414 };
415 static const unsigned int rates[] = {
416 48000
417 };
418 static const struct snd_pcm_hw_constraint_list constraints_rates = {
419 .count = ARRAY_SIZE(rates),
420 .list = rates,
421 .mask = 0,
422 };
423
424 struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
425 struct snd_pcm_runtime *runtime = substream->runtime;
426 int ret;
427
428 ret = snd_pcm_hw_constraint_list(runtime, 0,
429 SNDRV_PCM_HW_PARAM_CHANNELS,
430 &constraints_channels);
431 if (ret < 0) {
432 dev_err(rtd->dev, "hw_constraint_list channels failed\n");
433 return ret;
434 }
435
436 ret = snd_pcm_hw_constraint_list(runtime, 0,
437 SNDRV_PCM_HW_PARAM_RATE,
438 &constraints_rates);
439 if (ret < 0) {
440 dev_err(rtd->dev, "hw_constraint_list rate failed\n");
441 return ret;
442 }
443
444 return 0;
445}
446
447static const struct snd_soc_ops mt8192_mt6359_rt5682_ops = {
448 .startup = mt8192_mt6359_rt5682_startup,
449};
450
451
452SND_SOC_DAILINK_DEFS(playback1,
453 DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
454 DAILINK_COMP_ARRAY(COMP_DUMMY()),
455 DAILINK_COMP_ARRAY(COMP_EMPTY()));
456
457SND_SOC_DAILINK_DEFS(playback12,
458 DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
459 DAILINK_COMP_ARRAY(COMP_DUMMY()),
460 DAILINK_COMP_ARRAY(COMP_EMPTY()));
461
462SND_SOC_DAILINK_DEFS(playback2,
463 DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
464 DAILINK_COMP_ARRAY(COMP_DUMMY()),
465 DAILINK_COMP_ARRAY(COMP_EMPTY()));
466
467SND_SOC_DAILINK_DEFS(playback3,
468 DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
469 DAILINK_COMP_ARRAY(COMP_DUMMY()),
470 DAILINK_COMP_ARRAY(COMP_EMPTY()));
471
472SND_SOC_DAILINK_DEFS(playback4,
473 DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
474 DAILINK_COMP_ARRAY(COMP_DUMMY()),
475 DAILINK_COMP_ARRAY(COMP_EMPTY()));
476
477SND_SOC_DAILINK_DEFS(playback5,
478 DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
479 DAILINK_COMP_ARRAY(COMP_DUMMY()),
480 DAILINK_COMP_ARRAY(COMP_EMPTY()));
481
482SND_SOC_DAILINK_DEFS(playback6,
483 DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
484 DAILINK_COMP_ARRAY(COMP_DUMMY()),
485 DAILINK_COMP_ARRAY(COMP_EMPTY()));
486
487SND_SOC_DAILINK_DEFS(playback7,
488 DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
489 DAILINK_COMP_ARRAY(COMP_DUMMY()),
490 DAILINK_COMP_ARRAY(COMP_EMPTY()));
491
492SND_SOC_DAILINK_DEFS(playback8,
493 DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
494 DAILINK_COMP_ARRAY(COMP_DUMMY()),
495 DAILINK_COMP_ARRAY(COMP_EMPTY()));
496
497SND_SOC_DAILINK_DEFS(playback9,
498 DAILINK_COMP_ARRAY(COMP_CPU("DL9")),
499 DAILINK_COMP_ARRAY(COMP_DUMMY()),
500 DAILINK_COMP_ARRAY(COMP_EMPTY()));
501
502SND_SOC_DAILINK_DEFS(capture1,
503 DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
504 DAILINK_COMP_ARRAY(COMP_DUMMY()),
505 DAILINK_COMP_ARRAY(COMP_EMPTY()));
506
507SND_SOC_DAILINK_DEFS(capture2,
508 DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
509 DAILINK_COMP_ARRAY(COMP_DUMMY()),
510 DAILINK_COMP_ARRAY(COMP_EMPTY()));
511
512SND_SOC_DAILINK_DEFS(capture3,
513 DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
514 DAILINK_COMP_ARRAY(COMP_DUMMY()),
515 DAILINK_COMP_ARRAY(COMP_EMPTY()));
516
517SND_SOC_DAILINK_DEFS(capture4,
518 DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
519 DAILINK_COMP_ARRAY(COMP_DUMMY()),
520 DAILINK_COMP_ARRAY(COMP_EMPTY()));
521
522SND_SOC_DAILINK_DEFS(capture5,
523 DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
524 DAILINK_COMP_ARRAY(COMP_DUMMY()),
525 DAILINK_COMP_ARRAY(COMP_EMPTY()));
526
527SND_SOC_DAILINK_DEFS(capture6,
528 DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
529 DAILINK_COMP_ARRAY(COMP_DUMMY()),
530 DAILINK_COMP_ARRAY(COMP_EMPTY()));
531
532SND_SOC_DAILINK_DEFS(capture7,
533 DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
534 DAILINK_COMP_ARRAY(COMP_DUMMY()),
535 DAILINK_COMP_ARRAY(COMP_EMPTY()));
536
537SND_SOC_DAILINK_DEFS(capture8,
538 DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
539 DAILINK_COMP_ARRAY(COMP_DUMMY()),
540 DAILINK_COMP_ARRAY(COMP_EMPTY()));
541
542SND_SOC_DAILINK_DEFS(capture_mono1,
543 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
544 DAILINK_COMP_ARRAY(COMP_DUMMY()),
545 DAILINK_COMP_ARRAY(COMP_EMPTY()));
546
547SND_SOC_DAILINK_DEFS(capture_mono2,
548 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),
549 DAILINK_COMP_ARRAY(COMP_DUMMY()),
550 DAILINK_COMP_ARRAY(COMP_EMPTY()));
551
552SND_SOC_DAILINK_DEFS(capture_mono3,
553 DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),
554 DAILINK_COMP_ARRAY(COMP_DUMMY()),
555 DAILINK_COMP_ARRAY(COMP_EMPTY()));
556
557SND_SOC_DAILINK_DEFS(playback_hdmi,
558 DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
559 DAILINK_COMP_ARRAY(COMP_DUMMY()),
560 DAILINK_COMP_ARRAY(COMP_EMPTY()));
561
562
563SND_SOC_DAILINK_DEFS(primary_codec,
564 DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
565 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
566 "mt6359-snd-codec-aif1"),
567 COMP_CODEC("dmic-codec",
568 "dmic-hifi")),
569 DAILINK_COMP_ARRAY(COMP_EMPTY()));
570
571SND_SOC_DAILINK_DEFS(primary_codec_ch34,
572 DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),
573 DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
574 "mt6359-snd-codec-aif2")),
575 DAILINK_COMP_ARRAY(COMP_EMPTY()));
576
577SND_SOC_DAILINK_DEFS(ap_dmic,
578 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),
579 DAILINK_COMP_ARRAY(COMP_DUMMY()),
580 DAILINK_COMP_ARRAY(COMP_EMPTY()));
581
582SND_SOC_DAILINK_DEFS(ap_dmic_ch34,
583 DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),
584 DAILINK_COMP_ARRAY(COMP_DUMMY()),
585 DAILINK_COMP_ARRAY(COMP_EMPTY()));
586
587SND_SOC_DAILINK_DEFS(i2s0,
588 DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
589 DAILINK_COMP_ARRAY(COMP_DUMMY()),
590 DAILINK_COMP_ARRAY(COMP_EMPTY()));
591
592SND_SOC_DAILINK_DEFS(i2s1,
593 DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
594 DAILINK_COMP_ARRAY(COMP_DUMMY()),
595 DAILINK_COMP_ARRAY(COMP_EMPTY()));
596
597SND_SOC_DAILINK_DEFS(i2s2,
598 DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
599 DAILINK_COMP_ARRAY(COMP_DUMMY()),
600 DAILINK_COMP_ARRAY(COMP_EMPTY()));
601
602SND_SOC_DAILINK_DEFS(i2s3_rt1015,
603 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
604 DAILINK_COMP_ARRAY(COMP_CODEC(RT1015_DEV0_NAME,
605 RT1015_CODEC_DAI),
606 COMP_CODEC(RT1015_DEV1_NAME,
607 RT1015_CODEC_DAI)),
608 DAILINK_COMP_ARRAY(COMP_EMPTY()));
609
610SND_SOC_DAILINK_DEFS(i2s3_rt1015p,
611 DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
612 DAILINK_COMP_ARRAY(COMP_CODEC("rt1015p", "HiFi")),
613 DAILINK_COMP_ARRAY(COMP_EMPTY()));
614
615SND_SOC_DAILINK_DEFS(i2s5,
616 DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
617 DAILINK_COMP_ARRAY(COMP_DUMMY()),
618 DAILINK_COMP_ARRAY(COMP_EMPTY()));
619
620SND_SOC_DAILINK_DEFS(i2s6,
621 DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),
622 DAILINK_COMP_ARRAY(COMP_DUMMY()),
623 DAILINK_COMP_ARRAY(COMP_EMPTY()));
624
625SND_SOC_DAILINK_DEFS(i2s7,
626 DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),
627 DAILINK_COMP_ARRAY(COMP_DUMMY()),
628 DAILINK_COMP_ARRAY(COMP_EMPTY()));
629
630SND_SOC_DAILINK_DEFS(i2s8,
631 DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),
632 DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME,
633 RT5682_CODEC_DAI)),
634 DAILINK_COMP_ARRAY(COMP_EMPTY()));
635
636SND_SOC_DAILINK_DEFS(i2s9,
637 DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),
638 DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME,
639 RT5682_CODEC_DAI)),
640 DAILINK_COMP_ARRAY(COMP_EMPTY()));
641
642SND_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
647SND_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
652SND_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
657SND_SOC_DAILINK_DEFS(tdm,
658 DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
659 DAILINK_COMP_ARRAY(COMP_DUMMY()),
660 DAILINK_COMP_ARRAY(COMP_EMPTY()));
661
662static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
663
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_rt1015_rt5682_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
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 },
928 {
929 .name = "I2S5",
930 .no_pcm = 1,
931 .dpcm_playback = 1,
932 .ignore_suspend = 1,
933 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
934 SND_SOC_DAILINK_REG(i2s5),
935 },
936 {
937 .name = "I2S6",
938 .no_pcm = 1,
939 .dpcm_capture = 1,
940 .ignore_suspend = 1,
941 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
942 SND_SOC_DAILINK_REG(i2s6),
943 },
944 {
945 .name = "I2S7",
946 .no_pcm = 1,
947 .dpcm_playback = 1,
948 .ignore_suspend = 1,
949 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
950 SND_SOC_DAILINK_REG(i2s7),
951 },
952 {
953 .name = "I2S8",
954 .no_pcm = 1,
955 .dpcm_capture = 1,
956 .ignore_suspend = 1,
957 .init = mt8192_rt5682_init,
958 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
959 SND_SOC_DAILINK_REG(i2s8),
960 .ops = &mt8192_rt5682_i2s_ops,
961 },
962 {
963 .name = "I2S9",
964 .no_pcm = 1,
965 .dpcm_playback = 1,
966 .ignore_suspend = 1,
967 .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
968 SND_SOC_DAILINK_REG(i2s9),
969 .ops = &mt8192_rt5682_i2s_ops,
970 },
971 {
972 .name = "CONNSYS_I2S",
973 .no_pcm = 1,
974 .dpcm_capture = 1,
975 .ignore_suspend = 1,
976 SND_SOC_DAILINK_REG(connsys_i2s),
977 },
978 {
979 .name = "PCM 1",
980 .no_pcm = 1,
981 .dpcm_playback = 1,
982 .dpcm_capture = 1,
983 .ignore_suspend = 1,
984 SND_SOC_DAILINK_REG(pcm1),
985 },
986 {
987 .name = "PCM 2",
988 .no_pcm = 1,
989 .dpcm_playback = 1,
990 .dpcm_capture = 1,
991 .ignore_suspend = 1,
992 SND_SOC_DAILINK_REG(pcm2),
993 },
994 {
995 .name = "TDM",
996 .no_pcm = 1,
997 .dpcm_playback = 1,
998 .ignore_suspend = 1,
999 SND_SOC_DAILINK_REG(tdm),
1000 },
1001};
1002
1003static const struct snd_soc_dapm_widget
1004mt8192_mt6359_rt1015_rt5682_widgets[] = {
1005 SND_SOC_DAPM_SPK("Left Spk", NULL),
1006 SND_SOC_DAPM_SPK("Right Spk", NULL),
1007 SND_SOC_DAPM_HP("Headphone Jack", NULL),
1008 SND_SOC_DAPM_MIC("Headset Mic", NULL),
1009};
1010
1011static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
1012
1013 { "Left Spk", NULL, "Left SPO" },
1014 { "Right Spk", NULL, "Right SPO" },
1015
1016 { "Headphone Jack", NULL, "HPOL" },
1017 { "Headphone Jack", NULL, "HPOR" },
1018 { "IN1P", NULL, "Headset Mic" },
1019};
1020
1021static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
1022 SOC_DAPM_PIN_SWITCH("Left Spk"),
1023 SOC_DAPM_PIN_SWITCH("Right Spk"),
1024 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1025 SOC_DAPM_PIN_SWITCH("Headset Mic"),
1026};
1027
1028static struct snd_soc_codec_conf rt1015_amp_conf[] = {
1029 {
1030 .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
1031 .name_prefix = "Left",
1032 },
1033 {
1034 .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
1035 .name_prefix = "Right",
1036 },
1037};
1038
1039static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {
1040 .name = "mt8192_mt6359_rt1015_rt5682",
1041 .owner = THIS_MODULE,
1042 .dai_link = mt8192_mt6359_dai_links,
1043 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1044 .controls = mt8192_mt6359_rt1015_rt5682_controls,
1045 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),
1046 .dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,
1047 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),
1048 .dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,
1049 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),
1050 .codec_conf = rt1015_amp_conf,
1051 .num_configs = ARRAY_SIZE(rt1015_amp_conf),
1052};
1053
1054static const struct snd_soc_dapm_widget
1055mt8192_mt6359_rt1015p_rt5682_widgets[] = {
1056 SND_SOC_DAPM_SPK("Speakers", NULL),
1057 SND_SOC_DAPM_HP("Headphone Jack", NULL),
1058 SND_SOC_DAPM_MIC("Headset Mic", NULL),
1059};
1060
1061static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682_routes[] = {
1062
1063 { "Speakers", NULL, "Speaker" },
1064
1065 { "Headphone Jack", NULL, "HPOL" },
1066 { "Headphone Jack", NULL, "HPOR" },
1067 { "IN1P", NULL, "Headset Mic" },
1068};
1069
1070static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682_controls[] = {
1071 SOC_DAPM_PIN_SWITCH("Speakers"),
1072 SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1073 SOC_DAPM_PIN_SWITCH("Headset Mic"),
1074};
1075
1076static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682_card = {
1077 .name = "mt8192_mt6359_rt1015p_rt5682",
1078 .owner = THIS_MODULE,
1079 .dai_link = mt8192_mt6359_dai_links,
1080 .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1081 .controls = mt8192_mt6359_rt1015p_rt5682_controls,
1082 .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_controls),
1083 .dapm_widgets = mt8192_mt6359_rt1015p_rt5682_widgets,
1084 .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_widgets),
1085 .dapm_routes = mt8192_mt6359_rt1015p_rt5682_routes,
1086 .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_routes),
1087};
1088
1089static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
1090{
1091 struct snd_soc_card *card;
1092 struct device_node *platform_node;
1093 int ret, i;
1094 struct snd_soc_dai_link *dai_link;
1095 const struct of_device_id *match;
1096
1097 platform_node = of_parse_phandle(pdev->dev.of_node,
1098 "mediatek,platform", 0);
1099 if (!platform_node) {
1100 dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
1101 return -EINVAL;
1102 }
1103
1104 match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
1105 if (!match || !match->data)
1106 return -EINVAL;
1107
1108 card = (struct snd_soc_card *)match->data;
1109 card->dev = &pdev->dev;
1110
1111 for_each_card_prelinks(card, i, dai_link) {
1112 if (strcmp(dai_link->name, "I2S3") == 0) {
1113 if (card == &mt8192_mt6359_rt1015_rt5682_card) {
1114 dai_link->ops = &mt8192_rt1015_i2s_ops;
1115 dai_link->cpus = i2s3_rt1015_cpus;
1116 dai_link->num_cpus =
1117 ARRAY_SIZE(i2s3_rt1015_cpus);
1118 dai_link->codecs = i2s3_rt1015_codecs;
1119 dai_link->num_codecs =
1120 ARRAY_SIZE(i2s3_rt1015_codecs);
1121 dai_link->platforms = i2s3_rt1015_platforms;
1122 dai_link->num_platforms =
1123 ARRAY_SIZE(i2s3_rt1015_platforms);
1124 } else if (card == &mt8192_mt6359_rt1015p_rt5682_card) {
1125 dai_link->cpus = i2s3_rt1015p_cpus;
1126 dai_link->num_cpus =
1127 ARRAY_SIZE(i2s3_rt1015p_cpus);
1128 dai_link->codecs = i2s3_rt1015p_codecs;
1129 dai_link->num_codecs =
1130 ARRAY_SIZE(i2s3_rt1015p_codecs);
1131 dai_link->platforms = i2s3_rt1015p_platforms;
1132 dai_link->num_platforms =
1133 ARRAY_SIZE(i2s3_rt1015p_platforms);
1134 }
1135 }
1136
1137 if (!dai_link->platforms->name)
1138 dai_link->platforms->of_node = platform_node;
1139 }
1140
1141 ret = mt8192_afe_gpio_init(&pdev->dev);
1142 if (ret) {
1143 dev_err(&pdev->dev, "init gpio error %d\n", ret);
1144 return ret;
1145 }
1146
1147 return devm_snd_soc_register_card(&pdev->dev, card);
1148}
1149
1150#ifdef CONFIG_OF
1151static const struct of_device_id mt8192_mt6359_dt_match[] = {
1152 {
1153 .compatible = "mediatek,mt8192_mt6359_rt1015_rt5682",
1154 .data = &mt8192_mt6359_rt1015_rt5682_card,
1155 },
1156 {
1157 .compatible = "mediatek,mt8192_mt6359_rt1015p_rt5682",
1158 .data = &mt8192_mt6359_rt1015p_rt5682_card,
1159 },
1160 {}
1161};
1162#endif
1163
1164static const struct dev_pm_ops mt8192_mt6359_pm_ops = {
1165 .poweroff = snd_soc_poweroff,
1166 .restore = snd_soc_resume,
1167};
1168
1169static struct platform_driver mt8192_mt6359_driver = {
1170 .driver = {
1171 .name = "mt8192_mt6359",
1172#ifdef CONFIG_OF
1173 .of_match_table = mt8192_mt6359_dt_match,
1174#endif
1175 .pm = &mt8192_mt6359_pm_ops,
1176 },
1177 .probe = mt8192_mt6359_dev_probe,
1178};
1179
1180module_platform_driver(mt8192_mt6359_driver);
1181
1182
1183MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");
1184MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1185MODULE_LICENSE("GPL v2");
1186MODULE_ALIAS("mt8192_mt6359 soc card");
1187