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