Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8365/mt8365-afe-pcm.c
26488 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* MediaTek 8365 ALSA SoC AFE platform driver
4
*
5
* Copyright (c) 2024 MediaTek Inc.
6
* Authors: Jia Zeng <[email protected]>
7
* Alexandre Mergnat <[email protected]>
8
*/
9
10
#include <linux/delay.h>
11
#include <linux/module.h>
12
#include <linux/of.h>
13
#include <linux/of_address.h>
14
#include <linux/dma-mapping.h>
15
#include <linux/pm_runtime.h>
16
#include <sound/soc.h>
17
#include <sound/pcm_params.h>
18
#include "mt8365-afe-common.h"
19
#include "mt8365-afe-clk.h"
20
#include "mt8365-reg.h"
21
#include "../common/mtk-base-afe.h"
22
#include "../common/mtk-afe-platform-driver.h"
23
#include "../common/mtk-afe-fe-dai.h"
24
25
#define AFE_BASE_END_OFFSET 8
26
27
static unsigned int mCM2Input;
28
29
static const unsigned int mt8365_afe_backup_list[] = {
30
AUDIO_TOP_CON0,
31
AFE_CONN0,
32
AFE_CONN1,
33
AFE_CONN3,
34
AFE_CONN4,
35
AFE_CONN5,
36
AFE_CONN6,
37
AFE_CONN7,
38
AFE_CONN8,
39
AFE_CONN9,
40
AFE_CONN10,
41
AFE_CONN11,
42
AFE_CONN12,
43
AFE_CONN13,
44
AFE_CONN14,
45
AFE_CONN15,
46
AFE_CONN16,
47
AFE_CONN17,
48
AFE_CONN18,
49
AFE_CONN19,
50
AFE_CONN20,
51
AFE_CONN21,
52
AFE_CONN26,
53
AFE_CONN27,
54
AFE_CONN28,
55
AFE_CONN29,
56
AFE_CONN30,
57
AFE_CONN31,
58
AFE_CONN32,
59
AFE_CONN33,
60
AFE_CONN34,
61
AFE_CONN35,
62
AFE_CONN36,
63
AFE_CONN_24BIT,
64
AFE_CONN_24BIT_1,
65
AFE_DAC_CON0,
66
AFE_DAC_CON1,
67
AFE_DL1_BASE,
68
AFE_DL1_END,
69
AFE_DL2_BASE,
70
AFE_DL2_END,
71
AFE_VUL_BASE,
72
AFE_VUL_END,
73
AFE_AWB_BASE,
74
AFE_AWB_END,
75
AFE_VUL3_BASE,
76
AFE_VUL3_END,
77
AFE_HDMI_OUT_BASE,
78
AFE_HDMI_OUT_END,
79
AFE_HDMI_IN_2CH_BASE,
80
AFE_HDMI_IN_2CH_END,
81
AFE_ADDA_UL_DL_CON0,
82
AFE_ADDA_DL_SRC2_CON0,
83
AFE_ADDA_DL_SRC2_CON1,
84
AFE_I2S_CON,
85
AFE_I2S_CON1,
86
AFE_I2S_CON2,
87
AFE_I2S_CON3,
88
AFE_ADDA_UL_SRC_CON0,
89
AFE_AUD_PAD_TOP,
90
AFE_HD_ENGEN_ENABLE,
91
};
92
93
static const struct snd_pcm_hardware mt8365_afe_hardware = {
94
.info = (SNDRV_PCM_INFO_MMAP |
95
SNDRV_PCM_INFO_INTERLEAVED |
96
SNDRV_PCM_INFO_MMAP_VALID),
97
.buffer_bytes_max = 256 * 1024,
98
.period_bytes_min = 512,
99
.period_bytes_max = 128 * 1024,
100
.periods_min = 2,
101
.periods_max = 256,
102
.fifo_size = 0,
103
};
104
105
struct mt8365_afe_rate {
106
unsigned int rate;
107
unsigned int reg_val;
108
};
109
110
static const struct mt8365_afe_rate mt8365_afe_fs_rates[] = {
111
{ .rate = 8000, .reg_val = MT8365_FS_8K },
112
{ .rate = 11025, .reg_val = MT8365_FS_11D025K },
113
{ .rate = 12000, .reg_val = MT8365_FS_12K },
114
{ .rate = 16000, .reg_val = MT8365_FS_16K },
115
{ .rate = 22050, .reg_val = MT8365_FS_22D05K },
116
{ .rate = 24000, .reg_val = MT8365_FS_24K },
117
{ .rate = 32000, .reg_val = MT8365_FS_32K },
118
{ .rate = 44100, .reg_val = MT8365_FS_44D1K },
119
{ .rate = 48000, .reg_val = MT8365_FS_48K },
120
{ .rate = 88200, .reg_val = MT8365_FS_88D2K },
121
{ .rate = 96000, .reg_val = MT8365_FS_96K },
122
{ .rate = 176400, .reg_val = MT8365_FS_176D4K },
123
{ .rate = 192000, .reg_val = MT8365_FS_192K },
124
};
125
126
int mt8365_afe_fs_timing(unsigned int rate)
127
{
128
int i;
129
130
for (i = 0; i < ARRAY_SIZE(mt8365_afe_fs_rates); i++)
131
if (mt8365_afe_fs_rates[i].rate == rate)
132
return mt8365_afe_fs_rates[i].reg_val;
133
134
return -EINVAL;
135
}
136
137
bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id)
138
{
139
switch (id) {
140
case MT8365_AFE_IO_TDM_IN:
141
if (rate >= 8000 && rate <= 192000)
142
return true;
143
break;
144
case MT8365_AFE_IO_DMIC:
145
if (rate >= 8000 && rate <= 48000)
146
return true;
147
break;
148
default:
149
break;
150
}
151
152
return false;
153
}
154
155
bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id)
156
{
157
switch (id) {
158
case MT8365_AFE_IO_TDM_IN:
159
if (channel >= 1 && channel <= 8)
160
return true;
161
break;
162
case MT8365_AFE_IO_DMIC:
163
if (channel >= 1 && channel <= 8)
164
return true;
165
break;
166
default:
167
break;
168
}
169
170
return false;
171
}
172
173
static bool mt8365_afe_clk_group_44k(int sample_rate)
174
{
175
if (sample_rate == 11025 ||
176
sample_rate == 22050 ||
177
sample_rate == 44100 ||
178
sample_rate == 88200 ||
179
sample_rate == 176400)
180
return true;
181
else
182
return false;
183
}
184
185
static bool mt8365_afe_clk_group_48k(int sample_rate)
186
{
187
return (!mt8365_afe_clk_group_44k(sample_rate));
188
}
189
190
int mt8365_dai_set_priv(struct mtk_base_afe *afe, int id,
191
int priv_size, const void *priv_data)
192
{
193
struct mt8365_afe_private *afe_priv = afe->platform_priv;
194
void *temp_data;
195
196
temp_data = devm_kzalloc(afe->dev, priv_size, GFP_KERNEL);
197
if (!temp_data)
198
return -ENOMEM;
199
200
if (priv_data)
201
memcpy(temp_data, priv_data, priv_size);
202
203
afe_priv->dai_priv[id] = temp_data;
204
205
return 0;
206
}
207
208
static int mt8365_afe_irq_direction_enable(struct mtk_base_afe *afe,
209
int irq_id, int direction)
210
{
211
struct mtk_base_afe_irq *irq;
212
213
if (irq_id >= MT8365_AFE_IRQ_NUM)
214
return -1;
215
216
irq = &afe->irqs[irq_id];
217
218
if (direction == MT8365_AFE_IRQ_DIR_MCU) {
219
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN,
220
(1 << irq->irq_data->irq_clr_shift),
221
0);
222
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN,
223
(1 << irq->irq_data->irq_clr_shift),
224
(1 << irq->irq_data->irq_clr_shift));
225
} else if (direction == MT8365_AFE_IRQ_DIR_DSP) {
226
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN,
227
(1 << irq->irq_data->irq_clr_shift),
228
(1 << irq->irq_data->irq_clr_shift));
229
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN,
230
(1 << irq->irq_data->irq_clr_shift),
231
0);
232
} else {
233
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_DSP_EN,
234
(1 << irq->irq_data->irq_clr_shift),
235
(1 << irq->irq_data->irq_clr_shift));
236
regmap_update_bits(afe->regmap, AFE_IRQ_MCU_EN,
237
(1 << irq->irq_data->irq_clr_shift),
238
(1 << irq->irq_data->irq_clr_shift));
239
}
240
return 0;
241
}
242
243
static int mt8365_memif_fs(struct snd_pcm_substream *substream,
244
unsigned int rate)
245
{
246
return mt8365_afe_fs_timing(rate);
247
}
248
249
static int mt8365_irq_fs(struct snd_pcm_substream *substream,
250
unsigned int rate)
251
{
252
return mt8365_memif_fs(substream, rate);
253
}
254
255
static const struct mt8365_cm_ctrl_reg cm_ctrl_reg[MT8365_CM_NUM] = {
256
[MT8365_CM1] = {
257
.con0 = AFE_CM1_CON0,
258
.con1 = AFE_CM1_CON1,
259
.con2 = AFE_CM1_CON2,
260
.con3 = AFE_CM1_CON3,
261
.con4 = AFE_CM1_CON4,
262
},
263
[MT8365_CM2] = {
264
.con0 = AFE_CM2_CON0,
265
.con1 = AFE_CM2_CON1,
266
.con2 = AFE_CM2_CON2,
267
.con3 = AFE_CM2_CON3,
268
.con4 = AFE_CM2_CON4,
269
}
270
};
271
272
static int mt8365_afe_cm2_mux_conn(struct mtk_base_afe *afe)
273
{
274
struct mt8365_afe_private *afe_priv = afe->platform_priv;
275
unsigned int input = afe_priv->cm2_mux_input;
276
277
/* TDM_IN interconnect to CM2 */
278
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
279
CM2_AFE_CM2_CONN_CFG1_MASK,
280
CM2_AFE_CM2_CONN_CFG1(TDM_IN_CH0));
281
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
282
CM2_AFE_CM2_CONN_CFG2_MASK,
283
CM2_AFE_CM2_CONN_CFG2(TDM_IN_CH1));
284
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
285
CM2_AFE_CM2_CONN_CFG3_MASK,
286
CM2_AFE_CM2_CONN_CFG3(TDM_IN_CH2));
287
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
288
CM2_AFE_CM2_CONN_CFG4_MASK,
289
CM2_AFE_CM2_CONN_CFG4(TDM_IN_CH3));
290
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
291
CM2_AFE_CM2_CONN_CFG5_MASK,
292
CM2_AFE_CM2_CONN_CFG5(TDM_IN_CH4));
293
regmap_update_bits(afe->regmap, AFE_CM2_CONN0,
294
CM2_AFE_CM2_CONN_CFG6_MASK,
295
CM2_AFE_CM2_CONN_CFG6(TDM_IN_CH5));
296
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
297
CM2_AFE_CM2_CONN_CFG7_MASK,
298
CM2_AFE_CM2_CONN_CFG7(TDM_IN_CH6));
299
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
300
CM2_AFE_CM2_CONN_CFG8_MASK,
301
CM2_AFE_CM2_CONN_CFG8(TDM_IN_CH7));
302
303
/* ref data interconnect to CM2 */
304
if (input == MT8365_FROM_GASRC1) {
305
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
306
CM2_AFE_CM2_CONN_CFG9_MASK,
307
CM2_AFE_CM2_CONN_CFG9(GENERAL1_ASRC_OUT_LCH));
308
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
309
CM2_AFE_CM2_CONN_CFG10_MASK,
310
CM2_AFE_CM2_CONN_CFG10(GENERAL1_ASRC_OUT_RCH));
311
} else if (input == MT8365_FROM_GASRC2) {
312
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
313
CM2_AFE_CM2_CONN_CFG9_MASK,
314
CM2_AFE_CM2_CONN_CFG9(GENERAL2_ASRC_OUT_LCH));
315
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
316
CM2_AFE_CM2_CONN_CFG10_MASK,
317
CM2_AFE_CM2_CONN_CFG10(GENERAL2_ASRC_OUT_RCH));
318
} else if (input == MT8365_FROM_TDM_ASRC) {
319
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
320
CM2_AFE_CM2_CONN_CFG9_MASK,
321
CM2_AFE_CM2_CONN_CFG9(TDM_OUT_ASRC_CH0));
322
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
323
CM2_AFE_CM2_CONN_CFG10_MASK,
324
CM2_AFE_CM2_CONN_CFG10(TDM_OUT_ASRC_CH1));
325
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
326
CM2_AFE_CM2_CONN_CFG11_MASK,
327
CM2_AFE_CM2_CONN_CFG11(TDM_OUT_ASRC_CH2));
328
regmap_update_bits(afe->regmap, AFE_CM2_CONN1,
329
CM2_AFE_CM2_CONN_CFG12_MASK,
330
CM2_AFE_CM2_CONN_CFG12(TDM_OUT_ASRC_CH3));
331
regmap_update_bits(afe->regmap, AFE_CM2_CONN2,
332
CM2_AFE_CM2_CONN_CFG13_MASK,
333
CM2_AFE_CM2_CONN_CFG13(TDM_OUT_ASRC_CH4));
334
regmap_update_bits(afe->regmap, AFE_CM2_CONN2,
335
CM2_AFE_CM2_CONN_CFG14_MASK,
336
CM2_AFE_CM2_CONN_CFG14(TDM_OUT_ASRC_CH5));
337
regmap_update_bits(afe->regmap, AFE_CM2_CONN2,
338
CM2_AFE_CM2_CONN_CFG15_MASK,
339
CM2_AFE_CM2_CONN_CFG15(TDM_OUT_ASRC_CH6));
340
regmap_update_bits(afe->regmap, AFE_CM2_CONN2,
341
CM2_AFE_CM2_CONN_CFG16_MASK,
342
CM2_AFE_CM2_CONN_CFG16(TDM_OUT_ASRC_CH7));
343
} else {
344
dev_err(afe->dev, "%s wrong CM2 input %d\n", __func__, input);
345
return -1;
346
}
347
348
return 0;
349
}
350
351
static int mt8365_afe_get_cm_update_cnt(struct mtk_base_afe *afe,
352
enum mt8365_cm_num cmNum,
353
unsigned int rate, unsigned int channel)
354
{
355
unsigned int total_cnt, div_cnt, ch_pair, best_cnt;
356
unsigned int ch_update_cnt[MT8365_CM_UPDATA_CNT_SET];
357
int i;
358
359
/* calculate cm update cnt
360
* total_cnt = clk / fs, clk is 26m or 24m or 22m
361
* div_cnt = total_cnt / ch_pair, max ch 16ch ,2ch is a set
362
* best_cnt < div_cnt ,we set best_cnt = div_cnt -10
363
* ch01 = best_cnt, ch23 = 2* ch01_up_cnt
364
* ch45 = 3* ch01_up_cnt ...ch1415 = 8* ch01_up_cnt
365
*/
366
367
if (cmNum == MT8365_CM1) {
368
total_cnt = MT8365_CLK_26M / rate;
369
} else if (cmNum == MT8365_CM2) {
370
if (mt8365_afe_clk_group_48k(rate))
371
total_cnt = MT8365_CLK_24M / rate;
372
else
373
total_cnt = MT8365_CLK_22M / rate;
374
} else {
375
return -1;
376
}
377
378
if (channel % 2)
379
ch_pair = (channel / 2) + 1;
380
else
381
ch_pair = channel / 2;
382
383
div_cnt = total_cnt / ch_pair;
384
best_cnt = div_cnt - 10;
385
386
if (best_cnt <= 0)
387
return -1;
388
389
for (i = 0; i < ch_pair; i++)
390
ch_update_cnt[i] = (i + 1) * best_cnt;
391
392
switch (channel) {
393
case 16:
394
fallthrough;
395
case 15:
396
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con4,
397
CM_AFE_CM_UPDATE_CNT2_MASK,
398
CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[7]));
399
fallthrough;
400
case 14:
401
fallthrough;
402
case 13:
403
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con4,
404
CM_AFE_CM_UPDATE_CNT1_MASK,
405
CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[6]));
406
fallthrough;
407
case 12:
408
fallthrough;
409
case 11:
410
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con3,
411
CM_AFE_CM_UPDATE_CNT2_MASK,
412
CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[5]));
413
fallthrough;
414
case 10:
415
fallthrough;
416
case 9:
417
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con3,
418
CM_AFE_CM_UPDATE_CNT1_MASK,
419
CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[4]));
420
fallthrough;
421
case 8:
422
fallthrough;
423
case 7:
424
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con2,
425
CM_AFE_CM_UPDATE_CNT2_MASK,
426
CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[3]));
427
fallthrough;
428
case 6:
429
fallthrough;
430
case 5:
431
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con2,
432
CM_AFE_CM_UPDATE_CNT1_MASK,
433
CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[2]));
434
fallthrough;
435
case 4:
436
fallthrough;
437
case 3:
438
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con1,
439
CM_AFE_CM_UPDATE_CNT2_MASK,
440
CM_AFE_CM_UPDATE_CNT2(ch_update_cnt[1]));
441
fallthrough;
442
case 2:
443
fallthrough;
444
case 1:
445
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con1,
446
CM_AFE_CM_UPDATE_CNT1_MASK,
447
CM_AFE_CM_UPDATE_CNT1(ch_update_cnt[0]));
448
break;
449
default:
450
return -1;
451
}
452
453
return 0;
454
}
455
456
static int mt8365_afe_configure_cm(struct mtk_base_afe *afe,
457
enum mt8365_cm_num cmNum,
458
unsigned int channels,
459
unsigned int rate)
460
{
461
unsigned int val, mask;
462
unsigned int fs = mt8365_afe_fs_timing(rate);
463
464
val = FIELD_PREP(CM_AFE_CM_CH_NUM_MASK, (channels - 1)) |
465
FIELD_PREP(CM_AFE_CM_START_DATA_MASK, 0);
466
467
mask = CM_AFE_CM_CH_NUM_MASK |
468
CM_AFE_CM_START_DATA_MASK;
469
470
if (cmNum == MT8365_CM1) {
471
val |= FIELD_PREP(CM_AFE_CM1_IN_MODE_MASK, fs);
472
473
mask |= CM_AFE_CM1_VUL_SEL |
474
CM_AFE_CM1_IN_MODE_MASK;
475
} else if (cmNum == MT8365_CM2) {
476
if (mt8365_afe_clk_group_48k(rate))
477
val |= FIELD_PREP(CM_AFE_CM2_CLK_SEL, 0);
478
else
479
val |= FIELD_PREP(CM_AFE_CM2_CLK_SEL, 1);
480
481
val |= FIELD_PREP(CM_AFE_CM2_TDM_SEL, 1);
482
483
mask |= CM_AFE_CM2_TDM_SEL |
484
CM_AFE_CM1_IN_MODE_MASK |
485
CM_AFE_CM2_CLK_SEL;
486
487
mt8365_afe_cm2_mux_conn(afe);
488
} else {
489
return -1;
490
}
491
492
regmap_update_bits(afe->regmap, cm_ctrl_reg[cmNum].con0, mask, val);
493
494
mt8365_afe_get_cm_update_cnt(afe, cmNum, rate, channels);
495
496
return 0;
497
}
498
499
static int mt8365_afe_fe_startup(struct snd_pcm_substream *substream,
500
struct snd_soc_dai *dai)
501
{
502
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
503
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
504
struct snd_pcm_runtime *runtime = substream->runtime;
505
int memif_num = snd_soc_rtd_to_cpu(rtd, 0)->id;
506
struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
507
int ret;
508
509
memif->substream = substream;
510
511
snd_pcm_hw_constraint_step(substream->runtime, 0,
512
SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 16);
513
514
snd_soc_set_runtime_hwparams(substream, afe->mtk_afe_hardware);
515
516
ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
517
if (ret < 0)
518
dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
519
520
mt8365_afe_enable_main_clk(afe);
521
return ret;
522
}
523
524
static void mt8365_afe_fe_shutdown(struct snd_pcm_substream *substream,
525
struct snd_soc_dai *dai)
526
{
527
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
528
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
529
int memif_num = snd_soc_rtd_to_cpu(rtd, 0)->id;
530
struct mtk_base_afe_memif *memif = &afe->memif[memif_num];
531
532
memif->substream = NULL;
533
534
mt8365_afe_disable_main_clk(afe);
535
}
536
537
static int mt8365_afe_fe_hw_params(struct snd_pcm_substream *substream,
538
struct snd_pcm_hw_params *params,
539
struct snd_soc_dai *dai)
540
{
541
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
542
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
543
struct mt8365_afe_private *afe_priv = afe->platform_priv;
544
struct mt8365_control_data *ctrl_data = &afe_priv->ctrl_data;
545
int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
546
struct mtk_base_afe_memif *memif = &afe->memif[dai_id];
547
struct mt8365_fe_dai_data *fe_data = &afe_priv->fe_data[dai_id];
548
size_t request_size = params_buffer_bytes(params);
549
unsigned int channels = params_channels(params);
550
unsigned int rate = params_rate(params);
551
unsigned int base_end_offset = 8;
552
int ret, fs;
553
554
dev_info(afe->dev, "%s %s period = %d rate = %d channels = %d\n",
555
__func__, memif->data->name, params_period_size(params),
556
rate, channels);
557
558
if (dai_id == MT8365_AFE_MEMIF_VUL2) {
559
if (!ctrl_data->bypass_cm1)
560
/* configure cm1 */
561
mt8365_afe_configure_cm(afe, MT8365_CM1,
562
channels, rate);
563
else
564
regmap_update_bits(afe->regmap, AFE_CM1_CON0,
565
CM_AFE_CM1_VUL_SEL,
566
CM_AFE_CM1_VUL_SEL);
567
} else if (dai_id == MT8365_AFE_MEMIF_TDM_IN) {
568
if (!ctrl_data->bypass_cm2)
569
/* configure cm2 */
570
mt8365_afe_configure_cm(afe, MT8365_CM2,
571
channels, rate);
572
else
573
regmap_update_bits(afe->regmap, AFE_CM2_CON0,
574
CM_AFE_CM2_TDM_SEL,
575
~CM_AFE_CM2_TDM_SEL);
576
577
base_end_offset = 4;
578
}
579
580
if (request_size > fe_data->sram_size) {
581
ret = snd_pcm_lib_malloc_pages(substream, request_size);
582
if (ret < 0) {
583
dev_err(afe->dev,
584
"%s %s malloc pages %zu bytes failed %d\n",
585
__func__, memif->data->name, request_size, ret);
586
return ret;
587
}
588
589
fe_data->use_sram = false;
590
591
mt8365_afe_emi_clk_on(afe);
592
} else {
593
struct snd_dma_buffer *dma_buf = &substream->dma_buffer;
594
595
dma_buf->dev.type = SNDRV_DMA_TYPE_DEV;
596
dma_buf->dev.dev = substream->pcm->card->dev;
597
dma_buf->area = (unsigned char *)fe_data->sram_vir_addr;
598
dma_buf->addr = fe_data->sram_phy_addr;
599
dma_buf->bytes = request_size;
600
snd_pcm_set_runtime_buffer(substream, dma_buf);
601
602
fe_data->use_sram = true;
603
}
604
605
memif->phys_buf_addr = lower_32_bits(substream->runtime->dma_addr);
606
memif->buffer_size = substream->runtime->dma_bytes;
607
608
/* start */
609
regmap_write(afe->regmap, memif->data->reg_ofs_base,
610
memif->phys_buf_addr);
611
/* end */
612
regmap_write(afe->regmap,
613
memif->data->reg_ofs_base + base_end_offset,
614
memif->phys_buf_addr + memif->buffer_size - 1);
615
616
/* set channel */
617
if (memif->data->mono_shift >= 0) {
618
unsigned int mono = (params_channels(params) == 1) ? 1 : 0;
619
620
if (memif->data->mono_reg < 0)
621
dev_info(afe->dev, "%s mono_reg is NULL\n", __func__);
622
else
623
regmap_update_bits(afe->regmap, memif->data->mono_reg,
624
1 << memif->data->mono_shift,
625
mono << memif->data->mono_shift);
626
}
627
628
/* set rate */
629
if (memif->data->fs_shift < 0)
630
return 0;
631
632
fs = afe->memif_fs(substream, params_rate(params));
633
634
if (fs < 0)
635
return -EINVAL;
636
637
if (memif->data->fs_reg < 0)
638
dev_info(afe->dev, "%s fs_reg is NULL\n", __func__);
639
else
640
regmap_update_bits(afe->regmap, memif->data->fs_reg,
641
memif->data->fs_maskbit << memif->data->fs_shift,
642
fs << memif->data->fs_shift);
643
644
return 0;
645
}
646
647
static int mt8365_afe_fe_hw_free(struct snd_pcm_substream *substream,
648
struct snd_soc_dai *dai)
649
{
650
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
651
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
652
struct mt8365_afe_private *afe_priv = afe->platform_priv;
653
int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
654
struct mt8365_fe_dai_data *fe_data = &afe_priv->fe_data[dai_id];
655
int ret = 0;
656
657
if (fe_data->use_sram) {
658
snd_pcm_set_runtime_buffer(substream, NULL);
659
} else {
660
ret = snd_pcm_lib_free_pages(substream);
661
662
mt8365_afe_emi_clk_off(afe);
663
}
664
665
return ret;
666
}
667
668
static int mt8365_afe_fe_prepare(struct snd_pcm_substream *substream,
669
struct snd_soc_dai *dai)
670
{
671
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
672
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
673
int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
674
struct mtk_base_afe_memif *memif = &afe->memif[dai_id];
675
676
/* set format */
677
if (memif->data->hd_reg >= 0) {
678
switch (substream->runtime->format) {
679
case SNDRV_PCM_FORMAT_S16_LE:
680
regmap_update_bits(afe->regmap, memif->data->hd_reg,
681
3 << memif->data->hd_shift,
682
0 << memif->data->hd_shift);
683
break;
684
case SNDRV_PCM_FORMAT_S32_LE:
685
regmap_update_bits(afe->regmap, memif->data->hd_reg,
686
3 << memif->data->hd_shift,
687
3 << memif->data->hd_shift);
688
689
if (dai_id == MT8365_AFE_MEMIF_TDM_IN) {
690
regmap_update_bits(afe->regmap,
691
memif->data->hd_reg,
692
3 << memif->data->hd_shift,
693
1 << memif->data->hd_shift);
694
regmap_update_bits(afe->regmap,
695
memif->data->hd_reg,
696
1 << memif->data->hd_align_mshift,
697
1 << memif->data->hd_align_mshift);
698
}
699
break;
700
case SNDRV_PCM_FORMAT_S24_LE:
701
regmap_update_bits(afe->regmap, memif->data->hd_reg,
702
3 << memif->data->hd_shift,
703
1 << memif->data->hd_shift);
704
break;
705
default:
706
return -EINVAL;
707
}
708
}
709
710
mt8365_afe_irq_direction_enable(afe, memif->irq_usage,
711
MT8365_AFE_IRQ_DIR_MCU);
712
713
return 0;
714
}
715
716
static int mt8365_afe_fe_trigger(struct snd_pcm_substream *substream, int cmd,
717
struct snd_soc_dai *dai)
718
{
719
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
720
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
721
struct mt8365_afe_private *afe_priv = afe->platform_priv;
722
int dai_id = snd_soc_rtd_to_cpu(rtd, 0)->id;
723
struct mt8365_control_data *ctrl_data = &afe_priv->ctrl_data;
724
725
switch (cmd) {
726
case SNDRV_PCM_TRIGGER_START:
727
case SNDRV_PCM_TRIGGER_RESUME:
728
/* enable channel merge */
729
if (dai_id == MT8365_AFE_MEMIF_VUL2 &&
730
!ctrl_data->bypass_cm1) {
731
regmap_update_bits(afe->regmap, AFE_CM1_CON0,
732
CM_AFE_CM_ON, CM_AFE_CM_ON);
733
} else if (dai_id == MT8365_AFE_MEMIF_TDM_IN &&
734
!ctrl_data->bypass_cm2) {
735
regmap_update_bits(afe->regmap, AFE_CM2_CON0,
736
CM_AFE_CM_ON, CM_AFE_CM_ON);
737
}
738
break;
739
case SNDRV_PCM_TRIGGER_STOP:
740
case SNDRV_PCM_TRIGGER_SUSPEND:
741
/* disable channel merge */
742
if (dai_id == MT8365_AFE_MEMIF_VUL2 &&
743
!ctrl_data->bypass_cm1) {
744
regmap_update_bits(afe->regmap, AFE_CM1_CON0,
745
CM_AFE_CM_ON, ~CM_AFE_CM_ON);
746
} else if (dai_id == MT8365_AFE_MEMIF_TDM_IN &&
747
!ctrl_data->bypass_cm2) {
748
regmap_update_bits(afe->regmap, AFE_CM2_CON0,
749
CM_AFE_CM_ON, ~CM_AFE_CM_ON);
750
}
751
break;
752
default:
753
break;
754
}
755
756
return mtk_afe_fe_trigger(substream, cmd, dai);
757
}
758
759
static int mt8365_afe_hw_gain1_startup(struct snd_pcm_substream *substream,
760
struct snd_soc_dai *dai)
761
{
762
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
763
764
mt8365_afe_enable_main_clk(afe);
765
return 0;
766
}
767
768
static void mt8365_afe_hw_gain1_shutdown(struct snd_pcm_substream *substream,
769
struct snd_soc_dai *dai)
770
{
771
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
772
struct mt8365_afe_private *afe_priv = afe->platform_priv;
773
struct mt8365_be_dai_data *be =
774
&afe_priv->be_data[dai->id - MT8365_AFE_BACKEND_BASE];
775
776
if (be->prepared[substream->stream]) {
777
regmap_update_bits(afe->regmap, AFE_GAIN1_CON0,
778
AFE_GAIN1_CON0_EN_MASK, 0);
779
be->prepared[substream->stream] = false;
780
}
781
mt8365_afe_disable_main_clk(afe);
782
}
783
784
static int mt8365_afe_hw_gain1_prepare(struct snd_pcm_substream *substream,
785
struct snd_soc_dai *dai)
786
{
787
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
788
struct mt8365_afe_private *afe_priv = afe->platform_priv;
789
struct mt8365_be_dai_data *be =
790
&afe_priv->be_data[dai->id - MT8365_AFE_BACKEND_BASE];
791
792
int fs;
793
unsigned int val1 = 0, val2 = 0;
794
795
if (be->prepared[substream->stream]) {
796
dev_info(afe->dev, "%s prepared already\n", __func__);
797
return 0;
798
}
799
800
fs = mt8365_afe_fs_timing(substream->runtime->rate);
801
regmap_update_bits(afe->regmap, AFE_GAIN1_CON0,
802
AFE_GAIN1_CON0_MODE_MASK, (unsigned int)fs << 4);
803
804
regmap_read(afe->regmap, AFE_GAIN1_CON1, &val1);
805
regmap_read(afe->regmap, AFE_GAIN1_CUR, &val2);
806
if ((val1 & AFE_GAIN1_CON1_MASK) != (val2 & AFE_GAIN1_CUR_MASK))
807
regmap_update_bits(afe->regmap, AFE_GAIN1_CUR,
808
AFE_GAIN1_CUR_MASK, val1);
809
810
regmap_update_bits(afe->regmap, AFE_GAIN1_CON0,
811
AFE_GAIN1_CON0_EN_MASK, 1);
812
be->prepared[substream->stream] = true;
813
814
return 0;
815
}
816
817
static const struct snd_pcm_hardware mt8365_hostless_hardware = {
818
.info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
819
SNDRV_PCM_INFO_MMAP_VALID),
820
.period_bytes_min = 256,
821
.period_bytes_max = 4 * 48 * 1024,
822
.periods_min = 2,
823
.periods_max = 256,
824
.buffer_bytes_max = 8 * 48 * 1024,
825
.fifo_size = 0,
826
};
827
828
/* dai ops */
829
static int mtk_dai_hostless_startup(struct snd_pcm_substream *substream,
830
struct snd_soc_dai *dai)
831
{
832
struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
833
struct snd_pcm_runtime *runtime = substream->runtime;
834
int ret;
835
836
snd_soc_set_runtime_hwparams(substream, &mt8365_hostless_hardware);
837
838
ret = snd_pcm_hw_constraint_integer(runtime,
839
SNDRV_PCM_HW_PARAM_PERIODS);
840
if (ret < 0)
841
dev_err(afe->dev, "snd_pcm_hw_constraint_integer failed\n");
842
return ret;
843
}
844
845
/* FE DAIs */
846
static const struct snd_soc_dai_ops mt8365_afe_fe_dai_ops = {
847
.startup = mt8365_afe_fe_startup,
848
.shutdown = mt8365_afe_fe_shutdown,
849
.hw_params = mt8365_afe_fe_hw_params,
850
.hw_free = mt8365_afe_fe_hw_free,
851
.prepare = mt8365_afe_fe_prepare,
852
.trigger = mt8365_afe_fe_trigger,
853
};
854
855
static const struct snd_soc_dai_ops mt8365_dai_hostless_ops = {
856
.startup = mtk_dai_hostless_startup,
857
};
858
859
static const struct snd_soc_dai_ops mt8365_afe_hw_gain1_ops = {
860
.startup = mt8365_afe_hw_gain1_startup,
861
.shutdown = mt8365_afe_hw_gain1_shutdown,
862
.prepare = mt8365_afe_hw_gain1_prepare,
863
};
864
865
static struct snd_soc_dai_driver mt8365_memif_dai_driver[] = {
866
/* FE DAIs: memory intefaces to CPU */
867
{
868
.name = "DL1",
869
.id = MT8365_AFE_MEMIF_DL1,
870
.playback = {
871
.stream_name = "DL1",
872
.channels_min = 1,
873
.channels_max = 2,
874
.rates = SNDRV_PCM_RATE_8000_192000,
875
.formats = SNDRV_PCM_FMTBIT_S16_LE |
876
SNDRV_PCM_FMTBIT_S32_LE,
877
},
878
.ops = &mt8365_afe_fe_dai_ops,
879
}, {
880
.name = "DL2",
881
.id = MT8365_AFE_MEMIF_DL2,
882
.playback = {
883
.stream_name = "DL2",
884
.channels_min = 1,
885
.channels_max = 2,
886
.rates = SNDRV_PCM_RATE_8000_192000,
887
.formats = SNDRV_PCM_FMTBIT_S16_LE |
888
SNDRV_PCM_FMTBIT_S32_LE,
889
},
890
.ops = &mt8365_afe_fe_dai_ops,
891
}, {
892
.name = "TDM_OUT",
893
.id = MT8365_AFE_MEMIF_TDM_OUT,
894
.playback = {
895
.stream_name = "TDM_OUT",
896
.channels_min = 1,
897
.channels_max = 8,
898
.rates = SNDRV_PCM_RATE_8000_192000,
899
.formats = SNDRV_PCM_FMTBIT_S16_LE |
900
SNDRV_PCM_FMTBIT_S32_LE,
901
},
902
.ops = &mt8365_afe_fe_dai_ops,
903
}, {
904
.name = "AWB",
905
.id = MT8365_AFE_MEMIF_AWB,
906
.capture = {
907
.stream_name = "AWB",
908
.channels_min = 1,
909
.channels_max = 2,
910
.rates = SNDRV_PCM_RATE_8000_192000,
911
.formats = SNDRV_PCM_FMTBIT_S16_LE |
912
SNDRV_PCM_FMTBIT_S32_LE,
913
},
914
.ops = &mt8365_afe_fe_dai_ops,
915
}, {
916
.name = "VUL",
917
.id = MT8365_AFE_MEMIF_VUL,
918
.capture = {
919
.stream_name = "VUL",
920
.channels_min = 1,
921
.channels_max = 2,
922
.rates = SNDRV_PCM_RATE_8000_192000,
923
.formats = SNDRV_PCM_FMTBIT_S16_LE |
924
SNDRV_PCM_FMTBIT_S32_LE,
925
},
926
.ops = &mt8365_afe_fe_dai_ops,
927
}, {
928
.name = "VUL2",
929
.id = MT8365_AFE_MEMIF_VUL2,
930
.capture = {
931
.stream_name = "VUL2",
932
.channels_min = 1,
933
.channels_max = 16,
934
.rates = SNDRV_PCM_RATE_8000_192000,
935
.formats = SNDRV_PCM_FMTBIT_S16_LE |
936
SNDRV_PCM_FMTBIT_S32_LE,
937
},
938
.ops = &mt8365_afe_fe_dai_ops,
939
}, {
940
.name = "VUL3",
941
.id = MT8365_AFE_MEMIF_VUL3,
942
.capture = {
943
.stream_name = "VUL3",
944
.channels_min = 1,
945
.channels_max = 2,
946
.rates = SNDRV_PCM_RATE_8000_192000,
947
.formats = SNDRV_PCM_FMTBIT_S16_LE |
948
SNDRV_PCM_FMTBIT_S32_LE,
949
},
950
.ops = &mt8365_afe_fe_dai_ops,
951
}, {
952
.name = "TDM_IN",
953
.id = MT8365_AFE_MEMIF_TDM_IN,
954
.capture = {
955
.stream_name = "TDM_IN",
956
.channels_min = 1,
957
.channels_max = 16,
958
.rates = SNDRV_PCM_RATE_8000_192000,
959
.formats = SNDRV_PCM_FMTBIT_S16_LE |
960
SNDRV_PCM_FMTBIT_S32_LE,
961
},
962
.ops = &mt8365_afe_fe_dai_ops,
963
}, {
964
.name = "Hostless FM DAI",
965
.id = MT8365_AFE_IO_VIRTUAL_FM,
966
.playback = {
967
.stream_name = "Hostless FM DL",
968
.channels_min = 1,
969
.channels_max = 2,
970
.rates = SNDRV_PCM_RATE_8000_192000,
971
.formats = SNDRV_PCM_FMTBIT_S16_LE |
972
SNDRV_PCM_FMTBIT_S24_LE |
973
SNDRV_PCM_FMTBIT_S32_LE,
974
},
975
.capture = {
976
.stream_name = "Hostless FM UL",
977
.channels_min = 1,
978
.channels_max = 2,
979
.rates = SNDRV_PCM_RATE_8000_192000,
980
.formats = SNDRV_PCM_FMTBIT_S16_LE |
981
SNDRV_PCM_FMTBIT_S24_LE |
982
SNDRV_PCM_FMTBIT_S32_LE,
983
},
984
.ops = &mt8365_dai_hostless_ops,
985
}, {
986
.name = "HW_GAIN1",
987
.id = MT8365_AFE_IO_HW_GAIN1,
988
.playback = {
989
.stream_name = "HW Gain 1 In",
990
.channels_min = 1,
991
.channels_max = 2,
992
.rates = SNDRV_PCM_RATE_8000_192000,
993
.formats = SNDRV_PCM_FMTBIT_S16_LE |
994
SNDRV_PCM_FMTBIT_S24_LE |
995
SNDRV_PCM_FMTBIT_S32_LE,
996
},
997
.capture = {
998
.stream_name = "HW Gain 1 Out",
999
.channels_min = 1,
1000
.channels_max = 2,
1001
.rates = SNDRV_PCM_RATE_8000_192000,
1002
.formats = SNDRV_PCM_FMTBIT_S16_LE |
1003
SNDRV_PCM_FMTBIT_S24_LE |
1004
SNDRV_PCM_FMTBIT_S32_LE,
1005
},
1006
.ops = &mt8365_afe_hw_gain1_ops,
1007
.symmetric_rate = 1,
1008
.symmetric_channels = 1,
1009
.symmetric_sample_bits = 1,
1010
},
1011
};
1012
1013
static const struct snd_kcontrol_new mt8365_afe_o00_mix[] = {
1014
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN0, 5, 1, 0),
1015
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN0, 7, 1, 0),
1016
};
1017
1018
static const struct snd_kcontrol_new mt8365_afe_o01_mix[] = {
1019
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN1, 6, 1, 0),
1020
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN1, 8, 1, 0),
1021
};
1022
1023
static const struct snd_kcontrol_new mt8365_afe_o03_mix[] = {
1024
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN3, 5, 1, 0),
1025
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN3, 7, 1, 0),
1026
SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN3, 0, 1, 0),
1027
SOC_DAPM_SINGLE_AUTODISABLE("I10 Switch", AFE_CONN3, 10, 1, 0),
1028
};
1029
1030
static const struct snd_kcontrol_new mt8365_afe_o04_mix[] = {
1031
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN4, 6, 1, 0),
1032
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN4, 8, 1, 0),
1033
SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN4, 1, 1, 0),
1034
SOC_DAPM_SINGLE_AUTODISABLE("I11 Switch", AFE_CONN4, 11, 1, 0),
1035
};
1036
1037
static const struct snd_kcontrol_new mt8365_afe_o05_mix[] = {
1038
SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN5, 0, 1, 0),
1039
SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN5, 3, 1, 0),
1040
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN5, 5, 1, 0),
1041
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN5, 7, 1, 0),
1042
SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN5, 9, 1, 0),
1043
SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN5, 14, 1, 0),
1044
SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN5, 16, 1, 0),
1045
SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN5, 18, 1, 0),
1046
SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN5, 20, 1, 0),
1047
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN5, 23, 1, 0),
1048
SOC_DAPM_SINGLE_AUTODISABLE("I10L Switch", AFE_CONN5, 10, 1, 0),
1049
};
1050
1051
static const struct snd_kcontrol_new mt8365_afe_o06_mix[] = {
1052
SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN6, 1, 1, 0),
1053
SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN6, 4, 1, 0),
1054
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN6, 6, 1, 0),
1055
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN6, 8, 1, 0),
1056
SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN6, 22, 1, 0),
1057
SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN6, 15, 1, 0),
1058
SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN6, 17, 1, 0),
1059
SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN6, 19, 1, 0),
1060
SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN6, 21, 1, 0),
1061
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN6, 24, 1, 0),
1062
SOC_DAPM_SINGLE_AUTODISABLE("I11L Switch", AFE_CONN6, 11, 1, 0),
1063
};
1064
1065
static const struct snd_kcontrol_new mt8365_afe_o07_mix[] = {
1066
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN7, 5, 1, 0),
1067
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN7, 7, 1, 0),
1068
};
1069
1070
static const struct snd_kcontrol_new mt8365_afe_o08_mix[] = {
1071
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN8, 6, 1, 0),
1072
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN8, 8, 1, 0),
1073
};
1074
1075
static const struct snd_kcontrol_new mt8365_afe_o09_mix[] = {
1076
SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN9, 0, 1, 0),
1077
SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN9, 3, 1, 0),
1078
SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN9, 9, 1, 0),
1079
SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN9, 14, 1, 0),
1080
SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN9, 16, 1, 0),
1081
SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN9, 18, 1, 0),
1082
SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN9, 20, 1, 0),
1083
};
1084
1085
static const struct snd_kcontrol_new mt8365_afe_o10_mix[] = {
1086
SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN10, 1, 1, 0),
1087
SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN10, 4, 1, 0),
1088
SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN10, 22, 1, 0),
1089
SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN10, 15, 1, 0),
1090
SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN10, 17, 1, 0),
1091
SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN10, 19, 1, 0),
1092
SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN10, 21, 1, 0),
1093
};
1094
1095
static const struct snd_kcontrol_new mt8365_afe_o11_mix[] = {
1096
SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN11, 0, 1, 0),
1097
SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN11, 3, 1, 0),
1098
SOC_DAPM_SINGLE_AUTODISABLE("I09 Switch", AFE_CONN11, 9, 1, 0),
1099
SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN11, 14, 1, 0),
1100
SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN11, 16, 1, 0),
1101
SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN11, 18, 1, 0),
1102
SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN11, 20, 1, 0),
1103
};
1104
1105
static const struct snd_kcontrol_new mt8365_afe_o12_mix[] = {
1106
SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN12, 1, 1, 0),
1107
SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN12, 4, 1, 0),
1108
SOC_DAPM_SINGLE_AUTODISABLE("I22 Switch", AFE_CONN12, 22, 1, 0),
1109
SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN12, 15, 1, 0),
1110
SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN12, 17, 1, 0),
1111
SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN12, 19, 1, 0),
1112
SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN12, 21, 1, 0),
1113
};
1114
1115
static const struct snd_kcontrol_new mt8365_afe_o13_mix[] = {
1116
SOC_DAPM_SINGLE_AUTODISABLE("I00 Switch", AFE_CONN13, 0, 1, 0),
1117
};
1118
1119
static const struct snd_kcontrol_new mt8365_afe_o14_mix[] = {
1120
SOC_DAPM_SINGLE_AUTODISABLE("I01 Switch", AFE_CONN14, 1, 1, 0),
1121
};
1122
1123
static const struct snd_kcontrol_new mt8365_afe_o15_mix[] = {
1124
};
1125
1126
static const struct snd_kcontrol_new mt8365_afe_o16_mix[] = {
1127
};
1128
1129
static const struct snd_kcontrol_new mt8365_afe_o17_mix[] = {
1130
SOC_DAPM_SINGLE_AUTODISABLE("I03 Switch", AFE_CONN17, 3, 1, 0),
1131
SOC_DAPM_SINGLE_AUTODISABLE("I14 Switch", AFE_CONN17, 14, 1, 0),
1132
};
1133
1134
static const struct snd_kcontrol_new mt8365_afe_o18_mix[] = {
1135
SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN18, 4, 1, 0),
1136
SOC_DAPM_SINGLE_AUTODISABLE("I15 Switch", AFE_CONN18, 15, 1, 0),
1137
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN18, 23, 1, 0),
1138
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN18, 25, 1, 0),
1139
};
1140
1141
static const struct snd_kcontrol_new mt8365_afe_o19_mix[] = {
1142
SOC_DAPM_SINGLE_AUTODISABLE("I04 Switch", AFE_CONN19, 4, 1, 0),
1143
SOC_DAPM_SINGLE_AUTODISABLE("I16 Switch", AFE_CONN19, 16, 1, 0),
1144
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN19, 23, 1, 0),
1145
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN19, 24, 1, 0),
1146
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN19, 25, 1, 0),
1147
SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN19, 26, 1, 0),
1148
};
1149
1150
static const struct snd_kcontrol_new mt8365_afe_o20_mix[] = {
1151
SOC_DAPM_SINGLE_AUTODISABLE("I17 Switch", AFE_CONN20, 17, 1, 0),
1152
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN20, 24, 1, 0),
1153
SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN20, 26, 1, 0),
1154
};
1155
1156
static const struct snd_kcontrol_new mt8365_afe_o21_mix[] = {
1157
SOC_DAPM_SINGLE_AUTODISABLE("I18 Switch", AFE_CONN21, 18, 1, 0),
1158
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN21, 23, 1, 0),
1159
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN21, 25, 1, 0),
1160
};
1161
1162
static const struct snd_kcontrol_new mt8365_afe_o22_mix[] = {
1163
SOC_DAPM_SINGLE_AUTODISABLE("I19 Switch", AFE_CONN22, 19, 1, 0),
1164
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN22, 24, 1, 0),
1165
SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN22, 26, 1, 0),
1166
};
1167
1168
static const struct snd_kcontrol_new mt8365_afe_o23_mix[] = {
1169
SOC_DAPM_SINGLE_AUTODISABLE("I20 Switch", AFE_CONN23, 20, 1, 0),
1170
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN23, 23, 1, 0),
1171
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN23, 25, 1, 0),
1172
};
1173
1174
static const struct snd_kcontrol_new mt8365_afe_o24_mix[] = {
1175
SOC_DAPM_SINGLE_AUTODISABLE("I21 Switch", AFE_CONN24, 21, 1, 0),
1176
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN24, 24, 1, 0),
1177
SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN24, 26, 1, 0),
1178
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN24, 23, 1, 0),
1179
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN24, 25, 1, 0),
1180
};
1181
1182
static const struct snd_kcontrol_new mt8365_afe_o25_mix[] = {
1183
SOC_DAPM_SINGLE_AUTODISABLE("I27 Switch", AFE_CONN25, 27, 1, 0),
1184
SOC_DAPM_SINGLE_AUTODISABLE("I23 Switch", AFE_CONN25, 23, 1, 0),
1185
SOC_DAPM_SINGLE_AUTODISABLE("I25 Switch", AFE_CONN25, 25, 1, 0),
1186
};
1187
1188
static const struct snd_kcontrol_new mt8365_afe_o26_mix[] = {
1189
SOC_DAPM_SINGLE_AUTODISABLE("I28 Switch", AFE_CONN26, 28, 1, 0),
1190
SOC_DAPM_SINGLE_AUTODISABLE("I24 Switch", AFE_CONN26, 24, 1, 0),
1191
SOC_DAPM_SINGLE_AUTODISABLE("I26 Switch", AFE_CONN26, 26, 1, 0),
1192
};
1193
1194
static const struct snd_kcontrol_new mt8365_afe_o27_mix[] = {
1195
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN27, 5, 1, 0),
1196
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN27, 7, 1, 0),
1197
};
1198
1199
static const struct snd_kcontrol_new mt8365_afe_o28_mix[] = {
1200
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN28, 6, 1, 0),
1201
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN28, 8, 1, 0),
1202
};
1203
1204
static const struct snd_kcontrol_new mt8365_afe_o29_mix[] = {
1205
SOC_DAPM_SINGLE_AUTODISABLE("I05 Switch", AFE_CONN29, 5, 1, 0),
1206
SOC_DAPM_SINGLE_AUTODISABLE("I07 Switch", AFE_CONN29, 7, 1, 0),
1207
};
1208
1209
static const struct snd_kcontrol_new mt8365_afe_o30_mix[] = {
1210
SOC_DAPM_SINGLE_AUTODISABLE("I06 Switch", AFE_CONN30, 6, 1, 0),
1211
SOC_DAPM_SINGLE_AUTODISABLE("I08 Switch", AFE_CONN30, 8, 1, 0),
1212
};
1213
1214
static const struct snd_kcontrol_new mt8365_afe_o31_mix[] = {
1215
SOC_DAPM_SINGLE_AUTODISABLE("I29 Switch", AFE_CONN31, 29, 1, 0),
1216
};
1217
1218
static const struct snd_kcontrol_new mt8365_afe_o32_mix[] = {
1219
SOC_DAPM_SINGLE_AUTODISABLE("I30 Switch", AFE_CONN32, 30, 1, 0),
1220
};
1221
1222
static const struct snd_kcontrol_new mt8365_afe_o33_mix[] = {
1223
SOC_DAPM_SINGLE_AUTODISABLE("I31 Switch", AFE_CONN33, 31, 1, 0),
1224
};
1225
1226
static const struct snd_kcontrol_new mt8365_afe_o34_mix[] = {
1227
SOC_DAPM_SINGLE_AUTODISABLE("I32 Switch", AFE_CONN34_1, 0, 1, 0),
1228
};
1229
1230
static const struct snd_kcontrol_new mt8365_afe_o35_mix[] = {
1231
SOC_DAPM_SINGLE_AUTODISABLE("I33 Switch", AFE_CONN35_1, 1, 1, 0),
1232
};
1233
1234
static const struct snd_kcontrol_new mt8365_afe_o36_mix[] = {
1235
SOC_DAPM_SINGLE_AUTODISABLE("I34 Switch", AFE_CONN36_1, 2, 1, 0),
1236
};
1237
1238
static const struct snd_kcontrol_new mtk_hw_gain1_in_ch1_mix[] = {
1239
SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH1 Switch", AFE_CONN13,
1240
0, 1, 0),
1241
};
1242
1243
static const struct snd_kcontrol_new mtk_hw_gain1_in_ch2_mix[] = {
1244
SOC_DAPM_SINGLE_AUTODISABLE("CONNSYS_I2S_CH2 Switch", AFE_CONN14,
1245
1, 1, 0),
1246
};
1247
1248
static int mt8365_afe_cm2_io_input_mux_get(struct snd_kcontrol *kcontrol,
1249
struct snd_ctl_elem_value *ucontrol)
1250
{
1251
ucontrol->value.integer.value[0] = mCM2Input;
1252
1253
return 0;
1254
}
1255
1256
static int mt8365_afe_cm2_io_input_mux_put(struct snd_kcontrol *kcontrol,
1257
struct snd_ctl_elem_value *ucontrol)
1258
{
1259
struct snd_soc_dapm_context *dapm =
1260
snd_soc_dapm_kcontrol_dapm(kcontrol);
1261
struct snd_soc_component *comp = snd_soc_dapm_to_component(dapm);
1262
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(comp);
1263
struct mt8365_afe_private *afe_priv = afe->platform_priv;
1264
int ret;
1265
1266
mCM2Input = ucontrol->value.enumerated.item[0];
1267
1268
afe_priv->cm2_mux_input = mCM2Input;
1269
ret = snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
1270
1271
return ret;
1272
}
1273
1274
static const char * const fmhwgain_text[] = {
1275
"OPEN", "FM_HW_GAIN_IO"
1276
};
1277
1278
static const char * const ain_text[] = {
1279
"INT ADC", "EXT ADC",
1280
};
1281
1282
static const char * const vul2_in_input_text[] = {
1283
"VUL2_IN_FROM_O17O18", "VUL2_IN_FROM_CM1",
1284
};
1285
1286
static const char * const mt8365_afe_cm2_mux_text[] = {
1287
"OPEN", "FROM_GASRC1_OUT", "FROM_GASRC2_OUT", "FROM_TDM_ASRC_OUT",
1288
};
1289
1290
static SOC_ENUM_SINGLE_VIRT_DECL(fmhwgain_enum, fmhwgain_text);
1291
static SOC_ENUM_SINGLE_DECL(ain_enum, AFE_ADDA_TOP_CON0, 0, ain_text);
1292
static SOC_ENUM_SINGLE_VIRT_DECL(vul2_in_input_enum, vul2_in_input_text);
1293
static SOC_ENUM_SINGLE_VIRT_DECL(mt8365_afe_cm2_mux_input_enum,
1294
mt8365_afe_cm2_mux_text);
1295
1296
static const struct snd_kcontrol_new fmhwgain_mux =
1297
SOC_DAPM_ENUM("FM HW Gain Source", fmhwgain_enum);
1298
1299
static const struct snd_kcontrol_new ain_mux =
1300
SOC_DAPM_ENUM("AIN Source", ain_enum);
1301
1302
static const struct snd_kcontrol_new vul2_in_input_mux =
1303
SOC_DAPM_ENUM("VUL2 Input", vul2_in_input_enum);
1304
1305
static const struct snd_kcontrol_new mt8365_afe_cm2_mux_input_mux =
1306
SOC_DAPM_ENUM_EXT("CM2_MUX Source", mt8365_afe_cm2_mux_input_enum,
1307
mt8365_afe_cm2_io_input_mux_get,
1308
mt8365_afe_cm2_io_input_mux_put);
1309
1310
static const struct snd_soc_dapm_widget mt8365_memif_widgets[] = {
1311
/* inter-connections */
1312
SND_SOC_DAPM_MIXER("I00", SND_SOC_NOPM, 0, 0, NULL, 0),
1313
SND_SOC_DAPM_MIXER("I01", SND_SOC_NOPM, 0, 0, NULL, 0),
1314
SND_SOC_DAPM_MIXER("I03", SND_SOC_NOPM, 0, 0, NULL, 0),
1315
SND_SOC_DAPM_MIXER("I04", SND_SOC_NOPM, 0, 0, NULL, 0),
1316
SND_SOC_DAPM_MIXER("I05", SND_SOC_NOPM, 0, 0, NULL, 0),
1317
SND_SOC_DAPM_MIXER("I06", SND_SOC_NOPM, 0, 0, NULL, 0),
1318
SND_SOC_DAPM_MIXER("I07", SND_SOC_NOPM, 0, 0, NULL, 0),
1319
SND_SOC_DAPM_MIXER("I08", SND_SOC_NOPM, 0, 0, NULL, 0),
1320
SND_SOC_DAPM_MIXER("I05L", SND_SOC_NOPM, 0, 0, NULL, 0),
1321
SND_SOC_DAPM_MIXER("I06L", SND_SOC_NOPM, 0, 0, NULL, 0),
1322
SND_SOC_DAPM_MIXER("I07L", SND_SOC_NOPM, 0, 0, NULL, 0),
1323
SND_SOC_DAPM_MIXER("I08L", SND_SOC_NOPM, 0, 0, NULL, 0),
1324
SND_SOC_DAPM_MIXER("I09", SND_SOC_NOPM, 0, 0, NULL, 0),
1325
SND_SOC_DAPM_MIXER("I10", SND_SOC_NOPM, 0, 0, NULL, 0),
1326
SND_SOC_DAPM_MIXER("I11", SND_SOC_NOPM, 0, 0, NULL, 0),
1327
SND_SOC_DAPM_MIXER("I10L", SND_SOC_NOPM, 0, 0, NULL, 0),
1328
SND_SOC_DAPM_MIXER("I11L", SND_SOC_NOPM, 0, 0, NULL, 0),
1329
SND_SOC_DAPM_MIXER("I12", SND_SOC_NOPM, 0, 0, NULL, 0),
1330
SND_SOC_DAPM_MIXER("I13", SND_SOC_NOPM, 0, 0, NULL, 0),
1331
SND_SOC_DAPM_MIXER("I14", SND_SOC_NOPM, 0, 0, NULL, 0),
1332
SND_SOC_DAPM_MIXER("I15", SND_SOC_NOPM, 0, 0, NULL, 0),
1333
SND_SOC_DAPM_MIXER("I16", SND_SOC_NOPM, 0, 0, NULL, 0),
1334
SND_SOC_DAPM_MIXER("I17", SND_SOC_NOPM, 0, 0, NULL, 0),
1335
SND_SOC_DAPM_MIXER("I18", SND_SOC_NOPM, 0, 0, NULL, 0),
1336
SND_SOC_DAPM_MIXER("I19", SND_SOC_NOPM, 0, 0, NULL, 0),
1337
SND_SOC_DAPM_MIXER("I20", SND_SOC_NOPM, 0, 0, NULL, 0),
1338
SND_SOC_DAPM_MIXER("I21", SND_SOC_NOPM, 0, 0, NULL, 0),
1339
SND_SOC_DAPM_MIXER("I22", SND_SOC_NOPM, 0, 0, NULL, 0),
1340
SND_SOC_DAPM_MIXER("I23", SND_SOC_NOPM, 0, 0, NULL, 0),
1341
SND_SOC_DAPM_MIXER("I24", SND_SOC_NOPM, 0, 0, NULL, 0),
1342
SND_SOC_DAPM_MIXER("I25", SND_SOC_NOPM, 0, 0, NULL, 0),
1343
SND_SOC_DAPM_MIXER("I26", SND_SOC_NOPM, 0, 0, NULL, 0),
1344
SND_SOC_DAPM_MIXER("I27", SND_SOC_NOPM, 0, 0, NULL, 0),
1345
SND_SOC_DAPM_MIXER("I28", SND_SOC_NOPM, 0, 0, NULL, 0),
1346
SND_SOC_DAPM_MIXER("I29", SND_SOC_NOPM, 0, 0, NULL, 0),
1347
SND_SOC_DAPM_MIXER("I30", SND_SOC_NOPM, 0, 0, NULL, 0),
1348
SND_SOC_DAPM_MIXER("I31", SND_SOC_NOPM, 0, 0, NULL, 0),
1349
SND_SOC_DAPM_MIXER("I32", SND_SOC_NOPM, 0, 0, NULL, 0),
1350
SND_SOC_DAPM_MIXER("I33", SND_SOC_NOPM, 0, 0, NULL, 0),
1351
SND_SOC_DAPM_MIXER("I34", SND_SOC_NOPM, 0, 0, NULL, 0),
1352
SND_SOC_DAPM_MIXER("O00", SND_SOC_NOPM, 0, 0,
1353
mt8365_afe_o00_mix, ARRAY_SIZE(mt8365_afe_o00_mix)),
1354
SND_SOC_DAPM_MIXER("O01", SND_SOC_NOPM, 0, 0,
1355
mt8365_afe_o01_mix, ARRAY_SIZE(mt8365_afe_o01_mix)),
1356
SND_SOC_DAPM_MIXER("O03", SND_SOC_NOPM, 0, 0,
1357
mt8365_afe_o03_mix, ARRAY_SIZE(mt8365_afe_o03_mix)),
1358
SND_SOC_DAPM_MIXER("O04", SND_SOC_NOPM, 0, 0,
1359
mt8365_afe_o04_mix, ARRAY_SIZE(mt8365_afe_o04_mix)),
1360
SND_SOC_DAPM_MIXER("O05", SND_SOC_NOPM, 0, 0,
1361
mt8365_afe_o05_mix, ARRAY_SIZE(mt8365_afe_o05_mix)),
1362
SND_SOC_DAPM_MIXER("O06", SND_SOC_NOPM, 0, 0,
1363
mt8365_afe_o06_mix, ARRAY_SIZE(mt8365_afe_o06_mix)),
1364
SND_SOC_DAPM_MIXER("O07", SND_SOC_NOPM, 0, 0,
1365
mt8365_afe_o07_mix, ARRAY_SIZE(mt8365_afe_o07_mix)),
1366
SND_SOC_DAPM_MIXER("O08", SND_SOC_NOPM, 0, 0,
1367
mt8365_afe_o08_mix, ARRAY_SIZE(mt8365_afe_o08_mix)),
1368
SND_SOC_DAPM_MIXER("O09", SND_SOC_NOPM, 0, 0,
1369
mt8365_afe_o09_mix, ARRAY_SIZE(mt8365_afe_o09_mix)),
1370
SND_SOC_DAPM_MIXER("O10", SND_SOC_NOPM, 0, 0,
1371
mt8365_afe_o10_mix, ARRAY_SIZE(mt8365_afe_o10_mix)),
1372
SND_SOC_DAPM_MIXER("O11", SND_SOC_NOPM, 0, 0,
1373
mt8365_afe_o11_mix, ARRAY_SIZE(mt8365_afe_o11_mix)),
1374
SND_SOC_DAPM_MIXER("O12", SND_SOC_NOPM, 0, 0,
1375
mt8365_afe_o12_mix, ARRAY_SIZE(mt8365_afe_o12_mix)),
1376
SND_SOC_DAPM_MIXER("O13", SND_SOC_NOPM, 0, 0,
1377
mt8365_afe_o13_mix, ARRAY_SIZE(mt8365_afe_o13_mix)),
1378
SND_SOC_DAPM_MIXER("O14", SND_SOC_NOPM, 0, 0,
1379
mt8365_afe_o14_mix, ARRAY_SIZE(mt8365_afe_o14_mix)),
1380
SND_SOC_DAPM_MIXER("O15", SND_SOC_NOPM, 0, 0,
1381
mt8365_afe_o15_mix, ARRAY_SIZE(mt8365_afe_o15_mix)),
1382
SND_SOC_DAPM_MIXER("O16", SND_SOC_NOPM, 0, 0,
1383
mt8365_afe_o16_mix, ARRAY_SIZE(mt8365_afe_o16_mix)),
1384
SND_SOC_DAPM_MIXER("O17", SND_SOC_NOPM, 0, 0,
1385
mt8365_afe_o17_mix, ARRAY_SIZE(mt8365_afe_o17_mix)),
1386
SND_SOC_DAPM_MIXER("O18", SND_SOC_NOPM, 0, 0,
1387
mt8365_afe_o18_mix, ARRAY_SIZE(mt8365_afe_o18_mix)),
1388
SND_SOC_DAPM_MIXER("O19", SND_SOC_NOPM, 0, 0,
1389
mt8365_afe_o19_mix, ARRAY_SIZE(mt8365_afe_o19_mix)),
1390
SND_SOC_DAPM_MIXER("O20", SND_SOC_NOPM, 0, 0,
1391
mt8365_afe_o20_mix, ARRAY_SIZE(mt8365_afe_o20_mix)),
1392
SND_SOC_DAPM_MIXER("O21", SND_SOC_NOPM, 0, 0,
1393
mt8365_afe_o21_mix, ARRAY_SIZE(mt8365_afe_o21_mix)),
1394
SND_SOC_DAPM_MIXER("O22", SND_SOC_NOPM, 0, 0,
1395
mt8365_afe_o22_mix, ARRAY_SIZE(mt8365_afe_o22_mix)),
1396
SND_SOC_DAPM_MIXER("O23", SND_SOC_NOPM, 0, 0,
1397
mt8365_afe_o23_mix, ARRAY_SIZE(mt8365_afe_o23_mix)),
1398
SND_SOC_DAPM_MIXER("O24", SND_SOC_NOPM, 0, 0,
1399
mt8365_afe_o24_mix, ARRAY_SIZE(mt8365_afe_o24_mix)),
1400
SND_SOC_DAPM_MIXER("O25", SND_SOC_NOPM, 0, 0,
1401
mt8365_afe_o25_mix, ARRAY_SIZE(mt8365_afe_o25_mix)),
1402
SND_SOC_DAPM_MIXER("O26", SND_SOC_NOPM, 0, 0,
1403
mt8365_afe_o26_mix, ARRAY_SIZE(mt8365_afe_o26_mix)),
1404
SND_SOC_DAPM_MIXER("O27", SND_SOC_NOPM, 0, 0,
1405
mt8365_afe_o27_mix, ARRAY_SIZE(mt8365_afe_o27_mix)),
1406
SND_SOC_DAPM_MIXER("O28", SND_SOC_NOPM, 0, 0,
1407
mt8365_afe_o28_mix, ARRAY_SIZE(mt8365_afe_o28_mix)),
1408
SND_SOC_DAPM_MIXER("O29", SND_SOC_NOPM, 0, 0,
1409
mt8365_afe_o29_mix, ARRAY_SIZE(mt8365_afe_o29_mix)),
1410
SND_SOC_DAPM_MIXER("O30", SND_SOC_NOPM, 0, 0,
1411
mt8365_afe_o30_mix, ARRAY_SIZE(mt8365_afe_o30_mix)),
1412
SND_SOC_DAPM_MIXER("O31", SND_SOC_NOPM, 0, 0,
1413
mt8365_afe_o31_mix, ARRAY_SIZE(mt8365_afe_o31_mix)),
1414
SND_SOC_DAPM_MIXER("O32", SND_SOC_NOPM, 0, 0,
1415
mt8365_afe_o32_mix, ARRAY_SIZE(mt8365_afe_o32_mix)),
1416
SND_SOC_DAPM_MIXER("O33", SND_SOC_NOPM, 0, 0,
1417
mt8365_afe_o33_mix, ARRAY_SIZE(mt8365_afe_o33_mix)),
1418
SND_SOC_DAPM_MIXER("O34", SND_SOC_NOPM, 0, 0,
1419
mt8365_afe_o34_mix, ARRAY_SIZE(mt8365_afe_o34_mix)),
1420
SND_SOC_DAPM_MIXER("O35", SND_SOC_NOPM, 0, 0,
1421
mt8365_afe_o35_mix, ARRAY_SIZE(mt8365_afe_o35_mix)),
1422
SND_SOC_DAPM_MIXER("O36", SND_SOC_NOPM, 0, 0,
1423
mt8365_afe_o36_mix, ARRAY_SIZE(mt8365_afe_o36_mix)),
1424
SND_SOC_DAPM_MIXER("CM2_Mux IO", SND_SOC_NOPM, 0, 0, NULL, 0),
1425
SND_SOC_DAPM_MIXER("CM1_IO", SND_SOC_NOPM, 0, 0, NULL, 0),
1426
SND_SOC_DAPM_MIXER("O17O18", SND_SOC_NOPM, 0, 0, NULL, 0),
1427
/* inter-connections */
1428
SND_SOC_DAPM_MIXER("HW_GAIN1_IN_CH1", SND_SOC_NOPM, 0, 0,
1429
mtk_hw_gain1_in_ch1_mix,
1430
ARRAY_SIZE(mtk_hw_gain1_in_ch1_mix)),
1431
SND_SOC_DAPM_MIXER("HW_GAIN1_IN_CH2", SND_SOC_NOPM, 0, 0,
1432
mtk_hw_gain1_in_ch2_mix,
1433
ARRAY_SIZE(mtk_hw_gain1_in_ch2_mix)),
1434
1435
SND_SOC_DAPM_INPUT("DL Source"),
1436
1437
SND_SOC_DAPM_MUX("CM2_Mux_IO Input Mux", SND_SOC_NOPM, 0, 0,
1438
&mt8365_afe_cm2_mux_input_mux),
1439
1440
SND_SOC_DAPM_MUX("AIN Mux", SND_SOC_NOPM, 0, 0, &ain_mux),
1441
SND_SOC_DAPM_MUX("VUL2 Input Mux", SND_SOC_NOPM, 0, 0,
1442
&vul2_in_input_mux),
1443
1444
SND_SOC_DAPM_MUX("FM HW Gain Mux", SND_SOC_NOPM, 0, 0, &fmhwgain_mux),
1445
1446
SND_SOC_DAPM_INPUT("HW Gain 1 Out Endpoint"),
1447
SND_SOC_DAPM_OUTPUT("HW Gain 1 In Endpoint"),
1448
};
1449
1450
static const struct snd_soc_dapm_route mt8365_memif_routes[] = {
1451
/* downlink */
1452
{"I00", NULL, "2ND I2S Capture"},
1453
{"I01", NULL, "2ND I2S Capture"},
1454
{"I05", NULL, "DL1"},
1455
{"I06", NULL, "DL1"},
1456
{"I07", NULL, "DL2"},
1457
{"I08", NULL, "DL2"},
1458
1459
{"O03", "I05 Switch", "I05"},
1460
{"O04", "I06 Switch", "I06"},
1461
{"O00", "I05 Switch", "I05"},
1462
{"O01", "I06 Switch", "I06"},
1463
{"O07", "I05 Switch", "I05"},
1464
{"O08", "I06 Switch", "I06"},
1465
{"O27", "I05 Switch", "I05"},
1466
{"O28", "I06 Switch", "I06"},
1467
{"O29", "I05 Switch", "I05"},
1468
{"O30", "I06 Switch", "I06"},
1469
1470
{"O03", "I07 Switch", "I07"},
1471
{"O04", "I08 Switch", "I08"},
1472
{"O00", "I07 Switch", "I07"},
1473
{"O01", "I08 Switch", "I08"},
1474
{"O07", "I07 Switch", "I07"},
1475
{"O08", "I08 Switch", "I08"},
1476
1477
/* uplink */
1478
{"AWB", NULL, "O05"},
1479
{"AWB", NULL, "O06"},
1480
{"VUL", NULL, "O09"},
1481
{"VUL", NULL, "O10"},
1482
{"VUL3", NULL, "O11"},
1483
{"VUL3", NULL, "O12"},
1484
1485
{"AIN Mux", "EXT ADC", "I2S Capture"},
1486
{"I03", NULL, "AIN Mux"},
1487
{"I04", NULL, "AIN Mux"},
1488
1489
{"HW_GAIN1_IN_CH1", "CONNSYS_I2S_CH1", "Hostless FM DL"},
1490
{"HW_GAIN1_IN_CH2", "CONNSYS_I2S_CH2", "Hostless FM DL"},
1491
1492
{"HW Gain 1 In Endpoint", NULL, "HW Gain 1 In"},
1493
{"HW Gain 1 Out", NULL, "HW Gain 1 Out Endpoint"},
1494
{"HW Gain 1 In", NULL, "HW_GAIN1_IN_CH1"},
1495
{"HW Gain 1 In", NULL, "HW_GAIN1_IN_CH2"},
1496
1497
{"FM HW Gain Mux", "FM_HW_GAIN_IO", "HW Gain 1 Out"},
1498
{"Hostless FM UL", NULL, "FM HW Gain Mux"},
1499
{"Hostless FM UL", NULL, "FM 2ND I2S Mux"},
1500
1501
{"O05", "I05 Switch", "I05L"},
1502
{"O06", "I06 Switch", "I06L"},
1503
{"O05", "I07 Switch", "I07L"},
1504
{"O06", "I08 Switch", "I08L"},
1505
1506
{"O05", "I03 Switch", "I03"},
1507
{"O06", "I04 Switch", "I04"},
1508
{"O05", "I00 Switch", "I00"},
1509
{"O06", "I01 Switch", "I01"},
1510
{"O05", "I09 Switch", "I09"},
1511
{"O06", "I22 Switch", "I22"},
1512
{"O05", "I14 Switch", "I14"},
1513
{"O06", "I15 Switch", "I15"},
1514
{"O05", "I16 Switch", "I16"},
1515
{"O06", "I17 Switch", "I17"},
1516
{"O05", "I18 Switch", "I18"},
1517
{"O06", "I19 Switch", "I19"},
1518
{"O05", "I20 Switch", "I20"},
1519
{"O06", "I21 Switch", "I21"},
1520
{"O05", "I23 Switch", "I23"},
1521
{"O06", "I24 Switch", "I24"},
1522
1523
{"O09", "I03 Switch", "I03"},
1524
{"O10", "I04 Switch", "I04"},
1525
{"O09", "I00 Switch", "I00"},
1526
{"O10", "I01 Switch", "I01"},
1527
{"O09", "I09 Switch", "I09"},
1528
{"O10", "I22 Switch", "I22"},
1529
{"O09", "I14 Switch", "I14"},
1530
{"O10", "I15 Switch", "I15"},
1531
{"O09", "I16 Switch", "I16"},
1532
{"O10", "I17 Switch", "I17"},
1533
{"O09", "I18 Switch", "I18"},
1534
{"O10", "I19 Switch", "I19"},
1535
{"O09", "I20 Switch", "I20"},
1536
{"O10", "I21 Switch", "I21"},
1537
1538
{"O11", "I03 Switch", "I03"},
1539
{"O12", "I04 Switch", "I04"},
1540
{"O11", "I00 Switch", "I00"},
1541
{"O12", "I01 Switch", "I01"},
1542
{"O11", "I09 Switch", "I09"},
1543
{"O12", "I22 Switch", "I22"},
1544
{"O11", "I14 Switch", "I14"},
1545
{"O12", "I15 Switch", "I15"},
1546
{"O11", "I16 Switch", "I16"},
1547
{"O12", "I17 Switch", "I17"},
1548
{"O11", "I18 Switch", "I18"},
1549
{"O12", "I19 Switch", "I19"},
1550
{"O11", "I20 Switch", "I20"},
1551
{"O12", "I21 Switch", "I21"},
1552
1553
/* CM2_Mux*/
1554
{"CM2_Mux IO", NULL, "CM2_Mux_IO Input Mux"},
1555
1556
/* VUL2 */
1557
{"VUL2", NULL, "VUL2 Input Mux"},
1558
{"VUL2 Input Mux", "VUL2_IN_FROM_O17O18", "O17O18"},
1559
{"VUL2 Input Mux", "VUL2_IN_FROM_CM1", "CM1_IO"},
1560
1561
{"O17O18", NULL, "O17"},
1562
{"O17O18", NULL, "O18"},
1563
{"CM1_IO", NULL, "O17"},
1564
{"CM1_IO", NULL, "O18"},
1565
{"CM1_IO", NULL, "O19"},
1566
{"CM1_IO", NULL, "O20"},
1567
{"CM1_IO", NULL, "O21"},
1568
{"CM1_IO", NULL, "O22"},
1569
{"CM1_IO", NULL, "O23"},
1570
{"CM1_IO", NULL, "O24"},
1571
{"CM1_IO", NULL, "O25"},
1572
{"CM1_IO", NULL, "O26"},
1573
{"CM1_IO", NULL, "O31"},
1574
{"CM1_IO", NULL, "O32"},
1575
{"CM1_IO", NULL, "O33"},
1576
{"CM1_IO", NULL, "O34"},
1577
{"CM1_IO", NULL, "O35"},
1578
{"CM1_IO", NULL, "O36"},
1579
1580
{"O17", "I14 Switch", "I14"},
1581
{"O18", "I15 Switch", "I15"},
1582
{"O19", "I16 Switch", "I16"},
1583
{"O20", "I17 Switch", "I17"},
1584
{"O21", "I18 Switch", "I18"},
1585
{"O22", "I19 Switch", "I19"},
1586
{"O23", "I20 Switch", "I20"},
1587
{"O24", "I21 Switch", "I21"},
1588
{"O25", "I23 Switch", "I23"},
1589
{"O26", "I24 Switch", "I24"},
1590
{"O25", "I25 Switch", "I25"},
1591
{"O26", "I26 Switch", "I26"},
1592
1593
{"O17", "I03 Switch", "I03"},
1594
{"O18", "I04 Switch", "I04"},
1595
{"O18", "I23 Switch", "I23"},
1596
{"O18", "I25 Switch", "I25"},
1597
{"O19", "I04 Switch", "I04"},
1598
{"O19", "I23 Switch", "I23"},
1599
{"O19", "I24 Switch", "I24"},
1600
{"O19", "I25 Switch", "I25"},
1601
{"O19", "I26 Switch", "I26"},
1602
{"O20", "I24 Switch", "I24"},
1603
{"O20", "I26 Switch", "I26"},
1604
{"O21", "I23 Switch", "I23"},
1605
{"O21", "I25 Switch", "I25"},
1606
{"O22", "I24 Switch", "I24"},
1607
{"O22", "I26 Switch", "I26"},
1608
1609
{"O23", "I23 Switch", "I23"},
1610
{"O23", "I25 Switch", "I25"},
1611
{"O24", "I24 Switch", "I24"},
1612
{"O24", "I26 Switch", "I26"},
1613
{"O24", "I23 Switch", "I23"},
1614
{"O24", "I25 Switch", "I25"},
1615
{"O13", "I00 Switch", "I00"},
1616
{"O14", "I01 Switch", "I01"},
1617
{"O03", "I10 Switch", "I10"},
1618
{"O04", "I11 Switch", "I11"},
1619
};
1620
1621
static const struct mtk_base_memif_data memif_data[MT8365_AFE_MEMIF_NUM] = {
1622
{
1623
.name = "DL1",
1624
.id = MT8365_AFE_MEMIF_DL1,
1625
.reg_ofs_base = AFE_DL1_BASE,
1626
.reg_ofs_cur = AFE_DL1_CUR,
1627
.fs_reg = AFE_DAC_CON1,
1628
.fs_shift = 0,
1629
.fs_maskbit = 0xf,
1630
.mono_reg = AFE_DAC_CON1,
1631
.mono_shift = 21,
1632
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1633
.hd_shift = 16,
1634
.enable_reg = AFE_DAC_CON0,
1635
.enable_shift = 1,
1636
.msb_reg = -1,
1637
.msb_shift = -1,
1638
.agent_disable_reg = -1,
1639
.agent_disable_shift = -1,
1640
}, {
1641
.name = "DL2",
1642
.id = MT8365_AFE_MEMIF_DL2,
1643
.reg_ofs_base = AFE_DL2_BASE,
1644
.reg_ofs_cur = AFE_DL2_CUR,
1645
.fs_reg = AFE_DAC_CON1,
1646
.fs_shift = 4,
1647
.fs_maskbit = 0xf,
1648
.mono_reg = AFE_DAC_CON1,
1649
.mono_shift = 22,
1650
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1651
.hd_shift = 18,
1652
.enable_reg = AFE_DAC_CON0,
1653
.enable_shift = 2,
1654
.msb_reg = -1,
1655
.msb_shift = -1,
1656
.agent_disable_reg = -1,
1657
.agent_disable_shift = -1,
1658
}, {
1659
.name = "TDM OUT",
1660
.id = MT8365_AFE_MEMIF_TDM_OUT,
1661
.reg_ofs_base = AFE_HDMI_OUT_BASE,
1662
.reg_ofs_cur = AFE_HDMI_OUT_CUR,
1663
.fs_reg = -1,
1664
.fs_shift = -1,
1665
.fs_maskbit = -1,
1666
.mono_reg = -1,
1667
.mono_shift = -1,
1668
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1669
.hd_shift = 28,
1670
.enable_reg = AFE_HDMI_OUT_CON0,
1671
.enable_shift = 0,
1672
.msb_reg = -1,
1673
.msb_shift = -1,
1674
.agent_disable_reg = -1,
1675
.agent_disable_shift = -1,
1676
}, {
1677
.name = "AWB",
1678
.id = MT8365_AFE_MEMIF_AWB,
1679
.reg_ofs_base = AFE_AWB_BASE,
1680
.reg_ofs_cur = AFE_AWB_CUR,
1681
.fs_reg = AFE_DAC_CON1,
1682
.fs_shift = 12,
1683
.fs_maskbit = 0xf,
1684
.mono_reg = AFE_DAC_CON1,
1685
.mono_shift = 24,
1686
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1687
.hd_shift = 20,
1688
.enable_reg = AFE_DAC_CON0,
1689
.enable_shift = 6,
1690
.msb_reg = AFE_MEMIF_MSB,
1691
.msb_shift = 17,
1692
.agent_disable_reg = -1,
1693
.agent_disable_shift = -1,
1694
}, {
1695
.name = "VUL",
1696
.id = MT8365_AFE_MEMIF_VUL,
1697
.reg_ofs_base = AFE_VUL_BASE,
1698
.reg_ofs_cur = AFE_VUL_CUR,
1699
.fs_reg = AFE_DAC_CON1,
1700
.fs_shift = 16,
1701
.fs_maskbit = 0xf,
1702
.mono_reg = AFE_DAC_CON1,
1703
.mono_shift = 27,
1704
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1705
.hd_shift = 22,
1706
.enable_reg = AFE_DAC_CON0,
1707
.enable_shift = 3,
1708
.msb_reg = AFE_MEMIF_MSB,
1709
.msb_shift = 20,
1710
.agent_disable_reg = -1,
1711
.agent_disable_shift = -1,
1712
}, {
1713
.name = "VUL2",
1714
.id = MT8365_AFE_MEMIF_VUL2,
1715
.reg_ofs_base = AFE_VUL_D2_BASE,
1716
.reg_ofs_cur = AFE_VUL_D2_CUR,
1717
.fs_reg = AFE_DAC_CON0,
1718
.fs_shift = 20,
1719
.fs_maskbit = 0xf,
1720
.mono_reg = -1,
1721
.mono_shift = -1,
1722
.hd_reg = AFE_MEMIF_PBUF_SIZE,
1723
.hd_shift = 14,
1724
.enable_reg = AFE_DAC_CON0,
1725
.enable_shift = 9,
1726
.msb_reg = AFE_MEMIF_MSB,
1727
.msb_shift = 21,
1728
.agent_disable_reg = -1,
1729
.agent_disable_shift = -1,
1730
}, {
1731
.name = "VUL3",
1732
.id = MT8365_AFE_MEMIF_VUL3,
1733
.reg_ofs_base = AFE_VUL3_BASE,
1734
.reg_ofs_cur = AFE_VUL3_CUR,
1735
.fs_reg = AFE_DAC_CON1,
1736
.fs_shift = 8,
1737
.fs_maskbit = 0xf,
1738
.mono_reg = AFE_DAC_CON0,
1739
.mono_shift = 13,
1740
.hd_reg = AFE_MEMIF_PBUF2_SIZE,
1741
.hd_shift = 10,
1742
.enable_reg = AFE_DAC_CON0,
1743
.enable_shift = 12,
1744
.msb_reg = AFE_MEMIF_MSB,
1745
.msb_shift = 27,
1746
.agent_disable_reg = -1,
1747
.agent_disable_shift = -1,
1748
}, {
1749
.name = "TDM IN",
1750
.id = MT8365_AFE_MEMIF_TDM_IN,
1751
.reg_ofs_base = AFE_HDMI_IN_2CH_BASE,
1752
.reg_ofs_cur = AFE_HDMI_IN_2CH_CUR,
1753
.fs_reg = -1,
1754
.fs_shift = -1,
1755
.fs_maskbit = -1,
1756
.mono_reg = AFE_HDMI_IN_2CH_CON0,
1757
.mono_shift = 1,
1758
.hd_reg = AFE_MEMIF_PBUF2_SIZE,
1759
.hd_shift = 8,
1760
.hd_align_mshift = 5,
1761
.enable_reg = AFE_HDMI_IN_2CH_CON0,
1762
.enable_shift = 0,
1763
.msb_reg = AFE_MEMIF_MSB,
1764
.msb_shift = 28,
1765
.agent_disable_reg = -1,
1766
.agent_disable_shift = -1,
1767
},
1768
};
1769
1770
static const struct mtk_base_irq_data irq_data[MT8365_AFE_IRQ_NUM] = {
1771
{
1772
.id = MT8365_AFE_IRQ1,
1773
.irq_cnt_reg = AFE_IRQ_MCU_CNT1,
1774
.irq_cnt_shift = 0,
1775
.irq_cnt_maskbit = 0x3ffff,
1776
.irq_en_reg = AFE_IRQ_MCU_CON,
1777
.irq_en_shift = 0,
1778
.irq_fs_reg = AFE_IRQ_MCU_CON,
1779
.irq_fs_shift = 4,
1780
.irq_fs_maskbit = 0xf,
1781
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1782
.irq_clr_shift = 0,
1783
}, {
1784
.id = MT8365_AFE_IRQ2,
1785
.irq_cnt_reg = AFE_IRQ_MCU_CNT2,
1786
.irq_cnt_shift = 0,
1787
.irq_cnt_maskbit = 0x3ffff,
1788
.irq_en_reg = AFE_IRQ_MCU_CON,
1789
.irq_en_shift = 1,
1790
.irq_fs_reg = AFE_IRQ_MCU_CON,
1791
.irq_fs_shift = 8,
1792
.irq_fs_maskbit = 0xf,
1793
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1794
.irq_clr_shift = 1,
1795
}, {
1796
.id = MT8365_AFE_IRQ3,
1797
.irq_cnt_reg = AFE_IRQ_MCU_CNT3,
1798
.irq_cnt_shift = 0,
1799
.irq_cnt_maskbit = 0x3ffff,
1800
.irq_en_reg = AFE_IRQ_MCU_CON,
1801
.irq_en_shift = 2,
1802
.irq_fs_reg = AFE_IRQ_MCU_CON,
1803
.irq_fs_shift = 16,
1804
.irq_fs_maskbit = 0xf,
1805
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1806
.irq_clr_shift = 2,
1807
}, {
1808
.id = MT8365_AFE_IRQ4,
1809
.irq_cnt_reg = AFE_IRQ_MCU_CNT4,
1810
.irq_cnt_shift = 0,
1811
.irq_cnt_maskbit = 0x3ffff,
1812
.irq_en_reg = AFE_IRQ_MCU_CON,
1813
.irq_en_shift = 3,
1814
.irq_fs_reg = AFE_IRQ_MCU_CON,
1815
.irq_fs_shift = 20,
1816
.irq_fs_maskbit = 0xf,
1817
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1818
.irq_clr_shift = 3,
1819
}, {
1820
.id = MT8365_AFE_IRQ5,
1821
.irq_cnt_reg = AFE_IRQ_MCU_CNT5,
1822
.irq_cnt_shift = 0,
1823
.irq_cnt_maskbit = 0x3ffff,
1824
.irq_en_reg = AFE_IRQ_MCU_CON2,
1825
.irq_en_shift = 3,
1826
.irq_fs_reg = -1,
1827
.irq_fs_shift = 0,
1828
.irq_fs_maskbit = 0x0,
1829
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1830
.irq_clr_shift = 4,
1831
}, {
1832
.id = MT8365_AFE_IRQ6,
1833
.irq_cnt_reg = -1,
1834
.irq_cnt_shift = 0,
1835
.irq_cnt_maskbit = 0x0,
1836
.irq_en_reg = AFE_IRQ_MCU_CON,
1837
.irq_en_shift = 13,
1838
.irq_fs_reg = -1,
1839
.irq_fs_shift = 0,
1840
.irq_fs_maskbit = 0x0,
1841
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1842
.irq_clr_shift = 5,
1843
}, {
1844
.id = MT8365_AFE_IRQ7,
1845
.irq_cnt_reg = AFE_IRQ_MCU_CNT7,
1846
.irq_cnt_shift = 0,
1847
.irq_cnt_maskbit = 0x3ffff,
1848
.irq_en_reg = AFE_IRQ_MCU_CON,
1849
.irq_en_shift = 14,
1850
.irq_fs_reg = AFE_IRQ_MCU_CON,
1851
.irq_fs_shift = 24,
1852
.irq_fs_maskbit = 0xf,
1853
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1854
.irq_clr_shift = 6,
1855
}, {
1856
.id = MT8365_AFE_IRQ8,
1857
.irq_cnt_reg = AFE_IRQ_MCU_CNT8,
1858
.irq_cnt_shift = 0,
1859
.irq_cnt_maskbit = 0x3ffff,
1860
.irq_en_reg = AFE_IRQ_MCU_CON,
1861
.irq_en_shift = 15,
1862
.irq_fs_reg = AFE_IRQ_MCU_CON,
1863
.irq_fs_shift = 28,
1864
.irq_fs_maskbit = 0xf,
1865
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1866
.irq_clr_shift = 7,
1867
}, {
1868
.id = MT8365_AFE_IRQ9,
1869
.irq_cnt_reg = -1,
1870
.irq_cnt_shift = 0,
1871
.irq_cnt_maskbit = 0x0,
1872
.irq_en_reg = AFE_IRQ_MCU_CON2,
1873
.irq_en_shift = 2,
1874
.irq_fs_reg = -1,
1875
.irq_fs_shift = 0,
1876
.irq_fs_maskbit = 0x0,
1877
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1878
.irq_clr_shift = 8,
1879
}, {
1880
.id = MT8365_AFE_IRQ10,
1881
.irq_cnt_reg = AFE_IRQ_MCU_CNT10,
1882
.irq_cnt_shift = 0,
1883
.irq_cnt_maskbit = 0x3ffff,
1884
.irq_en_reg = AFE_IRQ_MCU_CON2,
1885
.irq_en_shift = 4,
1886
.irq_fs_reg = -1,
1887
.irq_fs_shift = 0,
1888
.irq_fs_maskbit = 0x0,
1889
.irq_clr_reg = AFE_IRQ_MCU_CLR,
1890
.irq_clr_shift = 9,
1891
},
1892
};
1893
1894
static int memif_specified_irqs[MT8365_AFE_MEMIF_NUM] = {
1895
[MT8365_AFE_MEMIF_DL1] = MT8365_AFE_IRQ1,
1896
[MT8365_AFE_MEMIF_DL2] = MT8365_AFE_IRQ2,
1897
[MT8365_AFE_MEMIF_TDM_OUT] = MT8365_AFE_IRQ5,
1898
[MT8365_AFE_MEMIF_AWB] = MT8365_AFE_IRQ3,
1899
[MT8365_AFE_MEMIF_VUL] = MT8365_AFE_IRQ4,
1900
[MT8365_AFE_MEMIF_VUL2] = MT8365_AFE_IRQ7,
1901
[MT8365_AFE_MEMIF_VUL3] = MT8365_AFE_IRQ8,
1902
[MT8365_AFE_MEMIF_TDM_IN] = MT8365_AFE_IRQ10,
1903
};
1904
1905
static const struct regmap_config mt8365_afe_regmap_config = {
1906
.reg_bits = 32,
1907
.reg_stride = 4,
1908
.val_bits = 32,
1909
.max_register = MAX_REGISTER,
1910
.cache_type = REGCACHE_NONE,
1911
};
1912
1913
static irqreturn_t mt8365_afe_irq_handler(int irq, void *dev_id)
1914
{
1915
struct mtk_base_afe *afe = dev_id;
1916
unsigned int reg_value;
1917
unsigned int mcu_irq_mask;
1918
int i, ret;
1919
1920
ret = regmap_read(afe->regmap, AFE_IRQ_MCU_STATUS, &reg_value);
1921
if (ret) {
1922
dev_err_ratelimited(afe->dev, "%s irq status err\n", __func__);
1923
reg_value = AFE_IRQ_STATUS_BITS;
1924
goto err_irq;
1925
}
1926
1927
ret = regmap_read(afe->regmap, AFE_IRQ_MCU_EN, &mcu_irq_mask);
1928
if (ret) {
1929
dev_err_ratelimited(afe->dev, "%s irq mcu_en err\n", __func__);
1930
reg_value = AFE_IRQ_STATUS_BITS;
1931
goto err_irq;
1932
}
1933
1934
/* only clr cpu irq */
1935
reg_value &= mcu_irq_mask;
1936
1937
for (i = 0; i < MT8365_AFE_MEMIF_NUM; i++) {
1938
struct mtk_base_afe_memif *memif = &afe->memif[i];
1939
struct mtk_base_afe_irq *mcu_irq;
1940
1941
if (memif->irq_usage < 0)
1942
continue;
1943
1944
mcu_irq = &afe->irqs[memif->irq_usage];
1945
1946
if (!(reg_value & (1 << mcu_irq->irq_data->irq_clr_shift)))
1947
continue;
1948
1949
snd_pcm_period_elapsed(memif->substream);
1950
}
1951
1952
err_irq:
1953
/* clear irq */
1954
regmap_write(afe->regmap, AFE_IRQ_MCU_CLR,
1955
reg_value & AFE_IRQ_STATUS_BITS);
1956
1957
return IRQ_HANDLED;
1958
}
1959
1960
static int mt8365_afe_runtime_suspend(struct device *dev)
1961
{
1962
return 0;
1963
}
1964
1965
static int mt8365_afe_runtime_resume(struct device *dev)
1966
{
1967
return 0;
1968
}
1969
1970
static int mt8365_afe_suspend(struct device *dev)
1971
{
1972
struct mtk_base_afe *afe = dev_get_drvdata(dev);
1973
struct regmap *regmap = afe->regmap;
1974
int i;
1975
1976
mt8365_afe_enable_main_clk(afe);
1977
1978
if (!afe->reg_back_up)
1979
afe->reg_back_up =
1980
devm_kcalloc(dev, afe->reg_back_up_list_num,
1981
sizeof(unsigned int), GFP_KERNEL);
1982
1983
for (i = 0; i < afe->reg_back_up_list_num; i++)
1984
regmap_read(regmap, afe->reg_back_up_list[i],
1985
&afe->reg_back_up[i]);
1986
1987
mt8365_afe_disable_main_clk(afe);
1988
1989
return 0;
1990
}
1991
1992
static int mt8365_afe_resume(struct device *dev)
1993
{
1994
struct mtk_base_afe *afe = dev_get_drvdata(dev);
1995
struct regmap *regmap = afe->regmap;
1996
int i = 0;
1997
1998
if (!afe->reg_back_up)
1999
return 0;
2000
2001
mt8365_afe_enable_main_clk(afe);
2002
2003
for (i = 0; i < afe->reg_back_up_list_num; i++)
2004
regmap_write(regmap, afe->reg_back_up_list[i],
2005
afe->reg_back_up[i]);
2006
2007
mt8365_afe_disable_main_clk(afe);
2008
2009
return 0;
2010
}
2011
2012
static int mt8365_afe_dev_runtime_suspend(struct device *dev)
2013
{
2014
struct mtk_base_afe *afe = dev_get_drvdata(dev);
2015
2016
if (pm_runtime_status_suspended(dev) || afe->suspended)
2017
return 0;
2018
2019
mt8365_afe_suspend(dev);
2020
afe->suspended = true;
2021
return 0;
2022
}
2023
2024
static int mt8365_afe_dev_runtime_resume(struct device *dev)
2025
{
2026
struct mtk_base_afe *afe = dev_get_drvdata(dev);
2027
2028
if (pm_runtime_status_suspended(dev) || !afe->suspended)
2029
return 0;
2030
2031
mt8365_afe_resume(dev);
2032
afe->suspended = false;
2033
return 0;
2034
}
2035
2036
static int mt8365_afe_init_registers(struct mtk_base_afe *afe)
2037
{
2038
size_t i;
2039
2040
static struct {
2041
unsigned int reg;
2042
unsigned int mask;
2043
unsigned int val;
2044
} init_regs[] = {
2045
{ AFE_CONN_24BIT, GENMASK(31, 0), GENMASK(31, 0) },
2046
{ AFE_CONN_24BIT_1, GENMASK(21, 0), GENMASK(21, 0) },
2047
};
2048
2049
mt8365_afe_enable_main_clk(afe);
2050
2051
for (i = 0; i < ARRAY_SIZE(init_regs); i++)
2052
regmap_update_bits(afe->regmap, init_regs[i].reg,
2053
init_regs[i].mask, init_regs[i].val);
2054
2055
mt8365_afe_disable_main_clk(afe);
2056
2057
return 0;
2058
}
2059
2060
static int mt8365_dai_memif_register(struct mtk_base_afe *afe)
2061
{
2062
struct mtk_base_afe_dai *dai;
2063
2064
dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
2065
if (!dai)
2066
return -ENOMEM;
2067
2068
list_add(&dai->list, &afe->sub_dais);
2069
2070
dai->dai_drivers = mt8365_memif_dai_driver;
2071
dai->num_dai_drivers = ARRAY_SIZE(mt8365_memif_dai_driver);
2072
2073
dai->dapm_widgets = mt8365_memif_widgets;
2074
dai->num_dapm_widgets = ARRAY_SIZE(mt8365_memif_widgets);
2075
dai->dapm_routes = mt8365_memif_routes;
2076
dai->num_dapm_routes = ARRAY_SIZE(mt8365_memif_routes);
2077
return 0;
2078
}
2079
2080
typedef int (*dai_register_cb)(struct mtk_base_afe *);
2081
static const dai_register_cb dai_register_cbs[] = {
2082
mt8365_dai_pcm_register,
2083
mt8365_dai_i2s_register,
2084
mt8365_dai_adda_register,
2085
mt8365_dai_dmic_register,
2086
mt8365_dai_memif_register,
2087
};
2088
2089
static int mt8365_afe_pcm_dev_probe(struct platform_device *pdev)
2090
{
2091
struct mtk_base_afe *afe;
2092
struct mt8365_afe_private *afe_priv;
2093
struct device *dev;
2094
int ret, i, sel_irq;
2095
unsigned int irq_id;
2096
struct resource *res;
2097
2098
afe = devm_kzalloc(&pdev->dev, sizeof(*afe), GFP_KERNEL);
2099
if (!afe)
2100
return -ENOMEM;
2101
platform_set_drvdata(pdev, afe);
2102
2103
afe->platform_priv = devm_kzalloc(&pdev->dev, sizeof(*afe_priv),
2104
GFP_KERNEL);
2105
if (!afe->platform_priv)
2106
return -ENOMEM;
2107
2108
afe_priv = afe->platform_priv;
2109
afe->dev = &pdev->dev;
2110
dev = afe->dev;
2111
2112
spin_lock_init(&afe_priv->afe_ctrl_lock);
2113
mutex_init(&afe_priv->afe_clk_mutex);
2114
2115
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2116
afe->base_addr = devm_ioremap_resource(&pdev->dev, res);
2117
if (IS_ERR(afe->base_addr))
2118
return PTR_ERR(afe->base_addr);
2119
2120
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2121
if (res) {
2122
afe_priv->afe_sram_vir_addr =
2123
devm_ioremap_resource(&pdev->dev, res);
2124
if (!IS_ERR(afe_priv->afe_sram_vir_addr)) {
2125
afe_priv->afe_sram_phy_addr = res->start;
2126
afe_priv->afe_sram_size = resource_size(res);
2127
}
2128
}
2129
2130
/* initial audio related clock */
2131
ret = mt8365_afe_init_audio_clk(afe);
2132
if (ret)
2133
return dev_err_probe(afe->dev, ret, "mt8365_afe_init_audio_clk fail\n");
2134
2135
afe->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "top_audio_sel",
2136
afe->base_addr,
2137
&mt8365_afe_regmap_config);
2138
if (IS_ERR(afe->regmap))
2139
return PTR_ERR(afe->regmap);
2140
2141
/* memif % irq initialize*/
2142
afe->memif_size = MT8365_AFE_MEMIF_NUM;
2143
afe->memif = devm_kcalloc(afe->dev, afe->memif_size,
2144
sizeof(*afe->memif), GFP_KERNEL);
2145
if (!afe->memif)
2146
return -ENOMEM;
2147
2148
afe->irqs_size = MT8365_AFE_IRQ_NUM;
2149
afe->irqs = devm_kcalloc(afe->dev, afe->irqs_size,
2150
sizeof(*afe->irqs), GFP_KERNEL);
2151
if (!afe->irqs)
2152
return -ENOMEM;
2153
2154
for (i = 0; i < afe->irqs_size; i++)
2155
afe->irqs[i].irq_data = &irq_data[i];
2156
2157
ret = platform_get_irq(pdev, 0);
2158
if (ret < 0)
2159
return ret;
2160
2161
irq_id = ret;
2162
ret = devm_request_irq(afe->dev, irq_id, mt8365_afe_irq_handler,
2163
0, "Afe_ISR_Handle", (void *)afe);
2164
if (ret)
2165
return dev_err_probe(afe->dev, ret, "could not request_irq\n");
2166
2167
/* init sub_dais */
2168
INIT_LIST_HEAD(&afe->sub_dais);
2169
2170
for (i = 0; i < ARRAY_SIZE(dai_register_cbs); i++) {
2171
ret = dai_register_cbs[i](afe);
2172
if (ret) {
2173
dev_warn(afe->dev, "dai register i %d fail, ret %d\n",
2174
i, ret);
2175
return ret;
2176
}
2177
}
2178
2179
/* init dai_driver and component_driver */
2180
ret = mtk_afe_combine_sub_dai(afe);
2181
if (ret) {
2182
dev_warn(afe->dev, "mtk_afe_combine_sub_dai fail, ret %d\n",
2183
ret);
2184
return ret;
2185
}
2186
2187
for (i = 0; i < afe->memif_size; i++) {
2188
afe->memif[i].data = &memif_data[i];
2189
sel_irq = memif_specified_irqs[i];
2190
if (sel_irq >= 0) {
2191
afe->memif[i].irq_usage = sel_irq;
2192
afe->memif[i].const_irq = 1;
2193
afe->irqs[sel_irq].irq_occupyed = true;
2194
} else {
2195
afe->memif[i].irq_usage = -1;
2196
}
2197
}
2198
2199
afe->mtk_afe_hardware = &mt8365_afe_hardware;
2200
afe->memif_fs = mt8365_memif_fs;
2201
afe->irq_fs = mt8365_irq_fs;
2202
2203
ret = devm_pm_runtime_enable(&pdev->dev);
2204
if (ret)
2205
return ret;
2206
2207
pm_runtime_get_sync(&pdev->dev);
2208
afe->reg_back_up_list = mt8365_afe_backup_list;
2209
afe->reg_back_up_list_num = ARRAY_SIZE(mt8365_afe_backup_list);
2210
afe->runtime_resume = mt8365_afe_runtime_resume;
2211
afe->runtime_suspend = mt8365_afe_runtime_suspend;
2212
2213
/* open afe pdn for dapm read/write audio register */
2214
mt8365_afe_enable_top_cg(afe, MT8365_TOP_CG_AFE);
2215
2216
/* Set 26m parent clk */
2217
mt8365_afe_set_clk_parent(afe,
2218
afe_priv->clocks[MT8365_CLK_TOP_AUD_SEL],
2219
afe_priv->clocks[MT8365_CLK_CLK26M]);
2220
2221
ret = devm_snd_soc_register_component(&pdev->dev,
2222
&mtk_afe_pcm_platform,
2223
afe->dai_drivers,
2224
afe->num_dai_drivers);
2225
if (ret) {
2226
dev_warn(dev, "err_platform\n");
2227
return ret;
2228
}
2229
2230
mt8365_afe_init_registers(afe);
2231
2232
return 0;
2233
}
2234
2235
static void mt8365_afe_pcm_dev_remove(struct platform_device *pdev)
2236
{
2237
struct mtk_base_afe *afe = platform_get_drvdata(pdev);
2238
2239
mt8365_afe_disable_top_cg(afe, MT8365_TOP_CG_AFE);
2240
2241
pm_runtime_disable(&pdev->dev);
2242
if (!pm_runtime_status_suspended(&pdev->dev))
2243
mt8365_afe_runtime_suspend(&pdev->dev);
2244
}
2245
2246
static const struct of_device_id mt8365_afe_pcm_dt_match[] = {
2247
{ .compatible = "mediatek,mt8365-afe-pcm", },
2248
{ }
2249
};
2250
MODULE_DEVICE_TABLE(of, mt8365_afe_pcm_dt_match);
2251
2252
static const struct dev_pm_ops mt8365_afe_pm_ops = {
2253
RUNTIME_PM_OPS(mt8365_afe_dev_runtime_suspend,
2254
mt8365_afe_dev_runtime_resume, NULL)
2255
SYSTEM_SLEEP_PM_OPS(mt8365_afe_suspend, mt8365_afe_resume)
2256
};
2257
2258
static struct platform_driver mt8365_afe_pcm_driver = {
2259
.driver = {
2260
.name = "mt8365-afe-pcm",
2261
.of_match_table = mt8365_afe_pcm_dt_match,
2262
.pm = pm_ptr(&mt8365_afe_pm_ops),
2263
},
2264
.probe = mt8365_afe_pcm_dev_probe,
2265
.remove = mt8365_afe_pcm_dev_remove,
2266
};
2267
2268
module_platform_driver(mt8365_afe_pcm_driver);
2269
2270
MODULE_DESCRIPTION("MediaTek ALSA SoC AFE platform driver");
2271
MODULE_AUTHOR("Jia Zeng <[email protected]>");
2272
MODULE_AUTHOR("Alexandre Mergnat <[email protected]>");
2273
MODULE_LICENSE("GPL");
2274
2275