Skip to content

Commit 41dfc80

Browse files
wenliangwulgirdwood
authored andcommitted
platform: mtk: add afe-platform support for mt8188
Add mt8188 AFE common header and register header files. Add AFE platform for mt8188 audio. Signed-off-by: Trevor Wu <trevor.wu@mediatek.com>
1 parent 64dc4a7 commit 41dfc80

5 files changed

Lines changed: 3041 additions & 1 deletion

File tree

src/include/sof/drivers/afe-drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ struct mtk_base_memif_data {
2727
int quad_ch_reg;
2828
int quad_ch_mask;
2929
int quad_ch_shift;
30+
int int_odd_flag_reg;
31+
int int_odd_flag_shift;
3032
int enable_reg;
3133
int enable_shift;
3234
int hd_reg;

src/platform/mt8188/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
add_subdirectory(lib)
44

5-
add_local_sources(sof platform.c)
5+
add_local_sources(sof platform.c afe-platform.c)
66
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/platform/mt8188/include/arch)
77
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/platform/mt8188/include/platform)

src/platform/mt8188/afe-platform.c

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
/*
3+
* Copyright(c) 2023 MediaTek. All rights reserved.
4+
*
5+
* Author: Trevor Wu <trevor.wu@mediatek.com>
6+
*/
7+
8+
#include <sof/common.h>
9+
#include <errno.h>
10+
#include <sof/drivers/afe-drv.h>
11+
#include <mt8188-afe-reg.h>
12+
#include <mt8188-afe-common.h>
13+
14+
/*
15+
* AFE: Audio Front-End
16+
*
17+
* frontend (memif):
18+
* memory interface
19+
* UL (uplink for capture)
20+
* DL (downlink for playback)
21+
* backend:
22+
* TDM In
23+
* TDM Out
24+
* DMIC
25+
* GASRC
26+
* I2S Out
27+
* I2S In
28+
* etc.
29+
* interconn:
30+
* inter-connection,
31+
* connect frontends and backends as DSP path
32+
*/
33+
34+
static const struct mtk_base_memif_data memif_data[MT8188_MEMIF_NUM] = {
35+
[MT8188_MEMIF_DL2] = {
36+
.name = "DL2",
37+
.id = MT8188_MEMIF_DL2,
38+
.reg_ofs_base = AFE_DL2_BASE,
39+
.reg_ofs_cur = AFE_DL2_CUR,
40+
.reg_ofs_end = AFE_DL2_END,
41+
.fs_reg = AFE_MEMIF_AGENT_FS_CON0,
42+
.fs_shift = 10,
43+
.fs_maskbit = 0x1f,
44+
.mono_reg = -1,
45+
.mono_shift = 0,
46+
.int_odd_flag_reg = -1,
47+
.int_odd_flag_shift = 0,
48+
.enable_reg = AFE_DAC_CON0,
49+
.enable_shift = 18,
50+
.hd_reg = AFE_DL2_CON0,
51+
.hd_shift = 5,
52+
.agent_disable_reg = AUDIO_TOP_CON5,
53+
.agent_disable_shift = 18,
54+
.ch_num_reg = AFE_DL2_CON0,
55+
.ch_num_shift = 0,
56+
.ch_num_maskbit = 0x1f,
57+
.msb_reg = AFE_NORMAL_BASE_ADR_MSB,
58+
.msb_shift = 18,
59+
.msb2_reg = AFE_NORMAL_END_ADR_MSB,
60+
.msb2_shift = 18,
61+
},
62+
[MT8188_MEMIF_DL3] = {
63+
.name = "DL3",
64+
.id = MT8188_MEMIF_DL3,
65+
.reg_ofs_base = AFE_DL3_BASE,
66+
.reg_ofs_cur = AFE_DL3_CUR,
67+
.reg_ofs_end = AFE_DL3_END,
68+
.fs_reg = AFE_MEMIF_AGENT_FS_CON0,
69+
.fs_shift = 15,
70+
.fs_maskbit = 0x1f,
71+
.mono_reg = -1,
72+
.mono_shift = 0,
73+
.int_odd_flag_reg = -1,
74+
.int_odd_flag_shift = 0,
75+
.enable_reg = AFE_DAC_CON0,
76+
.enable_shift = 19,
77+
.hd_reg = AFE_DL3_CON0,
78+
.hd_shift = 5,
79+
.agent_disable_reg = AUDIO_TOP_CON5,
80+
.agent_disable_shift = 19,
81+
.ch_num_reg = AFE_DL3_CON0,
82+
.ch_num_shift = 0,
83+
.ch_num_maskbit = 0x1f,
84+
.msb_reg = AFE_NORMAL_BASE_ADR_MSB,
85+
.msb_shift = 19,
86+
.msb2_reg = AFE_NORMAL_END_ADR_MSB,
87+
.msb2_shift = 19,
88+
},
89+
[MT8188_MEMIF_UL4] = {
90+
.name = "UL4",
91+
.id = MT8188_MEMIF_UL4,
92+
.reg_ofs_base = AFE_UL4_BASE,
93+
.reg_ofs_cur = AFE_UL4_CUR,
94+
.reg_ofs_end = AFE_UL4_END,
95+
.fs_reg = AFE_MEMIF_AGENT_FS_CON2,
96+
.fs_shift = 15,
97+
.fs_maskbit = 0x1f,
98+
.mono_reg = AFE_UL4_CON0,
99+
.mono_shift = 1,
100+
.int_odd_flag_reg = AFE_UL4_CON0,
101+
.int_odd_flag_shift = 0,
102+
.enable_reg = AFE_DAC_CON0,
103+
.enable_shift = 4,
104+
.hd_reg = AFE_UL4_CON0,
105+
.hd_shift = 5,
106+
.agent_disable_reg = AUDIO_TOP_CON5,
107+
.agent_disable_shift = 3,
108+
.ch_num_reg = -1,
109+
.ch_num_shift = 0,
110+
.ch_num_maskbit = 0,
111+
.msb_reg = AFE_NORMAL_BASE_ADR_MSB,
112+
.msb_shift = 3,
113+
.msb2_reg = AFE_NORMAL_END_ADR_MSB,
114+
.msb2_shift = 3,
115+
},
116+
[MT8188_MEMIF_UL5] = {
117+
.name = "UL5",
118+
.id = MT8188_MEMIF_UL5,
119+
.reg_ofs_base = AFE_UL5_BASE,
120+
.reg_ofs_cur = AFE_UL5_CUR,
121+
.reg_ofs_end = AFE_UL5_END,
122+
.fs_reg = AFE_MEMIF_AGENT_FS_CON2,
123+
.fs_shift = 20,
124+
.fs_maskbit = 0x1f,
125+
.mono_reg = AFE_UL5_CON0,
126+
.mono_shift = 1,
127+
.int_odd_flag_reg = AFE_UL5_CON0,
128+
.int_odd_flag_shift = 0,
129+
.enable_reg = AFE_DAC_CON0,
130+
.enable_shift = 5,
131+
.hd_reg = AFE_UL5_CON0,
132+
.hd_shift = 5,
133+
.agent_disable_reg = AUDIO_TOP_CON5,
134+
.agent_disable_shift = 4,
135+
.ch_num_reg = -1,
136+
.ch_num_shift = 0,
137+
.ch_num_maskbit = 0,
138+
.msb_reg = AFE_NORMAL_BASE_ADR_MSB,
139+
.msb_shift = 4,
140+
.msb2_reg = AFE_NORMAL_END_ADR_MSB,
141+
.msb2_shift = 4,
142+
},
143+
};
144+
145+
struct mt8188_afe_rate {
146+
unsigned int rate;
147+
unsigned int reg_value;
148+
};
149+
150+
static const struct mt8188_afe_rate mt8188_afe_rates[] = {
151+
{
152+
.rate = 8000,
153+
.reg_value = 0,
154+
},
155+
{
156+
.rate = 12000,
157+
.reg_value = 1,
158+
},
159+
{
160+
.rate = 16000,
161+
.reg_value = 2,
162+
},
163+
{
164+
.rate = 24000,
165+
.reg_value = 3,
166+
},
167+
{
168+
.rate = 32000,
169+
.reg_value = 4,
170+
},
171+
{
172+
.rate = 48000,
173+
.reg_value = 5,
174+
},
175+
{
176+
.rate = 96000,
177+
.reg_value = 6,
178+
},
179+
{
180+
.rate = 192000,
181+
.reg_value = 7,
182+
},
183+
{
184+
.rate = 384000,
185+
.reg_value = 8,
186+
},
187+
{
188+
.rate = 7350,
189+
.reg_value = 16,
190+
},
191+
{
192+
.rate = 11025,
193+
.reg_value = 17,
194+
},
195+
{
196+
.rate = 14700,
197+
.reg_value = 18,
198+
},
199+
{
200+
.rate = 22050,
201+
.reg_value = 19,
202+
},
203+
{
204+
.rate = 29400,
205+
.reg_value = 20,
206+
},
207+
{
208+
.rate = 44100,
209+
.reg_value = 21,
210+
},
211+
{
212+
.rate = 88200,
213+
.reg_value = 22,
214+
},
215+
{
216+
.rate = 176400,
217+
.reg_value = 23,
218+
},
219+
{
220+
.rate = 352800,
221+
.reg_value = 24,
222+
},
223+
};
224+
225+
static unsigned int mt8188_afe_fs_timing(unsigned int rate)
226+
{
227+
int i;
228+
229+
for (i = 0; i < ARRAY_SIZE(mt8188_afe_rates); i++)
230+
if (mt8188_afe_rates[i].rate == rate)
231+
return mt8188_afe_rates[i].reg_value;
232+
233+
return -EINVAL;
234+
}
235+
236+
static unsigned int mt8188_afe_fs(unsigned int rate, int aud_blk)
237+
{
238+
return mt8188_afe_fs_timing(rate);
239+
}
240+
241+
struct mtk_base_afe_platform mtk_afe_platform = {
242+
.base_addr = AFE_BASE_ADDR,
243+
.memif_datas = memif_data,
244+
.memif_size = MT8188_MEMIF_NUM,
245+
.memif_dl_num = MT8188_MEMIF_DL_NUM,
246+
.memif_32bit_supported = 0,
247+
.irq_datas = NULL,
248+
.irqs_size = 0,
249+
.dais_size = MT8188_DAI_NUM,
250+
.afe_fs = mt8188_afe_fs,
251+
.irq_fs = mt8188_afe_fs_timing,
252+
};
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2023 MediaTek. All rights reserved.
4+
*
5+
* Author: Trevor Wu <trevor.wu@mediatek.com>
6+
*/
7+
8+
#ifndef _MT_8188_AFE_COMMON_H_
9+
#define _MT_8188_AFE_COMMON_H_
10+
11+
enum {
12+
MT8188_MEMIF_START,
13+
MT8188_MEMIF_DL_START = MT8188_MEMIF_START,
14+
MT8188_MEMIF_DL2 = MT8188_MEMIF_DL_START,
15+
MT8188_MEMIF_DL3,
16+
MT8188_MEMIF_DL_END,
17+
MT8188_MEMIF_UL_START = MT8188_MEMIF_DL_END,
18+
MT8188_MEMIF_UL4 = MT8188_MEMIF_UL_START,
19+
MT8188_MEMIF_UL5,
20+
MT8188_MEMIF_UL_END,
21+
MT8188_MEMIF_END = MT8188_MEMIF_UL_END,
22+
MT8188_MEMIF_DL_NUM = (MT8188_MEMIF_DL_END - MT8188_MEMIF_DL_START),
23+
MT8188_MEMIF_UL_NUM = (MT8188_MEMIF_UL_END - MT8188_MEMIF_UL_START),
24+
MT8188_MEMIF_NUM = (MT8188_MEMIF_END - MT8188_MEMIF_START),
25+
};
26+
27+
enum {
28+
MT8188_IRQ_1,
29+
MT8188_IRQ_2,
30+
MT8188_IRQ_3,
31+
MT8188_IRQ_8,
32+
MT8188_IRQ_9,
33+
MT8188_IRQ_10,
34+
MT8188_IRQ_13,
35+
MT8188_IRQ_14,
36+
MT8188_IRQ_15,
37+
MT8188_IRQ_16,
38+
MT8188_IRQ_17,
39+
MT8188_IRQ_18,
40+
MT8188_IRQ_19,
41+
MT8188_IRQ_20,
42+
MT8188_IRQ_21,
43+
MT8188_IRQ_22,
44+
MT8188_IRQ_23,
45+
MT8188_IRQ_24,
46+
MT8188_IRQ_25,
47+
MT8188_IRQ_26,
48+
MT8188_IRQ_27,
49+
MT8188_IRQ_28,
50+
MT8188_IRQ_NUM,
51+
};
52+
53+
enum {
54+
MT8188_AFE_IO_ETDM2_OUT, /* speaker */
55+
MT8188_AFE_IO_ETDM1_OUT, /* headset out */
56+
MT8188_AFE_IO_ADDA, /* DMIC */
57+
MT8188_AFE_IO_ETDM2_IN, /* headset mic */
58+
MT8188_DAI_NUM,
59+
};
60+
61+
#endif

0 commit comments

Comments
 (0)