Skip to content

Commit e5aaeb7

Browse files
yefei-ajohnylin76
authored andcommitted
platform: mtk: add platform driver support for mt8196
Add support for dai, dma platform driver. Signed-off-by: Darren.Ye <darren.ye@mediatek.com>
1 parent b95fc72 commit e5aaeb7

File tree

8 files changed

+3413
-4
lines changed

8 files changed

+3413
-4
lines changed

src/platform/mt8196/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/mt8196/include/arch)
77
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/platform/mt8196/include/platform)

src/platform/mt8196/afe-platform.c

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Darren Ye <darren.ye@mediatek.com>
6+
*/
7+
8+
#include <sof/common.h>
9+
#include <errno.h>
10+
#include <sof/drivers/afe-drv.h>
11+
#include <mt8196-afe-reg.h>
12+
#include <mt8196-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[MT8196_MEMIF_NUM] = {
35+
[MT8196_MEMIF_DL1] = {
36+
.name = "DL1",
37+
.id = MT8196_MEMIF_DL1,
38+
.reg_ofs_base = AFE_DL1_BASE,
39+
.reg_ofs_cur = AFE_DL1_CUR,
40+
.reg_ofs_end = AFE_DL1_END,
41+
.reg_ofs_base_msb = AFE_DL1_BASE_MSB,
42+
.reg_ofs_cur_msb = AFE_DL1_CUR_MSB,
43+
.reg_ofs_end_msb = AFE_DL1_END_MSB,
44+
.fs_reg = AFE_DL1_CON0,
45+
.fs_shift = DL1_SEL_FS_SFT,
46+
.fs_maskbit = DL1_SEL_FS_MASK,
47+
.mono_reg = AFE_DL1_CON0,
48+
.mono_shift = DL1_MONO_SFT,
49+
.int_odd_flag_reg = -1,
50+
.int_odd_flag_shift = 0,
51+
.enable_reg = AFE_DL1_CON0,
52+
.enable_shift = DL1_ON_SFT,
53+
.hd_reg = AFE_DL1_CON0,
54+
.hd_shift = DL1_HD_MODE_SFT,
55+
.hd_align_reg = AFE_DL1_CON0,
56+
.hd_align_mshift = DL1_HALIGN_SFT,
57+
.agent_disable_reg = -1,
58+
.agent_disable_shift = -1,
59+
.ch_num_reg = -1,
60+
.msb_reg = -1,
61+
.msb_shift = -1,
62+
.pbuf_reg = AFE_DL1_CON0,
63+
.pbuf_mask = DL1_PBUF_SIZE_MASK,
64+
.pbuf_shift = DL1_PBUF_SIZE_SFT,
65+
.minlen_reg = AFE_DL1_CON0,
66+
.minlen_mask = DL1_MINLEN_MASK,
67+
.minlen_shift = DL1_MINLEN_SFT,
68+
},
69+
[MT8196_MEMIF_DL_24CH] = {
70+
.name = "DL_24CH",
71+
.id = MT8196_MEMIF_DL_24CH,
72+
.reg_ofs_base = AFE_DL_24CH_BASE,
73+
.reg_ofs_cur = AFE_DL_24CH_CUR,
74+
.reg_ofs_end = AFE_DL_24CH_END,
75+
.reg_ofs_base_msb = AFE_DL_24CH_BASE_MSB,
76+
.reg_ofs_cur_msb = AFE_DL_24CH_CUR_MSB,
77+
.reg_ofs_end_msb = AFE_DL_24CH_END_MSB,
78+
.fs_reg = AFE_DL_24CH_CON0,
79+
.fs_shift = DL_24CH_SEL_FS_SFT,
80+
.fs_maskbit = DL_24CH_SEL_FS_MASK,
81+
.mono_reg = -1,
82+
.mono_shift = -1,
83+
.int_odd_flag_reg = -1,
84+
.int_odd_flag_shift = 0,
85+
.enable_reg = AFE_DL_24CH_CON0,
86+
.enable_shift = DL_24CH_ON_SFT,
87+
.hd_reg = AFE_DL_24CH_CON0,
88+
.hd_shift = DL_24CH_HD_MODE_SFT,
89+
.hd_align_reg = AFE_DL_24CH_CON0,
90+
.hd_align_mshift = DL_24CH_HALIGN_SFT,
91+
.agent_disable_reg = -1,
92+
.agent_disable_shift = -1,
93+
.msb_reg = -1,
94+
.msb_shift = -1,
95+
.pbuf_reg = AFE_DL_24CH_CON0,
96+
.pbuf_mask = DL_24CH_PBUF_SIZE_MASK,
97+
.pbuf_shift = DL_24CH_PBUF_SIZE_SFT,
98+
.minlen_reg = AFE_DL_24CH_CON0,
99+
.minlen_mask = DL_24CH_MINLEN_MASK,
100+
.minlen_shift = DL_24CH_MINLEN_SFT,
101+
.ch_num_reg = AFE_DL_24CH_CON0,
102+
.ch_num_maskbit = DL_24CH_NUM_MASK,
103+
.ch_num_shift = DL_24CH_NUM_SFT,
104+
},
105+
[MT8196_MEMIF_UL0] = {
106+
.name = "UL0",
107+
.id = MT8196_MEMIF_UL0,
108+
.reg_ofs_base = AFE_VUL0_BASE,
109+
.reg_ofs_cur = AFE_VUL0_CUR,
110+
.reg_ofs_end = AFE_VUL0_END,
111+
.reg_ofs_base_msb = AFE_VUL0_BASE_MSB,
112+
.reg_ofs_cur_msb = AFE_VUL0_CUR_MSB,
113+
.reg_ofs_end_msb = AFE_VUL0_END_MSB,
114+
.fs_reg = AFE_VUL0_CON0,
115+
.fs_shift = VUL0_SEL_FS_SFT,
116+
.fs_maskbit = VUL0_SEL_FS_MASK,
117+
.mono_reg = AFE_VUL0_CON0,
118+
.mono_shift = VUL0_MONO_SFT,
119+
.int_odd_flag_reg = -1,
120+
.int_odd_flag_shift = 0,
121+
.enable_reg = AFE_VUL0_CON0,
122+
.enable_shift = VUL0_ON_SFT,
123+
.hd_reg = AFE_VUL0_CON0,
124+
.hd_shift = VUL0_HD_MODE_SFT,
125+
.hd_align_reg = AFE_VUL0_CON0,
126+
.hd_align_mshift = VUL0_HALIGN_SFT,
127+
.agent_disable_reg = -1,
128+
.agent_disable_shift = -1,
129+
.msb_reg = -1,
130+
.msb_shift = -1,
131+
},
132+
[MT8196_MEMIF_UL1] = {
133+
.name = "UL1",
134+
.id = MT8196_MEMIF_UL1,
135+
.reg_ofs_base = AFE_VUL1_BASE,
136+
.reg_ofs_cur = AFE_VUL1_CUR,
137+
.reg_ofs_end = AFE_VUL1_END,
138+
.reg_ofs_base_msb = AFE_VUL1_BASE_MSB,
139+
.reg_ofs_cur_msb = AFE_VUL1_CUR_MSB,
140+
.reg_ofs_end_msb = AFE_VUL1_END_MSB,
141+
.fs_reg = AFE_VUL1_CON0,
142+
.fs_shift = VUL1_SEL_FS_SFT,
143+
.fs_maskbit = VUL1_SEL_FS_MASK,
144+
.mono_reg = AFE_VUL1_CON0,
145+
.mono_shift = VUL1_MONO_SFT,
146+
.enable_reg = AFE_VUL1_CON0,
147+
.enable_shift = VUL1_ON_SFT,
148+
.hd_reg = AFE_VUL1_CON0,
149+
.hd_shift = VUL1_HD_MODE_SFT,
150+
.hd_align_reg = AFE_VUL1_CON0,
151+
.hd_align_mshift = VUL1_HALIGN_SFT,
152+
.agent_disable_reg = -1,
153+
.agent_disable_shift = -1,
154+
.msb_reg = -1,
155+
.msb_shift = -1,
156+
},
157+
[MT8196_MEMIF_UL2] = {
158+
.name = "UL2",
159+
.id = MT8196_MEMIF_UL2,
160+
.reg_ofs_base = AFE_VUL2_BASE,
161+
.reg_ofs_cur = AFE_VUL2_CUR,
162+
.reg_ofs_end = AFE_VUL2_END,
163+
.reg_ofs_base_msb = AFE_VUL2_BASE_MSB,
164+
.reg_ofs_cur_msb = AFE_VUL2_CUR_MSB,
165+
.reg_ofs_end_msb = AFE_VUL2_END_MSB,
166+
.fs_reg = AFE_VUL2_CON0,
167+
.fs_shift = VUL2_SEL_FS_SFT,
168+
.fs_maskbit = VUL2_SEL_FS_MASK,
169+
.mono_reg = AFE_VUL2_CON0,
170+
.mono_shift = VUL2_MONO_SFT,
171+
.int_odd_flag_reg = -1,
172+
.int_odd_flag_shift = 0,
173+
.enable_reg = AFE_VUL2_CON0,
174+
.enable_shift = VUL2_ON_SFT,
175+
.hd_reg = AFE_VUL2_CON0,
176+
.hd_shift = VUL2_HD_MODE_SFT,
177+
.hd_align_reg = AFE_VUL2_CON0,
178+
.hd_align_mshift = VUL2_HALIGN_SFT,
179+
.agent_disable_reg = -1,
180+
.agent_disable_shift = -1,
181+
.msb_reg = -1,
182+
.msb_shift = -1,
183+
},
184+
};
185+
186+
struct mt8196_afe_rate {
187+
unsigned int rate;
188+
unsigned int reg_value;
189+
};
190+
191+
static const struct mt8196_afe_rate mt8196_afe_rates[] = {
192+
{
193+
.rate = 8000,
194+
.reg_value = 0,
195+
},
196+
{
197+
.rate = 12000,
198+
.reg_value = 2,
199+
},
200+
{
201+
.rate = 16000,
202+
.reg_value = 4,
203+
},
204+
{
205+
.rate = 24000,
206+
.reg_value = 6,
207+
},
208+
{
209+
.rate = 32000,
210+
.reg_value = 8,
211+
},
212+
{
213+
.rate = 48000,
214+
.reg_value = 0x0a,
215+
},
216+
{
217+
.rate = 96000,
218+
.reg_value = 14,
219+
},
220+
{
221+
.rate = 192000,
222+
.reg_value = 18,
223+
},
224+
{
225+
.rate = 384000,
226+
.reg_value = 22,
227+
},
228+
{
229+
.rate = 11025,
230+
.reg_value = 1,
231+
},
232+
{
233+
.rate = 22050,
234+
.reg_value = 5,
235+
},
236+
{
237+
.rate = 44100,
238+
.reg_value = 9,
239+
},
240+
{
241+
.rate = 88200,
242+
.reg_value = 13,
243+
},
244+
{
245+
.rate = 176400,
246+
.reg_value = 17,
247+
},
248+
{
249+
.rate = 352800,
250+
.reg_value = 21,
251+
},
252+
};
253+
254+
static unsigned int mt8196_afe_fs_timing(unsigned int rate)
255+
{
256+
int i;
257+
258+
for (i = 0; i < ARRAY_SIZE(mt8196_afe_rates); i++)
259+
if (mt8196_afe_rates[i].rate == rate)
260+
return mt8196_afe_rates[i].reg_value;
261+
262+
return -EINVAL;
263+
}
264+
265+
static unsigned int mt8196_afe_fs(unsigned int rate, int aud_blk)
266+
{
267+
return mt8196_afe_fs_timing(rate);
268+
}
269+
270+
struct mtk_base_afe_platform mtk_afe_platform = {
271+
.base_addr = AFE_BASE_ADDR,
272+
.memif_datas = memif_data,
273+
.memif_size = MT8196_MEMIF_NUM,
274+
.memif_dl_num = MT8196_MEMIF_DL_NUM,
275+
.memif_32bit_supported = 0,
276+
.irq_datas = NULL,
277+
.irqs_size = 0,
278+
.dais_size = MT8196_DAI_NUM,
279+
.afe_fs = mt8196_afe_fs,
280+
.irq_fs = mt8196_afe_fs_timing,
281+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/* SPDX-License-Identifier: BSD-3-Clause */
2+
/*
3+
* Copyright(c) 2024 MediaTek. All rights reserved.
4+
*
5+
* Author: Darren Ye <darren.ye@mediatek.com>
6+
*/
7+
8+
#ifndef _MT_8196_AFE_COMMON_H_
9+
#define _MT_8196_AFE_COMMON_H_
10+
11+
enum {
12+
MT8196_MEMIF_START,
13+
MT8196_MEMIF_DL_START = MT8196_MEMIF_START,
14+
MT8196_MEMIF_DL1 = MT8196_MEMIF_DL_START,
15+
MT8196_MEMIF_DL_24CH,
16+
MT8196_MEMIF_DL_END,
17+
MT8196_MEMIF_UL_START = MT8196_MEMIF_DL_END,
18+
MT8196_MEMIF_UL0 = MT8196_MEMIF_UL_START,
19+
MT8196_MEMIF_UL1,
20+
MT8196_MEMIF_UL2,
21+
MT8196_MEMIF_UL_END,
22+
MT8196_MEMIF_END = MT8196_MEMIF_UL_END,
23+
MT8196_MEMIF_DL_NUM = (MT8196_MEMIF_DL_END - MT8196_MEMIF_DL_START),
24+
MT8196_MEMIF_UL_NUM = (MT8196_MEMIF_UL_END - MT8196_MEMIF_UL_START),
25+
MT8196_MEMIF_NUM = (MT8196_MEMIF_END - MT8196_MEMIF_START),
26+
};
27+
28+
/* update irq ID (= enum) from AFE_IRQ_MCU_STATUS */
29+
enum {
30+
MT8196_IRQ_0,
31+
MT8196_IRQ_1,
32+
MT8196_IRQ_2,
33+
MT8196_IRQ_3,
34+
MT8196_IRQ_4,
35+
MT8196_IRQ_5,
36+
MT8196_IRQ_6,
37+
MT8196_IRQ_7,
38+
MT8196_IRQ_8,
39+
MT8196_IRQ_9,
40+
MT8196_IRQ_10,
41+
MT8196_IRQ_11,
42+
MT8196_IRQ_12,
43+
MT8196_IRQ_13,
44+
MT8196_IRQ_14,
45+
MT8196_IRQ_15,
46+
MT8196_IRQ_16,
47+
MT8196_IRQ_17,
48+
MT8196_IRQ_18,
49+
MT8196_IRQ_19,
50+
MT8196_IRQ_20,
51+
MT8196_IRQ_21,
52+
MT8196_IRQ_22,
53+
MT8196_IRQ_23,
54+
MT8196_IRQ_24,
55+
MT8196_IRQ_25,
56+
MT8196_IRQ_26,
57+
MT8196_IRQ_31, /* used only for TDM */
58+
MT8196_IRQ_NUM,
59+
};
60+
61+
enum {
62+
MT8196_DAI_I2S_OUT4, /* speaker */
63+
MT8196_DAI_I2S_OUT6, /* headset out */
64+
MT8196_DAI_AP_DMIC, /* DMIC */
65+
MT8196_DAI_I2S_IN6, /* headset mic */
66+
MT8196_DAI_AP_DMIC_CH34,
67+
MT8196_DAI_NUM,
68+
};
69+
70+
#endif

0 commit comments

Comments
 (0)