Skip to content

Commit 89f41fb

Browse files
andrew-mtklgirdwood
authored andcommitted
platform: mtk: Add afe-platform support for mt8365
Add mt8365 AFE common header and register header files. Add AFE platform for mt8365 audio. Signed-off-by: Andrew Perepech <andrew.perepech@mediatek.com>
1 parent edbd963 commit 89f41fb

3 files changed

Lines changed: 1598 additions & 0 deletions

File tree

src/platform/mt8365/afe-platform.c

Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Andrew Perepech <andrew.perepech@mediatek.com>
6+
*/
7+
8+
#include <sof/common.h>
9+
#include <errno.h>
10+
#include <sof/drivers/afe-drv.h>
11+
#include <mt8365-afe-regs.h>
12+
#include <mt8365-afe-common.h>
13+
14+
/*
15+
* AFE: Audio Front-End
16+
*
17+
* frontend (memif):
18+
* memory interface
19+
* AWB, VULx, TDM_IN (uplink for capture)
20+
* DLx, TDM_OUT (downlink for playback)
21+
* backend:
22+
* TDM In
23+
* TMD out
24+
* DMIC
25+
* GASRC
26+
* etc.
27+
* interconn:
28+
* inter-connection,
29+
* connect frontends and backends as DSP path
30+
*/
31+
32+
static const struct mtk_base_memif_data memif_data[MT8365_MEMIF_NUM] = {
33+
[MT8365_MEMIF_DL1] = {
34+
.name = "DL1",
35+
.id = MT8365_MEMIF_DL1,
36+
.reg_ofs_base = AFE_DL1_BASE,
37+
.reg_ofs_cur = AFE_DL1_CUR,
38+
.reg_ofs_end = AFE_DL1_END,
39+
.fs_reg = AFE_DAC_CON1,
40+
.fs_shift = 0,
41+
.fs_maskbit = 0xf,
42+
.mono_reg = AFE_DAC_CON1,
43+
.mono_shift = 21,
44+
.enable_reg = AFE_DAC_CON0,
45+
.enable_shift = 1,
46+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
47+
.hd_shift = 16,
48+
.agent_disable_reg = -1,
49+
.agent_disable_shift = 0,
50+
.ch_num_reg = -1,
51+
.ch_num_shift = 0,
52+
.ch_num_maskbit = 0,
53+
.msb_reg = -1,
54+
.msb_shift = 0,
55+
.msb2_reg = -1,
56+
.msb2_shift = 0,
57+
},
58+
[MT8365_MEMIF_DL2] = {
59+
.name = "DL2",
60+
.id = MT8365_MEMIF_DL2,
61+
.reg_ofs_base = AFE_DL2_BASE,
62+
.reg_ofs_cur = AFE_DL2_CUR,
63+
.reg_ofs_end = AFE_DL2_END,
64+
.fs_reg = AFE_DAC_CON1,
65+
.fs_shift = 4,
66+
.fs_maskbit = 0xf,
67+
.mono_reg = AFE_DAC_CON1,
68+
.mono_shift = 22,
69+
.enable_reg = AFE_DAC_CON0,
70+
.enable_shift = 2,
71+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
72+
.hd_shift = 18,
73+
.agent_disable_reg = -1,
74+
.agent_disable_shift = 0,
75+
.ch_num_reg = -1,
76+
.ch_num_shift = 0,
77+
.ch_num_maskbit = 0,
78+
.msb_reg = -1,
79+
.msb_shift = 0,
80+
.msb2_reg = -1,
81+
.msb2_shift = 0,
82+
},
83+
[MT8365_MEMIF_TDM_OUT] = {
84+
.name = "TDM_OUT",
85+
.id = MT8365_MEMIF_DL2,
86+
.reg_ofs_base = AFE_HDMI_OUT_BASE,
87+
.reg_ofs_cur = AFE_HDMI_OUT_CUR,
88+
.reg_ofs_end = AFE_HDMI_OUT_END,
89+
.fs_reg = -1,
90+
.fs_shift = 0,
91+
.fs_maskbit = 0,
92+
.mono_reg = -1,
93+
.mono_shift = 0,
94+
.enable_reg = AFE_HDMI_OUT_CON0,
95+
.enable_shift = 0,
96+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
97+
.hd_shift = 28,
98+
.agent_disable_reg = -1,
99+
.agent_disable_shift = 0,
100+
.ch_num_reg = -1,
101+
.ch_num_shift = 0,
102+
.ch_num_maskbit = 0,
103+
.msb_reg = -1,
104+
.msb_shift = 0,
105+
.msb2_reg = -1,
106+
.msb2_shift = 0,
107+
},
108+
[MT8365_MEMIF_AWB] = {
109+
.name = "AWB",
110+
.id = MT8365_MEMIF_AWB,
111+
.reg_ofs_base = AFE_AWB_BASE,
112+
.reg_ofs_cur = AFE_AWB_CUR,
113+
.reg_ofs_end = AFE_AWB_END,
114+
.fs_reg = AFE_DAC_CON1,
115+
.fs_shift = 12,
116+
.fs_maskbit = 0xf,
117+
.mono_reg = AFE_DAC_CON1,
118+
.mono_shift = 24,
119+
.enable_reg = AFE_DAC_CON0,
120+
.enable_shift = 6,
121+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
122+
.hd_shift = 20,
123+
.agent_disable_reg = -1,
124+
.agent_disable_shift = 0,
125+
.ch_num_reg = -1,
126+
.ch_num_shift = 0,
127+
.ch_num_maskbit = 0,
128+
.msb_reg = AFE_MEMIF_MSB,
129+
.msb_shift = 17,
130+
.msb2_reg = -1,
131+
.msb2_shift = 0,
132+
},
133+
[MT8365_MEMIF_VUL] = {
134+
.name = "VUL",
135+
.id = MT8365_MEMIF_VUL,
136+
.reg_ofs_base = AFE_VUL_BASE,
137+
.reg_ofs_cur = AFE_VUL_CUR,
138+
.reg_ofs_end = AFE_VUL_END,
139+
.fs_reg = AFE_DAC_CON1,
140+
.fs_shift = 16,
141+
.fs_maskbit = 0xf,
142+
.mono_reg = AFE_DAC_CON1,
143+
.mono_shift = 27,
144+
.enable_reg = AFE_DAC_CON0,
145+
.enable_shift = 3,
146+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
147+
.hd_shift = 22,
148+
.agent_disable_reg = -1,
149+
.agent_disable_shift = 0,
150+
.ch_num_reg = -1,
151+
.ch_num_shift = 0,
152+
.ch_num_maskbit = 0,
153+
.msb_reg = AFE_MEMIF_MSB,
154+
.msb_shift = 20,
155+
.msb2_reg = -1,
156+
.msb2_shift = 0,
157+
},
158+
[MT8365_MEMIF_VUL2] = {
159+
.name = "VUL2",
160+
.id = MT8365_MEMIF_VUL2,
161+
.reg_ofs_base = AFE_VUL_D2_BASE,
162+
.reg_ofs_cur = AFE_VUL_D2_CUR,
163+
.reg_ofs_end = AFE_VUL_D2_END,
164+
.fs_reg = AFE_DAC_CON0,
165+
.fs_shift = 20,
166+
.fs_maskbit = 0xf,
167+
.mono_reg = AFE_DAC_CON0,
168+
.mono_shift = 10,
169+
.enable_reg = AFE_DAC_CON0,
170+
.enable_shift = 9,
171+
.hd_reg = AFE_MEMIF_PBUF_SIZE,
172+
.hd_shift = 14,
173+
.agent_disable_reg = -1,
174+
.agent_disable_shift = 0,
175+
.ch_num_reg = -1,
176+
.ch_num_shift = 0,
177+
.ch_num_maskbit = 0,
178+
.msb_reg = AFE_MEMIF_MSB,
179+
.msb_shift = 21,
180+
.msb2_reg = -1,
181+
.msb2_shift = 0,
182+
},
183+
[MT8365_MEMIF_VUL3] = {
184+
.name = "VUL3",
185+
.id = MT8365_MEMIF_VUL3,
186+
.reg_ofs_base = AFE_VUL3_BASE,
187+
.reg_ofs_cur = AFE_VUL3_CUR,
188+
.reg_ofs_end = AFE_VUL3_END,
189+
.fs_reg = AFE_DAC_CON1,
190+
.fs_shift = 8,
191+
.fs_maskbit = 0xf,
192+
.mono_reg = AFE_DAC_CON0,
193+
.mono_shift = 13,
194+
.enable_reg = AFE_DAC_CON0,
195+
.enable_shift = 12,
196+
.hd_reg = AFE_MEMIF_PBUF2_SIZE,
197+
.hd_shift = 10,
198+
.agent_disable_reg = -1,
199+
.agent_disable_shift = 0,
200+
.ch_num_reg = -1,
201+
.ch_num_shift = 0,
202+
.ch_num_maskbit = 0,
203+
.msb_reg = AFE_MEMIF_MSB,
204+
.msb_shift = 27,
205+
.msb2_reg = -1,
206+
.msb2_shift = 0,
207+
},
208+
[MT8365_MEMIF_TDM_IN] = {
209+
.name = "TDM_IN",
210+
.id = MT8365_MEMIF_TDM_IN,
211+
.reg_ofs_base = AFE_HDMI_IN_2CH_BASE,
212+
.reg_ofs_cur = AFE_HDMI_IN_2CH_CUR,
213+
.reg_ofs_end = AFE_HDMI_IN_2CH_END,
214+
.fs_reg = -1,
215+
.fs_shift = 0,
216+
.fs_maskbit = 0,
217+
.mono_reg = AFE_HDMI_IN_2CH_CON0,
218+
.mono_shift = 1,
219+
.enable_reg = AFE_HDMI_IN_2CH_CON0,
220+
.enable_shift = 0,
221+
.hd_reg = AFE_MEMIF_PBUF2_SIZE,
222+
.hd_shift = 8,
223+
.agent_disable_reg = -1,
224+
.agent_disable_shift = 0,
225+
.ch_num_reg = -1,
226+
.ch_num_shift = 0,
227+
.ch_num_maskbit = 0,
228+
.msb_reg = AFE_MEMIF_MSB,
229+
.msb_shift = 28,
230+
.msb2_reg = -1,
231+
.msb2_shift = 0,
232+
},
233+
};
234+
235+
struct mt8365_afe_rate {
236+
unsigned int rate;
237+
unsigned int reg_value;
238+
};
239+
240+
static const struct mt8365_afe_rate mt8365_afe_rates[] = {
241+
{
242+
.rate = 8000,
243+
.reg_value = 0,
244+
},
245+
{
246+
.rate = 11025,
247+
.reg_value = 1,
248+
},
249+
{
250+
.rate = 12000,
251+
.reg_value = 2,
252+
},
253+
{
254+
.rate = 16000,
255+
.reg_value = 4,
256+
},
257+
{
258+
.rate = 22050,
259+
.reg_value = 5,
260+
},
261+
{
262+
.rate = 24000,
263+
.reg_value = 6,
264+
},
265+
{
266+
.rate = 32000,
267+
.reg_value = 8,
268+
},
269+
{
270+
.rate = 44100,
271+
.reg_value = 9,
272+
},
273+
{
274+
.rate = 48000,
275+
.reg_value = 10,
276+
},
277+
{
278+
.rate = 88200,
279+
.reg_value = 11,
280+
},
281+
{
282+
.rate = 96000,
283+
.reg_value = 12,
284+
},
285+
{
286+
.rate = 176400,
287+
.reg_value = 13,
288+
},
289+
{
290+
.rate = 192000,
291+
.reg_value = 14,
292+
},
293+
};
294+
295+
static unsigned int mt8365_afe_fs_timing(unsigned int rate)
296+
{
297+
int i;
298+
299+
for (i = 0; i < ARRAY_SIZE(mt8365_afe_rates); i++)
300+
if (mt8365_afe_rates[i].rate == rate)
301+
return mt8365_afe_rates[i].reg_value;
302+
303+
return -EINVAL;
304+
}
305+
306+
static unsigned int mt8365_afe_fs(unsigned int rate, int aud_blk)
307+
{
308+
return mt8365_afe_fs_timing(rate);
309+
}
310+
311+
static unsigned int mt8365_afe2adsp_addr(unsigned int addr)
312+
{
313+
/*TODO : Need apply the address remap */
314+
return addr;
315+
}
316+
317+
static unsigned int mt8365_adsp2afe_addr(unsigned int addr)
318+
{
319+
/* TODO : Need apply the address remap */
320+
return addr;
321+
}
322+
323+
struct mtk_base_afe_platform mtk_afe_platform = {
324+
.base_addr = AFE_REG_BASE,
325+
.memif_datas = memif_data,
326+
.memif_size = MT8365_MEMIF_NUM,
327+
.memif_dl_num = MT8365_MEMIF_DL_NUM,
328+
.memif_32bit_supported = 0,
329+
.irq_datas = NULL,
330+
.irqs_size = 0,
331+
.dais_size = MT8365_DAI_NUM,
332+
.afe2adsp_addr = mt8365_afe2adsp_addr,
333+
.adsp2afe_addr = mt8365_adsp2afe_addr,
334+
.afe_fs = mt8365_afe_fs,
335+
.irq_fs = mt8365_afe_fs_timing,
336+
};
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Andrew Perepech <andrew.perepech@mediatek.com>
6+
*/
7+
8+
#ifndef _MT_8365_AFE_COMMON_H_
9+
#define _MT_8365_AFE_COMMON_H_
10+
11+
/* AFE: the abbreviation for Audio Front End */
12+
13+
enum {
14+
MT8365_MEMIF_START,
15+
MT8365_MEMIF_DL_START = MT8365_MEMIF_START,
16+
MT8365_MEMIF_DL1 = MT8365_MEMIF_DL_START,
17+
MT8365_MEMIF_DL2,
18+
MT8365_MEMIF_TDM_OUT,
19+
MT8365_MEMIF_DL_END,
20+
MT8365_MEMIF_UL_START = MT8365_MEMIF_DL_END,
21+
MT8365_MEMIF_AWB = MT8365_MEMIF_UL_START,
22+
MT8365_MEMIF_VUL,
23+
MT8365_MEMIF_VUL2,
24+
MT8365_MEMIF_VUL3,
25+
MT8365_MEMIF_TDM_IN,
26+
MT8365_MEMIF_UL_END,
27+
MT8365_MEMIF_END = MT8365_MEMIF_UL_END,
28+
MT8365_MEMIF_DL_NUM = (MT8365_MEMIF_DL_END - MT8365_MEMIF_DL_START),
29+
MT8365_MEMIF_UL_NUM = (MT8365_MEMIF_UL_END - MT8365_MEMIF_UL_START),
30+
MT8365_MEMIF_NUM = (MT8365_MEMIF_END - MT8365_MEMIF_START),
31+
};
32+
33+
enum {
34+
MT8365_AFE_IRQ_1,
35+
MT8365_AFE_IRQ_2,
36+
MT8365_AFE_IRQ_3,
37+
MT8365_AFE_IRQ_4,
38+
MT8365_AFE_IRQ_5,
39+
MT8365_AFE_IRQ_6,
40+
MT8365_AFE_IRQ_7,
41+
MT8365_AFE_IRQ_8,
42+
MT8365_AFE_IRQ_9,
43+
MT8365_AFE_IRQ_10,
44+
MT8365_AFE_IRQ_NUM,
45+
};
46+
47+
enum {
48+
MT8365_AFE_IO_INT_ADDA_OUT,
49+
MT8365_AFE_IO_2ND_I2S,
50+
MT8365_AFE_IO_INT_ADDA_IN,
51+
MT8365_AFE_IO_DMIC,
52+
MT8365_DAI_NUM,
53+
};
54+
55+
#endif /* _MT_8365_AFE_COMMON_H_ */

0 commit comments

Comments
 (0)