Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8188/mt8188-mt6359.c
26488 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* mt8188-mt6359.c -- MT8188-MT6359 ALSA SoC machine driver
4
*
5
* Copyright (c) 2022 MediaTek Inc.
6
* Author: Trevor Wu <[email protected]>
7
*/
8
9
#include <linux/bitfield.h>
10
#include <linux/input.h>
11
#include <linux/module.h>
12
#include <linux/of.h>
13
#include <linux/pm_runtime.h>
14
#include <sound/jack.h>
15
#include <sound/pcm_params.h>
16
#include <sound/soc.h>
17
#include "mt8188-afe-common.h"
18
#include "../../codecs/nau8825.h"
19
#include "../../codecs/mt6359.h"
20
#include "../../codecs/mt6359-accdet.h"
21
#include "../../codecs/rt5682.h"
22
#include "../common/mtk-afe-platform-driver.h"
23
#include "../common/mtk-soundcard-driver.h"
24
#include "../common/mtk-dsp-sof-common.h"
25
#include "../common/mtk-soc-card.h"
26
27
#define CKSYS_AUD_TOP_CFG 0x032c
28
#define RG_TEST_ON BIT(0)
29
#define RG_TEST_TYPE BIT(2)
30
#define CKSYS_AUD_TOP_MON 0x0330
31
#define TEST_MISO_COUNT_1 GENMASK(3, 0)
32
#define TEST_MISO_COUNT_2 GENMASK(7, 4)
33
#define TEST_MISO_DONE_1 BIT(28)
34
#define TEST_MISO_DONE_2 BIT(29)
35
36
#define NAU8825_HS_PRESENT BIT(0)
37
#define RT5682S_HS_PRESENT BIT(1)
38
#define ES8326_HS_PRESENT BIT(2)
39
#define MAX98390_TWO_AMP BIT(3)
40
/*
41
* Maxim MAX98390
42
*/
43
#define MAX98390_CODEC_DAI "max98390-aif1"
44
#define MAX98390_DEV0_NAME "max98390.0-0038" /* rear right */
45
#define MAX98390_DEV1_NAME "max98390.0-0039" /* rear left */
46
#define MAX98390_DEV2_NAME "max98390.0-003a" /* front right */
47
#define MAX98390_DEV3_NAME "max98390.0-003b" /* front left */
48
49
/*
50
* Nau88l25
51
*/
52
#define NAU8825_CODEC_DAI "nau8825-hifi"
53
54
/*
55
* ES8326
56
*/
57
#define ES8326_CODEC_DAI "ES8326 HiFi"
58
59
#define SOF_DMA_DL2 "SOF_DMA_DL2"
60
#define SOF_DMA_DL3 "SOF_DMA_DL3"
61
#define SOF_DMA_UL4 "SOF_DMA_UL4"
62
#define SOF_DMA_UL5 "SOF_DMA_UL5"
63
64
#define RT5682S_CODEC_DAI "rt5682s-aif1"
65
66
/* FE */
67
SND_SOC_DAILINK_DEFS(playback2,
68
DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
69
DAILINK_COMP_ARRAY(COMP_DUMMY()),
70
DAILINK_COMP_ARRAY(COMP_EMPTY()));
71
72
SND_SOC_DAILINK_DEFS(playback3,
73
DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
74
DAILINK_COMP_ARRAY(COMP_DUMMY()),
75
DAILINK_COMP_ARRAY(COMP_EMPTY()));
76
77
SND_SOC_DAILINK_DEFS(playback6,
78
DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
79
DAILINK_COMP_ARRAY(COMP_DUMMY()),
80
DAILINK_COMP_ARRAY(COMP_EMPTY()));
81
82
SND_SOC_DAILINK_DEFS(playback7,
83
DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
84
DAILINK_COMP_ARRAY(COMP_DUMMY()),
85
DAILINK_COMP_ARRAY(COMP_EMPTY()));
86
87
SND_SOC_DAILINK_DEFS(playback8,
88
DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
89
DAILINK_COMP_ARRAY(COMP_DUMMY()),
90
DAILINK_COMP_ARRAY(COMP_EMPTY()));
91
92
SND_SOC_DAILINK_DEFS(playback10,
93
DAILINK_COMP_ARRAY(COMP_CPU("DL10")),
94
DAILINK_COMP_ARRAY(COMP_DUMMY()),
95
DAILINK_COMP_ARRAY(COMP_EMPTY()));
96
97
SND_SOC_DAILINK_DEFS(playback11,
98
DAILINK_COMP_ARRAY(COMP_CPU("DL11")),
99
DAILINK_COMP_ARRAY(COMP_DUMMY()),
100
DAILINK_COMP_ARRAY(COMP_EMPTY()));
101
102
SND_SOC_DAILINK_DEFS(capture1,
103
DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
104
DAILINK_COMP_ARRAY(COMP_DUMMY()),
105
DAILINK_COMP_ARRAY(COMP_EMPTY()));
106
107
SND_SOC_DAILINK_DEFS(capture2,
108
DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
109
DAILINK_COMP_ARRAY(COMP_DUMMY()),
110
DAILINK_COMP_ARRAY(COMP_EMPTY()));
111
112
SND_SOC_DAILINK_DEFS(capture3,
113
DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
114
DAILINK_COMP_ARRAY(COMP_DUMMY()),
115
DAILINK_COMP_ARRAY(COMP_EMPTY()));
116
117
SND_SOC_DAILINK_DEFS(capture4,
118
DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
119
DAILINK_COMP_ARRAY(COMP_DUMMY()),
120
DAILINK_COMP_ARRAY(COMP_EMPTY()));
121
122
SND_SOC_DAILINK_DEFS(capture5,
123
DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
124
DAILINK_COMP_ARRAY(COMP_DUMMY()),
125
DAILINK_COMP_ARRAY(COMP_EMPTY()));
126
127
SND_SOC_DAILINK_DEFS(capture6,
128
DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
129
DAILINK_COMP_ARRAY(COMP_DUMMY()),
130
DAILINK_COMP_ARRAY(COMP_EMPTY()));
131
132
SND_SOC_DAILINK_DEFS(capture8,
133
DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
134
DAILINK_COMP_ARRAY(COMP_DUMMY()),
135
DAILINK_COMP_ARRAY(COMP_EMPTY()));
136
137
SND_SOC_DAILINK_DEFS(capture9,
138
DAILINK_COMP_ARRAY(COMP_CPU("UL9")),
139
DAILINK_COMP_ARRAY(COMP_DUMMY()),
140
DAILINK_COMP_ARRAY(COMP_EMPTY()));
141
142
SND_SOC_DAILINK_DEFS(capture10,
143
DAILINK_COMP_ARRAY(COMP_CPU("UL10")),
144
DAILINK_COMP_ARRAY(COMP_DUMMY()),
145
DAILINK_COMP_ARRAY(COMP_EMPTY()));
146
147
/* BE */
148
SND_SOC_DAILINK_DEFS(dl_src,
149
DAILINK_COMP_ARRAY(COMP_CPU("DL_SRC")),
150
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
151
"mt6359-snd-codec-aif1")),
152
DAILINK_COMP_ARRAY(COMP_EMPTY()));
153
154
SND_SOC_DAILINK_DEFS(DMIC_BE,
155
DAILINK_COMP_ARRAY(COMP_CPU("DMIC")),
156
DAILINK_COMP_ARRAY(COMP_DUMMY()),
157
DAILINK_COMP_ARRAY(COMP_EMPTY()));
158
159
SND_SOC_DAILINK_DEFS(dptx,
160
DAILINK_COMP_ARRAY(COMP_CPU("DPTX")),
161
DAILINK_COMP_ARRAY(COMP_DUMMY()),
162
DAILINK_COMP_ARRAY(COMP_EMPTY()));
163
164
SND_SOC_DAILINK_DEFS(etdm1_in,
165
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_IN")),
166
DAILINK_COMP_ARRAY(COMP_DUMMY()),
167
DAILINK_COMP_ARRAY(COMP_EMPTY()));
168
169
SND_SOC_DAILINK_DEFS(etdm2_in,
170
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_IN")),
171
DAILINK_COMP_ARRAY(COMP_DUMMY()),
172
DAILINK_COMP_ARRAY(COMP_EMPTY()));
173
174
SND_SOC_DAILINK_DEFS(etdm1_out,
175
DAILINK_COMP_ARRAY(COMP_CPU("ETDM1_OUT")),
176
DAILINK_COMP_ARRAY(COMP_DUMMY()),
177
DAILINK_COMP_ARRAY(COMP_EMPTY()));
178
179
SND_SOC_DAILINK_DEFS(etdm2_out,
180
DAILINK_COMP_ARRAY(COMP_CPU("ETDM2_OUT")),
181
DAILINK_COMP_ARRAY(COMP_DUMMY()),
182
DAILINK_COMP_ARRAY(COMP_EMPTY()));
183
184
SND_SOC_DAILINK_DEFS(etdm3_out,
185
DAILINK_COMP_ARRAY(COMP_CPU("ETDM3_OUT")),
186
DAILINK_COMP_ARRAY(COMP_DUMMY()),
187
DAILINK_COMP_ARRAY(COMP_EMPTY()));
188
189
SND_SOC_DAILINK_DEFS(pcm1,
190
DAILINK_COMP_ARRAY(COMP_CPU("PCM1")),
191
DAILINK_COMP_ARRAY(COMP_DUMMY()),
192
DAILINK_COMP_ARRAY(COMP_EMPTY()));
193
194
SND_SOC_DAILINK_DEFS(ul_src,
195
DAILINK_COMP_ARRAY(COMP_CPU("UL_SRC")),
196
DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
197
"mt6359-snd-codec-aif1")),
198
DAILINK_COMP_ARRAY(COMP_EMPTY()));
199
200
SND_SOC_DAILINK_DEFS(AFE_SOF_DL2,
201
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL2")),
202
DAILINK_COMP_ARRAY(COMP_DUMMY()),
203
DAILINK_COMP_ARRAY(COMP_EMPTY()));
204
205
SND_SOC_DAILINK_DEFS(AFE_SOF_DL3,
206
DAILINK_COMP_ARRAY(COMP_CPU("SOF_DL3")),
207
DAILINK_COMP_ARRAY(COMP_DUMMY()),
208
DAILINK_COMP_ARRAY(COMP_EMPTY()));
209
210
SND_SOC_DAILINK_DEFS(AFE_SOF_UL4,
211
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL4")),
212
DAILINK_COMP_ARRAY(COMP_DUMMY()),
213
DAILINK_COMP_ARRAY(COMP_EMPTY()));
214
215
SND_SOC_DAILINK_DEFS(AFE_SOF_UL5,
216
DAILINK_COMP_ARRAY(COMP_CPU("SOF_UL5")),
217
DAILINK_COMP_ARRAY(COMP_DUMMY()),
218
DAILINK_COMP_ARRAY(COMP_EMPTY()));
219
220
static const struct sof_conn_stream g_sof_conn_streams[] = {
221
{
222
.sof_link = "AFE_SOF_DL2",
223
.sof_dma = SOF_DMA_DL2,
224
.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
225
},
226
{
227
.sof_link = "AFE_SOF_DL3",
228
.sof_dma = SOF_DMA_DL3,
229
.stream_dir = SNDRV_PCM_STREAM_PLAYBACK
230
},
231
{
232
.sof_link = "AFE_SOF_UL4",
233
.sof_dma = SOF_DMA_UL4,
234
.stream_dir = SNDRV_PCM_STREAM_CAPTURE
235
},
236
{
237
.sof_link = "AFE_SOF_UL5",
238
.sof_dma = SOF_DMA_UL5,
239
.stream_dir = SNDRV_PCM_STREAM_CAPTURE
240
},
241
};
242
243
enum mt8188_jacks {
244
MT8188_JACK_HEADSET,
245
MT8188_JACK_DP,
246
MT8188_JACK_HDMI,
247
MT8188_JACK_MAX,
248
};
249
250
static struct snd_soc_jack_pin mt8188_hdmi_jack_pins[] = {
251
{
252
.pin = "HDMI",
253
.mask = SND_JACK_LINEOUT,
254
},
255
};
256
257
static struct snd_soc_jack_pin mt8188_dp_jack_pins[] = {
258
{
259
.pin = "DP",
260
.mask = SND_JACK_LINEOUT,
261
},
262
};
263
264
static struct snd_soc_jack_pin nau8825_jack_pins[] = {
265
{
266
.pin = "Headphone Jack",
267
.mask = SND_JACK_HEADPHONE,
268
},
269
{
270
.pin = "Headset Mic",
271
.mask = SND_JACK_MICROPHONE,
272
},
273
};
274
275
static struct snd_soc_jack_pin mt8188_headset_jack_pins[] = {
276
{
277
.pin = "Headphone",
278
.mask = SND_JACK_HEADPHONE,
279
},
280
{
281
.pin = "Headset Mic",
282
.mask = SND_JACK_MICROPHONE,
283
},
284
};
285
286
static const struct snd_kcontrol_new mt8188_dumb_spk_controls[] = {
287
SOC_DAPM_PIN_SWITCH("Ext Spk"),
288
};
289
290
static const struct snd_soc_dapm_widget mt8188_dumb_spk_widgets[] = {
291
SND_SOC_DAPM_SPK("Ext Spk", NULL),
292
};
293
294
static const struct snd_kcontrol_new mt8188_dual_spk_controls[] = {
295
SOC_DAPM_PIN_SWITCH("Left Spk"),
296
SOC_DAPM_PIN_SWITCH("Right Spk"),
297
};
298
299
static const struct snd_soc_dapm_widget mt8188_dual_spk_widgets[] = {
300
SND_SOC_DAPM_SPK("Left Spk", NULL),
301
SND_SOC_DAPM_SPK("Right Spk", NULL),
302
};
303
304
static const struct snd_kcontrol_new mt8188_rear_spk_controls[] = {
305
SOC_DAPM_PIN_SWITCH("Rear Left Spk"),
306
SOC_DAPM_PIN_SWITCH("Rear Right Spk"),
307
};
308
309
static const struct snd_soc_dapm_widget mt8188_rear_spk_widgets[] = {
310
SND_SOC_DAPM_SPK("Rear Left Spk", NULL),
311
SND_SOC_DAPM_SPK("Rear Right Spk", NULL),
312
};
313
314
static const struct snd_soc_dapm_widget mt8188_mt6359_widgets[] = {
315
SND_SOC_DAPM_HP("Headphone", NULL),
316
SND_SOC_DAPM_MIC("Headset Mic", NULL),
317
SND_SOC_DAPM_MIC("AP DMIC", NULL),
318
SND_SOC_DAPM_SINK("HDMI"),
319
SND_SOC_DAPM_SINK("DP"),
320
SND_SOC_DAPM_MIXER(SOF_DMA_DL2, SND_SOC_NOPM, 0, 0, NULL, 0),
321
SND_SOC_DAPM_MIXER(SOF_DMA_DL3, SND_SOC_NOPM, 0, 0, NULL, 0),
322
SND_SOC_DAPM_MIXER(SOF_DMA_UL4, SND_SOC_NOPM, 0, 0, NULL, 0),
323
SND_SOC_DAPM_MIXER(SOF_DMA_UL5, SND_SOC_NOPM, 0, 0, NULL, 0),
324
325
/* dynamic pinctrl */
326
SND_SOC_DAPM_PINCTRL("ETDM_SPK_PIN", "aud_etdm_spk_on", "aud_etdm_spk_off"),
327
SND_SOC_DAPM_PINCTRL("ETDM_HP_PIN", "aud_etdm_hp_on", "aud_etdm_hp_off"),
328
SND_SOC_DAPM_PINCTRL("MTKAIF_PIN", "aud_mtkaif_on", "aud_mtkaif_off"),
329
};
330
331
static const struct snd_kcontrol_new mt8188_mt6359_controls[] = {
332
SOC_DAPM_PIN_SWITCH("Headphone"),
333
SOC_DAPM_PIN_SWITCH("Headset Mic"),
334
};
335
336
static const struct snd_soc_dapm_widget mt8188_nau8825_widgets[] = {
337
SND_SOC_DAPM_HP("Headphone Jack", NULL),
338
};
339
340
static const struct snd_kcontrol_new mt8188_nau8825_controls[] = {
341
SOC_DAPM_PIN_SWITCH("Headphone Jack"),
342
};
343
344
static const struct snd_soc_dapm_route mt8188_mt6359_routes[] = {
345
/* SOF Uplink */
346
{SOF_DMA_UL4, NULL, "O034"},
347
{SOF_DMA_UL4, NULL, "O035"},
348
{SOF_DMA_UL5, NULL, "O036"},
349
{SOF_DMA_UL5, NULL, "O037"},
350
/* SOF Downlink */
351
{"I070", NULL, SOF_DMA_DL2},
352
{"I071", NULL, SOF_DMA_DL2},
353
{"I020", NULL, SOF_DMA_DL3},
354
{"I021", NULL, SOF_DMA_DL3},
355
};
356
357
static int mt8188_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
358
{
359
struct snd_soc_component *cmpnt_afe =
360
snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
361
struct snd_soc_component *cmpnt_codec =
362
snd_soc_rtd_to_codec(rtd, 0)->component;
363
struct snd_soc_dapm_widget *pin_w = NULL, *w;
364
struct mtk_base_afe *afe;
365
struct mt8188_afe_private *afe_priv;
366
struct mtkaif_param *param;
367
int chosen_phase_1, chosen_phase_2;
368
int prev_cycle_1, prev_cycle_2;
369
u8 test_done_1, test_done_2;
370
int cycle_1, cycle_2;
371
int mtkaif_chosen_phase[MT8188_MTKAIF_MISO_NUM];
372
int mtkaif_phase_cycle[MT8188_MTKAIF_MISO_NUM];
373
int mtkaif_calibration_num_phase;
374
bool mtkaif_calibration_ok;
375
u32 monitor = 0;
376
int counter;
377
int phase;
378
int i;
379
380
if (!cmpnt_afe)
381
return -EINVAL;
382
383
afe = snd_soc_component_get_drvdata(cmpnt_afe);
384
afe_priv = afe->platform_priv;
385
param = &afe_priv->mtkaif_params;
386
387
dev_dbg(afe->dev, "%s(), start\n", __func__);
388
389
param->mtkaif_calibration_ok = false;
390
for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++) {
391
param->mtkaif_chosen_phase[i] = -1;
392
param->mtkaif_phase_cycle[i] = 0;
393
mtkaif_chosen_phase[i] = -1;
394
mtkaif_phase_cycle[i] = 0;
395
}
396
397
if (IS_ERR(afe_priv->topckgen)) {
398
dev_info(afe->dev, "%s() Cannot find topckgen controller\n",
399
__func__);
400
return 0;
401
}
402
403
for_each_card_widgets(rtd->card, w) {
404
if (!strcmp(w->name, "MTKAIF_PIN")) {
405
pin_w = w;
406
break;
407
}
408
}
409
410
if (pin_w)
411
snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_PRE_PMU);
412
else
413
dev_dbg(afe->dev, "%s(), no pinmux widget, please check if default on\n", __func__);
414
415
pm_runtime_get_sync(afe->dev);
416
mt6359_mtkaif_calibration_enable(cmpnt_codec);
417
418
/* set test type to synchronizer pulse */
419
regmap_write(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_TYPE);
420
mtkaif_calibration_num_phase = 42; /* mt6359: 0 ~ 42 */
421
mtkaif_calibration_ok = true;
422
423
for (phase = 0;
424
phase <= mtkaif_calibration_num_phase && mtkaif_calibration_ok;
425
phase++) {
426
mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
427
phase, phase, phase);
428
429
regmap_set_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
430
431
test_done_1 = 0;
432
test_done_2 = 0;
433
434
cycle_1 = -1;
435
cycle_2 = -1;
436
437
counter = 0;
438
while (!(test_done_1 & test_done_2)) {
439
regmap_read(afe_priv->topckgen,
440
CKSYS_AUD_TOP_MON, &monitor);
441
test_done_1 = FIELD_GET(TEST_MISO_DONE_1, monitor);
442
test_done_2 = FIELD_GET(TEST_MISO_DONE_2, monitor);
443
444
if (test_done_1 == 1)
445
cycle_1 = FIELD_GET(TEST_MISO_COUNT_1, monitor);
446
447
if (test_done_2 == 1)
448
cycle_2 = FIELD_GET(TEST_MISO_COUNT_2, monitor);
449
450
/* handle if never test done */
451
if (++counter > 10000) {
452
dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, monitor 0x%x\n",
453
__func__, cycle_1, cycle_2, monitor);
454
mtkaif_calibration_ok = false;
455
break;
456
}
457
}
458
459
if (phase == 0) {
460
prev_cycle_1 = cycle_1;
461
prev_cycle_2 = cycle_2;
462
}
463
464
if (cycle_1 != prev_cycle_1 &&
465
mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
466
mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = phase - 1;
467
mtkaif_phase_cycle[MT8188_MTKAIF_MISO_0] = prev_cycle_1;
468
}
469
470
if (cycle_2 != prev_cycle_2 &&
471
mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
472
mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = phase - 1;
473
mtkaif_phase_cycle[MT8188_MTKAIF_MISO_1] = prev_cycle_2;
474
}
475
476
regmap_clear_bits(afe_priv->topckgen, CKSYS_AUD_TOP_CFG, RG_TEST_ON);
477
478
if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] >= 0 &&
479
mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] >= 0)
480
break;
481
}
482
483
if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] < 0) {
484
mtkaif_calibration_ok = false;
485
chosen_phase_1 = 0;
486
} else {
487
chosen_phase_1 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0];
488
}
489
490
if (mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] < 0) {
491
mtkaif_calibration_ok = false;
492
chosen_phase_2 = 0;
493
} else {
494
chosen_phase_2 = mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1];
495
}
496
497
mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
498
chosen_phase_1,
499
chosen_phase_2,
500
0);
501
502
mt6359_mtkaif_calibration_disable(cmpnt_codec);
503
pm_runtime_put(afe->dev);
504
505
param->mtkaif_calibration_ok = mtkaif_calibration_ok;
506
param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_0] = chosen_phase_1;
507
param->mtkaif_chosen_phase[MT8188_MTKAIF_MISO_1] = chosen_phase_2;
508
509
for (i = 0; i < MT8188_MTKAIF_MISO_NUM; i++)
510
param->mtkaif_phase_cycle[i] = mtkaif_phase_cycle[i];
511
512
if (pin_w)
513
snd_soc_dapm_pinctrl_event(pin_w, NULL, SND_SOC_DAPM_POST_PMD);
514
515
dev_dbg(afe->dev, "%s(), end, calibration ok %d\n",
516
__func__, param->mtkaif_calibration_ok);
517
518
return 0;
519
}
520
521
static int mt8188_mt6359_accdet_init(struct snd_soc_pcm_runtime *rtd)
522
{
523
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
524
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
525
int ret;
526
527
if (!soc_card_data->accdet)
528
return 0;
529
530
ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
531
SND_JACK_HEADSET | SND_JACK_BTN_0 |
532
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
533
SND_JACK_BTN_3,
534
jack, mt8188_headset_jack_pins,
535
ARRAY_SIZE(mt8188_headset_jack_pins));
536
if (ret) {
537
dev_err(rtd->dev, "Headset Jack create failed: %d\n", ret);
538
return ret;
539
}
540
541
ret = mt6359_accdet_enable_jack_detect(soc_card_data->accdet, jack);
542
if (ret) {
543
dev_err(rtd->dev, "Headset Jack enable failed: %d\n", ret);
544
return ret;
545
}
546
547
return 0;
548
}
549
550
static int mt8188_mt6359_init(struct snd_soc_pcm_runtime *rtd)
551
{
552
struct snd_soc_component *cmpnt_codec =
553
snd_soc_rtd_to_codec(rtd, 0)->component;
554
555
/* set mtkaif protocol */
556
mt6359_set_mtkaif_protocol(cmpnt_codec,
557
MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
558
559
/* mtkaif calibration */
560
mt8188_mt6359_mtkaif_calibration(rtd);
561
562
mt8188_mt6359_accdet_init(rtd);
563
564
return 0;
565
}
566
567
enum {
568
DAI_LINK_DL2_FE,
569
DAI_LINK_DL3_FE,
570
DAI_LINK_DL6_FE,
571
DAI_LINK_DL7_FE,
572
DAI_LINK_DL8_FE,
573
DAI_LINK_DL10_FE,
574
DAI_LINK_DL11_FE,
575
DAI_LINK_UL1_FE,
576
DAI_LINK_UL2_FE,
577
DAI_LINK_UL3_FE,
578
DAI_LINK_UL4_FE,
579
DAI_LINK_UL5_FE,
580
DAI_LINK_UL6_FE,
581
DAI_LINK_UL8_FE,
582
DAI_LINK_UL9_FE,
583
DAI_LINK_UL10_FE,
584
DAI_LINK_DL_SRC_BE,
585
DAI_LINK_DMIC_BE,
586
DAI_LINK_DPTX_BE,
587
DAI_LINK_ETDM1_IN_BE,
588
DAI_LINK_ETDM2_IN_BE,
589
DAI_LINK_ETDM1_OUT_BE,
590
DAI_LINK_ETDM2_OUT_BE,
591
DAI_LINK_ETDM3_OUT_BE,
592
DAI_LINK_PCM1_BE,
593
DAI_LINK_UL_SRC_BE,
594
DAI_LINK_REGULAR_LAST = DAI_LINK_UL_SRC_BE,
595
DAI_LINK_SOF_START,
596
DAI_LINK_SOF_DL2_BE = DAI_LINK_SOF_START,
597
DAI_LINK_SOF_DL3_BE,
598
DAI_LINK_SOF_UL4_BE,
599
DAI_LINK_SOF_UL5_BE,
600
DAI_LINK_SOF_END = DAI_LINK_SOF_UL5_BE,
601
};
602
603
#define DAI_LINK_REGULAR_NUM (DAI_LINK_REGULAR_LAST + 1)
604
605
static int mt8188_dptx_hw_params(struct snd_pcm_substream *substream,
606
struct snd_pcm_hw_params *params)
607
{
608
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
609
unsigned int rate = params_rate(params);
610
unsigned int mclk_fs_ratio = 256;
611
unsigned int mclk_fs = rate * mclk_fs_ratio;
612
struct snd_soc_dai *dai = snd_soc_rtd_to_cpu(rtd, 0);
613
614
return snd_soc_dai_set_sysclk(dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
615
}
616
617
static const struct snd_soc_ops mt8188_dptx_ops = {
618
.hw_params = mt8188_dptx_hw_params,
619
};
620
621
static int mt8188_dptx_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
622
struct snd_pcm_hw_params *params)
623
{
624
/* fix BE i2s format to 32bit, clean param mask first */
625
snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
626
0, (__force unsigned int)SNDRV_PCM_FORMAT_LAST);
627
628
params_set_format(params, SNDRV_PCM_FORMAT_S32_LE);
629
630
return 0;
631
}
632
633
static int mt8188_hdmi_codec_init(struct snd_soc_pcm_runtime *rtd)
634
{
635
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
636
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HDMI];
637
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
638
int ret = 0;
639
640
ret = snd_soc_card_jack_new_pins(rtd->card, "HDMI Jack",
641
SND_JACK_LINEOUT, jack,
642
mt8188_hdmi_jack_pins,
643
ARRAY_SIZE(mt8188_hdmi_jack_pins));
644
if (ret) {
645
dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
646
return ret;
647
}
648
649
ret = snd_soc_component_set_jack(component, jack, NULL);
650
if (ret) {
651
dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
652
__func__, component->name, ret);
653
return ret;
654
}
655
656
return 0;
657
}
658
659
static int mt8188_dptx_codec_init(struct snd_soc_pcm_runtime *rtd)
660
{
661
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
662
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_DP];
663
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
664
int ret = 0;
665
666
ret = snd_soc_card_jack_new_pins(rtd->card, "DP Jack", SND_JACK_LINEOUT,
667
jack, mt8188_dp_jack_pins,
668
ARRAY_SIZE(mt8188_dp_jack_pins));
669
if (ret) {
670
dev_err(rtd->dev, "%s, new jack failed: %d\n", __func__, ret);
671
return ret;
672
}
673
674
ret = snd_soc_component_set_jack(component, jack, NULL);
675
if (ret) {
676
dev_err(rtd->dev, "%s, set jack failed on %s (ret=%d)\n",
677
__func__, component->name, ret);
678
return ret;
679
}
680
681
return 0;
682
}
683
684
static int mt8188_dumb_amp_init(struct snd_soc_pcm_runtime *rtd)
685
{
686
struct snd_soc_card *card = rtd->card;
687
int ret = 0;
688
689
ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dumb_spk_widgets,
690
ARRAY_SIZE(mt8188_dumb_spk_widgets));
691
if (ret) {
692
dev_err(rtd->dev, "unable to add Dumb Speaker dapm, ret %d\n", ret);
693
return ret;
694
}
695
696
ret = snd_soc_add_card_controls(card, mt8188_dumb_spk_controls,
697
ARRAY_SIZE(mt8188_dumb_spk_controls));
698
if (ret) {
699
dev_err(rtd->dev, "unable to add Dumb card controls, ret %d\n", ret);
700
return ret;
701
}
702
703
return 0;
704
}
705
706
static int mt8188_max98390_hw_params(struct snd_pcm_substream *substream,
707
struct snd_pcm_hw_params *params)
708
{
709
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
710
unsigned int bit_width = params_width(params);
711
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
712
struct snd_soc_dai *codec_dai;
713
int i;
714
715
snd_soc_dai_set_tdm_slot(cpu_dai, 0xf, 0xf, 4, bit_width);
716
717
for_each_rtd_codec_dais(rtd, i, codec_dai) {
718
if (!strcmp(codec_dai->component->name, MAX98390_DEV0_NAME))
719
snd_soc_dai_set_tdm_slot(codec_dai, 0x8, 0x3, 4, bit_width);
720
721
if (!strcmp(codec_dai->component->name, MAX98390_DEV1_NAME))
722
snd_soc_dai_set_tdm_slot(codec_dai, 0x4, 0x3, 4, bit_width);
723
724
if (!strcmp(codec_dai->component->name, MAX98390_DEV2_NAME))
725
snd_soc_dai_set_tdm_slot(codec_dai, 0x2, 0x3, 4, bit_width);
726
727
if (!strcmp(codec_dai->component->name, MAX98390_DEV3_NAME))
728
snd_soc_dai_set_tdm_slot(codec_dai, 0x1, 0x3, 4, bit_width);
729
}
730
return 0;
731
}
732
733
static const struct snd_soc_ops mt8188_max98390_ops = {
734
.hw_params = mt8188_max98390_hw_params,
735
};
736
737
static int mt8188_max98390_codec_init(struct snd_soc_pcm_runtime *rtd)
738
{
739
struct snd_soc_card *card = rtd->card;
740
int ret;
741
742
/* add regular speakers dapm route */
743
ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_dual_spk_widgets,
744
ARRAY_SIZE(mt8188_dual_spk_widgets));
745
if (ret) {
746
dev_err(rtd->dev, "unable to add Left/Right Speaker widget, ret %d\n", ret);
747
return ret;
748
}
749
750
ret = snd_soc_add_card_controls(card, mt8188_dual_spk_controls,
751
ARRAY_SIZE(mt8188_dual_spk_controls));
752
if (ret) {
753
dev_err(rtd->dev, "unable to add Left/Right card controls, ret %d\n", ret);
754
return ret;
755
}
756
757
if (rtd->dai_link->num_codecs <= 2)
758
return 0;
759
760
/* add widgets/controls/dapm for rear speakers */
761
ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_rear_spk_widgets,
762
ARRAY_SIZE(mt8188_rear_spk_widgets));
763
if (ret) {
764
dev_err(rtd->dev, "unable to add Rear Speaker widget, ret %d\n", ret);
765
/* Don't need to add routes if widget addition failed */
766
return ret;
767
}
768
769
ret = snd_soc_add_card_controls(card, mt8188_rear_spk_controls,
770
ARRAY_SIZE(mt8188_rear_spk_controls));
771
if (ret) {
772
dev_err(rtd->dev, "unable to add Rear card controls, ret %d\n", ret);
773
return ret;
774
}
775
776
return 0;
777
}
778
779
static int mt8188_headset_codec_init(struct snd_soc_pcm_runtime *rtd)
780
{
781
struct snd_soc_card *card = rtd->card;
782
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(rtd->card);
783
struct snd_soc_jack *jack = &soc_card_data->card_data->jacks[MT8188_JACK_HEADSET];
784
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
785
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
786
int ret;
787
788
ret = snd_soc_dapm_new_controls(&card->dapm, mt8188_nau8825_widgets,
789
ARRAY_SIZE(mt8188_nau8825_widgets));
790
if (ret) {
791
dev_err(rtd->dev, "unable to add nau8825 card widget, ret %d\n", ret);
792
return ret;
793
}
794
795
ret = snd_soc_add_card_controls(card, mt8188_nau8825_controls,
796
ARRAY_SIZE(mt8188_nau8825_controls));
797
if (ret) {
798
dev_err(rtd->dev, "unable to add nau8825 card controls, ret %d\n", ret);
799
return ret;
800
}
801
802
ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
803
SND_JACK_HEADSET | SND_JACK_BTN_0 |
804
SND_JACK_BTN_1 | SND_JACK_BTN_2 |
805
SND_JACK_BTN_3,
806
jack,
807
nau8825_jack_pins,
808
ARRAY_SIZE(nau8825_jack_pins));
809
if (ret) {
810
dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
811
return ret;
812
}
813
814
if (card_data->flags & ES8326_HS_PRESENT) {
815
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
816
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOLUMEUP);
817
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEDOWN);
818
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOICECOMMAND);
819
} else {
820
snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
821
snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
822
snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
823
snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
824
}
825
826
ret = snd_soc_component_set_jack(component, jack, NULL);
827
828
if (ret) {
829
dev_err(rtd->dev, "Headset Jack call-back failed: %d\n", ret);
830
return ret;
831
}
832
833
return 0;
834
};
835
836
static void mt8188_headset_codec_exit(struct snd_soc_pcm_runtime *rtd)
837
{
838
struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component;
839
840
snd_soc_component_set_jack(component, NULL, NULL);
841
}
842
843
844
static int mt8188_nau8825_hw_params(struct snd_pcm_substream *substream,
845
struct snd_pcm_hw_params *params)
846
{
847
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
848
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
849
unsigned int rate = params_rate(params);
850
unsigned int bit_width = params_width(params);
851
int clk_freq, ret;
852
853
clk_freq = rate * 2 * bit_width;
854
855
/* Configure clock for codec */
856
ret = snd_soc_dai_set_sysclk(codec_dai, NAU8825_CLK_FLL_BLK, 0,
857
SND_SOC_CLOCK_IN);
858
if (ret < 0) {
859
dev_err(codec_dai->dev, "can't set BCLK clock %d\n", ret);
860
return ret;
861
}
862
863
/* Configure pll for codec */
864
ret = snd_soc_dai_set_pll(codec_dai, 0, 0, clk_freq,
865
params_rate(params) * 256);
866
if (ret < 0) {
867
dev_err(codec_dai->dev, "can't set BCLK: %d\n", ret);
868
return ret;
869
}
870
871
return 0;
872
}
873
874
static const struct snd_soc_ops mt8188_nau8825_ops = {
875
.hw_params = mt8188_nau8825_hw_params,
876
};
877
878
static int mt8188_rt5682s_i2s_hw_params(struct snd_pcm_substream *substream,
879
struct snd_pcm_hw_params *params)
880
{
881
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
882
struct snd_soc_card *card = rtd->card;
883
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
884
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
885
unsigned int rate = params_rate(params);
886
int bitwidth;
887
int ret;
888
889
bitwidth = snd_pcm_format_width(params_format(params));
890
if (bitwidth < 0) {
891
dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
892
return bitwidth;
893
}
894
895
ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
896
if (ret) {
897
dev_err(card->dev, "failed to set tdm slot\n");
898
return ret;
899
}
900
901
ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1, RT5682_PLL1_S_BCLK1,
902
rate * 32, rate * 512);
903
if (ret) {
904
dev_err(card->dev, "failed to set pll\n");
905
return ret;
906
}
907
908
ret = snd_soc_dai_set_sysclk(codec_dai, RT5682_SCLK_S_PLL1,
909
rate * 512, SND_SOC_CLOCK_IN);
910
if (ret) {
911
dev_err(card->dev, "failed to set sysclk\n");
912
return ret;
913
}
914
915
return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 128,
916
SND_SOC_CLOCK_OUT);
917
}
918
919
static const struct snd_soc_ops mt8188_rt5682s_i2s_ops = {
920
.hw_params = mt8188_rt5682s_i2s_hw_params,
921
};
922
923
static int mt8188_sof_be_hw_params(struct snd_pcm_substream *substream,
924
struct snd_pcm_hw_params *params)
925
{
926
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
927
struct snd_soc_component *cmpnt_afe = NULL;
928
struct snd_soc_pcm_runtime *runtime;
929
930
/* find afe component */
931
for_each_card_rtds(rtd->card, runtime) {
932
cmpnt_afe = snd_soc_rtdcom_lookup(runtime, AFE_PCM_NAME);
933
if (cmpnt_afe)
934
break;
935
}
936
937
if (cmpnt_afe && !pm_runtime_active(cmpnt_afe->dev)) {
938
dev_err(rtd->dev, "afe pm runtime is not active!!\n");
939
return -EINVAL;
940
}
941
942
return 0;
943
}
944
945
static const struct snd_soc_ops mt8188_sof_be_ops = {
946
.hw_params = mt8188_sof_be_hw_params,
947
};
948
949
static int mt8188_es8326_hw_params(struct snd_pcm_substream *substream,
950
struct snd_pcm_hw_params *params)
951
{
952
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
953
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
954
struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0);
955
unsigned int rate = params_rate(params);
956
int ret;
957
958
/* Configure MCLK for codec */
959
ret = snd_soc_dai_set_sysclk(codec_dai, 0, rate * 256, SND_SOC_CLOCK_IN);
960
if (ret < 0) {
961
dev_err(codec_dai->dev, "can't set MCLK %d\n", ret);
962
return ret;
963
}
964
965
/* Configure MCLK for cpu */
966
return snd_soc_dai_set_sysclk(cpu_dai, 0, rate * 256, SND_SOC_CLOCK_OUT);
967
}
968
969
static const struct snd_soc_ops mt8188_es8326_ops = {
970
.hw_params = mt8188_es8326_hw_params,
971
};
972
973
static struct snd_soc_dai_link mt8188_mt6359_dai_links[] = {
974
/* FE */
975
[DAI_LINK_DL2_FE] = {
976
.name = "DL2_FE",
977
.stream_name = "DL2 Playback",
978
.trigger = {
979
SND_SOC_DPCM_TRIGGER_POST,
980
SND_SOC_DPCM_TRIGGER_POST,
981
},
982
.dynamic = 1,
983
.playback_only = 1,
984
.dpcm_merged_chan = 1,
985
.dpcm_merged_rate = 1,
986
.dpcm_merged_format = 1,
987
SND_SOC_DAILINK_REG(playback2),
988
},
989
[DAI_LINK_DL3_FE] = {
990
.name = "DL3_FE",
991
.stream_name = "DL3 Playback",
992
.trigger = {
993
SND_SOC_DPCM_TRIGGER_POST,
994
SND_SOC_DPCM_TRIGGER_POST,
995
},
996
.dynamic = 1,
997
.playback_only = 1,
998
.dpcm_merged_chan = 1,
999
.dpcm_merged_rate = 1,
1000
.dpcm_merged_format = 1,
1001
SND_SOC_DAILINK_REG(playback3),
1002
},
1003
[DAI_LINK_DL6_FE] = {
1004
.name = "DL6_FE",
1005
.stream_name = "DL6 Playback",
1006
.trigger = {
1007
SND_SOC_DPCM_TRIGGER_POST,
1008
SND_SOC_DPCM_TRIGGER_POST,
1009
},
1010
.dynamic = 1,
1011
.playback_only = 1,
1012
.dpcm_merged_chan = 1,
1013
.dpcm_merged_rate = 1,
1014
.dpcm_merged_format = 1,
1015
SND_SOC_DAILINK_REG(playback6),
1016
},
1017
[DAI_LINK_DL7_FE] = {
1018
.name = "DL7_FE",
1019
.stream_name = "DL7 Playback",
1020
.trigger = {
1021
SND_SOC_DPCM_TRIGGER_PRE,
1022
SND_SOC_DPCM_TRIGGER_PRE,
1023
},
1024
.dynamic = 1,
1025
.playback_only = 1,
1026
SND_SOC_DAILINK_REG(playback7),
1027
},
1028
[DAI_LINK_DL8_FE] = {
1029
.name = "DL8_FE",
1030
.stream_name = "DL8 Playback",
1031
.trigger = {
1032
SND_SOC_DPCM_TRIGGER_POST,
1033
SND_SOC_DPCM_TRIGGER_POST,
1034
},
1035
.dynamic = 1,
1036
.playback_only = 1,
1037
SND_SOC_DAILINK_REG(playback8),
1038
},
1039
[DAI_LINK_DL10_FE] = {
1040
.name = "DL10_FE",
1041
.stream_name = "DL10 Playback",
1042
.trigger = {
1043
SND_SOC_DPCM_TRIGGER_POST,
1044
SND_SOC_DPCM_TRIGGER_POST,
1045
},
1046
.dynamic = 1,
1047
.playback_only = 1,
1048
SND_SOC_DAILINK_REG(playback10),
1049
},
1050
[DAI_LINK_DL11_FE] = {
1051
.name = "DL11_FE",
1052
.stream_name = "DL11 Playback",
1053
.trigger = {
1054
SND_SOC_DPCM_TRIGGER_POST,
1055
SND_SOC_DPCM_TRIGGER_POST,
1056
},
1057
.dynamic = 1,
1058
.playback_only = 1,
1059
SND_SOC_DAILINK_REG(playback11),
1060
},
1061
[DAI_LINK_UL1_FE] = {
1062
.name = "UL1_FE",
1063
.stream_name = "UL1 Capture",
1064
.trigger = {
1065
SND_SOC_DPCM_TRIGGER_PRE,
1066
SND_SOC_DPCM_TRIGGER_PRE,
1067
},
1068
.dynamic = 1,
1069
.capture_only = 1,
1070
SND_SOC_DAILINK_REG(capture1),
1071
},
1072
[DAI_LINK_UL2_FE] = {
1073
.name = "UL2_FE",
1074
.stream_name = "UL2 Capture",
1075
.trigger = {
1076
SND_SOC_DPCM_TRIGGER_POST,
1077
SND_SOC_DPCM_TRIGGER_POST,
1078
},
1079
.dynamic = 1,
1080
.capture_only = 1,
1081
SND_SOC_DAILINK_REG(capture2),
1082
},
1083
[DAI_LINK_UL3_FE] = {
1084
.name = "UL3_FE",
1085
.stream_name = "UL3 Capture",
1086
.trigger = {
1087
SND_SOC_DPCM_TRIGGER_POST,
1088
SND_SOC_DPCM_TRIGGER_POST,
1089
},
1090
.dynamic = 1,
1091
.capture_only = 1,
1092
SND_SOC_DAILINK_REG(capture3),
1093
},
1094
[DAI_LINK_UL4_FE] = {
1095
.name = "UL4_FE",
1096
.stream_name = "UL4 Capture",
1097
.trigger = {
1098
SND_SOC_DPCM_TRIGGER_POST,
1099
SND_SOC_DPCM_TRIGGER_POST,
1100
},
1101
.dynamic = 1,
1102
.capture_only = 1,
1103
.dpcm_merged_chan = 1,
1104
.dpcm_merged_rate = 1,
1105
.dpcm_merged_format = 1,
1106
SND_SOC_DAILINK_REG(capture4),
1107
},
1108
[DAI_LINK_UL5_FE] = {
1109
.name = "UL5_FE",
1110
.stream_name = "UL5 Capture",
1111
.trigger = {
1112
SND_SOC_DPCM_TRIGGER_POST,
1113
SND_SOC_DPCM_TRIGGER_POST,
1114
},
1115
.dynamic = 1,
1116
.capture_only = 1,
1117
.dpcm_merged_chan = 1,
1118
.dpcm_merged_rate = 1,
1119
.dpcm_merged_format = 1,
1120
SND_SOC_DAILINK_REG(capture5),
1121
},
1122
[DAI_LINK_UL6_FE] = {
1123
.name = "UL6_FE",
1124
.stream_name = "UL6 Capture",
1125
.trigger = {
1126
SND_SOC_DPCM_TRIGGER_PRE,
1127
SND_SOC_DPCM_TRIGGER_PRE,
1128
},
1129
.dynamic = 1,
1130
.capture_only = 1,
1131
SND_SOC_DAILINK_REG(capture6),
1132
},
1133
[DAI_LINK_UL8_FE] = {
1134
.name = "UL8_FE",
1135
.stream_name = "UL8 Capture",
1136
.trigger = {
1137
SND_SOC_DPCM_TRIGGER_POST,
1138
SND_SOC_DPCM_TRIGGER_POST,
1139
},
1140
.dynamic = 1,
1141
.capture_only = 1,
1142
SND_SOC_DAILINK_REG(capture8),
1143
},
1144
[DAI_LINK_UL9_FE] = {
1145
.name = "UL9_FE",
1146
.stream_name = "UL9 Capture",
1147
.trigger = {
1148
SND_SOC_DPCM_TRIGGER_POST,
1149
SND_SOC_DPCM_TRIGGER_POST,
1150
},
1151
.dynamic = 1,
1152
.capture_only = 1,
1153
SND_SOC_DAILINK_REG(capture9),
1154
},
1155
[DAI_LINK_UL10_FE] = {
1156
.name = "UL10_FE",
1157
.stream_name = "UL10 Capture",
1158
.trigger = {
1159
SND_SOC_DPCM_TRIGGER_POST,
1160
SND_SOC_DPCM_TRIGGER_POST,
1161
},
1162
.dynamic = 1,
1163
.capture_only = 1,
1164
SND_SOC_DAILINK_REG(capture10),
1165
},
1166
/* BE */
1167
[DAI_LINK_DL_SRC_BE] = {
1168
.name = "DL_SRC_BE",
1169
.no_pcm = 1,
1170
.playback_only = 1,
1171
SND_SOC_DAILINK_REG(dl_src),
1172
},
1173
[DAI_LINK_DMIC_BE] = {
1174
.name = "DMIC_BE",
1175
.no_pcm = 1,
1176
.capture_only = 1,
1177
.ignore_suspend = 1,
1178
SND_SOC_DAILINK_REG(DMIC_BE),
1179
},
1180
[DAI_LINK_DPTX_BE] = {
1181
.name = "DPTX_BE",
1182
.ops = &mt8188_dptx_ops,
1183
.be_hw_params_fixup = mt8188_dptx_hw_params_fixup,
1184
.no_pcm = 1,
1185
.playback_only = 1,
1186
SND_SOC_DAILINK_REG(dptx),
1187
},
1188
[DAI_LINK_ETDM1_IN_BE] = {
1189
.name = "ETDM1_IN_BE",
1190
.no_pcm = 1,
1191
.dai_fmt = SND_SOC_DAIFMT_I2S |
1192
SND_SOC_DAIFMT_NB_NF |
1193
SND_SOC_DAIFMT_CBP_CFP,
1194
.capture_only = 1,
1195
.ignore_suspend = 1,
1196
SND_SOC_DAILINK_REG(etdm1_in),
1197
},
1198
[DAI_LINK_ETDM2_IN_BE] = {
1199
.name = "ETDM2_IN_BE",
1200
.no_pcm = 1,
1201
.dai_fmt = SND_SOC_DAIFMT_I2S |
1202
SND_SOC_DAIFMT_NB_NF |
1203
SND_SOC_DAIFMT_CBP_CFP,
1204
.capture_only = 1,
1205
SND_SOC_DAILINK_REG(etdm2_in),
1206
},
1207
[DAI_LINK_ETDM1_OUT_BE] = {
1208
.name = "ETDM1_OUT_BE",
1209
.no_pcm = 1,
1210
.dai_fmt = SND_SOC_DAIFMT_I2S |
1211
SND_SOC_DAIFMT_NB_NF |
1212
SND_SOC_DAIFMT_CBC_CFC,
1213
.playback_only = 1,
1214
SND_SOC_DAILINK_REG(etdm1_out),
1215
},
1216
[DAI_LINK_ETDM2_OUT_BE] = {
1217
.name = "ETDM2_OUT_BE",
1218
.no_pcm = 1,
1219
.dai_fmt = SND_SOC_DAIFMT_I2S |
1220
SND_SOC_DAIFMT_NB_NF |
1221
SND_SOC_DAIFMT_CBC_CFC,
1222
.playback_only = 1,
1223
SND_SOC_DAILINK_REG(etdm2_out),
1224
},
1225
[DAI_LINK_ETDM3_OUT_BE] = {
1226
.name = "ETDM3_OUT_BE",
1227
.no_pcm = 1,
1228
.dai_fmt = SND_SOC_DAIFMT_I2S |
1229
SND_SOC_DAIFMT_NB_NF |
1230
SND_SOC_DAIFMT_CBC_CFC,
1231
.playback_only = 1,
1232
SND_SOC_DAILINK_REG(etdm3_out),
1233
},
1234
[DAI_LINK_PCM1_BE] = {
1235
.name = "PCM1_BE",
1236
.no_pcm = 1,
1237
.dai_fmt = SND_SOC_DAIFMT_I2S |
1238
SND_SOC_DAIFMT_NB_NF |
1239
SND_SOC_DAIFMT_CBC_CFC,
1240
SND_SOC_DAILINK_REG(pcm1),
1241
},
1242
[DAI_LINK_UL_SRC_BE] = {
1243
.name = "UL_SRC_BE",
1244
.no_pcm = 1,
1245
.capture_only = 1,
1246
SND_SOC_DAILINK_REG(ul_src),
1247
},
1248
1249
/* SOF BE */
1250
[DAI_LINK_SOF_DL2_BE] = {
1251
.name = "AFE_SOF_DL2",
1252
.no_pcm = 1,
1253
.playback_only = 1,
1254
.ops = &mt8188_sof_be_ops,
1255
SND_SOC_DAILINK_REG(AFE_SOF_DL2),
1256
},
1257
[DAI_LINK_SOF_DL3_BE] = {
1258
.name = "AFE_SOF_DL3",
1259
.no_pcm = 1,
1260
.playback_only = 1,
1261
.ops = &mt8188_sof_be_ops,
1262
SND_SOC_DAILINK_REG(AFE_SOF_DL3),
1263
},
1264
[DAI_LINK_SOF_UL4_BE] = {
1265
.name = "AFE_SOF_UL4",
1266
.no_pcm = 1,
1267
.capture_only = 1,
1268
.ops = &mt8188_sof_be_ops,
1269
SND_SOC_DAILINK_REG(AFE_SOF_UL4),
1270
},
1271
[DAI_LINK_SOF_UL5_BE] = {
1272
.name = "AFE_SOF_UL5",
1273
.no_pcm = 1,
1274
.capture_only = 1,
1275
.ops = &mt8188_sof_be_ops,
1276
SND_SOC_DAILINK_REG(AFE_SOF_UL5),
1277
},
1278
};
1279
1280
static void mt8188_fixup_controls(struct snd_soc_card *card)
1281
{
1282
struct mtk_soc_card_data *soc_card_data = snd_soc_card_get_drvdata(card);
1283
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1284
struct snd_kcontrol *kctl;
1285
1286
if (card_data->flags & (NAU8825_HS_PRESENT | RT5682S_HS_PRESENT | ES8326_HS_PRESENT)) {
1287
struct snd_soc_dapm_widget *w, *next_w;
1288
1289
for_each_card_widgets_safe(card, w, next_w) {
1290
if (strcmp(w->name, "Headphone"))
1291
continue;
1292
1293
snd_soc_dapm_free_widget(w);
1294
}
1295
1296
kctl = snd_ctl_find_id_mixer(card->snd_card, "Headphone Switch");
1297
if (kctl)
1298
snd_ctl_remove(card->snd_card, kctl);
1299
else
1300
dev_warn(card->dev, "Cannot find ctl : Headphone Switch\n");
1301
}
1302
}
1303
1304
static struct snd_soc_card mt8188_mt6359_soc_card = {
1305
.owner = THIS_MODULE,
1306
.dai_link = mt8188_mt6359_dai_links,
1307
.num_links = ARRAY_SIZE(mt8188_mt6359_dai_links),
1308
.dapm_widgets = mt8188_mt6359_widgets,
1309
.num_dapm_widgets = ARRAY_SIZE(mt8188_mt6359_widgets),
1310
.dapm_routes = mt8188_mt6359_routes,
1311
.num_dapm_routes = ARRAY_SIZE(mt8188_mt6359_routes),
1312
.controls = mt8188_mt6359_controls,
1313
.num_controls = ARRAY_SIZE(mt8188_mt6359_controls),
1314
.fixup_controls = mt8188_fixup_controls,
1315
};
1316
1317
static int mt8188_mt6359_soc_card_probe(struct mtk_soc_card_data *soc_card_data, bool legacy)
1318
{
1319
struct mtk_platform_card_data *card_data = soc_card_data->card_data;
1320
struct snd_soc_card *card = soc_card_data->card_data->card;
1321
struct snd_soc_dai_link *dai_link;
1322
bool init_mt6359 = false;
1323
bool init_es8326 = false;
1324
bool init_nau8825 = false;
1325
bool init_rt5682s = false;
1326
bool init_max98390 = false;
1327
bool init_dumb = false;
1328
int i;
1329
1330
if (legacy)
1331
return -EINVAL;
1332
1333
for_each_card_prelinks(card, i, dai_link) {
1334
if (strcmp(dai_link->name, "DPTX_BE") == 0) {
1335
if (dai_link->num_codecs &&
1336
!snd_soc_dlc_is_dummy(dai_link->codecs))
1337
dai_link->init = mt8188_dptx_codec_init;
1338
} else if (strcmp(dai_link->name, "ETDM3_OUT_BE") == 0) {
1339
if (dai_link->num_codecs &&
1340
!snd_soc_dlc_is_dummy(dai_link->codecs))
1341
dai_link->init = mt8188_hdmi_codec_init;
1342
} else if (strcmp(dai_link->name, "DL_SRC_BE") == 0 ||
1343
strcmp(dai_link->name, "UL_SRC_BE") == 0) {
1344
if (!init_mt6359) {
1345
dai_link->init = mt8188_mt6359_init;
1346
init_mt6359 = true;
1347
}
1348
} else if (strcmp(dai_link->name, "ETDM1_OUT_BE") == 0 ||
1349
strcmp(dai_link->name, "ETDM2_OUT_BE") == 0 ||
1350
strcmp(dai_link->name, "ETDM1_IN_BE") == 0 ||
1351
strcmp(dai_link->name, "ETDM2_IN_BE") == 0) {
1352
if (!dai_link->num_codecs)
1353
continue;
1354
1355
if (!strcmp(dai_link->codecs->dai_name, MAX98390_CODEC_DAI)) {
1356
/*
1357
* The TDM protocol settings with fixed 4 slots are defined in
1358
* mt8188_max98390_ops. Two amps is I2S mode,
1359
* SOC and codec don't require TDM settings.
1360
*/
1361
if (!(card_data->flags & MAX98390_TWO_AMP)) {
1362
dai_link->ops = &mt8188_max98390_ops;
1363
}
1364
if (!init_max98390) {
1365
dai_link->init = mt8188_max98390_codec_init;
1366
init_max98390 = true;
1367
}
1368
} else if (!strcmp(dai_link->codecs->dai_name, NAU8825_CODEC_DAI)) {
1369
dai_link->ops = &mt8188_nau8825_ops;
1370
if (!init_nau8825) {
1371
dai_link->init = mt8188_headset_codec_init;
1372
dai_link->exit = mt8188_headset_codec_exit;
1373
init_nau8825 = true;
1374
}
1375
} else if (!strcmp(dai_link->codecs->dai_name, RT5682S_CODEC_DAI)) {
1376
dai_link->ops = &mt8188_rt5682s_i2s_ops;
1377
if (!init_rt5682s) {
1378
dai_link->init = mt8188_headset_codec_init;
1379
dai_link->exit = mt8188_headset_codec_exit;
1380
init_rt5682s = true;
1381
}
1382
} else if (!strcmp(dai_link->codecs->dai_name, ES8326_CODEC_DAI)) {
1383
dai_link->ops = &mt8188_es8326_ops;
1384
if (!init_es8326) {
1385
dai_link->init = mt8188_headset_codec_init;
1386
dai_link->exit = mt8188_headset_codec_exit;
1387
init_es8326 = true;
1388
}
1389
} else {
1390
if (!snd_soc_dlc_is_dummy(dai_link->codecs)) {
1391
if (!init_dumb) {
1392
dai_link->init = mt8188_dumb_amp_init;
1393
init_dumb = true;
1394
}
1395
}
1396
}
1397
}
1398
}
1399
1400
return 0;
1401
}
1402
1403
static const struct mtk_sof_priv mt8188_sof_priv = {
1404
.conn_streams = g_sof_conn_streams,
1405
.num_streams = ARRAY_SIZE(g_sof_conn_streams),
1406
};
1407
1408
static const struct mtk_soundcard_pdata mt8188_evb_card = {
1409
.card_name = "mt8188_mt6359",
1410
.card_data = &(struct mtk_platform_card_data) {
1411
.card = &mt8188_mt6359_soc_card,
1412
.num_jacks = MT8188_JACK_MAX,
1413
},
1414
.sof_priv = &mt8188_sof_priv,
1415
.soc_probe = mt8188_mt6359_soc_card_probe,
1416
};
1417
1418
static const struct mtk_soundcard_pdata mt8188_nau8825_card = {
1419
.card_name = "mt8188_nau8825",
1420
.card_data = &(struct mtk_platform_card_data) {
1421
.card = &mt8188_mt6359_soc_card,
1422
.num_jacks = MT8188_JACK_MAX,
1423
.flags = NAU8825_HS_PRESENT
1424
},
1425
.sof_priv = &mt8188_sof_priv,
1426
.soc_probe = mt8188_mt6359_soc_card_probe,
1427
};
1428
1429
static const struct mtk_soundcard_pdata mt8188_rt5682s_card = {
1430
.card_name = "mt8188_rt5682s",
1431
.card_data = &(struct mtk_platform_card_data) {
1432
.card = &mt8188_mt6359_soc_card,
1433
.num_jacks = MT8188_JACK_MAX,
1434
.flags = RT5682S_HS_PRESENT | MAX98390_TWO_AMP
1435
},
1436
.sof_priv = &mt8188_sof_priv,
1437
.soc_probe = mt8188_mt6359_soc_card_probe,
1438
};
1439
1440
static const struct mtk_soundcard_pdata mt8188_es8326_card = {
1441
.card_name = "mt8188_es8326",
1442
.card_data = &(struct mtk_platform_card_data) {
1443
.card = &mt8188_mt6359_soc_card,
1444
.num_jacks = MT8188_JACK_MAX,
1445
.flags = ES8326_HS_PRESENT | MAX98390_TWO_AMP
1446
},
1447
.sof_priv = &mt8188_sof_priv,
1448
.soc_probe = mt8188_mt6359_soc_card_probe,
1449
};
1450
1451
static const struct of_device_id mt8188_mt6359_dt_match[] = {
1452
{ .compatible = "mediatek,mt8188-mt6359-evb", .data = &mt8188_evb_card, },
1453
{ .compatible = "mediatek,mt8188-nau8825", .data = &mt8188_nau8825_card, },
1454
{ .compatible = "mediatek,mt8188-rt5682s", .data = &mt8188_rt5682s_card, },
1455
{ .compatible = "mediatek,mt8188-es8326", .data = &mt8188_es8326_card, },
1456
{ /* sentinel */ },
1457
};
1458
MODULE_DEVICE_TABLE(of, mt8188_mt6359_dt_match);
1459
1460
static struct platform_driver mt8188_mt6359_driver = {
1461
.driver = {
1462
.name = "mt8188_mt6359",
1463
.of_match_table = mt8188_mt6359_dt_match,
1464
.pm = &snd_soc_pm_ops,
1465
},
1466
.probe = mtk_soundcard_common_probe,
1467
};
1468
1469
module_platform_driver(mt8188_mt6359_driver);
1470
1471
/* Module information */
1472
MODULE_DESCRIPTION("MT8188-MT6359 ALSA SoC machine driver");
1473
MODULE_AUTHOR("Trevor Wu <[email protected]>");
1474
MODULE_LICENSE("GPL");
1475
MODULE_ALIAS("mt8188 mt6359 soc card");
1476
1477