Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/mediatek/mt8365/mt8365-afe-common.h
26488 views
1
/* SPDX-License-Identifier: GPL-2.0
2
*
3
* MediaTek 8365 audio driver common definitions
4
*
5
* Copyright (c) 2024 MediaTek Inc.
6
* Authors: Jia Zeng <[email protected]>
7
* Alexandre Mergnat <[email protected]>
8
*/
9
10
#ifndef _MT8365_AFE_COMMON_H_
11
#define _MT8365_AFE_COMMON_H_
12
13
#include <linux/clk.h>
14
#include <linux/list.h>
15
#include <linux/regmap.h>
16
#include <sound/soc.h>
17
#include <sound/asound.h>
18
#include "../common/mtk-base-afe.h"
19
#include "mt8365-reg.h"
20
21
enum {
22
MT8365_AFE_MEMIF_DL1,
23
MT8365_AFE_MEMIF_DL2,
24
MT8365_AFE_MEMIF_TDM_OUT,
25
/*
26
* MT8365_AFE_MEMIF_SPDIF_OUT,
27
*/
28
MT8365_AFE_MEMIF_AWB,
29
MT8365_AFE_MEMIF_VUL,
30
MT8365_AFE_MEMIF_VUL2,
31
MT8365_AFE_MEMIF_VUL3,
32
MT8365_AFE_MEMIF_TDM_IN,
33
/*
34
* MT8365_AFE_MEMIF_SPDIF_IN,
35
*/
36
MT8365_AFE_MEMIF_NUM,
37
MT8365_AFE_BACKEND_BASE = MT8365_AFE_MEMIF_NUM,
38
MT8365_AFE_IO_TDM_OUT = MT8365_AFE_BACKEND_BASE,
39
MT8365_AFE_IO_TDM_IN,
40
MT8365_AFE_IO_I2S,
41
MT8365_AFE_IO_2ND_I2S,
42
MT8365_AFE_IO_PCM1,
43
MT8365_AFE_IO_VIRTUAL_DL_SRC,
44
MT8365_AFE_IO_VIRTUAL_TDM_OUT_SRC,
45
MT8365_AFE_IO_VIRTUAL_FM,
46
MT8365_AFE_IO_DMIC,
47
MT8365_AFE_IO_INT_ADDA,
48
MT8365_AFE_IO_GASRC1,
49
MT8365_AFE_IO_GASRC2,
50
MT8365_AFE_IO_TDM_ASRC,
51
MT8365_AFE_IO_HW_GAIN1,
52
MT8365_AFE_IO_HW_GAIN2,
53
MT8365_AFE_BACKEND_END,
54
MT8365_AFE_BACKEND_NUM = (MT8365_AFE_BACKEND_END -
55
MT8365_AFE_BACKEND_BASE),
56
};
57
58
enum {
59
MT8365_AFE_IRQ1,
60
MT8365_AFE_IRQ2,
61
MT8365_AFE_IRQ3,
62
MT8365_AFE_IRQ4,
63
MT8365_AFE_IRQ5,
64
MT8365_AFE_IRQ6,
65
MT8365_AFE_IRQ7,
66
MT8365_AFE_IRQ8,
67
MT8365_AFE_IRQ9,
68
MT8365_AFE_IRQ10,
69
MT8365_AFE_IRQ_NUM,
70
};
71
72
enum {
73
MT8365_TOP_CG_AFE,
74
MT8365_TOP_CG_I2S_IN,
75
MT8365_TOP_CG_22M,
76
MT8365_TOP_CG_24M,
77
MT8365_TOP_CG_INTDIR_CK,
78
MT8365_TOP_CG_APLL2_TUNER,
79
MT8365_TOP_CG_APLL_TUNER,
80
MT8365_TOP_CG_SPDIF,
81
MT8365_TOP_CG_TDM_OUT,
82
MT8365_TOP_CG_TDM_IN,
83
MT8365_TOP_CG_ADC,
84
MT8365_TOP_CG_DAC,
85
MT8365_TOP_CG_DAC_PREDIS,
86
MT8365_TOP_CG_TML,
87
MT8365_TOP_CG_I2S1_BCLK,
88
MT8365_TOP_CG_I2S2_BCLK,
89
MT8365_TOP_CG_I2S3_BCLK,
90
MT8365_TOP_CG_I2S4_BCLK,
91
MT8365_TOP_CG_DMIC0_ADC,
92
MT8365_TOP_CG_DMIC1_ADC,
93
MT8365_TOP_CG_DMIC2_ADC,
94
MT8365_TOP_CG_DMIC3_ADC,
95
MT8365_TOP_CG_CONNSYS_I2S_ASRC,
96
MT8365_TOP_CG_GENERAL1_ASRC,
97
MT8365_TOP_CG_GENERAL2_ASRC,
98
MT8365_TOP_CG_TDM_ASRC,
99
MT8365_TOP_CG_NUM
100
};
101
102
enum {
103
MT8365_CLK_TOP_AUD_SEL,
104
MT8365_CLK_AUD_I2S0_M,
105
MT8365_CLK_AUD_I2S1_M,
106
MT8365_CLK_AUD_I2S2_M,
107
MT8365_CLK_AUD_I2S3_M,
108
MT8365_CLK_ENGEN1,
109
MT8365_CLK_ENGEN2,
110
MT8365_CLK_AUD1,
111
MT8365_CLK_AUD2,
112
MT8365_CLK_I2S0_M_SEL,
113
MT8365_CLK_I2S1_M_SEL,
114
MT8365_CLK_I2S2_M_SEL,
115
MT8365_CLK_I2S3_M_SEL,
116
MT8365_CLK_CLK26M,
117
MT8365_CLK_NUM
118
};
119
120
enum {
121
MT8365_AFE_APLL1 = 0,
122
MT8365_AFE_APLL2,
123
MT8365_AFE_APLL_NUM,
124
};
125
126
enum {
127
MT8365_AFE_1ST_I2S = 0,
128
MT8365_AFE_2ND_I2S,
129
MT8365_AFE_I2S_SETS,
130
};
131
132
enum {
133
MT8365_AFE_I2S_SEPARATE_CLOCK = 0,
134
MT8365_AFE_I2S_SHARED_CLOCK,
135
};
136
137
enum {
138
MT8365_AFE_TDM_OUT_I2S = 0,
139
MT8365_AFE_TDM_OUT_TDM,
140
MT8365_AFE_TDM_OUT_I2S_32BITS,
141
};
142
143
enum mt8365_afe_tdm_ch_start {
144
AFE_TDM_CH_START_O28_O29 = 0,
145
AFE_TDM_CH_START_O30_O31,
146
AFE_TDM_CH_START_O32_O33,
147
AFE_TDM_CH_START_O34_O35,
148
AFE_TDM_CH_ZERO,
149
};
150
151
enum {
152
MT8365_PCM_FORMAT_I2S = 0,
153
MT8365_PCM_FORMAT_EIAJ,
154
MT8365_PCM_FORMAT_PCMA,
155
MT8365_PCM_FORMAT_PCMB,
156
};
157
158
enum {
159
MT8365_FS_8K = 0,
160
MT8365_FS_11D025K,
161
MT8365_FS_12K,
162
MT8365_FS_384K,
163
MT8365_FS_16K,
164
MT8365_FS_22D05K,
165
MT8365_FS_24K,
166
MT8365_FS_130K,
167
MT8365_FS_32K,
168
MT8365_FS_44D1K,
169
MT8365_FS_48K,
170
MT8365_FS_88D2K,
171
MT8365_FS_96K,
172
MT8365_FS_176D4K,
173
MT8365_FS_192K,
174
};
175
176
enum {
177
FS_8000HZ = 0, /* 0000b */
178
FS_11025HZ = 1, /* 0001b */
179
FS_12000HZ = 2, /* 0010b */
180
FS_384000HZ = 3, /* 0011b */
181
FS_16000HZ = 4, /* 0100b */
182
FS_22050HZ = 5, /* 0101b */
183
FS_24000HZ = 6, /* 0110b */
184
FS_130000HZ = 7, /* 0111b */
185
FS_32000HZ = 8, /* 1000b */
186
FS_44100HZ = 9, /* 1001b */
187
FS_48000HZ = 10, /* 1010b */
188
FS_88200HZ = 11, /* 1011b */
189
FS_96000HZ = 12, /* 1100b */
190
FS_176400HZ = 13, /* 1101b */
191
FS_192000HZ = 14, /* 1110b */
192
FS_260000HZ = 15, /* 1111b */
193
};
194
195
enum {
196
MT8365_AFE_DEBUGFS_AFE,
197
MT8365_AFE_DEBUGFS_MEMIF,
198
MT8365_AFE_DEBUGFS_IRQ,
199
MT8365_AFE_DEBUGFS_CONN,
200
MT8365_AFE_DEBUGFS_DBG,
201
MT8365_AFE_DEBUGFS_NUM,
202
};
203
204
enum {
205
MT8365_AFE_IRQ_DIR_MCU = 0,
206
MT8365_AFE_IRQ_DIR_DSP,
207
MT8365_AFE_IRQ_DIR_BOTH,
208
};
209
210
/* MCLK */
211
enum {
212
MT8365_I2S0_MCK = 0,
213
MT8365_I2S3_MCK,
214
MT8365_MCK_NUM,
215
};
216
217
struct mt8365_fe_dai_data {
218
bool use_sram;
219
unsigned int sram_phy_addr;
220
void __iomem *sram_vir_addr;
221
unsigned int sram_size;
222
};
223
224
struct mt8365_be_dai_data {
225
bool prepared[SNDRV_PCM_STREAM_LAST + 1];
226
unsigned int fmt_mode;
227
};
228
229
#define MT8365_CLK_26M 26000000
230
#define MT8365_CLK_24M 24000000
231
#define MT8365_CLK_22M 22000000
232
#define MT8365_CM_UPDATA_CNT_SET 8
233
234
enum mt8365_cm_num {
235
MT8365_CM1 = 0,
236
MT8365_CM2,
237
MT8365_CM_NUM,
238
};
239
240
enum mt8365_cm2_mux_in {
241
MT8365_FROM_GASRC1 = 1,
242
MT8365_FROM_GASRC2,
243
MT8365_FROM_TDM_ASRC,
244
MT8365_CM_MUX_NUM,
245
};
246
247
enum cm2_mux_conn_in {
248
GENERAL2_ASRC_OUT_LCH = 0,
249
GENERAL2_ASRC_OUT_RCH = 1,
250
TDM_IN_CH0 = 2,
251
TDM_IN_CH1 = 3,
252
TDM_IN_CH2 = 4,
253
TDM_IN_CH3 = 5,
254
TDM_IN_CH4 = 6,
255
TDM_IN_CH5 = 7,
256
TDM_IN_CH6 = 8,
257
TDM_IN_CH7 = 9,
258
GENERAL1_ASRC_OUT_LCH = 10,
259
GENERAL1_ASRC_OUT_RCH = 11,
260
TDM_OUT_ASRC_CH0 = 12,
261
TDM_OUT_ASRC_CH1 = 13,
262
TDM_OUT_ASRC_CH2 = 14,
263
TDM_OUT_ASRC_CH3 = 15,
264
TDM_OUT_ASRC_CH4 = 16,
265
TDM_OUT_ASRC_CH5 = 17,
266
TDM_OUT_ASRC_CH6 = 18,
267
TDM_OUT_ASRC_CH7 = 19
268
};
269
270
struct mt8365_cm_ctrl_reg {
271
unsigned int con0;
272
unsigned int con1;
273
unsigned int con2;
274
unsigned int con3;
275
unsigned int con4;
276
};
277
278
struct mt8365_control_data {
279
bool bypass_cm1;
280
bool bypass_cm2;
281
unsigned int loopback_type;
282
};
283
284
enum dmic_input_mode {
285
DMIC_MODE_3P25M = 0,
286
DMIC_MODE_1P625M,
287
DMIC_MODE_812P5K,
288
DMIC_MODE_406P25K,
289
};
290
291
enum iir_mode {
292
IIR_MODE0 = 0,
293
IIR_MODE1,
294
IIR_MODE2,
295
IIR_MODE3,
296
IIR_MODE4,
297
IIR_MODE5,
298
};
299
300
enum {
301
MT8365_GASRC1 = 0,
302
MT8365_GASRC2,
303
MT8365_GASRC_NUM,
304
MT8365_TDM_ASRC1 = MT8365_GASRC_NUM,
305
MT8365_TDM_ASRC2,
306
MT8365_TDM_ASRC3,
307
MT8365_TDM_ASRC4,
308
MT8365_TDM_ASRC_NUM,
309
};
310
311
struct mt8365_gasrc_ctrl_reg {
312
unsigned int con0;
313
unsigned int con2;
314
unsigned int con3;
315
unsigned int con4;
316
unsigned int con5;
317
unsigned int con6;
318
unsigned int con9;
319
unsigned int con10;
320
unsigned int con12;
321
unsigned int con13;
322
};
323
324
struct mt8365_gasrc_data {
325
bool duplex;
326
bool tx_mode;
327
bool cali_on;
328
bool tdm_asrc_out_cm2;
329
bool iir_on;
330
};
331
332
struct mt8365_afe_private {
333
struct clk *clocks[MT8365_CLK_NUM];
334
struct regmap *topckgen;
335
struct mt8365_fe_dai_data fe_data[MT8365_AFE_MEMIF_NUM];
336
struct mt8365_be_dai_data be_data[MT8365_AFE_BACKEND_NUM];
337
struct mt8365_control_data ctrl_data;
338
struct mt8365_gasrc_data gasrc_data[MT8365_TDM_ASRC_NUM];
339
int afe_on_ref_cnt;
340
int top_cg_ref_cnt[MT8365_TOP_CG_NUM];
341
void __iomem *afe_sram_vir_addr;
342
unsigned int afe_sram_phy_addr;
343
unsigned int afe_sram_size;
344
/* locks */
345
spinlock_t afe_ctrl_lock;
346
struct mutex afe_clk_mutex; /* Protect & sync APLL TUNER registers access*/
347
#ifdef CONFIG_DEBUG_FS
348
struct dentry *debugfs_dentry[MT8365_AFE_DEBUGFS_NUM];
349
#endif
350
int apll_tuner_ref_cnt[MT8365_AFE_APLL_NUM];
351
unsigned int tdm_out_mode;
352
unsigned int cm2_mux_input;
353
354
/* dai */
355
bool dai_on[MT8365_AFE_BACKEND_END];
356
void *dai_priv[MT8365_AFE_BACKEND_END];
357
};
358
359
static inline u32 rx_frequency_palette(unsigned int fs)
360
{
361
/* *
362
* A = (26M / fs) * 64
363
* B = 8125 / A
364
* return = DEC2HEX(B * 2^23)
365
*/
366
switch (fs) {
367
case FS_8000HZ: return 0x050000;
368
case FS_11025HZ: return 0x06E400;
369
case FS_12000HZ: return 0x078000;
370
case FS_16000HZ: return 0x0A0000;
371
case FS_22050HZ: return 0x0DC800;
372
case FS_24000HZ: return 0x0F0000;
373
case FS_32000HZ: return 0x140000;
374
case FS_44100HZ: return 0x1B9000;
375
case FS_48000HZ: return 0x1E0000;
376
case FS_88200HZ: return 0x372000;
377
case FS_96000HZ: return 0x3C0000;
378
case FS_176400HZ: return 0x6E4000;
379
case FS_192000HZ: return 0x780000;
380
default: return 0x0;
381
}
382
}
383
384
static inline u32 AutoRstThHi(unsigned int fs)
385
{
386
switch (fs) {
387
case FS_8000HZ: return 0x36000;
388
case FS_11025HZ: return 0x27000;
389
case FS_12000HZ: return 0x24000;
390
case FS_16000HZ: return 0x1B000;
391
case FS_22050HZ: return 0x14000;
392
case FS_24000HZ: return 0x12000;
393
case FS_32000HZ: return 0x0D800;
394
case FS_44100HZ: return 0x09D00;
395
case FS_48000HZ: return 0x08E00;
396
case FS_88200HZ: return 0x04E00;
397
case FS_96000HZ: return 0x04800;
398
case FS_176400HZ: return 0x02700;
399
case FS_192000HZ: return 0x02400;
400
default: return 0x0;
401
}
402
}
403
404
static inline u32 AutoRstThLo(unsigned int fs)
405
{
406
switch (fs) {
407
case FS_8000HZ: return 0x30000;
408
case FS_11025HZ: return 0x23000;
409
case FS_12000HZ: return 0x20000;
410
case FS_16000HZ: return 0x18000;
411
case FS_22050HZ: return 0x11000;
412
case FS_24000HZ: return 0x0FE00;
413
case FS_32000HZ: return 0x0BE00;
414
case FS_44100HZ: return 0x08A00;
415
case FS_48000HZ: return 0x07F00;
416
case FS_88200HZ: return 0x04500;
417
case FS_96000HZ: return 0x04000;
418
case FS_176400HZ: return 0x02300;
419
case FS_192000HZ: return 0x02000;
420
default: return 0x0;
421
}
422
}
423
424
bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id);
425
bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id);
426
427
int mt8365_dai_i2s_register(struct mtk_base_afe *afe);
428
int mt8365_dai_set_priv(struct mtk_base_afe *afe,
429
int id,
430
int priv_size,
431
const void *priv_data);
432
433
int mt8365_afe_fs_timing(unsigned int rate);
434
435
void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable);
436
int mt8365_afe_set_i2s_out(struct mtk_base_afe *afe, unsigned int rate, int bit_width);
437
438
int mt8365_dai_adda_register(struct mtk_base_afe *afe);
439
int mt8365_dai_enable_adda_on(struct mtk_base_afe *afe);
440
int mt8365_dai_disable_adda_on(struct mtk_base_afe *afe);
441
442
int mt8365_dai_dmic_register(struct mtk_base_afe *afe);
443
444
int mt8365_dai_pcm_register(struct mtk_base_afe *afe);
445
446
int mt8365_dai_tdm_register(struct mtk_base_afe *afe);
447
448
#endif
449
450