xref: /linux/sound/soc/mediatek/mt8365/mt8365-afe-common.h (revision 38c7c9ddc74033406461d64e541bbc8268e77f73)
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 <jia.zeng@mediatek.com>
7  *          Alexandre Mergnat <amergnat@baylibre.com>
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_clk_group_48k(int sample_rate);
425 bool mt8365_afe_rate_supported(unsigned int rate, unsigned int id);
426 bool mt8365_afe_channel_supported(unsigned int channel, unsigned int id);
427 
428 int mt8365_dai_i2s_register(struct mtk_base_afe *afe);
429 int mt8365_dai_set_priv(struct mtk_base_afe *afe,
430 			int id,
431 			int priv_size,
432 			const void *priv_data);
433 
434 int mt8365_afe_fs_timing(unsigned int rate);
435 
436 void mt8365_afe_set_i2s_out_enable(struct mtk_base_afe *afe, bool enable);
437 int mt8365_afe_set_i2s_out(struct mtk_base_afe *afe, unsigned int rate,	int bit_width);
438 
439 int mt8365_dai_adda_register(struct mtk_base_afe *afe);
440 int mt8365_dai_enable_adda_on(struct mtk_base_afe *afe);
441 int mt8365_dai_disable_adda_on(struct mtk_base_afe *afe);
442 
443 int mt8365_dai_dmic_register(struct mtk_base_afe *afe);
444 
445 int mt8365_dai_pcm_register(struct mtk_base_afe *afe);
446 
447 int mt8365_dai_tdm_register(struct mtk_base_afe *afe);
448 
449 #endif
450