Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8186/mt8186-mt6366.c
26488 views
1
// SPDX-License-Identifier: GPL-2.0
2
//
3
// mt8186-mt6366.c
4
// -- MT8186-MT6366 ALSA SoC machine driver
5
//
6
// Copyright (c) 2022 MediaTek Inc.
7
// Author: Jiaxin Yu <[email protected]>
8
//
9
// Copyright (c) 2024 Collabora Ltd.
10
// AngeloGioacchino Del Regno <[email protected]>
11
//
12
13
#include <linux/gpio/consumer.h>
14
#include <linux/input.h>
15
#include <linux/module.h>
16
#include <linux/of.h>
17
#include <sound/jack.h>
18
#include <sound/pcm_params.h>
19
#include <sound/rt5682.h>
20
#include <sound/soc.h>
21
22
#include "../../codecs/da7219.h"
23
#include "../../codecs/mt6358.h"
24
#include "../../codecs/rt5682.h"
25
#include "../common/mtk-afe-platform-driver.h"
26
#include "../common/mtk-dsp-sof-common.h"
27
#include "../common/mtk-soc-card.h"
28
#include "../common/mtk-soundcard-driver.h"
29
#include "mt8186-afe-common.h"
30
#include "mt8186-afe-clk.h"
31
#include "mt8186-afe-gpio.h"
32
#include "mt8186-mt6366-common.h"
33
34
#define RT1019_CODEC_DAI "HiFi"
35
#define RT1019_DEV0_NAME "rt1019p"
36
37
#define RT5682S_CODEC_DAI "rt5682s-aif1"
38
#define RT5682S_DEV0_NAME "rt5682s.5-001a"
39
40
#define DA7219_CODEC_DAI "da7219-hifi"
41
#define DA7219_DEV_NAME "da7219.5-001a"
42
43
#define SOF_DMA_DL1 "SOF_DMA_DL1"
44
#define SOF_DMA_DL2 "SOF_DMA_DL2"
45
#define SOF_DMA_UL1 "SOF_DMA_UL1"
46
#define SOF_DMA_UL2 "SOF_DMA_UL2"
47
48
#define DA7219_CODEC_PRESENT BIT(0)
49
50
struct mt8186_mt6366_rt1019_rt5682s_priv {
51
struct gpio_desc *dmic_sel;
52
int dmic_switch;
53
};
54
55
enum mt8186_jacks {
56
MT8186_JACK_HEADSET,
57
MT8186_JACK_HDMI,
58
MT8186_JACK_MAX,
59
};
60
61
/* Headset jack detection DAPM pins */
62
static struct snd_soc_jack_pin mt8186_jack_pins[] = {
63
{
64
.pin = "Headphone",
65
.mask = SND_JACK_HEADPHONE,
66
},
67
{
68
.pin = "Headset Mic",
69
.mask = SND_JACK_MICROPHONE,
70
},
71
};
72
73
static struct snd_soc_codec_conf mt8186_mt6366_rt1019_rt5682s_codec_conf[] = {
74
{
75
.dlc = COMP_CODEC_CONF("mt6358-sound"),
76
.name_prefix = "Mt6366",
77
},
78
{
79
.dlc = COMP_CODEC_CONF("bt-sco"),
80
.name_prefix = "Mt8186 bt",
81
},
82
{
83
.dlc = COMP_CODEC_CONF("hdmi-audio-codec"),
84
.name_prefix = "Mt8186 hdmi",
85
},
86
};
87
88
static int dmic_get(struct snd_kcontrol *kcontrol,
89
struct snd_ctl_elem_value *ucontrol)
90
{
91
struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
92
struct mtk_soc_card_data *soc_card_data =
93
snd_soc_card_get_drvdata(dapm->card);
94
struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
95
96
ucontrol->value.integer.value[0] = priv->dmic_switch;
97
return 0;
98
}
99
100
static int dmic_set(struct snd_kcontrol *kcontrol,
101
struct snd_ctl_elem_value *ucontrol)
102
{
103
struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
104
struct mtk_soc_card_data *soc_card_data =
105
snd_soc_card_get_drvdata(dapm->card);
106
struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
107
108
priv->dmic_switch = ucontrol->value.integer.value[0];
109
if (priv->dmic_sel) {
110
gpiod_set_value(priv->dmic_sel, priv->dmic_switch);
111
dev_dbg(dapm->card->dev, "dmic_set_value %d\n",
112
priv->dmic_switch);
113
}
114
return 0;
115
}
116
117
static const char * const dmic_mux_text[] = {
118
"Front Mic",
119
"Rear Mic",
120
};
121
122
static SOC_ENUM_SINGLE_DECL(mt8186_dmic_enum,
123
SND_SOC_NOPM, 0, dmic_mux_text);
124
125
static const struct snd_kcontrol_new mt8186_dmic_mux_control =
126
SOC_DAPM_ENUM_EXT("DMIC Select Mux", mt8186_dmic_enum,
127
dmic_get, dmic_set);
128
129
static const struct snd_soc_dapm_widget dmic_widgets[] = {
130
SND_SOC_DAPM_MIC("DMIC", NULL),
131
SND_SOC_DAPM_MUX("Dmic Mux", SND_SOC_NOPM, 0, 0, &mt8186_dmic_mux_control),
132
};
133
134
static const struct snd_soc_dapm_route dmic_map[] = {
135
/* digital mics */
136
{"Dmic Mux", "Front Mic", "DMIC"},
137
{"Dmic Mux", "Rear Mic", "DMIC"},
138
};
139
140
static int primary_codec_init(struct snd_soc_pcm_runtime *rtd)
141
{
142
struct snd_soc_card *card = rtd->card;
143
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
144
struct mt8186_mt6366_rt1019_rt5682s_priv *priv = soc_card_data->mach_priv;
145
int ret;
146
147
ret = mt8186_mt6366_init(rtd);
148
149
if (ret) {
150
dev_err(card->dev, "mt8186_mt6366_init failed: %d\n", ret);
151
return ret;
152
}
153
154
if (!priv->dmic_sel) {
155
dev_dbg(card->dev, "dmic_sel is null\n");
156
return 0;
157
}
158
159
ret = snd_soc_dapm_new_controls(&card->dapm, dmic_widgets,
160
ARRAY_SIZE(dmic_widgets));
161
if (ret) {
162
dev_err(card->dev, "DMic widget addition failed: %d\n", ret);
163
/* Don't need to add routes if widget addition failed */
164
return ret;
165
}
166
167
ret = snd_soc_dapm_add_routes(&card->dapm, dmic_map,
168
ARRAY_SIZE(dmic_map));
169
170
if (ret)
171
dev_err(card->dev, "DMic map addition failed: %d\n", ret);
172
173
return ret;
174
}
175
176
static int mt8186_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
177
{
178
struct snd_soc_component *cmpnt_afe =
179
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
180
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
181
struct mtk_soc_card_data *soc_card_data =
182
snd_soc_card_get_drvdata(rtd->card);
183
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HEADSET];
184
struct snd_soc_component *cmpnt_codec =
185
snd_soc_rtd_to_codec(rtd, 0)->component;
186
const int hs_keys_rt5682[] = {
187
KEY_PLAYPAUSE, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_VOICECOMMAND
188
};
189
const int hs_keys_da7219[] = {
190
KEY_PLAYPAUSE, KEY_VOICECOMMAND, KEY_VOLUMEUP, KEY_VOLUMEDOWN
191
};
192
const int *hs_keys;
193
int ret;
194
int type;
195
196
ret = mt8186_dai_i2s_set_share(afe, "I2S1", "I2S0");
197
if (ret) {
198
dev_err(rtd->dev, "Failed to set up shared clocks\n");
199
return ret;
200
}
201
202
ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
203
SND_JACK_HEADSET | SND_JACK_BTN_0 |
204
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
205
SND_JACK_BTN_3,
206
jack, mt8186_jack_pins,
207
ARRAY_SIZE(mt8186_jack_pins));
208
if (ret) {
209
dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
210
return ret;
211
}
212
213
if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
214
hs_keys = hs_keys_da7219;
215
else
216
hs_keys = hs_keys_rt5682;
217
218
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, hs_keys[0]);
219
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, hs_keys[1]);
220
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, hs_keys[2]);
221
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, hs_keys[3]);
222
223
type = SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 | SND_JACK_BTN_3;
224
return snd_soc_component_set_jack(cmpnt_codec, jack, (void *)&type);
225
}
226
227
static int mt8186_da7219_i2s_hw_params(struct snd_pcm_substream *substream,
228
struct snd_pcm_hw_params *params)
229
{
230
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
231
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
232
struct snd_soc_dai *codec_dai;
233
unsigned int rate = params_rate(params);
234
unsigned int mclk_fs_ratio = 256;
235
unsigned int mclk_fs = rate * mclk_fs_ratio;
236
unsigned int freq;
237
int ret, j;
238
239
ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
240
if (ret < 0) {
241
dev_err(rtd->dev, "failed to set cpu dai sysclk: %d\n", ret);
242
return ret;
243
}
244
245
for_each_rtd_codec_dais(rtd, j, codec_dai) {
246
if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))
247
continue;
248
249
ret = snd_soc_dai_set_sysclk(codec_dai, DA7219_CLKSRC_MCLK,
250
mclk_fs, SND_SOC_CLOCK_IN);
251
if (ret < 0) {
252
dev_err(rtd->dev, "failed to set sysclk: %d\n", ret);
253
return ret;
254
}
255
256
if ((rate % 8000) == 0)
257
freq = DA7219_PLL_FREQ_OUT_98304;
258
else
259
freq = DA7219_PLL_FREQ_OUT_90316;
260
261
ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL_SRM,
262
0, freq);
263
if (ret) {
264
dev_err(rtd->dev, "failed to start PLL: %d\n", ret);
265
return ret;
266
}
267
}
268
269
return 0;
270
}
271
272
static int mt8186_da7219_i2s_hw_free(struct snd_pcm_substream *substream)
273
{
274
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
275
struct snd_soc_dai *codec_dai;
276
int j, ret;
277
278
for_each_rtd_codec_dais(rtd, j, codec_dai) {
279
if (strcmp(codec_dai->component->name, DA7219_DEV_NAME))
280
continue;
281
282
ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);
283
if (ret < 0) {
284
dev_err(rtd->dev, "failed to stop PLL: %d\n", ret);
285
return ret;
286
}
287
}
288
289
return 0;
290
}
291
292
static const struct snd_soc_ops mt8186_da7219_i2s_ops = {
293
.hw_params = mt8186_da7219_i2s_hw_params,
294
.hw_free = mt8186_da7219_i2s_hw_free,
295
};
296
297
static int mt8186_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
298
struct snd_pcm_hw_params *params)
299
{
300
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
301
struct snd_soc_card *card = rtd->card;
302
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
303
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
304
unsigned int rate = params_rate(params);
305
unsigned int mclk_fs_ratio = 128;
306
unsigned int mclk_fs = rate * mclk_fs_ratio;
307
int bitwidth;
308
int ret;
309
310
bitwidth = snd_pcm_format_width(params_format(params));
311
if (bitwidth < 0) {
312
dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
313
return bitwidth;
314
}
315
316
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
317
if (ret) {
318
dev_err(card->dev, "failed to set tdm slot\n");
319
return ret;
320
}
321
322
ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
323
RT5682_PLL1_S_BCLK1,
324
params_rate(params) * 64,
325
params_rate(params) * 512);
326
if (ret) {
327
dev_err(card->dev, "failed to set pll\n");
328
return ret;
329
}
330
331
ret = snd_soc_dai_set_sysclk(codec_dai,
332
RT5682_SCLK_S_PLL1,
333
params_rate(params) * 512,
334
SND_SOC_CLOCK_IN);
335
if (ret) {
336
dev_err(card->dev, "failed to set sysclk\n");
337
return ret;
338
}
339
340
return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
341
}
342
343
static const struct snd_soc_ops mt8186_rt5682s_i2s_ops = {
344
.hw_params = mt8186_rt5682s_i2s_hw_params,
345
};
346
347
static int mt8186_mt6366_rt1019_rt5682s_hdmi_init(struct snd_soc_pcm_runtime *rtd)
348
{
349
struct snd_soc_component *cmpnt_afe =
350
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
351
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
352
struct snd_soc_component *cmpnt_codec =
353
snd_soc_rtd_to_codec(rtd, 0)->component;
354
struct mtk_soc_card_data *soc_card_data =
355
snd_soc_card_get_drvdata(rtd->card);
356
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8186_JACK_HDMI];
357
int ret;
358
359
ret = mt8186_dai_i2s_set_share(afe, "I2S2", "I2S3");
360
if (ret) {
361
dev_err(rtd->dev, "Failed to set up shared clocks\n");
362
return ret;
363
}
364
365
ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);
366
if (ret) {
367
dev_err(rtd->dev, "HDMI Jack creation failed: %d\n", ret);
368
return ret;
369
}
370
371
return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
372
}
373
374
static int mt8186_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
375
struct snd_pcm_hw_params *params,
376
snd_pcm_format_t fmt)
377
{
378
struct snd_interval *channels = hw_param_interval(params,
379
SNDRV_PCM_HW_PARAM_CHANNELS);
380
381
dev_dbg(rtd->dev, "%s(), fix format to %d\n", __func__, fmt);
382
383
/* fix BE i2s channel to 2 channel */
384
channels->min = 2;
385
channels->max = 2;
386
387
/* clean param mask first */
388
snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
389
0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
390
391
params_set_format(params, fmt);
392
393
return 0;
394
}
395
396
static int mt8186_i2s_hw_params_24le_fixup(struct snd_soc_pcm_runtime *rtd,
397
struct snd_pcm_hw_params *params)
398
{
399
return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S24_LE);
400
}
401
402
static int mt8186_i2s_hw_params_32le_fixup(struct snd_soc_pcm_runtime *rtd,
403
struct snd_pcm_hw_params *params)
404
{
405
return mt8186_hw_params_fixup(rtd, params, SNDRV_PCM_FORMAT_S32_LE);
406
}
407
408
/* fixup the BE DAI link to match any values from topology */
409
static int mt8186_sof_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
410
struct snd_pcm_hw_params *params)
411
{
412
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
413
int ret;
414
415
ret = mtk_sof_dai_link_fixup(rtd, params);
416
417
if (!strcmp(rtd->dai_link->name, "I2S0") ||
418
!strcmp(rtd->dai_link->name, "I2S1") ||
419
!strcmp(rtd->dai_link->name, "I2S2")) {
420
if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
421
mt8186_i2s_hw_params_32le_fixup(rtd, params);
422
else
423
mt8186_i2s_hw_params_24le_fixup(rtd, params);
424
} else if (!strcmp(rtd->dai_link->name, "I2S3")) {
425
if (soc_card_data->card_data->flags & DA7219_CODEC_PRESENT)
426
mt8186_i2s_hw_params_24le_fixup(rtd, params);
427
else
428
mt8186_i2s_hw_params_32le_fixup(rtd, params);
429
}
430
431
return ret;
432
}
433
434
/* FE */
435
SND_SOC_DAILINK_DEFS(playback1,
436
DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
437
DAILINK_COMP_ARRAY(COMP_DUMMY()),
438
DAILINK_COMP_ARRAY(COMP_EMPTY()));
439
440
SND_SOC_DAILINK_DEFS(playback12,
441
DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
442
DAILINK_COMP_ARRAY(COMP_DUMMY()),
443
DAILINK_COMP_ARRAY(COMP_EMPTY()));
444
445
SND_SOC_DAILINK_DEFS(playback2,
446
DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
447
DAILINK_COMP_ARRAY(COMP_DUMMY()),
448
DAILINK_COMP_ARRAY(COMP_EMPTY()));
449
450
SND_SOC_DAILINK_DEFS(playback3,
451
DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
452
DAILINK_COMP_ARRAY(COMP_DUMMY()),
453
DAILINK_COMP_ARRAY(COMP_EMPTY()));
454
455
SND_SOC_DAILINK_DEFS(playback4,
456
DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
457
DAILINK_COMP_ARRAY(COMP_DUMMY()),
458
DAILINK_COMP_ARRAY(COMP_EMPTY()));
459
460
SND_SOC_DAILINK_DEFS(playback5,
461
DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
462
DAILINK_COMP_ARRAY(COMP_DUMMY()),
463
DAILINK_COMP_ARRAY(COMP_EMPTY()));
464
465
SND_SOC_DAILINK_DEFS(playback6,
466
DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
467
DAILINK_COMP_ARRAY(COMP_DUMMY()),
468
DAILINK_COMP_ARRAY(COMP_EMPTY()));
469
470
SND_SOC_DAILINK_DEFS(playback7,
471
DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
472
DAILINK_COMP_ARRAY(COMP_DUMMY()),
473
DAILINK_COMP_ARRAY(COMP_EMPTY()));
474
475
SND_SOC_DAILINK_DEFS(playback8,
476
DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
477
DAILINK_COMP_ARRAY(COMP_DUMMY()),
478
DAILINK_COMP_ARRAY(COMP_EMPTY()));
479
480
SND_SOC_DAILINK_DEFS(capture1,
481
DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
482
DAILINK_COMP_ARRAY(COMP_DUMMY()),
483
DAILINK_COMP_ARRAY(COMP_EMPTY()));
484
485
SND_SOC_DAILINK_DEFS(capture2,
486
DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
487
DAILINK_COMP_ARRAY(COMP_DUMMY()),
488
DAILINK_COMP_ARRAY(COMP_EMPTY()));
489
490
SND_SOC_DAILINK_DEFS(capture3,
491
DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
492
DAILINK_COMP_ARRAY(COMP_DUMMY()),
493
DAILINK_COMP_ARRAY(COMP_EMPTY()));
494
495
SND_SOC_DAILINK_DEFS(capture4,
496
DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
497
DAILINK_COMP_ARRAY(COMP_DUMMY()),
498
DAILINK_COMP_ARRAY(COMP_EMPTY()));
499
500
SND_SOC_DAILINK_DEFS(capture5,
501
DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
502
DAILINK_COMP_ARRAY(COMP_DUMMY()),
503
DAILINK_COMP_ARRAY(COMP_EMPTY()));
504
505
SND_SOC_DAILINK_DEFS(capture6,
506
DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
507
DAILINK_COMP_ARRAY(COMP_DUMMY()),
508
DAILINK_COMP_ARRAY(COMP_EMPTY()));
509
510
SND_SOC_DAILINK_DEFS(capture7,
511
DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
512
DAILINK_COMP_ARRAY(COMP_DUMMY()),
513
DAILINK_COMP_ARRAY(COMP_EMPTY()));
514
515
/* hostless */
516
SND_SOC_DAILINK_DEFS(hostless_lpbk,
517
DAILINK_COMP_ARRAY(COMP_CPU("Hostless LPBK DAI")),
518
DAILINK_COMP_ARRAY(COMP_DUMMY()),
519
DAILINK_COMP_ARRAY(COMP_EMPTY()));
520
SND_SOC_DAILINK_DEFS(hostless_fm,
521
DAILINK_COMP_ARRAY(COMP_CPU("Hostless FM DAI")),
522
DAILINK_COMP_ARRAY(COMP_DUMMY()),
523
DAILINK_COMP_ARRAY(COMP_EMPTY()));
524
SND_SOC_DAILINK_DEFS(hostless_src1,
525
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_1_DAI")),
526
DAILINK_COMP_ARRAY(COMP_DUMMY()),
527
DAILINK_COMP_ARRAY(COMP_EMPTY()));
528
SND_SOC_DAILINK_DEFS(hostless_src_bargein,
529
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_SRC_Bargein_DAI")),
530
DAILINK_COMP_ARRAY(COMP_DUMMY()),
531
DAILINK_COMP_ARRAY(COMP_EMPTY()));
532
533
/* BE */
534
SND_SOC_DAILINK_DEFS(adda,
535
DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
536
DAILINK_COMP_ARRAY(COMP_CODEC("mt6358-sound",
537
"mt6358-snd-codec-aif1"),
538
COMP_CODEC("dmic-codec",
539
"dmic-hifi")),
540
DAILINK_COMP_ARRAY(COMP_EMPTY()));
541
SND_SOC_DAILINK_DEFS(i2s0,
542
DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
543
DAILINK_COMP_ARRAY(COMP_EMPTY()),
544
DAILINK_COMP_ARRAY(COMP_EMPTY()));
545
SND_SOC_DAILINK_DEFS(i2s1,
546
DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
547
DAILINK_COMP_ARRAY(COMP_EMPTY()),
548
DAILINK_COMP_ARRAY(COMP_EMPTY()));
549
SND_SOC_DAILINK_DEFS(i2s2,
550
DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
551
DAILINK_COMP_ARRAY(COMP_DUMMY()),
552
DAILINK_COMP_ARRAY(COMP_EMPTY()));
553
SND_SOC_DAILINK_DEFS(i2s3,
554
DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
555
DAILINK_COMP_ARRAY(COMP_EMPTY()),
556
DAILINK_COMP_ARRAY(COMP_EMPTY()));
557
SND_SOC_DAILINK_DEFS(hw_gain1,
558
DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 1")),
559
DAILINK_COMP_ARRAY(COMP_DUMMY()),
560
DAILINK_COMP_ARRAY(COMP_EMPTY()));
561
SND_SOC_DAILINK_DEFS(hw_gain2,
562
DAILINK_COMP_ARRAY(COMP_CPU("HW Gain 2")),
563
DAILINK_COMP_ARRAY(COMP_DUMMY()),
564
DAILINK_COMP_ARRAY(COMP_EMPTY()));
565
SND_SOC_DAILINK_DEFS(hw_src1,
566
DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_1")),
567
DAILINK_COMP_ARRAY(COMP_DUMMY()),
568
DAILINK_COMP_ARRAY(COMP_EMPTY()));
569
SND_SOC_DAILINK_DEFS(hw_src2,
570
DAILINK_COMP_ARRAY(COMP_CPU("HW_SRC_2")),
571
DAILINK_COMP_ARRAY(COMP_DUMMY()),
572
DAILINK_COMP_ARRAY(COMP_EMPTY()));
573
SND_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
SND_SOC_DAILINK_DEFS(pcm1,
578
DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
579
DAILINK_COMP_ARRAY(COMP_CODEC("bt-sco", "bt-sco-pcm-wb")),
580
DAILINK_COMP_ARRAY(COMP_EMPTY()));
581
SND_SOC_DAILINK_DEFS(tdm_in,
582
DAILINK_COMP_ARRAY(COMP_CPU("TDM IN")),
583
DAILINK_COMP_ARRAY(COMP_DUMMY()),
584
DAILINK_COMP_ARRAY(COMP_EMPTY()));
585
586
/* hostless */
587
SND_SOC_DAILINK_DEFS(hostless_ul1,
588
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL1 DAI")),
589
DAILINK_COMP_ARRAY(COMP_DUMMY()),
590
DAILINK_COMP_ARRAY(COMP_EMPTY()));
591
SND_SOC_DAILINK_DEFS(hostless_ul2,
592
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL2 DAI")),
593
DAILINK_COMP_ARRAY(COMP_DUMMY()),
594
DAILINK_COMP_ARRAY(COMP_EMPTY()));
595
SND_SOC_DAILINK_DEFS(hostless_ul3,
596
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL3 DAI")),
597
DAILINK_COMP_ARRAY(COMP_DUMMY()),
598
DAILINK_COMP_ARRAY(COMP_EMPTY()));
599
SND_SOC_DAILINK_DEFS(hostless_ul5,
600
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL5 DAI")),
601
DAILINK_COMP_ARRAY(COMP_DUMMY()),
602
DAILINK_COMP_ARRAY(COMP_EMPTY()));
603
SND_SOC_DAILINK_DEFS(hostless_ul6,
604
DAILINK_COMP_ARRAY(COMP_CPU("Hostless_UL6 DAI")),
605
DAILINK_COMP_ARRAY(COMP_DUMMY()),
606
DAILINK_COMP_ARRAY(COMP_EMPTY()));
607
SND_SOC_DAILINK_DEFS(hostless_hw_gain_aaudio,
608
DAILINK_COMP_ARRAY(COMP_CPU("Hostless HW Gain AAudio DAI")),
609
DAILINK_COMP_ARRAY(COMP_DUMMY()),
610
DAILINK_COMP_ARRAY(COMP_EMPTY()));
611
SND_SOC_DAILINK_DEFS(hostless_src_aaudio,
612
DAILINK_COMP_ARRAY(COMP_CPU("Hostless SRC AAudio DAI")),
613
DAILINK_COMP_ARRAY(COMP_DUMMY()),
614
DAILINK_COMP_ARRAY(COMP_EMPTY()));
615
SND_SOC_DAILINK_DEFS(AFE_SOF_DL1,
616
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL1")),
617
DAILINK_COMP_ARRAY(COMP_DUMMY()),
618
DAILINK_COMP_ARRAY(COMP_EMPTY()));
619
620
SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
621
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
622
DAILINK_COMP_ARRAY(COMP_DUMMY()),
623
DAILINK_COMP_ARRAY(COMP_EMPTY()));
624
625
SND_SOC_DAILINK_DEFS(AFE_SOF_UL1,
626
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL1")),
627
DAILINK_COMP_ARRAY(COMP_DUMMY()),
628
DAILINK_COMP_ARRAY(COMP_EMPTY()));
629
630
SND_SOC_DAILINK_DEFS(AFE_SOF_UL2,
631
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL2")),
632
DAILINK_COMP_ARRAY(COMP_DUMMY()),
633
DAILINK_COMP_ARRAY(COMP_EMPTY()));
634
635
static const struct sof_conn_stream g_sof_conn_streams[] = {
636
{ "I2S1", "AFE_SOF_DL1", SOF_DMA_DL1, SNDRV_PCM_STREAM_PLAYBACK},
637
{ "I2S3", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
638
{ "Primary Codec", "AFE_SOF_UL1", SOF_DMA_UL1, SNDRV_PCM_STREAM_CAPTURE},
639
{ "I2S0", "AFE_SOF_UL2", SOF_DMA_UL2, SNDRV_PCM_STREAM_CAPTURE},
640
};
641
642
static struct snd_soc_dai_link mt8186_mt6366_rt1019_rt5682s_dai_links[] = {
643
/* Front End DAI links */
644
{
645
.name = "Playback_1",
646
.stream_name = "Playback_1",
647
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
648
SND_SOC_DPCM_TRIGGER_PRE},
649
.dynamic = 1,
650
.playback_only = 1,
651
.dpcm_merged_format = 1,
652
.dpcm_merged_chan = 1,
653
.dpcm_merged_rate = 1,
654
.ops = &mtk_soundcard_common_playback_ops,
655
SND_SOC_DAILINK_REG(playback1),
656
},
657
{
658
.name = "Playback_12",
659
.stream_name = "Playback_12",
660
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
661
SND_SOC_DPCM_TRIGGER_PRE},
662
.dynamic = 1,
663
.playback_only = 1,
664
SND_SOC_DAILINK_REG(playback12),
665
},
666
{
667
.name = "Playback_2",
668
.stream_name = "Playback_2",
669
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
670
SND_SOC_DPCM_TRIGGER_PRE},
671
.dynamic = 1,
672
.playback_only = 1,
673
.dpcm_merged_format = 1,
674
.dpcm_merged_chan = 1,
675
.dpcm_merged_rate = 1,
676
SND_SOC_DAILINK_REG(playback2),
677
},
678
{
679
.name = "Playback_3",
680
.stream_name = "Playback_3",
681
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
682
SND_SOC_DPCM_TRIGGER_PRE},
683
.dynamic = 1,
684
.playback_only = 1,
685
.dpcm_merged_format = 1,
686
.dpcm_merged_chan = 1,
687
.dpcm_merged_rate = 1,
688
.ops = &mtk_soundcard_common_playback_ops,
689
SND_SOC_DAILINK_REG(playback3),
690
},
691
{
692
.name = "Playback_4",
693
.stream_name = "Playback_4",
694
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
695
SND_SOC_DPCM_TRIGGER_PRE},
696
.dynamic = 1,
697
.playback_only = 1,
698
SND_SOC_DAILINK_REG(playback4),
699
},
700
{
701
.name = "Playback_5",
702
.stream_name = "Playback_5",
703
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
704
SND_SOC_DPCM_TRIGGER_PRE},
705
.dynamic = 1,
706
.playback_only = 1,
707
SND_SOC_DAILINK_REG(playback5),
708
},
709
{
710
.name = "Playback_6",
711
.stream_name = "Playback_6",
712
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
713
SND_SOC_DPCM_TRIGGER_PRE},
714
.dynamic = 1,
715
.playback_only = 1,
716
SND_SOC_DAILINK_REG(playback6),
717
},
718
{
719
.name = "Playback_7",
720
.stream_name = "Playback_7",
721
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
722
SND_SOC_DPCM_TRIGGER_PRE},
723
.dynamic = 1,
724
.playback_only = 1,
725
SND_SOC_DAILINK_REG(playback7),
726
},
727
{
728
.name = "Playback_8",
729
.stream_name = "Playback_8",
730
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
731
SND_SOC_DPCM_TRIGGER_PRE},
732
.dynamic = 1,
733
.playback_only = 1,
734
SND_SOC_DAILINK_REG(playback8),
735
},
736
{
737
.name = "Capture_1",
738
.stream_name = "Capture_1",
739
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
740
SND_SOC_DPCM_TRIGGER_PRE},
741
.dynamic = 1,
742
.capture_only = 1,
743
SND_SOC_DAILINK_REG(capture1),
744
},
745
{
746
.name = "Capture_2",
747
.stream_name = "Capture_2",
748
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
749
SND_SOC_DPCM_TRIGGER_PRE},
750
.dynamic = 1,
751
.capture_only = 1,
752
.dpcm_merged_format = 1,
753
.dpcm_merged_chan = 1,
754
.dpcm_merged_rate = 1,
755
.ops = &mtk_soundcard_common_capture_ops,
756
SND_SOC_DAILINK_REG(capture2),
757
},
758
{
759
.name = "Capture_3",
760
.stream_name = "Capture_3",
761
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
762
SND_SOC_DPCM_TRIGGER_PRE},
763
.dynamic = 1,
764
.capture_only = 1,
765
SND_SOC_DAILINK_REG(capture3),
766
},
767
{
768
.name = "Capture_4",
769
.stream_name = "Capture_4",
770
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
771
SND_SOC_DPCM_TRIGGER_PRE},
772
.dynamic = 1,
773
.capture_only = 1,
774
.dpcm_merged_format = 1,
775
.dpcm_merged_chan = 1,
776
.dpcm_merged_rate = 1,
777
.ops = &mtk_soundcard_common_capture_ops,
778
SND_SOC_DAILINK_REG(capture4),
779
},
780
{
781
.name = "Capture_5",
782
.stream_name = "Capture_5",
783
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
784
SND_SOC_DPCM_TRIGGER_PRE},
785
.dynamic = 1,
786
.capture_only = 1,
787
SND_SOC_DAILINK_REG(capture5),
788
},
789
{
790
.name = "Capture_6",
791
.stream_name = "Capture_6",
792
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
793
SND_SOC_DPCM_TRIGGER_PRE},
794
.dynamic = 1,
795
.capture_only = 1,
796
.dpcm_merged_format = 1,
797
.dpcm_merged_chan = 1,
798
.dpcm_merged_rate = 1,
799
SND_SOC_DAILINK_REG(capture6),
800
},
801
{
802
.name = "Capture_7",
803
.stream_name = "Capture_7",
804
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
805
SND_SOC_DPCM_TRIGGER_PRE},
806
.dynamic = 1,
807
.capture_only = 1,
808
SND_SOC_DAILINK_REG(capture7),
809
},
810
{
811
.name = "Hostless_LPBK",
812
.stream_name = "Hostless_LPBK",
813
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
814
SND_SOC_DPCM_TRIGGER_PRE},
815
.dynamic = 1,
816
.ignore_suspend = 1,
817
SND_SOC_DAILINK_REG(hostless_lpbk),
818
},
819
{
820
.name = "Hostless_FM",
821
.stream_name = "Hostless_FM",
822
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
823
SND_SOC_DPCM_TRIGGER_PRE},
824
.dynamic = 1,
825
.ignore_suspend = 1,
826
SND_SOC_DAILINK_REG(hostless_fm),
827
},
828
{
829
.name = "Hostless_SRC_1",
830
.stream_name = "Hostless_SRC_1",
831
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
832
SND_SOC_DPCM_TRIGGER_PRE},
833
.dynamic = 1,
834
.ignore_suspend = 1,
835
SND_SOC_DAILINK_REG(hostless_src1),
836
},
837
{
838
.name = "Hostless_SRC_Bargein",
839
.stream_name = "Hostless_SRC_Bargein",
840
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
841
SND_SOC_DPCM_TRIGGER_PRE},
842
.dynamic = 1,
843
.ignore_suspend = 1,
844
SND_SOC_DAILINK_REG(hostless_src_bargein),
845
},
846
{
847
.name = "Hostless_HW_Gain_AAudio",
848
.stream_name = "Hostless_HW_Gain_AAudio",
849
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
850
SND_SOC_DPCM_TRIGGER_PRE},
851
.dynamic = 1,
852
.capture_only = 1,
853
.ignore_suspend = 1,
854
SND_SOC_DAILINK_REG(hostless_hw_gain_aaudio),
855
},
856
{
857
.name = "Hostless_SRC_AAudio",
858
.stream_name = "Hostless_SRC_AAudio",
859
.trigger = {SND_SOC_DPCM_TRIGGER_PRE,
860
SND_SOC_DPCM_TRIGGER_PRE},
861
.dynamic = 1,
862
.ignore_suspend = 1,
863
SND_SOC_DAILINK_REG(hostless_src_aaudio),
864
},
865
/* Back End DAI links */
866
{
867
.name = "Primary Codec",
868
.no_pcm = 1,
869
.ignore_suspend = 1,
870
.init = primary_codec_init,
871
SND_SOC_DAILINK_REG(adda),
872
},
873
{
874
.name = "I2S3",
875
.no_pcm = 1,
876
.dai_fmt = SND_SOC_DAIFMT_I2S |
877
SND_SOC_DAIFMT_IB_IF |
878
SND_SOC_DAIFMT_CBP_CFP,
879
.playback_only = 1,
880
.ignore_suspend = 1,
881
.init = mt8186_mt6366_rt1019_rt5682s_hdmi_init,
882
SND_SOC_DAILINK_REG(i2s3),
883
},
884
{
885
.name = "I2S0",
886
.no_pcm = 1,
887
.capture_only = 1,
888
.ignore_suspend = 1,
889
.ops = &mt8186_rt5682s_i2s_ops,
890
SND_SOC_DAILINK_REG(i2s0),
891
},
892
{
893
.name = "I2S1",
894
.no_pcm = 1,
895
.playback_only = 1,
896
.ignore_suspend = 1,
897
.init = mt8186_headset_codec_init,
898
SND_SOC_DAILINK_REG(i2s1),
899
},
900
{
901
.name = "I2S2",
902
.no_pcm = 1,
903
.capture_only = 1,
904
.ignore_suspend = 1,
905
SND_SOC_DAILINK_REG(i2s2),
906
},
907
{
908
.name = "HW Gain 1",
909
.no_pcm = 1,
910
.ignore_suspend = 1,
911
SND_SOC_DAILINK_REG(hw_gain1),
912
},
913
{
914
.name = "HW Gain 2",
915
.no_pcm = 1,
916
.ignore_suspend = 1,
917
SND_SOC_DAILINK_REG(hw_gain2),
918
},
919
{
920
.name = "HW_SRC_1",
921
.no_pcm = 1,
922
.ignore_suspend = 1,
923
SND_SOC_DAILINK_REG(hw_src1),
924
},
925
{
926
.name = "HW_SRC_2",
927
.no_pcm = 1,
928
.ignore_suspend = 1,
929
SND_SOC_DAILINK_REG(hw_src2),
930
},
931
{
932
.name = "CONNSYS_I2S",
933
.no_pcm = 1,
934
.capture_only = 1,
935
.ignore_suspend = 1,
936
SND_SOC_DAILINK_REG(connsys_i2s),
937
},
938
{
939
.name = "PCM 1",
940
.dai_fmt = SND_SOC_DAIFMT_I2S |
941
SND_SOC_DAIFMT_NB_IF,
942
.no_pcm = 1,
943
.ignore_suspend = 1,
944
SND_SOC_DAILINK_REG(pcm1),
945
},
946
{
947
.name = "TDM IN",
948
.no_pcm = 1,
949
.capture_only = 1,
950
.ignore_suspend = 1,
951
SND_SOC_DAILINK_REG(tdm_in),
952
},
953
/* dummy BE for ul memif to record from dl memif */
954
{
955
.name = "Hostless_UL1",
956
.no_pcm = 1,
957
.capture_only = 1,
958
.ignore_suspend = 1,
959
SND_SOC_DAILINK_REG(hostless_ul1),
960
},
961
{
962
.name = "Hostless_UL2",
963
.no_pcm = 1,
964
.capture_only = 1,
965
.ignore_suspend = 1,
966
SND_SOC_DAILINK_REG(hostless_ul2),
967
},
968
{
969
.name = "Hostless_UL3",
970
.no_pcm = 1,
971
.capture_only = 1,
972
.ignore_suspend = 1,
973
SND_SOC_DAILINK_REG(hostless_ul3),
974
},
975
{
976
.name = "Hostless_UL5",
977
.no_pcm = 1,
978
.capture_only = 1,
979
.ignore_suspend = 1,
980
SND_SOC_DAILINK_REG(hostless_ul5),
981
},
982
{
983
.name = "Hostless_UL6",
984
.no_pcm = 1,
985
.capture_only = 1,
986
.ignore_suspend = 1,
987
SND_SOC_DAILINK_REG(hostless_ul6),
988
},
989
/* SOF BE */
990
{
991
.name = "AFE_SOF_DL1",
992
.no_pcm = 1,
993
.playback_only = 1,
994
SND_SOC_DAILINK_REG(AFE_SOF_DL1),
995
},
996
{
997
.name = "AFE_SOF_DL2",
998
.no_pcm = 1,
999
.playback_only = 1,
1000
SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1001
},
1002
{
1003
.name = "AFE_SOF_UL1",
1004
.no_pcm = 1,
1005
.capture_only = 1,
1006
SND_SOC_DAILINK_REG(AFE_SOF_UL1),
1007
},
1008
{
1009
.name = "AFE_SOF_UL2",
1010
.no_pcm = 1,
1011
.capture_only = 1,
1012
SND_SOC_DAILINK_REG(AFE_SOF_UL2),
1013
},
1014
};
1015
1016
static const struct snd_soc_dapm_widget
1017
mt8186_mt6366_da7219_max98357_widgets[] = {
1018
SND_SOC_DAPM_SPK("Speakers", NULL),
1019
SND_SOC_DAPM_HP("Headphones", NULL),
1020
SND_SOC_DAPM_MIC("Headset Mic", NULL),
1021
SND_SOC_DAPM_LINE("Line Out", NULL),
1022
SND_SOC_DAPM_LINE("HDMI1", NULL),
1023
SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1024
SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1025
SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1026
SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1027
};
1028
1029
static const struct snd_soc_dapm_widget
1030
mt8186_mt6366_rt1019_rt5682s_widgets[] = {
1031
SND_SOC_DAPM_SPK("Speakers", NULL),
1032
SND_SOC_DAPM_HP("Headphone", NULL),
1033
SND_SOC_DAPM_MIC("Headset Mic", NULL),
1034
SND_SOC_DAPM_OUTPUT("HDMI1"),
1035
SND_SOC_DAPM_MIXER(SOF_DMA_DL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1036
SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1037
SND_SOC_DAPM_MIXER(SOF_DMA_UL1, SND_SOC_NOPM, 0, 0, NULL, 0),
1038
SND_SOC_DAPM_MIXER(SOF_DMA_UL2, SND_SOC_NOPM, 0, 0, NULL, 0),
1039
};
1040
1041
static const struct snd_soc_dapm_route
1042
mt8186_mt6366_rt1019_rt5682s_routes[] = {
1043
/* SPK */
1044
{ "Speakers", NULL, "Speaker" },
1045
/* Headset */
1046
{ "Headphone", NULL, "HPOL" },
1047
{ "Headphone", NULL, "HPOR" },
1048
{ "IN1P", NULL, "Headset Mic" },
1049
/* HDMI */
1050
{ "HDMI1", NULL, "TX" },
1051
/* SOF Uplink */
1052
{SOF_DMA_UL1, NULL, "UL1_CH1"},
1053
{SOF_DMA_UL1, NULL, "UL1_CH2"},
1054
{SOF_DMA_UL2, NULL, "UL2_CH1"},
1055
{SOF_DMA_UL2, NULL, "UL2_CH2"},
1056
/* SOF Downlink */
1057
{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1058
{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1059
};
1060
1061
static const struct snd_soc_dapm_route mt8186_mt6366_rt5650_routes[] = {
1062
/* SPK */
1063
{"Speakers", NULL, "SPOL"},
1064
{"Speakers", NULL, "SPOR"},
1065
/* Headset */
1066
{ "Headphone", NULL, "HPOL" },
1067
{ "Headphone", NULL, "HPOR" },
1068
{ "IN1P", NULL, "Headset Mic" },
1069
{ "IN1N", NULL, "Headset Mic"},
1070
/* HDMI */
1071
{ "HDMI1", NULL, "TX" },
1072
/* SOF Uplink */
1073
{SOF_DMA_UL1, NULL, "UL1_CH1"},
1074
{SOF_DMA_UL1, NULL, "UL1_CH2"},
1075
{SOF_DMA_UL2, NULL, "UL2_CH1"},
1076
{SOF_DMA_UL2, NULL, "UL2_CH2"},
1077
/* SOF Downlink */
1078
{"DSP_DL1_VIRT", NULL, SOF_DMA_DL1},
1079
{"DSP_DL2_VIRT", NULL, SOF_DMA_DL2},
1080
};
1081
1082
static const struct snd_kcontrol_new mt8186_mt6366_da7219_max98357_controls[] = {
1083
SOC_DAPM_PIN_SWITCH("Speakers"),
1084
SOC_DAPM_PIN_SWITCH("Headphones"),
1085
SOC_DAPM_PIN_SWITCH("Headset Mic"),
1086
SOC_DAPM_PIN_SWITCH("Line Out"),
1087
SOC_DAPM_PIN_SWITCH("HDMI1"),
1088
};
1089
1090
static const struct snd_kcontrol_new
1091
mt8186_mt6366_rt1019_rt5682s_controls[] = {
1092
SOC_DAPM_PIN_SWITCH("Speakers"),
1093
SOC_DAPM_PIN_SWITCH("Headphone"),
1094
SOC_DAPM_PIN_SWITCH("Headset Mic"),
1095
SOC_DAPM_PIN_SWITCH("HDMI1"),
1096
};
1097
1098
static struct snd_soc_card mt8186_mt6366_da7219_max98357_soc_card = {
1099
.name = "mt8186_da7219_max98357",
1100
.owner = THIS_MODULE,
1101
.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1102
.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1103
.controls = mt8186_mt6366_da7219_max98357_controls,
1104
.num_controls = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_controls),
1105
.dapm_widgets = mt8186_mt6366_da7219_max98357_widgets,
1106
.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_da7219_max98357_widgets),
1107
.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1108
.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1109
.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1110
.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1111
};
1112
1113
static struct snd_soc_card mt8186_mt6366_rt1019_rt5682s_soc_card = {
1114
.name = "mt8186_rt1019_rt5682s",
1115
.owner = THIS_MODULE,
1116
.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1117
.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1118
.controls = mt8186_mt6366_rt1019_rt5682s_controls,
1119
.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1120
.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1121
.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1122
.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1123
.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1124
.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1125
.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1126
};
1127
1128
static struct snd_soc_card mt8186_mt6366_rt5682s_max98360_soc_card = {
1129
.name = "mt8186_rt5682s_max98360",
1130
.owner = THIS_MODULE,
1131
.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1132
.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1133
.controls = mt8186_mt6366_rt1019_rt5682s_controls,
1134
.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1135
.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1136
.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1137
.dapm_routes = mt8186_mt6366_rt1019_rt5682s_routes,
1138
.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_routes),
1139
.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1140
.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1141
};
1142
1143
static struct snd_soc_card mt8186_mt6366_rt5650_soc_card = {
1144
.name = "mt8186_rt5650",
1145
.owner = THIS_MODULE,
1146
.dai_link = mt8186_mt6366_rt1019_rt5682s_dai_links,
1147
.num_links = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_dai_links),
1148
.controls = mt8186_mt6366_rt1019_rt5682s_controls,
1149
.num_controls = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_controls),
1150
.dapm_widgets = mt8186_mt6366_rt1019_rt5682s_widgets,
1151
.num_dapm_widgets = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_widgets),
1152
.dapm_routes = mt8186_mt6366_rt5650_routes,
1153
.num_dapm_routes = ARRAY_SIZE(mt8186_mt6366_rt5650_routes),
1154
.codec_conf = mt8186_mt6366_rt1019_rt5682s_codec_conf,
1155
.num_configs = ARRAY_SIZE(mt8186_mt6366_rt1019_rt5682s_codec_conf),
1156
};
1157
1158
static int mt8186_mt6366_legacy_probe(struct mtk_soc_card_data *soc_card_data)
1159
{
1160
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1161
struct snd_soc_card *card = card_data->card;
1162
struct device *dev = card->dev;
1163
struct snd_soc_dai_link *dai_link;
1164
struct device_node *headset_codec, *playback_codec;
1165
int ret, i;
1166
1167
playback_codec = of_get_child_by_name(dev->of_node, "playback-codecs");
1168
if (!playback_codec)
1169
return dev_err_probe(dev, -EINVAL,
1170
"Property 'playback-codecs' missing or invalid\n");
1171
1172
headset_codec = of_get_child_by_name(dev->of_node, "headset-codec");
1173
if (!headset_codec) {
1174
of_node_put(playback_codec);
1175
return dev_err_probe(dev, -EINVAL,
1176
"Property 'headset-codec' missing or invalid\n");
1177
}
1178
1179
for_each_card_prelinks(card, i, dai_link) {
1180
ret = mt8186_mt6366_card_set_be_link(card, dai_link, playback_codec, "I2S3");
1181
if (ret) {
1182
dev_err_probe(dev, ret, "%s set playback_codec fail\n",
1183
dai_link->name);
1184
break;
1185
}
1186
1187
ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S0");
1188
if (ret) {
1189
dev_err_probe(dev, ret, "%s set headset_codec fail\n",
1190
dai_link->name);
1191
break;
1192
}
1193
1194
ret = mt8186_mt6366_card_set_be_link(card, dai_link, headset_codec, "I2S1");
1195
if (ret) {
1196
dev_err_probe(dev, ret, "%s set headset_codec fail\n",
1197
dai_link->name);
1198
break;
1199
}
1200
}
1201
of_node_put(headset_codec);
1202
of_node_put(playback_codec);
1203
1204
return ret;
1205
}
1206
1207
static int mt8186_mt6366_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1208
{
1209
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1210
struct snd_soc_card *card = card_data->card;
1211
struct snd_soc_dai_link *dai_link;
1212
struct mt8186_mt6366_rt1019_rt5682s_priv *mach_priv;
1213
int i, ret;
1214
1215
mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);
1216
if (!mach_priv)
1217
return -ENOMEM;
1218
1219
soc_card_data->mach_priv = mach_priv;
1220
1221
mach_priv->dmic_sel = devm_gpiod_get_optional(card->dev,
1222
"dmic", GPIOD_OUT_LOW);
1223
if (IS_ERR(mach_priv->dmic_sel))
1224
return dev_err_probe(card->dev, PTR_ERR(mach_priv->dmic_sel),
1225
"DMIC gpio failed\n");
1226
1227
for_each_card_prelinks(card, i, dai_link) {
1228
if (strcmp(dai_link->name, "I2S0") == 0 ||
1229
strcmp(dai_link->name, "I2S1") == 0 ||
1230
strcmp(dai_link->name, "I2S2") == 0) {
1231
if (card_data->flags & DA7219_CODEC_PRESENT) {
1232
dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;
1233
dai_link->ops = &mt8186_da7219_i2s_ops;
1234
} else {
1235
dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;
1236
dai_link->ops = &mt8186_rt5682s_i2s_ops;
1237
}
1238
} else if (strcmp(dai_link->name, "I2S3") == 0) {
1239
if (card_data->flags & DA7219_CODEC_PRESENT)
1240
dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_24le_fixup;
1241
else
1242
dai_link->be_hw_params_fixup = mt8186_i2s_hw_params_32le_fixup;
1243
}
1244
}
1245
1246
if (legacy) {
1247
ret = mt8186_mt6366_legacy_probe(soc_card_data);
1248
if (ret)
1249
return ret;
1250
}
1251
1252
ret = mt8186_afe_gpio_init(card->dev);
1253
if (ret)
1254
return dev_err_probe(card->dev, ret, "init AFE gpio error\n");
1255
1256
return 0;
1257
}
1258
1259
static const unsigned int mt8186_pcm_playback_channels[] = { 2 };
1260
static const unsigned int mt8186_pcm_capture_channels[] = { 1, 2 };
1261
static const unsigned int mt8186_pcm_rates[] = { 48000 };
1262
1263
static const struct snd_pcm_hw_constraint_list mt8186_rate_constraint = {
1264
.list = mt8186_pcm_rates,
1265
.count = ARRAY_SIZE(mt8186_pcm_rates)
1266
};
1267
1268
static const struct mtk_pcm_constraints_data mt8186_pcm_constraints[MTK_CONSTRAINT_CAPTURE + 1] = {
1269
[MTK_CONSTRAINT_PLAYBACK] = {
1270
.channels = &(const struct snd_pcm_hw_constraint_list) {
1271
.list = mt8186_pcm_playback_channels,
1272
.count = ARRAY_SIZE(mt8186_pcm_playback_channels)
1273
},
1274
.rates = &mt8186_rate_constraint,
1275
},
1276
[MTK_CONSTRAINT_CAPTURE] = {
1277
.channels = &(const struct snd_pcm_hw_constraint_list) {
1278
.list = mt8186_pcm_capture_channels,
1279
.count = ARRAY_SIZE(mt8186_pcm_capture_channels)
1280
},
1281
.rates = &mt8186_rate_constraint,
1282
}
1283
};
1284
1285
static const struct mtk_sof_priv mt8186_sof_priv = {
1286
.conn_streams = g_sof_conn_streams,
1287
.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1288
.sof_dai_link_fixup = mt8186_sof_dai_link_fixup
1289
};
1290
1291
static const struct mtk_soundcard_pdata mt8186_mt6366_da7219_max98357_pdata = {
1292
.card_data = &(struct mtk_platform_card_data) {
1293
.card = &mt8186_mt6366_da7219_max98357_soc_card,
1294
.num_jacks = MT8186_JACK_MAX,
1295
.pcm_constraints = mt8186_pcm_constraints,
1296
.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
1297
.flags = DA7219_CODEC_PRESENT,
1298
},
1299
.sof_priv = &mt8186_sof_priv,
1300
.soc_probe = mt8186_mt6366_soc_card_probe
1301
};
1302
1303
static const struct mtk_soundcard_pdata mt8186_mt6366_rt1019_rt5682s_pdata = {
1304
.card_data = &(struct mtk_platform_card_data) {
1305
.card = &mt8186_mt6366_rt1019_rt5682s_soc_card,
1306
.num_jacks = MT8186_JACK_MAX,
1307
.pcm_constraints = mt8186_pcm_constraints,
1308
.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
1309
},
1310
.sof_priv = &mt8186_sof_priv,
1311
.soc_probe = mt8186_mt6366_soc_card_probe
1312
};
1313
1314
static const struct mtk_soundcard_pdata mt8186_mt6366_rt5682s_max98360_pdata = {
1315
.card_data = &(struct mtk_platform_card_data) {
1316
.card = &mt8186_mt6366_rt5682s_max98360_soc_card,
1317
.num_jacks = MT8186_JACK_MAX,
1318
.pcm_constraints = mt8186_pcm_constraints,
1319
.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
1320
},
1321
.sof_priv = &mt8186_sof_priv,
1322
.soc_probe = mt8186_mt6366_soc_card_probe
1323
};
1324
1325
static const struct mtk_soundcard_pdata mt8186_mt6366_rt5650_pdata = {
1326
.card_data = &(struct mtk_platform_card_data) {
1327
.card = &mt8186_mt6366_rt5650_soc_card,
1328
.num_jacks = MT8186_JACK_MAX,
1329
.pcm_constraints = mt8186_pcm_constraints,
1330
.num_pcm_constraints = ARRAY_SIZE(mt8186_pcm_constraints),
1331
},
1332
.sof_priv = &mt8186_sof_priv,
1333
.soc_probe = mt8186_mt6366_soc_card_probe
1334
};
1335
1336
#if IS_ENABLED(CONFIG_OF)
1337
static const struct of_device_id mt8186_mt6366_dt_match[] = {
1338
{
1339
.compatible = "mediatek,mt8186-mt6366-rt1019-rt5682s-sound",
1340
.data = &mt8186_mt6366_rt1019_rt5682s_pdata,
1341
},
1342
{
1343
.compatible = "mediatek,mt8186-mt6366-rt5682s-max98360-sound",
1344
.data = &mt8186_mt6366_rt5682s_max98360_pdata,
1345
},
1346
{
1347
.compatible = "mediatek,mt8186-mt6366-rt5650-sound",
1348
.data = &mt8186_mt6366_rt5650_pdata,
1349
},
1350
{
1351
.compatible = "mediatek,mt8186-mt6366-da7219-max98357-sound",
1352
.data = &mt8186_mt6366_da7219_max98357_pdata,
1353
},
1354
{ /* sentinel */ }
1355
};
1356
MODULE_DEVICE_TABLE(of, mt8186_mt6366_dt_match);
1357
#endif
1358
1359
static struct platform_driver mt8186_mt6366_driver = {
1360
.driver = {
1361
.name = "mt8186_mt6366",
1362
#if IS_ENABLED(CONFIG_OF)
1363
.of_match_table = mt8186_mt6366_dt_match,
1364
#endif
1365
.pm = &snd_soc_pm_ops,
1366
},
1367
.probe = mtk_soundcard_common_probe,
1368
};
1369
1370
module_platform_driver(mt8186_mt6366_driver);
1371
1372
/* Module information */
1373
MODULE_DESCRIPTION("MT8186-MT6366 ALSA SoC machine driver");
1374
MODULE_AUTHOR("Jiaxin Yu <[email protected]>");
1375
MODULE_LICENSE("GPL v2");
1376
MODULE_ALIAS("mt8186_mt6366 soc card");
1377
1378