Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8195/mt8195-mt6359.c
54529 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_AVOUT, 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_AVOUT, 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
struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
455
int ret;
456
457
priv->i2so1_mclk = afe_priv->clk[MT8195_CLK_TOP_APLL12_DIV2];
458
459
ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
460
SND_JACK_HEADSET | SND_JACK_BTN_0 |
461
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
462
SND_JACK_BTN_3,
463
jack, mt8195_jack_pins,
464
ARRAY_SIZE(mt8195_jack_pins));
465
if (ret) {
466
dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
467
return ret;
468
}
469
470
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
471
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
472
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
473
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
474
475
ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
476
if (ret) {
477
dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
478
return ret;
479
}
480
481
ret = snd_soc_dapm_add_routes(dapm, mt8195_rt5682_routes,
482
ARRAY_SIZE(mt8195_rt5682_routes));
483
if (ret)
484
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
485
486
return ret;
487
};
488
489
static int mt8195_rt1011_etdm_hw_params(struct snd_pcm_substream *substream,
490
struct snd_pcm_hw_params *params)
491
{
492
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
493
struct snd_soc_dai *codec_dai;
494
struct snd_soc_card *card = rtd->card;
495
int srate, i, ret;
496
497
srate = params_rate(params);
498
499
for_each_rtd_codec_dais(rtd, i, codec_dai) {
500
ret = snd_soc_dai_set_pll(codec_dai, 0, RT1011_PLL1_S_BCLK,
501
64 * srate, 256 * srate);
502
if (ret < 0) {
503
dev_err(card->dev, "codec_dai clock not set\n");
504
return ret;
505
}
506
507
ret = snd_soc_dai_set_sysclk(codec_dai,
508
RT1011_FS_SYS_PRE_S_PLL1,
509
256 * srate, SND_SOC_CLOCK_IN);
510
if (ret < 0) {
511
dev_err(card->dev, "codec_dai clock not set\n");
512
return ret;
513
}
514
}
515
return 0;
516
}
517
518
static const struct snd_soc_ops mt8195_rt1011_etdm_ops = {
519
.hw_params = mt8195_rt1011_etdm_hw_params,
520
};
521
522
static int mt8195_sof_be_hw_params(struct snd_pcm_substream *substream,
523
struct snd_pcm_hw_params *params)
524
{
525
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
526
struct snd_soc_component *cmpnt_afe = NULL;
527
struct snd_soc_pcm_runtime *runtime;
528
529
/* find afe component */
530
for_each_card_rtds(rtd->card, runtime) {
531
cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
532
if (cmpnt_afe)
533
break;
534
}
535
536
if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
537
dev_err(rtd->dev, "afe pm runtime is not active!!\n");
538
return -EINVAL;
539
}
540
541
return 0;
542
}
543
544
static const struct snd_soc_ops mt8195_sof_be_ops = {
545
.hw_params = mt8195_sof_be_hw_params,
546
};
547
548
static int mt8195_rt1011_init(struct snd_soc_pcm_runtime *rtd)
549
{
550
struct snd_soc_card *card = rtd->card;
551
struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
552
int ret;
553
554
ret = snd_soc_dapm_new_controls(dapm, mt8195_dual_speaker_widgets,
555
ARRAY_SIZE(mt8195_dual_speaker_widgets));
556
if (ret) {
557
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
558
/* Don't need to add routes if widget addition failed */
559
return ret;
560
}
561
562
ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
563
ARRAY_SIZE(mt8195_dual_speaker_controls));
564
if (ret) {
565
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
566
return ret;
567
}
568
569
ret = snd_soc_dapm_add_routes(dapm, mt8195_rt1011_routes,
570
ARRAY_SIZE(mt8195_rt1011_routes));
571
if (ret)
572
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
573
574
return ret;
575
}
576
577
static int mt8195_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
578
{
579
struct snd_soc_card *card = rtd->card;
580
struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
581
int ret;
582
583
ret = snd_soc_dapm_new_controls(dapm, mt8195_speaker_widgets,
584
ARRAY_SIZE(mt8195_speaker_widgets));
585
if (ret) {
586
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
587
/* Don't need to add routes if widget addition failed */
588
return ret;
589
}
590
591
ret = snd_soc_add_card_controls(card, mt8195_speaker_controls,
592
ARRAY_SIZE(mt8195_speaker_controls));
593
if (ret) {
594
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
595
return ret;
596
}
597
598
return 0;
599
}
600
601
static int mt8195_rt1019_init(struct snd_soc_pcm_runtime *rtd)
602
{
603
struct snd_soc_card *card = rtd->card;
604
struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
605
int ret;
606
607
ret = mt8195_dumb_amp_init(rtd);
608
if (ret)
609
return ret;
610
611
ret = snd_soc_dapm_add_routes(dapm, mt8195_rt1019_routes,
612
ARRAY_SIZE(mt8195_rt1019_routes));
613
if (ret)
614
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
615
616
return ret;
617
}
618
619
static int mt8195_max98390_init(struct snd_soc_pcm_runtime *rtd)
620
{
621
struct snd_soc_card *card = rtd->card;
622
struct snd_soc_dapm_context *dapm = snd_soc_card_to_dapm(card);
623
int ret;
624
625
ret = snd_soc_dapm_new_controls(dapm, mt8195_dual_speaker_widgets,
626
ARRAY_SIZE(mt8195_dual_speaker_widgets));
627
if (ret) {
628
dev_err(rtd->dev, "unable to add dapm controls, ret %d\n", ret);
629
/* Don't need to add routes if widget addition failed */
630
return ret;
631
}
632
633
ret = snd_soc_add_card_controls(card, mt8195_dual_speaker_controls,
634
ARRAY_SIZE(mt8195_dual_speaker_controls));
635
if (ret) {
636
dev_err(rtd->dev, "unable to add card controls, ret %d\n", ret);
637
return ret;
638
}
639
640
ret = snd_soc_dapm_add_routes(dapm, mt8195_max98390_routes,
641
ARRAY_SIZE(mt8195_max98390_routes));
642
if (ret)
643
dev_err(rtd->dev, "unable to add dapm routes, ret %d\n", ret);
644
645
return ret;
646
}
647
648
static int mt8195_etdm_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
649
struct snd_pcm_hw_params *params)
650
{
651
/* fix BE i2s format to S24_LE, clean param mask first */
652
snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
653
0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
654
655
params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
656
657
return 0;
658
}
659
660
static int mt8195_set_bias_level_post(struct snd_soc_card *card,
661
struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
662
{
663
struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
664
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
665
struct mt8195_mt6359_priv *priv = soc_card_data->mach_priv;
666
int ret;
667
668
/*
669
* It's required to control mclk directly in the set_bias_level_post
670
* function for rt5682 and rt5682s codec, or the unexpected pop happens
671
* at the end of playback.
672
*/
673
if (!component ||
674
(strcmp(component->name, RT5682_DEV0_NAME) &&
675
strcmp(component->name, RT5682S_DEV0_NAME)))
676
return 0;
677
678
switch (level) {
679
case SND_SOC_BIAS_OFF:
680
if (!__clk_is_enabled(priv->i2so1_mclk))
681
return 0;
682
683
clk_disable_unprepare(priv->i2so1_mclk);
684
dev_dbg(card->dev, "Disable i2so1 mclk\n");
685
break;
686
case SND_SOC_BIAS_ON:
687
ret = clk_prepare_enable(priv->i2so1_mclk);
688
if (ret) {
689
dev_err(card->dev, "Can't enable i2so1 mclk: %d\n", ret);
690
return ret;
691
}
692
dev_dbg(card->dev, "Enable i2so1 mclk\n");
693
break;
694
default:
695
break;
696
}
697
698
return 0;
699
}
700
701
enum {
702
DAI_LINK_DL2_FE,
703
DAI_LINK_DL3_FE,
704
DAI_LINK_DL6_FE,
705
DAI_LINK_DL7_FE,
706
DAI_LINK_DL8_FE,
707
DAI_LINK_DL10_FE,
708
DAI_LINK_DL11_FE,
709
DAI_LINK_UL1_FE,
710
DAI_LINK_UL2_FE,
711
DAI_LINK_UL3_FE,
712
DAI_LINK_UL4_FE,
713
DAI_LINK_UL5_FE,
714
DAI_LINK_UL6_FE,
715
DAI_LINK_UL8_FE,
716
DAI_LINK_UL9_FE,
717
DAI_LINK_UL10_FE,
718
DAI_LINK_DL_SRC_BE,
719
DAI_LINK_DPTX_BE,
720
DAI_LINK_ETDM1_IN_BE,
721
DAI_LINK_ETDM2_IN_BE,
722
DAI_LINK_ETDM1_OUT_BE,
723
DAI_LINK_ETDM2_OUT_BE,
724
DAI_LINK_ETDM3_OUT_BE,
725
DAI_LINK_PCM1_BE,
726
DAI_LINK_UL_SRC1_BE,
727
DAI_LINK_UL_SRC2_BE,
728
DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC2_BE,
729
DAI_LINK_SOF_START,
730
DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
731
DAI_LINK_SOF_DL3_BE,
732
DAI_LINK_SOF_UL4_BE,
733
DAI_LINK_SOF_UL5_BE,
734
DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
735
};
736
737
#define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1)
738
739
/* FE */
740
SND_SOC_DAILINK_DEFS(DL2_FE,
741
DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
742
DAILINK_COMP_ARRAY(COMP_DUMMY()),
743
DAILINK_COMP_ARRAY(COMP_EMPTY()));
744
745
SND_SOC_DAILINK_DEFS(DL3_FE,
746
DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
747
DAILINK_COMP_ARRAY(COMP_DUMMY()),
748
DAILINK_COMP_ARRAY(COMP_EMPTY()));
749
750
SND_SOC_DAILINK_DEFS(DL6_FE,
751
DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
752
DAILINK_COMP_ARRAY(COMP_DUMMY()),
753
DAILINK_COMP_ARRAY(COMP_EMPTY()));
754
755
SND_SOC_DAILINK_DEFS(DL7_FE,
756
DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
757
DAILINK_COMP_ARRAY(COMP_DUMMY()),
758
DAILINK_COMP_ARRAY(COMP_EMPTY()));
759
760
SND_SOC_DAILINK_DEFS(DL8_FE,
761
DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
762
DAILINK_COMP_ARRAY(COMP_DUMMY()),
763
DAILINK_COMP_ARRAY(COMP_EMPTY()));
764
765
SND_SOC_DAILINK_DEFS(DL10_FE,
766
DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
767
DAILINK_COMP_ARRAY(COMP_DUMMY()),
768
DAILINK_COMP_ARRAY(COMP_EMPTY()));
769
770
SND_SOC_DAILINK_DEFS(DL11_FE,
771
DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
772
DAILINK_COMP_ARRAY(COMP_DUMMY()),
773
DAILINK_COMP_ARRAY(COMP_EMPTY()));
774
775
SND_SOC_DAILINK_DEFS(UL1_FE,
776
DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
777
DAILINK_COMP_ARRAY(COMP_DUMMY()),
778
DAILINK_COMP_ARRAY(COMP_EMPTY()));
779
780
SND_SOC_DAILINK_DEFS(UL2_FE,
781
DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
782
DAILINK_COMP_ARRAY(COMP_DUMMY()),
783
DAILINK_COMP_ARRAY(COMP_EMPTY()));
784
785
SND_SOC_DAILINK_DEFS(UL3_FE,
786
DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
787
DAILINK_COMP_ARRAY(COMP_DUMMY()),
788
DAILINK_COMP_ARRAY(COMP_EMPTY()));
789
790
SND_SOC_DAILINK_DEFS(UL4_FE,
791
DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
792
DAILINK_COMP_ARRAY(COMP_DUMMY()),
793
DAILINK_COMP_ARRAY(COMP_EMPTY()));
794
795
SND_SOC_DAILINK_DEFS(UL5_FE,
796
DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
797
DAILINK_COMP_ARRAY(COMP_DUMMY()),
798
DAILINK_COMP_ARRAY(COMP_EMPTY()));
799
800
SND_SOC_DAILINK_DEFS(UL6_FE,
801
DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
802
DAILINK_COMP_ARRAY(COMP_DUMMY()),
803
DAILINK_COMP_ARRAY(COMP_EMPTY()));
804
805
SND_SOC_DAILINK_DEFS(UL8_FE,
806
DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
807
DAILINK_COMP_ARRAY(COMP_DUMMY()),
808
DAILINK_COMP_ARRAY(COMP_EMPTY()));
809
810
SND_SOC_DAILINK_DEFS(UL9_FE,
811
DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
812
DAILINK_COMP_ARRAY(COMP_DUMMY()),
813
DAILINK_COMP_ARRAY(COMP_EMPTY()));
814
815
SND_SOC_DAILINK_DEFS(UL10_FE,
816
DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
817
DAILINK_COMP_ARRAY(COMP_DUMMY()),
818
DAILINK_COMP_ARRAY(COMP_EMPTY()));
819
820
/* BE */
821
SND_SOC_DAILINK_DEFS(DL_SRC_BE,
822
DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
823
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
824
"mt6359-snd-codec-aif1")),
825
DAILINK_COMP_ARRAY(COMP_EMPTY()));
826
827
SND_SOC_DAILINK_DEFS(DPTX_BE,
828
DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
829
DAILINK_COMP_ARRAY(COMP_DUMMY()),
830
DAILINK_COMP_ARRAY(COMP_EMPTY()));
831
832
SND_SOC_DAILINK_DEFS(ETDM1_IN_BE,
833
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
834
DAILINK_COMP_ARRAY(COMP_DUMMY()),
835
DAILINK_COMP_ARRAY(COMP_EMPTY()));
836
837
SND_SOC_DAILINK_DEFS(ETDM2_IN_BE,
838
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
839
DAILINK_COMP_ARRAY(COMP_DUMMY()),
840
DAILINK_COMP_ARRAY(COMP_EMPTY()));
841
842
SND_SOC_DAILINK_DEFS(ETDM1_OUT_BE,
843
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
844
DAILINK_COMP_ARRAY(COMP_DUMMY()),
845
DAILINK_COMP_ARRAY(COMP_EMPTY()));
846
847
SND_SOC_DAILINK_DEFS(ETDM2_OUT_BE,
848
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
849
DAILINK_COMP_ARRAY(COMP_DUMMY()),
850
DAILINK_COMP_ARRAY(COMP_EMPTY()));
851
852
SND_SOC_DAILINK_DEFS(ETDM3_OUT_BE,
853
DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
854
DAILINK_COMP_ARRAY(COMP_DUMMY()),
855
DAILINK_COMP_ARRAY(COMP_EMPTY()));
856
857
SND_SOC_DAILINK_DEFS(PCM1_BE,
858
DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
859
DAILINK_COMP_ARRAY(COMP_DUMMY()),
860
DAILINK_COMP_ARRAY(COMP_EMPTY()));
861
862
SND_SOC_DAILINK_DEFS(UL_SRC1_BE,
863
DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC1")),
864
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
865
"mt6359-snd-codec-aif1"),
866
COMP_CODEC("dmic-codec",
867
"dmic-hifi")),
868
DAILINK_COMP_ARRAY(COMP_EMPTY()));
869
870
SND_SOC_DAILINK_DEFS(UL_SRC2_BE,
871
DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC2")),
872
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
873
"mt6359-snd-codec-aif2")),
874
DAILINK_COMP_ARRAY(COMP_EMPTY()));
875
876
SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
877
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
878
DAILINK_COMP_ARRAY(COMP_DUMMY()),
879
DAILINK_COMP_ARRAY(COMP_EMPTY()));
880
881
SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
882
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
883
DAILINK_COMP_ARRAY(COMP_DUMMY()),
884
DAILINK_COMP_ARRAY(COMP_EMPTY()));
885
886
SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
887
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
888
DAILINK_COMP_ARRAY(COMP_DUMMY()),
889
DAILINK_COMP_ARRAY(COMP_EMPTY()));
890
891
SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
892
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
893
DAILINK_COMP_ARRAY(COMP_DUMMY()),
894
DAILINK_COMP_ARRAY(COMP_EMPTY()));
895
896
/* codec */
897
SND_SOC_DAILINK_DEF(rt1019_comps,
898
DAILINK_COMP_ARRAY(COMP_CODEC(RT1019_DEV0_NAME,
899
RT1019_CODEC_DAI)));
900
901
SND_SOC_DAILINK_DEF(rt1011_comps,
902
DAILINK_COMP_ARRAY(COMP_CODEC(RT1011_DEV0_NAME,
903
RT1011_CODEC_DAI),
904
COMP_CODEC(RT1011_DEV1_NAME,
905
RT1011_CODEC_DAI)));
906
907
SND_SOC_DAILINK_DEF(max98390_comps,
908
DAILINK_COMP_ARRAY(COMP_CODEC(MAX98390_DEV0_NAME,
909
MAX98390_CODEC_DAI),
910
COMP_CODEC(MAX98390_DEV1_NAME,
911
MAX98390_CODEC_DAI)));
912
913
static const struct sof_conn_stream g_sof_conn_streams[] = {
914
{ "ETDM2_OUT_BE", "AFE_SOF_DL2", SOF_DMA_DL2, SNDRV_PCM_STREAM_PLAYBACK},
915
{ "ETDM1_OUT_BE", "AFE_SOF_DL3", SOF_DMA_DL3, SNDRV_PCM_STREAM_PLAYBACK},
916
{ "UL_SRC1_BE", "AFE_SOF_UL4", SOF_DMA_UL4, SNDRV_PCM_STREAM_CAPTURE},
917
{ "ETDM2_IN_BE", "AFE_SOF_UL5", SOF_DMA_UL5, SNDRV_PCM_STREAM_CAPTURE},
918
};
919
920
static struct snd_soc_dai_link mt8195_mt6359_dai_links[] = {
921
/* FE */
922
[DAI_LINK_DL2_FE] = {
923
.name = "DL2_FE",
924
.stream_name = "DL2 Playback",
925
.trigger = {
926
SND_SOC_DPCM_TRIGGER_POST,
927
SND_SOC_DPCM_TRIGGER_POST,
928
},
929
.dynamic = 1,
930
.playback_only = 1,
931
.ops = &mtk_soundcard_common_playback_ops,
932
SND_SOC_DAILINK_REG(DL2_FE),
933
},
934
[DAI_LINK_DL3_FE] = {
935
.name = "DL3_FE",
936
.stream_name = "DL3 Playback",
937
.trigger = {
938
SND_SOC_DPCM_TRIGGER_POST,
939
SND_SOC_DPCM_TRIGGER_POST,
940
},
941
.dynamic = 1,
942
.playback_only = 1,
943
.ops = &mtk_soundcard_common_playback_ops,
944
SND_SOC_DAILINK_REG(DL3_FE),
945
},
946
[DAI_LINK_DL6_FE] = {
947
.name = "DL6_FE",
948
.stream_name = "DL6 Playback",
949
.trigger = {
950
SND_SOC_DPCM_TRIGGER_POST,
951
SND_SOC_DPCM_TRIGGER_POST,
952
},
953
.dynamic = 1,
954
.playback_only = 1,
955
.ops = &mtk_soundcard_common_playback_ops,
956
SND_SOC_DAILINK_REG(DL6_FE),
957
},
958
[DAI_LINK_DL7_FE] = {
959
.name = "DL7_FE",
960
.stream_name = "DL7 Playback",
961
.trigger = {
962
SND_SOC_DPCM_TRIGGER_PRE,
963
SND_SOC_DPCM_TRIGGER_PRE,
964
},
965
.dynamic = 1,
966
.playback_only = 1,
967
SND_SOC_DAILINK_REG(DL7_FE),
968
},
969
[DAI_LINK_DL8_FE] = {
970
.name = "DL8_FE",
971
.stream_name = "DL8 Playback",
972
.trigger = {
973
SND_SOC_DPCM_TRIGGER_POST,
974
SND_SOC_DPCM_TRIGGER_POST,
975
},
976
.dynamic = 1,
977
.playback_only = 1,
978
.ops = &mtk_soundcard_common_playback_ops,
979
SND_SOC_DAILINK_REG(DL8_FE),
980
},
981
[DAI_LINK_DL10_FE] = {
982
.name = "DL10_FE",
983
.stream_name = "DL10 Playback",
984
.trigger = {
985
SND_SOC_DPCM_TRIGGER_POST,
986
SND_SOC_DPCM_TRIGGER_POST,
987
},
988
.dynamic = 1,
989
.playback_only = 1,
990
.ops = &mt8195_hdmitx_dptx_playback_ops,
991
SND_SOC_DAILINK_REG(DL10_FE),
992
},
993
[DAI_LINK_DL11_FE] = {
994
.name = "DL11_FE",
995
.stream_name = "DL11 Playback",
996
.trigger = {
997
SND_SOC_DPCM_TRIGGER_POST,
998
SND_SOC_DPCM_TRIGGER_POST,
999
},
1000
.dynamic = 1,
1001
.playback_only = 1,
1002
.ops = &mtk_soundcard_common_playback_ops,
1003
SND_SOC_DAILINK_REG(DL11_FE),
1004
},
1005
[DAI_LINK_UL1_FE] = {
1006
.name = "UL1_FE",
1007
.stream_name = "UL1 Capture",
1008
.trigger = {
1009
SND_SOC_DPCM_TRIGGER_PRE,
1010
SND_SOC_DPCM_TRIGGER_PRE,
1011
},
1012
.dynamic = 1,
1013
.capture_only = 1,
1014
SND_SOC_DAILINK_REG(UL1_FE),
1015
},
1016
[DAI_LINK_UL2_FE] = {
1017
.name = "UL2_FE",
1018
.stream_name = "UL2 Capture",
1019
.trigger = {
1020
SND_SOC_DPCM_TRIGGER_POST,
1021
SND_SOC_DPCM_TRIGGER_POST,
1022
},
1023
.dynamic = 1,
1024
.capture_only = 1,
1025
.ops = &mtk_soundcard_common_capture_ops,
1026
SND_SOC_DAILINK_REG(UL2_FE),
1027
},
1028
[DAI_LINK_UL3_FE] = {
1029
.name = "UL3_FE",
1030
.stream_name = "UL3 Capture",
1031
.trigger = {
1032
SND_SOC_DPCM_TRIGGER_POST,
1033
SND_SOC_DPCM_TRIGGER_POST,
1034
},
1035
.dynamic = 1,
1036
.capture_only = 1,
1037
.ops = &mtk_soundcard_common_capture_ops,
1038
SND_SOC_DAILINK_REG(UL3_FE),
1039
},
1040
[DAI_LINK_UL4_FE] = {
1041
.name = "UL4_FE",
1042
.stream_name = "UL4 Capture",
1043
.trigger = {
1044
SND_SOC_DPCM_TRIGGER_POST,
1045
SND_SOC_DPCM_TRIGGER_POST,
1046
},
1047
.dynamic = 1,
1048
.capture_only = 1,
1049
.ops = &mtk_soundcard_common_capture_ops,
1050
SND_SOC_DAILINK_REG(UL4_FE),
1051
},
1052
[DAI_LINK_UL5_FE] = {
1053
.name = "UL5_FE",
1054
.stream_name = "UL5 Capture",
1055
.trigger = {
1056
SND_SOC_DPCM_TRIGGER_POST,
1057
SND_SOC_DPCM_TRIGGER_POST,
1058
},
1059
.dynamic = 1,
1060
.capture_only = 1,
1061
.ops = &mtk_soundcard_common_capture_ops,
1062
SND_SOC_DAILINK_REG(UL5_FE),
1063
},
1064
[DAI_LINK_UL6_FE] = {
1065
.name = "UL6_FE",
1066
.stream_name = "UL6 Capture",
1067
.trigger = {
1068
SND_SOC_DPCM_TRIGGER_PRE,
1069
SND_SOC_DPCM_TRIGGER_PRE,
1070
},
1071
.dynamic = 1,
1072
.capture_only = 1,
1073
SND_SOC_DAILINK_REG(UL6_FE),
1074
},
1075
[DAI_LINK_UL8_FE] = {
1076
.name = "UL8_FE",
1077
.stream_name = "UL8 Capture",
1078
.trigger = {
1079
SND_SOC_DPCM_TRIGGER_POST,
1080
SND_SOC_DPCM_TRIGGER_POST,
1081
},
1082
.dynamic = 1,
1083
.capture_only = 1,
1084
.ops = &mtk_soundcard_common_capture_ops,
1085
SND_SOC_DAILINK_REG(UL8_FE),
1086
},
1087
[DAI_LINK_UL9_FE] = {
1088
.name = "UL9_FE",
1089
.stream_name = "UL9 Capture",
1090
.trigger = {
1091
SND_SOC_DPCM_TRIGGER_POST,
1092
SND_SOC_DPCM_TRIGGER_POST,
1093
},
1094
.dynamic = 1,
1095
.capture_only = 1,
1096
.ops = &mtk_soundcard_common_capture_ops,
1097
SND_SOC_DAILINK_REG(UL9_FE),
1098
},
1099
[DAI_LINK_UL10_FE] = {
1100
.name = "UL10_FE",
1101
.stream_name = "UL10 Capture",
1102
.trigger = {
1103
SND_SOC_DPCM_TRIGGER_POST,
1104
SND_SOC_DPCM_TRIGGER_POST,
1105
},
1106
.dynamic = 1,
1107
.capture_only = 1,
1108
.ops = &mtk_soundcard_common_capture_ops,
1109
SND_SOC_DAILINK_REG(UL10_FE),
1110
},
1111
/* BE */
1112
[DAI_LINK_DL_SRC_BE] = {
1113
.name = "DL_SRC_BE",
1114
.no_pcm = 1,
1115
.playback_only = 1,
1116
SND_SOC_DAILINK_REG(DL_SRC_BE),
1117
},
1118
[DAI_LINK_DPTX_BE] = {
1119
.name = "DPTX_BE",
1120
.no_pcm = 1,
1121
.playback_only = 1,
1122
.ops = &mt8195_dptx_ops,
1123
.be_hw_params_fixup = mt8195_dptx_hw_params_fixup,
1124
SND_SOC_DAILINK_REG(DPTX_BE),
1125
},
1126
[DAI_LINK_ETDM1_IN_BE] = {
1127
.name = "ETDM1_IN_BE",
1128
.no_pcm = 1,
1129
.dai_fmt = SND_SOC_DAIFMT_I2S |
1130
SND_SOC_DAIFMT_NB_NF |
1131
SND_SOC_DAIFMT_CBC_CFC,
1132
.capture_only = 1,
1133
SND_SOC_DAILINK_REG(ETDM1_IN_BE),
1134
},
1135
[DAI_LINK_ETDM2_IN_BE] = {
1136
.name = "ETDM2_IN_BE",
1137
.no_pcm = 1,
1138
.dai_fmt = SND_SOC_DAIFMT_I2S |
1139
SND_SOC_DAIFMT_NB_NF |
1140
SND_SOC_DAIFMT_CBC_CFC,
1141
.capture_only = 1,
1142
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1143
SND_SOC_DAILINK_REG(ETDM2_IN_BE),
1144
},
1145
[DAI_LINK_ETDM1_OUT_BE] = {
1146
.name = "ETDM1_OUT_BE",
1147
.no_pcm = 1,
1148
.dai_fmt = SND_SOC_DAIFMT_I2S |
1149
SND_SOC_DAIFMT_NB_NF |
1150
SND_SOC_DAIFMT_CBC_CFC,
1151
.playback_only = 1,
1152
.be_hw_params_fixup = mt8195_etdm_hw_params_fixup,
1153
SND_SOC_DAILINK_REG(ETDM1_OUT_BE),
1154
},
1155
[DAI_LINK_ETDM2_OUT_BE] = {
1156
.name = "ETDM2_OUT_BE",
1157
.no_pcm = 1,
1158
.dai_fmt = SND_SOC_DAIFMT_I2S |
1159
SND_SOC_DAIFMT_NB_NF |
1160
SND_SOC_DAIFMT_CBC_CFC,
1161
.playback_only = 1,
1162
SND_SOC_DAILINK_REG(ETDM2_OUT_BE),
1163
},
1164
[DAI_LINK_ETDM3_OUT_BE] = {
1165
.name = "ETDM3_OUT_BE",
1166
.no_pcm = 1,
1167
.dai_fmt = SND_SOC_DAIFMT_I2S |
1168
SND_SOC_DAIFMT_NB_NF |
1169
SND_SOC_DAIFMT_CBC_CFC,
1170
.playback_only = 1,
1171
SND_SOC_DAILINK_REG(ETDM3_OUT_BE),
1172
},
1173
[DAI_LINK_PCM1_BE] = {
1174
.name = "PCM1_BE",
1175
.no_pcm = 1,
1176
.dai_fmt = SND_SOC_DAIFMT_I2S |
1177
SND_SOC_DAIFMT_NB_NF |
1178
SND_SOC_DAIFMT_CBC_CFC,
1179
SND_SOC_DAILINK_REG(PCM1_BE),
1180
},
1181
[DAI_LINK_UL_SRC1_BE] = {
1182
.name = "UL_SRC1_BE",
1183
.no_pcm = 1,
1184
.capture_only = 1,
1185
SND_SOC_DAILINK_REG(UL_SRC1_BE),
1186
},
1187
[DAI_LINK_UL_SRC2_BE] = {
1188
.name = "UL_SRC2_BE",
1189
.no_pcm = 1,
1190
.capture_only = 1,
1191
SND_SOC_DAILINK_REG(UL_SRC2_BE),
1192
},
1193
/* SOF BE */
1194
[DAI_LINK_SOF_DL2_BE] = {
1195
.name = "AFE_SOF_DL2",
1196
.no_pcm = 1,
1197
.playback_only = 1,
1198
.ops = &mt8195_sof_be_ops,
1199
SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1200
},
1201
[DAI_LINK_SOF_DL3_BE] = {
1202
.name = "AFE_SOF_DL3",
1203
.no_pcm = 1,
1204
.playback_only = 1,
1205
.ops = &mt8195_sof_be_ops,
1206
SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1207
},
1208
[DAI_LINK_SOF_UL4_BE] = {
1209
.name = "AFE_SOF_UL4",
1210
.no_pcm = 1,
1211
.capture_only = 1,
1212
.ops = &mt8195_sof_be_ops,
1213
SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1214
},
1215
[DAI_LINK_SOF_UL5_BE] = {
1216
.name = "AFE_SOF_UL5",
1217
.no_pcm = 1,
1218
.capture_only = 1,
1219
.ops = &mt8195_sof_be_ops,
1220
SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1221
},
1222
};
1223
1224
static struct snd_soc_codec_conf rt1011_codec_conf[] = {
1225
{
1226
.dlc = COMP_CODEC_CONF(RT1011_DEV0_NAME),
1227
.name_prefix = "Left",
1228
},
1229
{
1230
.dlc = COMP_CODEC_CONF(RT1011_DEV1_NAME),
1231
.name_prefix = "Right",
1232
},
1233
};
1234
1235
static struct snd_soc_codec_conf max98390_codec_conf[] = {
1236
{
1237
.dlc = COMP_CODEC_CONF(MAX98390_DEV0_NAME),
1238
.name_prefix = "Right",
1239
},
1240
{
1241
.dlc = COMP_CODEC_CONF(MAX98390_DEV1_NAME),
1242
.name_prefix = "Left",
1243
},
1244
};
1245
1246
static struct snd_soc_card mt8195_mt6359_soc_card = {
1247
.owner = THIS_MODULE,
1248
.dai_link = mt8195_mt6359_dai_links,
1249
.num_links = ARRAY_SIZE(mt8195_mt6359_dai_links),
1250
.controls = mt8195_mt6359_controls,
1251
.num_controls = ARRAY_SIZE(mt8195_mt6359_controls),
1252
.dapm_widgets = mt8195_mt6359_widgets,
1253
.num_dapm_widgets = ARRAY_SIZE(mt8195_mt6359_widgets),
1254
.dapm_routes = mt8195_mt6359_routes,
1255
.num_dapm_routes = ARRAY_SIZE(mt8195_mt6359_routes),
1256
.set_bias_level_post = mt8195_set_bias_level_post,
1257
};
1258
1259
/* fixup the BE DAI link to match any values from topology */
1260
static int mt8195_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
1261
struct snd_pcm_hw_params *params)
1262
{
1263
int ret;
1264
1265
ret = mtk_sof_dai_link_fixup(rtd, params);
1266
1267
if (!strcmp(rtd->dai_link->name, "ETDM2_IN_BE") ||
1268
!strcmp(rtd->dai_link->name, "ETDM1_OUT_BE")) {
1269
mt8195_etdm_hw_params_fixup(rtd, params);
1270
}
1271
1272
return ret;
1273
}
1274
1275
static int mt8195_mt6359_legacy_probe(struct mtk_soc_card_data *soc_card_data)
1276
{
1277
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1278
struct snd_soc_card *card = card_data->card;
1279
struct device_node *codec_node, *dp_node, *hdmi_node;
1280
struct snd_soc_dai_link *dai_link;
1281
struct device *dev = card->dev;
1282
bool is5682s, init6359 = false;
1283
int i;
1284
1285
if (strstr(card->name, "_5682s")) {
1286
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682s");
1287
is5682s = true;
1288
} else {
1289
codec_node = of_find_compatible_node(NULL, NULL, "realtek,rt5682i");
1290
is5682s = false;
1291
}
1292
1293
dp_node = of_parse_phandle(dev->of_node, "mediatek,dptx-codec", 0);
1294
hdmi_node = of_parse_phandle(dev->of_node, "mediatek,hdmi-codec", 0);
1295
1296
for_each_card_prelinks(card, i, dai_link) {
1297
if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1298
if (!dp_node) {
1299
dev_dbg(dev, "No property 'dptx-codec'\n");
1300
} else {
1301
dai_link->codecs->of_node = dp_node;
1302
dai_link->codecs->name = NULL;
1303
dai_link->codecs->dai_name = "i2s-hifi";
1304
dai_link->init = mt8195_dptx_codec_init;
1305
}
1306
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1307
if (!hdmi_node) {
1308
dev_dbg(dev, "No property 'hdmi-codec'\n");
1309
} else {
1310
dai_link->codecs->of_node = hdmi_node;
1311
dai_link->codecs->name = NULL;
1312
dai_link->codecs->dai_name = "i2s-hifi";
1313
dai_link->init = mt8195_hdmi_codec_init;
1314
}
1315
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0) {
1316
if (!codec_node) {
1317
dev_err(dev, "Codec not found!\n");
1318
} else {
1319
dai_link->codecs->of_node = codec_node;
1320
dai_link->codecs->name = NULL;
1321
dai_link->codecs->dai_name =
1322
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1323
dai_link->init = mt8195_rt5682_init;
1324
dai_link->ops = &mt8195_rt5682_etdm_ops;
1325
}
1326
} else if (strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1327
if (!codec_node) {
1328
dev_err(dev, "Codec not found!\n");
1329
} else {
1330
dai_link->codecs->of_node = codec_node;
1331
dai_link->codecs->name = NULL;
1332
dai_link->codecs->dai_name =
1333
is5682s ? RT5682S_CODEC_DAI : RT5682_CODEC_DAI;
1334
dai_link->ops = &mt8195_rt5682_etdm_ops;
1335
}
1336
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1337
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1338
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1339
if (!init6359) {
1340
dai_link->init = mt8195_mt6359_init;
1341
init6359 = true;
1342
}
1343
} else if (strcmp(dai_link->name, "ETDM2_OUT_BE") == 0) {
1344
switch (card_data->flags) {
1345
case RT1011_SPEAKER_AMP_PRESENT:
1346
dai_link->codecs = rt1011_comps;
1347
dai_link->num_codecs = ARRAY_SIZE(rt1011_comps);
1348
dai_link->init = mt8195_rt1011_init;
1349
dai_link->ops = &mt8195_rt1011_etdm_ops;
1350
dai_link->be_hw_params_fixup = mt8195_etdm_hw_params_fixup;
1351
card->codec_conf = rt1011_codec_conf;
1352
card->num_configs = ARRAY_SIZE(rt1011_codec_conf);
1353
break;
1354
case RT1019_SPEAKER_AMP_PRESENT:
1355
dai_link->codecs = rt1019_comps;
1356
dai_link->num_codecs = ARRAY_SIZE(rt1019_comps);
1357
dai_link->init = mt8195_rt1019_init;
1358
break;
1359
case MAX98390_SPEAKER_AMP_PRESENT:
1360
dai_link->codecs = max98390_comps;
1361
dai_link->num_codecs = ARRAY_SIZE(max98390_comps);
1362
dai_link->init = mt8195_max98390_init;
1363
card->codec_conf = max98390_codec_conf;
1364
card->num_configs = ARRAY_SIZE(max98390_codec_conf);
1365
break;
1366
default:
1367
break;
1368
}
1369
}
1370
}
1371
1372
return 0;
1373
}
1374
1375
static int mt8195_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1376
{
1377
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1378
struct snd_soc_card *card = card_data->card;
1379
struct mt8195_mt6359_priv *mach_priv;
1380
struct snd_soc_dai_link *dai_link;
1381
u8 codec_init = 0;
1382
int i;
1383
1384
mach_priv = devm_kzalloc(card->dev, sizeof(*mach_priv), GFP_KERNEL);
1385
if (!mach_priv)
1386
return -ENOMEM;
1387
1388
soc_card_data->mach_priv = mach_priv;
1389
1390
if (legacy)
1391
return mt8195_mt6359_legacy_probe(soc_card_data);
1392
1393
for_each_card_prelinks(card, i, dai_link) {
1394
if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1395
if (dai_link->num_codecs &&
1396
!snd_soc_dlc_is_dummy(dai_link->codecs))
1397
dai_link->init = mt8195_dptx_codec_init;
1398
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1399
if (dai_link->num_codecs &&
1400
!snd_soc_dlc_is_dummy(dai_link->codecs))
1401
dai_link->init = mt8195_hdmi_codec_init;
1402
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1403
strcmp(dai_link->name, "UL_SRC1_BE") == 0 ||
1404
strcmp(dai_link->name, "UL_SRC2_BE") == 0) {
1405
if (!(codec_init & MT6359_CODEC_INIT)) {
1406
dai_link->init = mt8195_mt6359_init;
1407
codec_init |= MT6359_CODEC_INIT;
1408
}
1409
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1410
strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1411
strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1412
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1413
if (!dai_link->num_codecs)
1414
continue;
1415
1416
if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1417
if (!(codec_init & MAX98390_CODEC_INIT)) {
1418
dai_link->init = mt8195_max98390_init;
1419
codec_init |= MAX98390_CODEC_INIT;
1420
}
1421
} else if (!strcmp(dai_link->codecs->dai_name, RT1011_CODEC_DAI)) {
1422
dai_link->ops = &mt8195_rt1011_etdm_ops;
1423
if (!(codec_init & RT1011_CODEC_INIT)) {
1424
dai_link->init = mt8195_rt1011_init;
1425
codec_init |= RT1011_CODEC_INIT;
1426
}
1427
} else if (!strcmp(dai_link->codecs->dai_name, RT1019_CODEC_DAI)) {
1428
if (!(codec_init & RT1019_CODEC_INIT)) {
1429
dai_link->init = mt8195_rt1019_init;
1430
codec_init |= RT1019_CODEC_INIT;
1431
}
1432
} else if (!strcmp(dai_link->codecs->dai_name, RT5682_CODEC_DAI) ||
1433
!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1434
dai_link->ops = &mt8195_rt5682_etdm_ops;
1435
if (!(codec_init & RT5682_CODEC_INIT)) {
1436
dai_link->init = mt8195_rt5682_init;
1437
codec_init |= RT5682_CODEC_INIT;
1438
}
1439
} else {
1440
if (!snd_soc_dlc_is_dummy(dai_link->codecs)) {
1441
if (!(codec_init & DUMB_CODEC_INIT)) {
1442
dai_link->init = mt8195_dumb_amp_init;
1443
codec_init |= DUMB_CODEC_INIT;
1444
}
1445
}
1446
}
1447
}
1448
}
1449
1450
return 0;
1451
}
1452
1453
static const unsigned int mt8195_pcm_playback_channels[] = { 2 };
1454
static const unsigned int mt8195_pcm_capture_channels[] = { 1, 2 };
1455
static const unsigned int mt8195_pcm_hdmidp_channels[] = { 2, 4, 6, 8 };
1456
static const unsigned int mt8195_pcm_rates[] = { 48000 };
1457
1458
static const struct snd_pcm_hw_constraint_list mt8195_rate_constraint = {
1459
.list = mt8195_pcm_rates,
1460
.count = ARRAY_SIZE(mt8195_pcm_rates)
1461
};
1462
1463
static const struct mtk_pcm_constraints_data mt8195_pcm_constraints[MTK_CONSTRAINT_HDMIDP + 1] = {
1464
[MTK_CONSTRAINT_PLAYBACK] = {
1465
.channels = &(const struct snd_pcm_hw_constraint_list) {
1466
.list = mt8195_pcm_playback_channels,
1467
.count = ARRAY_SIZE(mt8195_pcm_playback_channels)
1468
},
1469
.rates = &mt8195_rate_constraint,
1470
},
1471
[MTK_CONSTRAINT_CAPTURE] = {
1472
.channels = &(const struct snd_pcm_hw_constraint_list) {
1473
.list = mt8195_pcm_capture_channels,
1474
.count = ARRAY_SIZE(mt8195_pcm_capture_channels)
1475
},
1476
.rates = &mt8195_rate_constraint,
1477
},
1478
[MTK_CONSTRAINT_HDMIDP] = {
1479
.channels = &(const struct snd_pcm_hw_constraint_list) {
1480
.list = mt8195_pcm_hdmidp_channels,
1481
.count = ARRAY_SIZE(mt8195_pcm_hdmidp_channels)
1482
},
1483
.rates = &mt8195_rate_constraint,
1484
},
1485
};
1486
1487
static const struct mtk_sof_priv mt8195_sof_priv = {
1488
.conn_streams = g_sof_conn_streams,
1489
.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1490
.sof_dai_link_fixup = mt8195_dai_link_fixup
1491
};
1492
1493
static const struct mtk_soundcard_pdata mt8195_mt6359_rt1019_rt5682_card = {
1494
.card_name = "mt8195_r1019_5682",
1495
.card_data = &(struct mtk_platform_card_data) {
1496
.card = &mt8195_mt6359_soc_card,
1497
.num_jacks = MT8195_JACK_MAX,
1498
.pcm_constraints = mt8195_pcm_constraints,
1499
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1500
.flags = RT1019_SPEAKER_AMP_PRESENT
1501
},
1502
.sof_priv = &mt8195_sof_priv,
1503
.soc_probe = mt8195_mt6359_soc_card_probe
1504
};
1505
1506
static const struct mtk_soundcard_pdata mt8195_mt6359_rt1011_rt5682_card = {
1507
.card_name = "mt8195_r1011_5682",
1508
.card_data = &(struct mtk_platform_card_data) {
1509
.card = &mt8195_mt6359_soc_card,
1510
.num_jacks = MT8195_JACK_MAX,
1511
.pcm_constraints = mt8195_pcm_constraints,
1512
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1513
.flags = RT1011_SPEAKER_AMP_PRESENT
1514
},
1515
.sof_priv = &mt8195_sof_priv,
1516
.soc_probe = mt8195_mt6359_soc_card_probe
1517
};
1518
1519
static const struct mtk_soundcard_pdata mt8195_mt6359_max98390_rt5682_card = {
1520
.card_name = "mt8195_m98390_r5682",
1521
.card_data = &(struct mtk_platform_card_data) {
1522
.card = &mt8195_mt6359_soc_card,
1523
.num_jacks = MT8195_JACK_MAX,
1524
.pcm_constraints = mt8195_pcm_constraints,
1525
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1526
.flags = MAX98390_SPEAKER_AMP_PRESENT
1527
},
1528
.sof_priv = &mt8195_sof_priv,
1529
.soc_probe = mt8195_mt6359_soc_card_probe
1530
};
1531
1532
static const struct mtk_soundcard_pdata mt8195_mt6359_card = {
1533
.card_name = "mt8195_mt6359",
1534
.card_data = &(struct mtk_platform_card_data) {
1535
.card = &mt8195_mt6359_soc_card,
1536
.num_jacks = MT8195_JACK_MAX,
1537
.pcm_constraints = mt8195_pcm_constraints,
1538
.num_pcm_constraints = ARRAY_SIZE(mt8195_pcm_constraints),
1539
},
1540
.sof_priv = &mt8195_sof_priv,
1541
.soc_probe = mt8195_mt6359_soc_card_probe
1542
};
1543
1544
static const struct of_device_id mt8195_mt6359_dt_match[] = {
1545
{
1546
.compatible = "mediatek,mt8195_mt6359_rt1019_rt5682",
1547
.data = &mt8195_mt6359_rt1019_rt5682_card,
1548
},
1549
{
1550
.compatible = "mediatek,mt8195_mt6359_rt1011_rt5682",
1551
.data = &mt8195_mt6359_rt1011_rt5682_card,
1552
},
1553
{
1554
.compatible = "mediatek,mt8195_mt6359_max98390_rt5682",
1555
.data = &mt8195_mt6359_max98390_rt5682_card,
1556
},
1557
{
1558
.compatible = "mediatek,mt8195_mt6359",
1559
.data = &mt8195_mt6359_card,
1560
},
1561
{},
1562
};
1563
MODULE_DEVICE_TABLE(of, mt8195_mt6359_dt_match);
1564
1565
static struct platform_driver mt8195_mt6359_driver = {
1566
.driver = {
1567
.name = "mt8195_mt6359",
1568
.of_match_table = mt8195_mt6359_dt_match,
1569
.pm = &snd_soc_pm_ops,
1570
},
1571
.probe = mtk_soundcard_common_probe,
1572
};
1573
1574
module_platform_driver(mt8195_mt6359_driver);
1575
1576
/* Module information */
1577
MODULE_DESCRIPTION("MT8195-MT6359 ALSA SoC machine driver");
1578
MODULE_AUTHOR("Trevor Wu <[email protected]>");
1579
MODULE_AUTHOR("YC Hung <[email protected]>");
1580
MODULE_LICENSE("GPL");
1581
MODULE_ALIAS("mt8195_mt6359 soc card");
1582
1583