Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8195/mt8195-mt6359.c
26488 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* mt8195-mt6359.c --
4
* MT8195-MT6359 ALSA SoC machine driver code
5
*
6
* Copyright (c) 2022 MediaTek Inc.
7
* Author: Trevor Wu <[email protected]>
8
* YC Hung <[email protected]>
9
*/
10
11
#include <linux/input.h>
12
#include <linux/module.h>
13
#include <linux/of.h>
14
#include <linux/pm_runtime.h>
15
#include <sound/jack.h>
16
#include <sound/pcm_params.h>
17
#include <sound/rt5682.h>
18
#include <sound/soc.h>
19
#include "../../codecs/mt6359.h"
20
#include "../../codecs/rt1011.h"
21
#include "../../codecs/rt5682.h"
22
#include "../common/mtk-afe-platform-driver.h"
23
#include "../common/mtk-dsp-sof-common.h"
24
#include "../common/mtk-soc-card.h"
25
#include "../common/mtk-soundcard-driver.h"
26
#include "mt8195-afe-clk.h"
27
#include "mt8195-afe-common.h"
28
29
#define RT1011_SPEAKER_AMP_PRESENT BIT(0)
30
#define RT1019_SPEAKER_AMP_PRESENT BIT(1)
31
#define MAX98390_SPEAKER_AMP_PRESENT BIT(2)
32
33
#define DUMB_CODEC_INIT BIT(0)
34
#define MT6359_CODEC_INIT BIT(1)
35
#define RT1011_CODEC_INIT BIT(2)
36
#define RT1019_CODEC_INIT BIT(3)
37
#define MAX98390_CODEC_INIT BIT(4)
38
#define RT5682_CODEC_INIT BIT(5)
39
40
#define RT1011_CODEC_DAI "rt1011-aif"
41
#define RT1011_DEV0_NAME "rt1011.2-0038"
42
#define RT1011_DEV1_NAME "rt1011.2-0039"
43
44
#define RT1019_CODEC_DAI "HiFi"
45
#define RT1019_DEV0_NAME "rt1019p"
46
47
#define MAX98390_CODEC_DAI "max98390-aif1"
48
#define MAX98390_DEV0_NAME "max98390.2-0038" /* right */
49
#define MAX98390_DEV1_NAME "max98390.2-0039" /* left */
50
51
#define RT5682_CODEC_DAI "rt5682-aif1"
52
#define RT5682_DEV0_NAME "rt5682.2-001a"
53
54
#define RT5682S_CODEC_DAI "rt5682s-aif1"
55
#define RT5682S_DEV0_NAME "rt5682s.2-001a"
56
57
#define SOF_DMA_DL2 "SOF_DMA_DL2"
58
#define SOF_DMA_DL3 "SOF_DMA_DL3"
59
#define SOF_DMA_UL4 "SOF_DMA_UL4"
60
#define SOF_DMA_UL5 "SOF_DMA_UL5"
61
62
struct mt8195_mt6359_priv {
63
struct clk *i2so1_mclk;
64
};
65
66
enum mt8195_jacks {
67
MT8195_JACK_HEADSET,
68
MT8195_JACK_DP,
69
MT8195_JACK_HDMI,
70
MT8195_JACK_MAX,
71
};
72
73
/* Headset jack detection DAPM pins */
74
static struct snd_soc_jack_pin mt8195_jack_pins[] = {
75
{
76
.pin = "Headphone",
77
.mask = SND_JACK_HEADPHONE,
78
},
79
{
80
.pin = "Headset Mic",
81
.mask = SND_JACK_MICROPHONE,
82
},
83
};
84
85
static const struct snd_soc_dapm_widget mt8195_mt6359_widgets[] = {
86
SND_SOC_DAPM_HP("Headphone", NULL),
87
SND_SOC_DAPM_MIC("Headset Mic", NULL),
88
SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
89
SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
90
SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
91
SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
92
};
93
94
static const struct snd_soc_dapm_route mt8195_mt6359_routes[] = {
95
/* SOF Uplink */
96
{SOF_DMA_UL4, NULL, "O034"},
97
{SOF_DMA_UL4, NULL, "O035"},
98
{SOF_DMA_UL5, NULL, "O036"},
99
{SOF_DMA_UL5, NULL, "O037"},
100
/* SOF Downlink */
101
{"I070", NULL, SOF_DMA_DL2},
102
{"I071", NULL, SOF_DMA_DL2},
103
{"I020", NULL, SOF_DMA_DL3},
104
{"I021", NULL, SOF_DMA_DL3},
105
};
106
107
static const struct snd_kcontrol_new mt8195_mt6359_controls[] = {
108
SOC_DAPM_PIN_SWITCH("Headphone"),
109
SOC_DAPM_PIN_SWITCH("Headset Mic"),
110
};
111
112
static const struct snd_soc_dapm_widget mt8195_dual_speaker_widgets[] = {
113
SND_SOC_DAPM_SPK("Left Spk", NULL),
114
SND_SOC_DAPM_SPK("Right Spk", NULL),
115
};
116
117
static const struct snd_kcontrol_new mt8195_dual_speaker_controls[] = {
118
SOC_DAPM_PIN_SWITCH("Left Spk"),
119
SOC_DAPM_PIN_SWITCH("Right Spk"),
120
};
121
122
static const struct snd_soc_dapm_widget mt8195_speaker_widgets[] = {
123
SND_SOC_DAPM_SPK("Ext Spk", NULL),
124
};
125
126
static const struct snd_kcontrol_new mt8195_speaker_controls[] = {
127
SOC_DAPM_PIN_SWITCH("Ext Spk"),
128
};
129
130
static const struct snd_soc_dapm_route mt8195_rt5682_routes[] = {
131
/* headset */
132
{ "Headphone", NULL, "HPOL" },
133
{ "Headphone", NULL, "HPOR" },
134
{ "IN1P", NULL, "Headset Mic" },
135
};
136
137
static const struct snd_soc_dapm_route mt8195_rt1011_routes[] = {
138
{ "Left Spk", NULL, "Left SPO" },
139
{ "Right Spk", NULL, "Right SPO" },
140
};
141
142
static const struct snd_soc_dapm_route mt8195_rt1019_routes[] = {
143
{ "Ext Spk", NULL, "Speaker" },
144
};
145
146
static const struct snd_soc_dapm_route mt8195_max98390_routes[] = {
147
{ "Left Spk", NULL, "Left BE_OUT" },
148
{ "Right Spk", NULL, "Right BE_OUT" },
149
};
150
151
#define CKSYS_AUD_TOP_CFG 0x032c
152
#define CKSYS_AUD_TOP_MON 0x0330
153
154
static int mt8195_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
155
{
156
struct snd_soc_component *cmpnt_afe =
157
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
158
struct snd_soc_component *cmpnt_codec =
159
snd_soc_rtd_to_codec(rtd, 0)->component;
160
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
161
struct mt8195_afe_private *afe_priv = afe->platform_priv;
162
struct mtkaif_param *param = &afe_priv->mtkaif_params;
163
int chosen_phase_1, chosen_phase_2, chosen_phase_3;
164
int prev_cycle_1, prev_cycle_2, prev_cycle_3;
165
int test_done_1, test_done_2, test_done_3;
166
int cycle_1, cycle_2, cycle_3;
167
int mtkaif_chosen_phase[MT8195_MTKAIF_MISO_NUM];
168
int mtkaif_phase_cycle[MT8195_MTKAIF_MISO_NUM];
169
int mtkaif_calibration_num_phase;
170
bool mtkaif_calibration_ok;
171
unsigned int monitor = 0;
172
int counter;
173
int phase;
174
int i;
175
176
dev_dbg(afe->dev, "%s(), start\n", __func__);
177
178
param->mtkaif_calibration_ok = false;
179
for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++) {
180
param->mtkaif_chosen_phase[i] = -1;
181
param->mtkaif_phase_cycle[i] = 0;
182
mtkaif_chosen_phase[i] = -1;
183
mtkaif_phase_cycle[i] = 0;
184
}
185
186
if (IS_ERR(afe_priv->topckgen)) {
187
dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
188
__func__);
189
return 0;
190
}
191
192
pm_runtime_get_sync(afe->dev);
193
mt6359_mtkaif_calibration_enable(cmpnt_codec);
194
195
/* set test type to synchronizer pulse */
196
regmap_update_bits(afe_priv->topckgen,
197
CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
198
mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */
199
mtkaif_calibration_ok = true;
200
201
for (phase = 0;
202
phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
203
phase++) {
204
mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
205
phase, phase, phase);
206
207
regmap_update_bits(afe_priv->topckgen,
208
CKSYS_AUD_TOP_CFG, 0x1, 0x1);
209
210
test_done_1 = 0;
211
test_done_2 = 0;
212
test_done_3 = 0;
213
cycle_1 = -1;
214
cycle_2 = -1;
215
cycle_3 = -1;
216
counter = 0;
217
while (!(test_done_1 & test_done_2 & test_done_3)) {
218
regmap_read(afe_priv->topckgen,
219
CKSYS_AUD_TOP_MON, &monitor);
220
test_done_1 = (monitor >> 28) & 0x1;
221
test_done_2 = (monitor >> 29) & 0x1;
222
test_done_3 = (monitor >> 30) & 0x1;
223
if (test_done_1 == 1)
224
cycle_1 = monitor & 0xf;
225
226
if (test_done_2 == 1)
227
cycle_2 = (monitor >> 4) & 0xf;
228
229
if (test_done_3 == 1)
230
cycle_3 = (monitor >> 8) & 0xf;
231
232
/* handle if never test done */
233
if (++counter > 10000) {
234
dev_info(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
235
__func__,
236
cycle_1, cycle_2, cycle_3, monitor);
237
mtkaif_calibration_ok = false;
238
break;
239
}
240
}
241
242
if (phase == 0) {
243
prev_cycle_1 = cycle_1;
244
prev_cycle_2 = cycle_2;
245
prev_cycle_3 = cycle_3;
246
}
247
248
if (cycle_1 != prev_cycle_1 &&
249
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
250
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = phase - 1;
251
mtkaif_phase_cycle[MT8195_MTKAIF_MISO_0] = prev_cycle_1;
252
}
253
254
if (cycle_2 != prev_cycle_2 &&
255
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
256
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = phase - 1;
257
mtkaif_phase_cycle[MT8195_MTKAIF_MISO_1] = prev_cycle_2;
258
}
259
260
if (cycle_3 != prev_cycle_3 &&
261
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
262
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = phase - 1;
263
mtkaif_phase_cycle[MT8195_MTKAIF_MISO_2] = prev_cycle_3;
264
}
265
266
regmap_update_bits(afe_priv->topckgen,
267
CKSYS_AUD_TOP_CFG, 0x1, 0x0);
268
269
if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] >= 0 &&
270
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] >= 0 &&
271
mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] >= 0)
272
break;
273
}
274
275
if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] < 0) {
276
mtkaif_calibration_ok = false;
277
chosen_phase_1 = 0;
278
} else {
279
chosen_phase_1 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0];
280
}
281
282
if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] < 0) {
283
mtkaif_calibration_ok = false;
284
chosen_phase_2 = 0;
285
} else {
286
chosen_phase_2 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1];
287
}
288
289
if (mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] < 0) {
290
mtkaif_calibration_ok = false;
291
chosen_phase_3 = 0;
292
} else {
293
chosen_phase_3 = mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2];
294
}
295
296
mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
297
chosen_phase_1,
298
chosen_phase_2,
299
chosen_phase_3);
300
301
mt6359_mtkaif_calibration_disable(cmpnt_codec);
302
pm_runtime_put(afe->dev);
303
304
param->mtkaif_calibration_ok = mtkaif_calibration_ok;
305
param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_0] = chosen_phase_1;
306
param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_1] = chosen_phase_2;
307
param->mtkaif_chosen_phase[MT8195_MTKAIF_MISO_2] = chosen_phase_3;
308
for (i = 0; i < MT8195_MTKAIF_MISO_NUM; i++)
309
param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
310
311
dev_info(afe->dev, "%s(), end, calibration ok %d\n",
312
__func__, param->mtkaif_calibration_ok);
313
314
return 0;
315
}
316
317
static int mt8195_mt6359_init(struct snd_soc_pcm_runtime *rtd)
318
{
319
struct snd_soc_component *cmpnt_codec =
320
snd_soc_rtd_to_codec(rtd, 0)->component;
321
322
/* set mtkaif protocol */
323
mt6359_set_mtkaif_protocol(cmpnt_codec,
324
MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
325
326
/* mtkaif calibration */
327
mt8195_mt6359_mtkaif_calibration(rtd);
328
329
return 0;
330
}
331
332
static int mt8195_hdmitx_dptx_startup(struct snd_pcm_substream *substream)
333
{
334
return mtk_soundcard_startup(substream, MTK_CONSTRAINT_HDMIDP);
335
}
336
337
static const struct snd_soc_ops mt8195_hdmitx_dptx_playback_ops = {
338
.startup = mt8195_hdmitx_dptx_startup,
339
};
340
341
static int mt8195_dptx_hw_params(struct snd_pcm_substream *substream,
342
struct snd_pcm_hw_params *params)
343
{
344
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
345
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
346
347
return snd_soc_dai_set_sysclk(cpu_dai, 0, params_rate(params) * 256,
348
SND_SOC_CLOCK_OUT);
349
}
350
351
static const struct snd_soc_ops mt8195_dptx_ops = {
352
.hw_params = mt8195_dptx_hw_params,
353
};
354
355
static int mt8195_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
356
{
357
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
358
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_DP];
359
struct snd_soc_component *cmpnt_codec =
360
snd_soc_rtd_to_codec(rtd, 0)->component;
361
int ret;
362
363
ret = snd_soc_card_jack_new(rtd->card, "DP Jack", SND_JACK_LINEOUT, jack);
364
if (ret)
365
return ret;
366
367
return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
368
}
369
370
static int mt8195_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
371
{
372
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
373
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HDMI];
374
struct snd_soc_component *cmpnt_codec =
375
snd_soc_rtd_to_codec(rtd, 0)->component;
376
int ret;
377
378
ret = snd_soc_card_jack_new(rtd->card, "HDMI Jack", SND_JACK_LINEOUT, jack);
379
if (ret)
380
return ret;
381
382
return snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
383
}
384
385
static int mt8195_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
386
struct snd_pcm_hw_params *params)
387
{
388
/* fix BE i2s format to S24_LE, clean param mask first */
389
snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
390
0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
391
392
params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
393
394
return 0;
395
}
396
397
static int mt8195_rt5682_etdm_hw_params(struct snd_pcm_substream *substream,
398
struct snd_pcm_hw_params *params)
399
{
400
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
401
struct snd_soc_card *card = rtd->card;
402
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
403
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
404
unsigned int rate = params_rate(params);
405
int bitwidth;
406
int ret;
407
408
bitwidth = snd_pcm_format_width(params_format(params));
409
if (bitwidth < 0) {
410
dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
411
return bitwidth;
412
}
413
414
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
415
if (ret) {
416
dev_err(card->dev, "failed to set tdm slot\n");
417
return ret;
418
}
419
420
ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_MCLK,
421
rate * 256, rate * 512);
422
if (ret) {
423
dev_err(card->dev, "failed to set pll\n");
424
return ret;
425
}
426
427
ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
428
rate * 512, SND_SOC_CLOCK_IN);
429
if (ret) {
430
dev_err(card->dev, "failed to set sysclk\n");
431
return ret;
432
}
433
434
return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256,
435
SND_SOC_CLOCK_OUT);
436
}
437
438
static const struct snd_soc_ops mt8195_rt5682_etdm_ops = {
439
.hw_params = mt8195_rt5682_etdm_hw_params,
440
};
441
442
static int mt8195_rt5682_init(struct snd_soc_pcm_runtime *rtd)
443
{
444
struct snd_soc_component *cmpnt_codec =
445
snd_soc_rtd_to_codec(rtd, 0)->component;
446
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
447
struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
448
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8195_JACK_HEADSET];
449
struct snd_soc_component *cmpnt_afe =
450
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
451
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
452
struct mt8195_afe_private *afe_priv = afe->platform_priv;
453
struct snd_soc_card *card = rtd->card;
454
int ret;
455
456
priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2];
457
458
ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
459
SND_JACK_HEADSET | SND_JACK_BTN_0 |
460
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
461
SND_JACK_BTN_3,
462
jack, mt8195_jack_pins,
463
ARRAY_SIZE(mt8195_jack_pins));
464
if (ret) {
465
dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
466
return ret;
467
}
468
469
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
470
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
471
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
472
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
473
474
ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
475
if (ret) {
476
dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
477
return ret;
478
}
479
480
ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt5682_routes,
481
ARRAY_SIZE(mt8195_rt5682_routes));
482
if (ret)
483
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
484
485
return ret;
486
};
487
488
static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream,
489
struct snd_pcm_hw_params *params)
490
{
491
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
492
struct snd_soc_dai *codec_dai;
493
struct snd_soc_card *card = rtd->card;
494
int srate, i, ret;
495
496
srate = params_rate(params);
497
498
for_each_rtd_codec_dais(rtd, i, codec_dai) {
499
ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK,
500
64 * srate, 256 * srate);
501
if (ret < 0) {
502
dev_err(card->dev, "codec_dai clock not set\n");
503
return ret;
504
}
505
506
ret = snd_soc_dai_set_sysclk(codec_dai,
507
RT1011_FS_SYS_PRE_S_PLL1,
508
256 * srate, SND_SOC_CLOCK_IN);
509
if (ret < 0) {
510
dev_err(card->dev, "codec_dai clock not set\n");
511
return ret;
512
}
513
}
514
return 0;
515
}
516
517
static const struct snd_soc_ops mt8195_rt1011_etdm_ops = {
518
.hw_params = mt8195_rt1011_etdm_hw_params,
519
};
520
521
static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream,
522
struct snd_pcm_hw_params *params)
523
{
524
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
525
struct snd_soc_component *cmpnt_afe = NULL;
526
struct snd_soc_pcm_runtime *runtime;
527
528
/* find afe component */
529
for_each_card_rtds(rtd->card, runtime) {
530
cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
531
if (cmpnt_afe)
532
break;
533
}
534
535
if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
536
dev_err(rtd->dev, "afe pm runtime is not active!!\n");
537
return -EINVAL;
538
}
539
540
return 0;
541
}
542
543
static const struct snd_soc_ops mt8195_sof_be_ops = {
544
.hw_params = mt8195_sof_be_hw_params,
545
};
546
547
static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd)
548
{
549
struct snd_soc_card *card = rtd->card;
550
int ret;
551
552
ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
553
ARRAY_SIZE(mt8195_dual_speaker_widgets));
554
if (ret) {
555
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
556
/* Don't need to add routes if widget addition failed */
557
return ret;
558
}
559
560
ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
561
ARRAY_SIZE(mt8195_dual_speaker_controls));
562
if (ret) {
563
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
564
return ret;
565
}
566
567
ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1011_routes,
568
ARRAY_SIZE(mt8195_rt1011_routes));
569
if (ret)
570
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
571
572
return ret;
573
}
574
575
static int mt8195_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
576
{
577
struct snd_soc_card *card = rtd->card;
578
int ret;
579
580
ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_speaker_widgets,
581
ARRAY_SIZE(mt8195_speaker_widgets));
582
if (ret) {
583
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
584
/* Don't need to add routes if widget addition failed */
585
return ret;
586
}
587
588
ret = snd_soc_add_card_controls(card, mt8195_speaker_controls,
589
ARRAY_SIZE(mt8195_speaker_controls));
590
if (ret) {
591
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
592
return ret;
593
}
594
595
return 0;
596
}
597
598
static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd)
599
{
600
struct snd_soc_card *card = rtd->card;
601
int ret;
602
603
ret = mt8195_dumb_amp_init(rtd);
604
if (ret)
605
return ret;
606
607
ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_rt1019_routes,
608
ARRAY_SIZE(mt8195_rt1019_routes));
609
if (ret)
610
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
611
612
return ret;
613
}
614
615
static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd)
616
{
617
struct snd_soc_card *card = rtd->card;
618
int ret;
619
620
ret = snd_soc_dapm_new_controls(&card->dapm, mt8195_dual_speaker_widgets,
621
ARRAY_SIZE(mt8195_dual_speaker_widgets));
622
if (ret) {
623
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
624
/* Don't need to add routes if widget addition failed */
625
return ret;
626
}
627
628
ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
629
ARRAY_SIZE(mt8195_dual_speaker_controls));
630
if (ret) {
631
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
632
return ret;
633
}
634
635
ret = snd_soc_dapm_add_routes(&card->dapm, mt8195_max98390_routes,
636
ARRAY_SIZE(mt8195_max98390_routes));
637
if (ret)
638
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
639
640
return ret;
641
}
642
643
static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
644
struct snd_pcm_hw_params *params)
645
{
646
/* fix BE i2s format to S24_LE, clean param mask first */
647
snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
648
0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
649
650
params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
651
652
return 0;
653
}
654
655
static int mt8195_set_bias_level_post(struct snd_soc_card *card,
656
struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
657
{
658
struct snd_soc_component *component = dapm->component;
659
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
660
struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
661
int ret;
662
663
/*
664
* It's required to control mclk directly in the set_bias_level_post
665
* function for rt5682 and rt5682s codec, or the unexpected pop happens
666
* at the end of playback.
667
*/
668
if (!component ||
669
(strcmp(component->name, RT5682_DEV0_NAME) &&
670
strcmp(component->name, RT5682S_DEV0_NAME)))
671
return 0;
672
673
switch (level) {
674
case SND_SOC_BIAS_OFF:
675
if (!__clk_is_enabled(priv->i2so1_mclk))
676
return 0;
677
678
clk_disable_unprepare(priv->i2so1_mclk);
679
dev_dbg(card->dev, "Disable i2so1 mclk\n");
680
break;
681
case SND_SOC_BIAS_ON:
682
ret = clk_prepare_enable(priv->i2so1_mclk);
683
if (ret) {
684
dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret);
685
return ret;
686
}
687
dev_dbg(card->dev, "Enable i2so1 mclk\n");
688
break;
689
default:
690
break;
691
}
692
693
return 0;
694
}
695
696
enum {
697
DAI_LINK_DL2_FE,
698
DAI_LINK_DL3_FE,
699
DAI_LINK_DL6_FE,
700
DAI_LINK_DL7_FE,
701
DAI_LINK_DL8_FE,
702
DAI_LINK_DL10_FE,
703
DAI_LINK_DL11_FE,
704
DAI_LINK_UL1_FE,
705
DAI_LINK_UL2_FE,
706
DAI_LINK_UL3_FE,
707
DAI_LINK_UL4_FE,
708
DAI_LINK_UL5_FE,
709
DAI_LINK_UL6_FE,
710
DAI_LINK_UL8_FE,
711
DAI_LINK_UL9_FE,
712
DAI_LINK_UL10_FE,
713
DAI_LINK_DL_SRC_BE,
714
DAI_LINK_DPTX_BE,
715
DAI_LINK_ETDM1_IN_BE,
716
DAI_LINK_ETDM2_IN_BE,
717
DAI_LINK_ETDM1_OUT_BE,
718
DAI_LINK_ETDM2_OUT_BE,
719
DAI_LINK_ETDM3_OUT_BE,
720
DAI_LINK_PCM1_BE,
721
DAI_LINK_UL_SRC1_BE,
722
DAI_LINK_UL_SRC2_BE,
723
DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE,
724
DAI_LINK_SOF_START,
725
DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
726
DAI_LINK_SOF_DL3_BE,
727
DAI_LINK_SOF_UL4_BE,
728
DAI_LINK_SOF_UL5_BE,
729
DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
730
};
731
732
#define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1)
733
734
/* FE */
735
SND_SOC_DAILINK_DEFS(DL2_FE,
736
DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
737
DAILINK_COMP_ARRAY(COMP_DUMMY()),
738
DAILINK_COMP_ARRAY(COMP_EMPTY()));
739
740
SND_SOC_DAILINK_DEFS(DL3_FE,
741
DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
742
DAILINK_COMP_ARRAY(COMP_DUMMY()),
743
DAILINK_COMP_ARRAY(COMP_EMPTY()));
744
745
SND_SOC_DAILINK_DEFS(DL6_FE,
746
DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
747
DAILINK_COMP_ARRAY(COMP_DUMMY()),
748
DAILINK_COMP_ARRAY(COMP_EMPTY()));
749
750
SND_SOC_DAILINK_DEFS(DL7_FE,
751
DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
752
DAILINK_COMP_ARRAY(COMP_DUMMY()),
753
DAILINK_COMP_ARRAY(COMP_EMPTY()));
754
755
SND_SOC_DAILINK_DEFS(DL8_FE,
756
DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
757
DAILINK_COMP_ARRAY(COMP_DUMMY()),
758
DAILINK_COMP_ARRAY(COMP_EMPTY()));
759
760
SND_SOC_DAILINK_DEFS(DL10_FE,
761
DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
762
DAILINK_COMP_ARRAY(COMP_DUMMY()),
763
DAILINK_COMP_ARRAY(COMP_EMPTY()));
764
765
SND_SOC_DAILINK_DEFS(DL11_FE,
766
DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
767
DAILINK_COMP_ARRAY(COMP_DUMMY()),
768
DAILINK_COMP_ARRAY(COMP_EMPTY()));
769
770
SND_SOC_DAILINK_DEFS(UL1_FE,
771
DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
772
DAILINK_COMP_ARRAY(COMP_DUMMY()),
773
DAILINK_COMP_ARRAY(COMP_EMPTY()));
774
775
SND_SOC_DAILINK_DEFS(UL2_FE,
776
DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
777
DAILINK_COMP_ARRAY(COMP_DUMMY()),
778
DAILINK_COMP_ARRAY(COMP_EMPTY()));
779
780
SND_SOC_DAILINK_DEFS(UL3_FE,
781
DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
782
DAILINK_COMP_ARRAY(COMP_DUMMY()),
783
DAILINK_COMP_ARRAY(COMP_EMPTY()));
784
785
SND_SOC_DAILINK_DEFS(UL4_FE,
786
DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
787
DAILINK_COMP_ARRAY(COMP_DUMMY()),
788
DAILINK_COMP_ARRAY(COMP_EMPTY()));
789
790
SND_SOC_DAILINK_DEFS(UL5_FE,
791
DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
792
DAILINK_COMP_ARRAY(COMP_DUMMY()),
793
DAILINK_COMP_ARRAY(COMP_EMPTY()));
794
795
SND_SOC_DAILINK_DEFS(UL6_FE,
796
DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
797
DAILINK_COMP_ARRAY(COMP_DUMMY()),
798
DAILINK_COMP_ARRAY(COMP_EMPTY()));
799
800
SND_SOC_DAILINK_DEFS(UL8_FE,
801
DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
802
DAILINK_COMP_ARRAY(COMP_DUMMY()),
803
DAILINK_COMP_ARRAY(COMP_EMPTY()));
804
805
SND_SOC_DAILINK_DEFS(UL9_FE,
806
DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
807
DAILINK_COMP_ARRAY(COMP_DUMMY()),
808
DAILINK_COMP_ARRAY(COMP_EMPTY()));
809
810
SND_SOC_DAILINK_DEFS(UL10_FE,
811
DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
812
DAILINK_COMP_ARRAY(COMP_DUMMY()),
813
DAILINK_COMP_ARRAY(COMP_EMPTY()));
814
815
/* BE */
816
SND_SOC_DAILINK_DEFS(DL_SRC_BE,
817
DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
818
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
819
"mt6359-snd-codec-aif1")),
820
DAILINK_COMP_ARRAY(COMP_EMPTY()));
821
822
SND_SOC_DAILINK_DEFS(DPTX_BE,
823
DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
824
DAILINK_COMP_ARRAY(COMP_DUMMY()),
825
DAILINK_COMP_ARRAY(COMP_EMPTY()));
826
827
SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
828
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
829
DAILINK_COMP_ARRAY(COMP_DUMMY()),
830
DAILINK_COMP_ARRAY(COMP_EMPTY()));
831
832
SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
833
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
834
DAILINK_COMP_ARRAY(COMP_DUMMY()),
835
DAILINK_COMP_ARRAY(COMP_EMPTY()));
836
837
SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
838
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
839
DAILINK_COMP_ARRAY(COMP_DUMMY()),
840
DAILINK_COMP_ARRAY(COMP_EMPTY()));
841
842
SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
843
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
844
DAILINK_COMP_ARRAY(COMP_DUMMY()),
845
DAILINK_COMP_ARRAY(COMP_EMPTY()));
846
847
SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE,
848
DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
849
DAILINK_COMP_ARRAY(COMP_DUMMY()),
850
DAILINK_COMP_ARRAY(COMP_EMPTY()));
851
852
SND_SOC_DAILINK_DEFS(PCM1_BE,
853
DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
854
DAILINK_COMP_ARRAY(COMP_DUMMY()),
855
DAILINK_COMP_ARRAY(COMP_EMPTY()));
856
857
SND_SOC_DAILINK_DEFS(UL_SRC1_BE,
858
DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")),
859
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
860
"mt6359-snd-codec-aif1"),
861
COMP_CODEC("dmic-codec",
862
"dmic-hifi")),
863
DAILINK_COMP_ARRAY(COMP_EMPTY()));
864
865
SND_SOC_DAILINK_DEFS(UL_SRC2_BE,
866
DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")),
867
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
868
"mt6359-snd-codec-aif2")),
869
DAILINK_COMP_ARRAY(COMP_EMPTY()));
870
871
SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
872
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
873
DAILINK_COMP_ARRAY(COMP_DUMMY()),
874
DAILINK_COMP_ARRAY(COMP_EMPTY()));
875
876
SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
877
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
878
DAILINK_COMP_ARRAY(COMP_DUMMY()),
879
DAILINK_COMP_ARRAY(COMP_EMPTY()));
880
881
SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
882
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
883
DAILINK_COMP_ARRAY(COMP_DUMMY()),
884
DAILINK_COMP_ARRAY(COMP_EMPTY()));
885
886
SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
887
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
888
DAILINK_COMP_ARRAY(COMP_DUMMY()),
889
DAILINK_COMP_ARRAY(COMP_EMPTY()));
890
891
/* codec */
892
SND_SOC_DAILINK_DEF(rt1019_comps,
893
DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME,
894
RT1019_CODEC_DAI)));
895
896
SND_SOC_DAILINK_DEF(rt1011_comps,
897
DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME,
898
RT1011_CODEC_DAI),
899
COMP_CODEC(RT1011_DEV1_NAME,
900
RT1011_CODEC_DAI)));
901
902
SND_SOC_DAILINK_DEF(max98390_comps,
903
DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME,
904
MAX98390_CODEC_DAI),
905
COMP_CODEC(MAX98390_DEV1_NAME,
906
MAX98390_CODEC_DAI)));
907
908
static const struct sof_conn_stream g_sof_conn_streams[] = {
909
{ "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
910
{ "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK},
911
{ "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE},
912
{ "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE},
913
};
914
915
static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
916
/* FE */
917
[DAI_LINK_DL2_FE] = {
918
.name = "DL2_FE",
919
.stream_name = "DL2 Playback",
920
.trigger = {
921
SND_SOC_DPCM_TRIGGER_POST,
922
SND_SOC_DPCM_TRIGGER_POST,
923
},
924
.dynamic = 1,
925
.playback_only = 1,
926
.ops = &mtk_soundcard_common_playback_ops,
927
SND_SOC_DAILINK_REG(DL2_FE),
928
},
929
[DAI_LINK_DL3_FE] = {
930
.name = "DL3_FE",
931
.stream_name = "DL3 Playback",
932
.trigger = {
933
SND_SOC_DPCM_TRIGGER_POST,
934
SND_SOC_DPCM_TRIGGER_POST,
935
},
936
.dynamic = 1,
937
.playback_only = 1,
938
.ops = &mtk_soundcard_common_playback_ops,
939
SND_SOC_DAILINK_REG(DL3_FE),
940
},
941
[DAI_LINK_DL6_FE] = {
942
.name = "DL6_FE",
943
.stream_name = "DL6 Playback",
944
.trigger = {
945
SND_SOC_DPCM_TRIGGER_POST,
946
SND_SOC_DPCM_TRIGGER_POST,
947
},
948
.dynamic = 1,
949
.playback_only = 1,
950
.ops = &mtk_soundcard_common_playback_ops,
951
SND_SOC_DAILINK_REG(DL6_FE),
952
},
953
[DAI_LINK_DL7_FE] = {
954
.name = "DL7_FE",
955
.stream_name = "DL7 Playback",
956
.trigger = {
957
SND_SOC_DPCM_TRIGGER_PRE,
958
SND_SOC_DPCM_TRIGGER_PRE,
959
},
960
.dynamic = 1,
961
.playback_only = 1,
962
SND_SOC_DAILINK_REG(DL7_FE),
963
},
964
[DAI_LINK_DL8_FE] = {
965
.name = "DL8_FE",
966
.stream_name = "DL8 Playback",
967
.trigger = {
968
SND_SOC_DPCM_TRIGGER_POST,
969
SND_SOC_DPCM_TRIGGER_POST,
970
},
971
.dynamic = 1,
972
.playback_only = 1,
973
.ops = &mtk_soundcard_common_playback_ops,
974
SND_SOC_DAILINK_REG(DL8_FE),
975
},
976
[DAI_LINK_DL10_FE] = {
977
.name = "DL10_FE",
978
.stream_name = "DL10 Playback",
979
.trigger = {
980
SND_SOC_DPCM_TRIGGER_POST,
981
SND_SOC_DPCM_TRIGGER_POST,
982
},
983
.dynamic = 1,
984
.playback_only = 1,
985
.ops = &mt8195_hdmitx_dptx_playback_ops,
986
SND_SOC_DAILINK_REG(DL10_FE),
987
},
988
[DAI_LINK_DL11_FE] = {
989
.name = "DL11_FE",
990
.stream_name = "DL11 Playback",
991
.trigger = {
992
SND_SOC_DPCM_TRIGGER_POST,
993
SND_SOC_DPCM_TRIGGER_POST,
994
},
995
.dynamic = 1,
996
.playback_only = 1,
997
.ops = &mtk_soundcard_common_playback_ops,
998
SND_SOC_DAILINK_REG(DL11_FE),
999
},
1000
[DAI_LINK_UL1_FE] = {
1001
.name = "UL1_FE",
1002
.stream_name = "UL1 Capture",
1003
.trigger = {
1004
SND_SOC_DPCM_TRIGGER_PRE,
1005
SND_SOC_DPCM_TRIGGER_PRE,
1006
},
1007
.dynamic = 1,
1008
.capture_only = 1,
1009
SND_SOC_DAILINK_REG(UL1_FE),
1010
},
1011
[DAI_LINK_UL2_FE] = {
1012
.name = "UL2_FE",
1013
.stream_name = "UL2 Capture",
1014
.trigger = {
1015
SND_SOC_DPCM_TRIGGER_POST,
1016
SND_SOC_DPCM_TRIGGER_POST,
1017
},
1018
.dynamic = 1,
1019
.capture_only = 1,
1020
.ops = &mtk_soundcard_common_capture_ops,
1021
SND_SOC_DAILINK_REG(UL2_FE),
1022
},
1023
[DAI_LINK_UL3_FE] = {
1024
.name = "UL3_FE",
1025
.stream_name = "UL3 Capture",
1026
.trigger = {
1027
SND_SOC_DPCM_TRIGGER_POST,
1028
SND_SOC_DPCM_TRIGGER_POST,
1029
},
1030
.dynamic = 1,
1031
.capture_only = 1,
1032
.ops = &mtk_soundcard_common_capture_ops,
1033
SND_SOC_DAILINK_REG(UL3_FE),
1034
},
1035
[DAI_LINK_UL4_FE] = {
1036
.name = "UL4_FE",
1037
.stream_name = "UL4 Capture",
1038
.trigger = {
1039
SND_SOC_DPCM_TRIGGER_POST,
1040
SND_SOC_DPCM_TRIGGER_POST,
1041
},
1042
.dynamic = 1,
1043
.capture_only = 1,
1044
.ops = &mtk_soundcard_common_capture_ops,
1045
SND_SOC_DAILINK_REG(UL4_FE),
1046
},
1047
[DAI_LINK_UL5_FE] = {
1048
.name = "UL5_FE",
1049
.stream_name = "UL5 Capture",
1050
.trigger = {
1051
SND_SOC_DPCM_TRIGGER_POST,
1052
SND_SOC_DPCM_TRIGGER_POST,
1053
},
1054
.dynamic = 1,
1055
.capture_only = 1,
1056
.ops = &mtk_soundcard_common_capture_ops,
1057
SND_SOC_DAILINK_REG(UL5_FE),
1058
},
1059
[DAI_LINK_UL6_FE] = {
1060
.name = "UL6_FE",
1061
.stream_name = "UL6 Capture",
1062
.trigger = {
1063
SND_SOC_DPCM_TRIGGER_PRE,
1064
SND_SOC_DPCM_TRIGGER_PRE,
1065
},
1066
.dynamic = 1,
1067
.capture_only = 1,
1068
SND_SOC_DAILINK_REG(UL6_FE),
1069
},
1070
[DAI_LINK_UL8_FE] = {
1071
.name = "UL8_FE",
1072
.stream_name = "UL8 Capture",
1073
.trigger = {
1074
SND_SOC_DPCM_TRIGGER_POST,
1075
SND_SOC_DPCM_TRIGGER_POST,
1076
},
1077
.dynamic = 1,
1078
.capture_only = 1,
1079
.ops = &mtk_soundcard_common_capture_ops,
1080
SND_SOC_DAILINK_REG(UL8_FE),
1081
},
1082
[DAI_LINK_UL9_FE] = {
1083
.name = "UL9_FE",
1084
.stream_name = "UL9 Capture",
1085
.trigger = {
1086
SND_SOC_DPCM_TRIGGER_POST,
1087
SND_SOC_DPCM_TRIGGER_POST,
1088
},
1089
.dynamic = 1,
1090
.capture_only = 1,
1091
.ops = &mtk_soundcard_common_capture_ops,
1092
SND_SOC_DAILINK_REG(UL9_FE),
1093
},
1094
[DAI_LINK_UL10_FE] = {
1095
.name = "UL10_FE",
1096
.stream_name = "UL10 Capture",
1097
.trigger = {
1098
SND_SOC_DPCM_TRIGGER_POST,
1099
SND_SOC_DPCM_TRIGGER_POST,
1100
},
1101
.dynamic = 1,
1102
.capture_only = 1,
1103
.ops = &mtk_soundcard_common_capture_ops,
1104
SND_SOC_DAILINK_REG(UL10_FE),
1105
},
1106
/* BE */
1107
[DAI_LINK_DL_SRC_BE] = {
1108
.name = "DL_SRC_BE",
1109
.no_pcm = 1,
1110
.playback_only = 1,
1111
SND_SOC_DAILINK_REG(DL_SRC_BE),
1112
},
1113
[DAI_LINK_DPTX_BE] = {
1114
.name = "DPTX_BE",
1115
.no_pcm = 1,
1116
.playback_only = 1,
1117
.ops = &mt8195_dptx_ops,
1118
.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
1119
SND_SOC_DAILINK_REG(DPTX_BE),
1120
},
1121
[DAI_LINK_ETDM1_IN_BE] = {
1122
.name = "ETDM1_IN_BE",
1123
.no_pcm = 1,
1124
.dai_fmt = SND_SOC_DAIFMT_I2S |
1125
SND_SOC_DAIFMT_NB_NF |
1126
SND_SOC_DAIFMT_CBC_CFC,
1127
.capture_only = 1,
1128
SND_SOC_DAILINK_REG(ETDM1_IN_BE),
1129
},
1130
[DAI_LINK_ETDM2_IN_BE] = {
1131
.name = "ETDM2_IN_BE",
1132
.no_pcm = 1,
1133
.dai_fmt = SND_SOC_DAIFMT_I2S |
1134
SND_SOC_DAIFMT_NB_NF |
1135
SND_SOC_DAIFMT_CBC_CFC,
1136
.capture_only = 1,
1137
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1138
SND_SOC_DAILINK_REG(ETDM2_IN_BE),
1139
},
1140
[DAI_LINK_ETDM1_OUT_BE] = {
1141
.name = "ETDM1_OUT_BE",
1142
.no_pcm = 1,
1143
.dai_fmt = SND_SOC_DAIFMT_I2S |
1144
SND_SOC_DAIFMT_NB_NF |
1145
SND_SOC_DAIFMT_CBC_CFC,
1146
.playback_only = 1,
1147
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1148
SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
1149
},
1150
[DAI_LINK_ETDM2_OUT_BE] = {
1151
.name = "ETDM2_OUT_BE",
1152
.no_pcm = 1,
1153
.dai_fmt = SND_SOC_DAIFMT_I2S |
1154
SND_SOC_DAIFMT_NB_NF |
1155
SND_SOC_DAIFMT_CBC_CFC,
1156
.playback_only = 1,
1157
SND_SOC_DAILINK_REG(ETDM2_OUT_BE),
1158
},
1159
[DAI_LINK_ETDM3_OUT_BE] = {
1160
.name = "ETDM3_OUT_BE",
1161
.no_pcm = 1,
1162
.dai_fmt = SND_SOC_DAIFMT_I2S |
1163
SND_SOC_DAIFMT_NB_NF |
1164
SND_SOC_DAIFMT_CBC_CFC,
1165
.playback_only = 1,
1166
SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
1167
},
1168
[DAI_LINK_PCM1_BE] = {
1169
.name = "PCM1_BE",
1170
.no_pcm = 1,
1171
.dai_fmt = SND_SOC_DAIFMT_I2S |
1172
SND_SOC_DAIFMT_NB_NF |
1173
SND_SOC_DAIFMT_CBC_CFC,
1174
SND_SOC_DAILINK_REG(PCM1_BE),
1175
},
1176
[DAI_LINK_UL_SRC1_BE] = {
1177
.name = "UL_SRC1_BE",
1178
.no_pcm = 1,
1179
.capture_only = 1,
1180
SND_SOC_DAILINK_REG(UL_SRC1_BE),
1181
},
1182
[DAI_LINK_UL_SRC2_BE] = {
1183
.name = "UL_SRC2_BE",
1184
.no_pcm = 1,
1185
.capture_only = 1,
1186
SND_SOC_DAILINK_REG(UL_SRC2_BE),
1187
},
1188
/* SOF BE */
1189
[DAI_LINK_SOF_DL2_BE] = {
1190
.name = "AFE_SOF_DL2",
1191
.no_pcm = 1,
1192
.playback_only = 1,
1193
.ops = &mt8195_sof_be_ops,
1194
SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1195
},
1196
[DAI_LINK_SOF_DL3_BE] = {
1197
.name = "AFE_SOF_DL3",
1198
.no_pcm = 1,
1199
.playback_only = 1,
1200
.ops = &mt8195_sof_be_ops,
1201
SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1202
},
1203
[DAI_LINK_SOF_UL4_BE] = {
1204
.name = "AFE_SOF_UL4",
1205
.no_pcm = 1,
1206
.capture_only = 1,
1207
.ops = &mt8195_sof_be_ops,
1208
SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1209
},
1210
[DAI_LINK_SOF_UL5_BE] = {
1211
.name = "AFE_SOF_UL5",
1212
.no_pcm = 1,
1213
.capture_only = 1,
1214
.ops = &mt8195_sof_be_ops,
1215
SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1216
},
1217
};
1218
1219
static struct snd_soc_codec_conf rt1011_codec_conf[] = {
1220
{
1221
.dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME),
1222
.name_prefix = "Left",
1223
},
1224
{
1225
.dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME),
1226
.name_prefix = "Right",
1227
},
1228
};
1229
1230
static struct snd_soc_codec_conf max98390_codec_conf[] = {
1231
{
1232
.dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME),
1233
.name_prefix = "Right",
1234
},
1235
{
1236
.dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME),
1237
.name_prefix = "Left",
1238
},
1239
};
1240
1241
static struct snd_soc_card mt8195_mt6359_soc_card = {
1242
.owner = THIS_MODULE,
1243
.dai_link = mt8195_mt6359_dai_links,
1244
.num_links = ARRAY_SIZE(mt8195_mt6359_dai_links),
1245
.controls = mt8195_mt6359_controls,
1246
.num_controls = ARRAY_SIZE(mt8195_mt6359_controls),
1247
.dapm_widgets = mt8195_mt6359_widgets,
1248
.num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets),
1249
.dapm_routes = mt8195_mt6359_routes,
1250
.num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes),
1251
.set_bias_level_post = mt8195_set_bias_level_post,
1252
};
1253
1254
/* fixup the BE DAI link to match any values from topology */
1255
static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
1256
struct snd_pcm_hw_params *params)
1257
{
1258
int ret;
1259
1260
ret = mtk_sof_dai_link_fixup(rtd, params);
1261
1262
if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") ||
1263
!strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) {
1264
mt8195_etdm_hw_params_fixup(rtd, params);
1265
}
1266
1267
return ret;
1268
}
1269
1270
static int mt8195_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data)
1271
{
1272
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1273
struct snd_soc_card *card = card_data->card;
1274
struct device_node *codec_node, *dp_node, *hdmi_node;
1275
struct snd_soc_dai_link *dai_link;
1276
struct device *dev = card->dev;
1277
bool is5682s, init6359 = false;
1278
int i;
1279
1280
if (strstr(card->name, "_5682s")) {
1281
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s");
1282
is5682s = true;
1283
} else {
1284
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i");
1285
is5682s = false;
1286
}
1287
1288
dp_node = of_parse_phandle(dev->of_node, "mediatek,dptx-codec", 0);
1289
hdmi_node = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0);
1290
1291
for_each_card_prelinks(card, i, dai_link) {
1292
if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1293
if (!dp_node) {
1294
dev_dbg(dev, "No property 'dptx-codec'\n");
1295
} else {
1296
dai_link->codecs->of_node = dp_node;
1297
dai_link->codecs->name = NULL;
1298
dai_link->codecs->dai_name = "i2s-hifi";
1299
dai_link->init = mt8195_dptx_codec_init;
1300
}
1301
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1302
if (!hdmi_node) {
1303
dev_dbg(dev, "No property 'hdmi-codec'\n");
1304
} else {
1305
dai_link->codecs->of_node = hdmi_node;
1306
dai_link->codecs->name = NULL;
1307
dai_link->codecs->dai_name = "i2s-hifi";
1308
dai_link->init = mt8195_hdmi_codec_init;
1309
}
1310
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) {
1311
if (!codec_node) {
1312
dev_err(dev, "Codec not found!\n");
1313
} else {
1314
dai_link->codecs->of_node = codec_node;
1315
dai_link->codecs->name = NULL;
1316
dai_link->codecs->dai_name =
1317
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1318
dai_link->init = mt8195_rt5682_init;
1319
dai_link->ops = &mt8195_rt5682_etdm_ops;
1320
}
1321
} else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1322
if (!codec_node) {
1323
dev_err(dev, "Codec not found!\n");
1324
} else {
1325
dai_link->codecs->of_node = codec_node;
1326
dai_link->codecs->name = NULL;
1327
dai_link->codecs->dai_name =
1328
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1329
dai_link->ops = &mt8195_rt5682_etdm_ops;
1330
}
1331
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1332
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1333
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1334
if (!init6359) {
1335
dai_link->init = mt8195_mt6359_init;
1336
init6359 = true;
1337
}
1338
} else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) {
1339
switch (card_data->flags) {
1340
case RT1011_SPEAKER_AMP_PRESENT:
1341
dai_link->codecs = rt1011_comps;
1342
dai_link->num_codecs = ARRAY_SIZE(rt1011_comps);
1343
dai_link->init = mt8195_rt1011_init;
1344
dai_link->ops = &mt8195_rt1011_etdm_ops;
1345
dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup;
1346
card->codec_conf = rt1011_codec_conf;
1347
card->num_configs = ARRAY_SIZE(rt1011_codec_conf);
1348
break;
1349
case RT1019_SPEAKER_AMP_PRESENT:
1350
dai_link->codecs = rt1019_comps;
1351
dai_link->num_codecs = ARRAY_SIZE(rt1019_comps);
1352
dai_link->init = mt8195_rt1019_init;
1353
break;
1354
case MAX98390_SPEAKER_AMP_PRESENT:
1355
dai_link->codecs = max98390_comps;
1356
dai_link->num_codecs = ARRAY_SIZE(max98390_comps);
1357
dai_link->init = mt8195_max98390_init;
1358
card->codec_conf = max98390_codec_conf;
1359
card->num_configs = ARRAY_SIZE(max98390_codec_conf);
1360
break;
1361
default:
1362
break;
1363
}
1364
}
1365
}
1366
1367
return 0;
1368
}
1369
1370
static int mt8195_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1371
{
1372
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1373
struct snd_soc_card *card = card_data->card;
1374
struct mt8195_mt6359_priv *mach_priv;
1375
struct snd_soc_dai_link *dai_link;
1376
u8 codec_init = 0;
1377
int i;
1378
1379
mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);
1380
if (!mach_priv)
1381
return -ENOMEM;
1382
1383
soc_card_data->mach_priv = mach_priv;
1384
1385
if (legacy)
1386
return mt8195_mt6359_legacy_probe(soc_card_data);
1387
1388
for_each_card_prelinks(card, i, dai_link) {
1389
if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1390
if (dai_link->num_codecs &&
1391
!snd_soc_dlc_is_dummy(dai_link->codecs))
1392
dai_link->init = mt8195_dptx_codec_init;
1393
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1394
if (dai_link->num_codecs &&
1395
!snd_soc_dlc_is_dummy(dai_link->codecs))
1396
dai_link->init = mt8195_hdmi_codec_init;
1397
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1398
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1399
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1400
if (!(codec_init & MT6359_CODEC_INIT)) {
1401
dai_link->init = mt8195_mt6359_init;
1402
codec_init |= MT6359_CODEC_INIT;
1403
}
1404
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1405
strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1406
strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1407
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1408
if (!dai_link->num_codecs)
1409
continue;
1410
1411
if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1412
if (!(codec_init & MAX98390_CODEC_INIT)) {
1413
dai_link->init = mt8195_max98390_init;
1414
codec_init |= MAX98390_CODEC_INIT;
1415
}
1416
} else if (!strcmp(dai_link->codecs->dai_name, RT1011_CODEC_DAI)) {
1417
dai_link->ops = &mt8195_rt1011_etdm_ops;
1418
if (!(codec_init & RT1011_CODEC_INIT)) {
1419
dai_link->init = mt8195_rt1011_init;
1420
codec_init |= RT1011_CODEC_INIT;
1421
}
1422
} else if (!strcmp(dai_link->codecs->dai_name, RT1019_CODEC_DAI)) {
1423
if (!(codec_init & RT1019_CODEC_INIT)) {
1424
dai_link->init = mt8195_rt1019_init;
1425
codec_init |= RT1019_CODEC_INIT;
1426
}
1427
} else if (!strcmp(dai_link->codecs->dai_name, RT5682_CODEC_DAI) ||
1428
!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1429
dai_link->ops = &mt8195_rt5682_etdm_ops;
1430
if (!(codec_init & RT5682_CODEC_INIT)) {
1431
dai_link->init = mt8195_rt5682_init;
1432
codec_init |= RT5682_CODEC_INIT;
1433
}
1434
} else {
1435
if (!snd_soc_dlc_is_dummy(dai_link->codecs)) {
1436
if (!(codec_init & DUMB_CODEC_INIT)) {
1437
dai_link->init = mt8195_dumb_amp_init;
1438
codec_init |= DUMB_CODEC_INIT;
1439
}
1440
}
1441
}
1442
}
1443
}
1444
1445
return 0;
1446
}
1447
1448
static const unsigned int mt8195_pcm_playback_channels[] = { 2 };
1449
static const unsigned int mt8195_pcm_capture_channels[] = { 1, 2 };
1450
static const unsigned int mt8195_pcm_hdmidp_channels[] = { 2, 4, 6, 8 };
1451
static const unsigned int mt8195_pcm_rates[] = { 48000 };
1452
1453
static const struct snd_pcm_hw_constraint_list mt8195_rate_constraint = {
1454
.list = mt8195_pcm_rates,
1455
.count = ARRAY_SIZE(mt8195_pcm_rates)
1456
};
1457
1458
static const struct mtk_pcm_constraints_data mt8195_pcm_constraints[MTK_CONSTRAINT_HDMIDP + 1] = {
1459
[MTK_CONSTRAINT_PLAYBACK] = {
1460
.channels = &(const struct snd_pcm_hw_constraint_list) {
1461
.list = mt8195_pcm_playback_channels,
1462
.count = ARRAY_SIZE(mt8195_pcm_playback_channels)
1463
},
1464
.rates = &mt8195_rate_constraint,
1465
},
1466
[MTK_CONSTRAINT_CAPTURE] = {
1467
.channels = &(const struct snd_pcm_hw_constraint_list) {
1468
.list = mt8195_pcm_capture_channels,
1469
.count = ARRAY_SIZE(mt8195_pcm_capture_channels)
1470
},
1471
.rates = &mt8195_rate_constraint,
1472
},
1473
[MTK_CONSTRAINT_HDMIDP] = {
1474
.channels = &(const struct snd_pcm_hw_constraint_list) {
1475
.list = mt8195_pcm_hdmidp_channels,
1476
.count = ARRAY_SIZE(mt8195_pcm_hdmidp_channels)
1477
},
1478
.rates = &mt8195_rate_constraint,
1479
},
1480
};
1481
1482
static const struct mtk_sof_priv mt8195_sof_priv = {
1483
.conn_streams = g_sof_conn_streams,
1484
.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1485
.sof_dai_link_fixup = mt8195_dai_link_fixup
1486
};
1487
1488
static const struct mtk_soundcard_pdata mt8195_mt6359_rt1019_rt5682_card = {
1489
.card_name = "mt8195_r1019_5682",
1490
.card_data = &(struct mtk_platform_card_data) {
1491
.card = &mt8195_mt6359_soc_card,
1492
.num_jacks = MT8195_JACK_MAX,
1493
.pcm_constraints = mt8195_pcm_constraints,
1494
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1495
.flags = RT1019_SPEAKER_AMP_PRESENT
1496
},
1497
.sof_priv = &mt8195_sof_priv,
1498
.soc_probe = mt8195_mt6359_soc_card_probe
1499
};
1500
1501
static const struct mtk_soundcard_pdata mt8195_mt6359_rt1011_rt5682_card = {
1502
.card_name = "mt8195_r1011_5682",
1503
.card_data = &(struct mtk_platform_card_data) {
1504
.card = &mt8195_mt6359_soc_card,
1505
.num_jacks = MT8195_JACK_MAX,
1506
.pcm_constraints = mt8195_pcm_constraints,
1507
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1508
.flags = RT1011_SPEAKER_AMP_PRESENT
1509
},
1510
.sof_priv = &mt8195_sof_priv,
1511
.soc_probe = mt8195_mt6359_soc_card_probe
1512
};
1513
1514
static const struct mtk_soundcard_pdata mt8195_mt6359_max98390_rt5682_card = {
1515
.card_name = "mt8195_m98390_r5682",
1516
.card_data = &(struct mtk_platform_card_data) {
1517
.card = &mt8195_mt6359_soc_card,
1518
.num_jacks = MT8195_JACK_MAX,
1519
.pcm_constraints = mt8195_pcm_constraints,
1520
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1521
.flags = MAX98390_SPEAKER_AMP_PRESENT
1522
},
1523
.sof_priv = &mt8195_sof_priv,
1524
.soc_probe = mt8195_mt6359_soc_card_probe
1525
};
1526
1527
static const struct mtk_soundcard_pdata mt8195_mt6359_card = {
1528
.card_name = "mt8195_mt6359",
1529
.card_data = &(struct mtk_platform_card_data) {
1530
.card = &mt8195_mt6359_soc_card,
1531
.num_jacks = MT8195_JACK_MAX,
1532
.pcm_constraints = mt8195_pcm_constraints,
1533
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1534
},
1535
.sof_priv = &mt8195_sof_priv,
1536
.soc_probe = mt8195_mt6359_soc_card_probe
1537
};
1538
1539
static const struct of_device_id mt8195_mt6359_dt_match[] = {
1540
{
1541
.compatible = "mediatek,mt8195_mt6359_rt1019_rt5682",
1542
.data = &mt8195_mt6359_rt1019_rt5682_card,
1543
},
1544
{
1545
.compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",
1546
.data = &mt8195_mt6359_rt1011_rt5682_card,
1547
},
1548
{
1549
.compatible = "mediatek,mt8195_mt6359_max98390_rt5682",
1550
.data = &mt8195_mt6359_max98390_rt5682_card,
1551
},
1552
{
1553
.compatible = "mediatek,mt8195_mt6359",
1554
.data = &mt8195_mt6359_card,
1555
},
1556
{},
1557
};
1558
MODULE_DEVICE_TABLE(of, mt8195_mt6359_dt_match);
1559
1560
static struct platform_driver mt8195_mt6359_driver = {
1561
.driver = {
1562
.name = "mt8195_mt6359",
1563
.of_match_table = mt8195_mt6359_dt_match,
1564
.pm = &snd_soc_pm_ops,
1565
},
1566
.probe = mtk_soundcard_common_probe,
1567
};
1568
1569
module_platform_driver(mt8195_mt6359_driver);
1570
1571
/* Module information */
1572
MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver");
1573
MODULE_AUTHOR("Trevor Wu <[email protected]>");
1574
MODULE_AUTHOR("YC Hung <[email protected]>");
1575
MODULE_LICENSE("GPL");
1576
MODULE_ALIAS("mt8195_mt6359 soc card");
1577
1578