blob: b46ca9f46016cbf9d24de93a66530caf5cba5377 [file] [log] [blame]
Weijie Gao42143692023-07-19 17:16:28 +08001// SPDX-License-Identifier: GPL-2.0
2/*
3 * MediaTek clock driver for MT7988 SoC
4 *
5 * Copyright (C) 2022 MediaTek Inc.
6 * Author: Sam Shih <sam.shih@mediatek.com>
7 */
8
9#include <dm.h>
10#include <log.h>
11#include <asm/arch-mediatek/reset.h>
12#include <asm/io.h>
13#include <dt-bindings/clock/mt7988-clk.h>
14#include <linux/bitops.h>
15
16#include "clk-mtk.h"
17
18#define MT7988_CLK_PDN 0x250
19#define MT7988_CLK_PDN_EN_WRITE BIT(31)
20
21#define MT7988_ETHDMA_RST_CTRL_OFS 0x34
22#define MT7988_ETHWARP_RST_CTRL_OFS 0x8
23
24#define XTAL_FACTOR(_id, _name, _parent, _mult, _div) \
25 FACTOR(_id, _parent, _mult, _div, CLK_PARENT_XTAL)
26
27#define PLL_FACTOR(_id, _name, _parent, _mult, _div) \
28 FACTOR(_id, _parent, _mult, _div, CLK_PARENT_APMIXED)
29
30#define TOP_FACTOR(_id, _name, _parent, _mult, _div) \
31 FACTOR(_id, _parent, _mult, _div, CLK_PARENT_TOPCKGEN)
32
33#define INFRA_FACTOR(_id, _name, _parent, _mult, _div) \
34 FACTOR(_id, _parent, _mult, _div, CLK_PARENT_INFRASYS)
35
36/* FIXED PLLS */
37static const struct mtk_fixed_clk apmixedsys_mtk_plls[] = {
38 FIXED_CLK(CK_APMIXED_NETSYSPLL, CLK_XTAL, 850000000),
39 FIXED_CLK(CK_APMIXED_MPLL, CLK_XTAL, 416000000),
40 FIXED_CLK(CK_APMIXED_MMPLL, CLK_XTAL, 720000000),
41 FIXED_CLK(CK_APMIXED_APLL2, CLK_XTAL, 196608000),
42 FIXED_CLK(CK_APMIXED_NET1PLL, CLK_XTAL, 2500000000),
43 FIXED_CLK(CK_APMIXED_NET2PLL, CLK_XTAL, 800000000),
44 FIXED_CLK(CK_APMIXED_WEDMCUPLL, CLK_XTAL, 208000000),
45 FIXED_CLK(CK_APMIXED_SGMPLL, CLK_XTAL, 325000000),
46 FIXED_CLK(CK_APMIXED_ARM_B, CLK_XTAL, 1500000000),
47 FIXED_CLK(CK_APMIXED_CCIPLL2_B, CLK_XTAL, 960000000),
48 FIXED_CLK(CK_APMIXED_USXGMIIPLL, CLK_XTAL, 644533000),
49 FIXED_CLK(CK_APMIXED_MSDCPLL, CLK_XTAL, 400000000),
50};
51
Christian Marangid061f732024-08-03 10:32:58 +020052/* TOPCKGEN FIXED CLK */
53static const struct mtk_fixed_clk topckgen_mtk_fixed_clks[] = {
54 FIXED_CLK(CK_TOP_XTAL, CLK_XTAL, 40000000),
55};
56
Weijie Gao42143692023-07-19 17:16:28 +080057/* TOPCKGEN FIXED DIV */
58static const struct mtk_fixed_factor topckgen_mtk_fixed_factors[] = {
Christian Marangib76b75b2024-08-03 10:32:50 +020059 TOP_FACTOR(CK_TOP_XTAL_D2, "xtal_d2", CK_TOP_XTAL, 1, 2),
Christian Marangi8b75c2c2024-08-03 10:32:56 +020060 TOP_FACTOR(CK_TOP_RTC_32K, "rtc_32k", CK_TOP_XTAL, 1,
Weijie Gao42143692023-07-19 17:16:28 +080061 1250),
Christian Marangi8b75c2c2024-08-03 10:32:56 +020062 TOP_FACTOR(CK_TOP_RTC_32P7K, "rtc_32p7k", CK_TOP_XTAL, 1,
Weijie Gao42143692023-07-19 17:16:28 +080063 1220),
Christian Marangi1bafda92024-08-03 10:32:57 +020064 PLL_FACTOR(CK_TOP_MPLL_D2, "mpll_d2", CK_APMIXED_MPLL, 1, 2),
65 PLL_FACTOR(CK_TOP_MPLL_D3_D2, "mpll_d3_d2", CK_APMIXED_MPLL, 1, 2),
66 PLL_FACTOR(CK_TOP_MPLL_D4, "mpll_d4", CK_APMIXED_MPLL, 1, 4),
67 PLL_FACTOR(CK_TOP_MPLL_D8, "mpll_d8", CK_APMIXED_MPLL, 1, 8),
68 PLL_FACTOR(CK_TOP_MPLL_D8_D2, "mpll_d8_d2", CK_APMIXED_MPLL, 1, 16),
Christian Marangi1bafda92024-08-03 10:32:57 +020069 PLL_FACTOR(CK_TOP_MMPLL_D2, "mmpll_d2", CK_APMIXED_MMPLL, 1, 2),
70 PLL_FACTOR(CK_TOP_MMPLL_D3_D5, "mmpll_d3_d5", CK_APMIXED_MMPLL, 1, 15),
71 PLL_FACTOR(CK_TOP_MMPLL_D4, "mmpll_d4", CK_APMIXED_MMPLL, 1, 4),
72 PLL_FACTOR(CK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", CK_APMIXED_MMPLL, 1, 12),
73 PLL_FACTOR(CK_TOP_MMPLL_D8, "mmpll_d8", CK_APMIXED_MMPLL, 1, 8),
Christian Marangi1bafda92024-08-03 10:32:57 +020074 PLL_FACTOR(CK_TOP_APLL2_D4, "apll2_d4", CK_APMIXED_APLL2, 1, 4),
75 PLL_FACTOR(CK_TOP_NET1PLL_D4, "net1pll_d4", CK_APMIXED_NET1PLL, 1, 4),
76 PLL_FACTOR(CK_TOP_NET1PLL_D5, "net1pll_d5", CK_APMIXED_NET1PLL, 1, 5),
77 PLL_FACTOR(CK_TOP_NET1PLL_D5_D2, "net1pll_d5_d2", CK_APMIXED_NET1PLL, 1, 10),
78 PLL_FACTOR(CK_TOP_NET1PLL_D5_D4, "net1pll_d5_d4", CK_APMIXED_NET1PLL, 1, 20),
79 PLL_FACTOR(CK_TOP_NET1PLL_D8, "net1pll_d8", CK_APMIXED_NET1PLL, 1, 8),
80 PLL_FACTOR(CK_TOP_NET1PLL_D8_D2, "net1pll_d8_d2", CK_APMIXED_NET1PLL, 1, 16),
81 PLL_FACTOR(CK_TOP_NET1PLL_D8_D4, "net1pll_d8_d4", CK_APMIXED_NET1PLL, 1, 32),
82 PLL_FACTOR(CK_TOP_NET1PLL_D8_D8, "net1pll_d8_d8", CK_APMIXED_NET1PLL, 1, 64),
83 PLL_FACTOR(CK_TOP_NET1PLL_D8_D16, "net1pll_d8_d16", CK_APMIXED_NET1PLL, 1,
84 128),
Christian Marangi1bafda92024-08-03 10:32:57 +020085 PLL_FACTOR(CK_TOP_NET2PLL_D2, "net2pll_d2", CK_APMIXED_NET2PLL, 1, 2),
86 PLL_FACTOR(CK_TOP_NET2PLL_D4, "net2pll_d4", CK_APMIXED_NET2PLL, 1, 4),
87 PLL_FACTOR(CK_TOP_NET2PLL_D4_D4, "net2pll_d4_d4", CK_APMIXED_NET2PLL, 1, 16),
88 PLL_FACTOR(CK_TOP_NET2PLL_D4_D8, "net2pll_d4_d8", CK_APMIXED_NET2PLL, 1, 32),
89 PLL_FACTOR(CK_TOP_NET2PLL_D6, "net2pll_d6", CK_APMIXED_NET2PLL, 1, 6),
90 PLL_FACTOR(CK_TOP_NET2PLL_D8, "net2pll_d8", CK_APMIXED_NET2PLL, 1, 8),
Weijie Gao42143692023-07-19 17:16:28 +080091};
92
93/* TOPCKGEN MUX PARENTS */
Christian Marangid061f732024-08-03 10:32:58 +020094#define APMIXED_PARENT(_id) PARENT(_id, CLK_PARENT_APMIXED)
95#define TOP_PARENT(_id) PARENT(_id, CLK_PARENT_TOPCKGEN)
Weijie Gao42143692023-07-19 17:16:28 +080096
Christian Marangid061f732024-08-03 10:32:58 +020097static const struct mtk_parent netsys_parents[] = {
98 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D2),
99 TOP_PARENT(CK_TOP_MMPLL_D2),
Weijie Gao42143692023-07-19 17:16:28 +0800100};
101
Christian Marangid061f732024-08-03 10:32:58 +0200102static const struct mtk_parent netsys_500m_parents[] = {
103 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5),
104 TOP_PARENT(CK_TOP_NET1PLL_D5_D2),
Weijie Gao42143692023-07-19 17:16:28 +0800105};
106
Christian Marangid061f732024-08-03 10:32:58 +0200107static const struct mtk_parent netsys_2x_parents[] = {
108 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_NET2PLL),
109 APMIXED_PARENT(CK_APMIXED_MMPLL),
Weijie Gao42143692023-07-19 17:16:28 +0800110};
111
Christian Marangid061f732024-08-03 10:32:58 +0200112static const struct mtk_parent netsys_gsw_parents[] = {
113 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D4),
114 TOP_PARENT(CK_TOP_NET1PLL_D5),
115};
Weijie Gao42143692023-07-19 17:16:28 +0800116
Christian Marangid061f732024-08-03 10:32:58 +0200117static const struct mtk_parent eth_gmii_parents[] = {
118 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5_D4),
119};
Weijie Gao42143692023-07-19 17:16:28 +0800120
Christian Marangid061f732024-08-03 10:32:58 +0200121static const struct mtk_parent netsys_mcu_parents[] = {
122 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_NET2PLL),
123 APMIXED_PARENT(CK_APMIXED_MMPLL), TOP_PARENT(CK_TOP_NET1PLL_D4),
124 TOP_PARENT(CK_TOP_NET1PLL_D5), APMIXED_PARENT(CK_APMIXED_MPLL),
125};
Weijie Gao42143692023-07-19 17:16:28 +0800126
Christian Marangid061f732024-08-03 10:32:58 +0200127static const struct mtk_parent eip197_parents[] = {
128 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_NETSYSPLL),
129 APMIXED_PARENT(CK_APMIXED_NET2PLL), APMIXED_PARENT(CK_APMIXED_MMPLL),
130 TOP_PARENT(CK_TOP_NET1PLL_D4), TOP_PARENT(CK_TOP_NET1PLL_D5),
131};
Weijie Gao42143692023-07-19 17:16:28 +0800132
Christian Marangid061f732024-08-03 10:32:58 +0200133static const struct mtk_parent axi_infra_parents[] = {
134 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D8_D2),
135};
Weijie Gao42143692023-07-19 17:16:28 +0800136
Christian Marangid061f732024-08-03 10:32:58 +0200137static const struct mtk_parent uart_parents[] = {
138 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MPLL_D8),
139 TOP_PARENT(CK_TOP_MPLL_D8_D2),
140};
Weijie Gao42143692023-07-19 17:16:28 +0800141
Christian Marangid061f732024-08-03 10:32:58 +0200142static const struct mtk_parent emmc_250m_parents[] = {
143 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5_D2),
144 TOP_PARENT(CK_TOP_MMPLL_D4),
145};
Weijie Gao42143692023-07-19 17:16:28 +0800146
Christian Marangid061f732024-08-03 10:32:58 +0200147static const struct mtk_parent emmc_400m_parents[] = {
148 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_MSDCPLL),
149 TOP_PARENT(CK_TOP_MMPLL_D2), TOP_PARENT(CK_TOP_MPLL_D2),
150 TOP_PARENT(CK_TOP_MMPLL_D4), TOP_PARENT(CK_TOP_NET1PLL_D8_D2),
151};
Weijie Gao42143692023-07-19 17:16:28 +0800152
Christian Marangid061f732024-08-03 10:32:58 +0200153static const struct mtk_parent spi_parents[] = {
154 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MPLL_D2),
155 TOP_PARENT(CK_TOP_MMPLL_D4), TOP_PARENT(CK_TOP_NET1PLL_D8_D2),
156 TOP_PARENT(CK_TOP_NET2PLL_D6), TOP_PARENT(CK_TOP_NET1PLL_D5_D4),
157 TOP_PARENT(CK_TOP_MPLL_D4), TOP_PARENT(CK_TOP_NET1PLL_D8_D4),
158};
Weijie Gao42143692023-07-19 17:16:28 +0800159
Christian Marangid061f732024-08-03 10:32:58 +0200160static const struct mtk_parent nfi1x_parents[] = {
161 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MMPLL_D4),
162 TOP_PARENT(CK_TOP_NET1PLL_D8_D2), TOP_PARENT(CK_TOP_NET2PLL_D6),
163 TOP_PARENT(CK_TOP_MPLL_D4), TOP_PARENT(CK_TOP_MMPLL_D8),
164 TOP_PARENT(CK_TOP_NET1PLL_D8_D4), TOP_PARENT(CK_TOP_MPLL_D8),
165};
Weijie Gao42143692023-07-19 17:16:28 +0800166
Christian Marangid061f732024-08-03 10:32:58 +0200167static const struct mtk_parent spinfi_parents[] = {
168 TOP_PARENT(CK_TOP_XTAL_D2), TOP_PARENT(CK_TOP_XTAL),
169 TOP_PARENT(CK_TOP_NET1PLL_D5_D4), TOP_PARENT(CK_TOP_MPLL_D4),
170 TOP_PARENT(CK_TOP_MMPLL_D8), TOP_PARENT(CK_TOP_NET1PLL_D8_D4),
171 TOP_PARENT(CK_TOP_MMPLL_D6_D2), TOP_PARENT(CK_TOP_MPLL_D8),
172};
Weijie Gao42143692023-07-19 17:16:28 +0800173
Christian Marangid061f732024-08-03 10:32:58 +0200174static const struct mtk_parent pwm_parents[] = {
175 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D8_D2),
176 TOP_PARENT(CK_TOP_NET1PLL_D5_D4), TOP_PARENT(CK_TOP_MPLL_D4),
177 TOP_PARENT(CK_TOP_MPLL_D8_D2), TOP_PARENT(CK_TOP_RTC_32K),
178};
Weijie Gao42143692023-07-19 17:16:28 +0800179
Christian Marangid061f732024-08-03 10:32:58 +0200180static const struct mtk_parent i2c_parents[] = {
181 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5_D4),
182 TOP_PARENT(CK_TOP_MPLL_D4), TOP_PARENT(CK_TOP_NET1PLL_D8_D4),
183};
Weijie Gao42143692023-07-19 17:16:28 +0800184
Christian Marangid061f732024-08-03 10:32:58 +0200185static const struct mtk_parent pcie_mbist_250m_parents[] = {
186 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5_D2),
187};
Weijie Gao42143692023-07-19 17:16:28 +0800188
Christian Marangid061f732024-08-03 10:32:58 +0200189static const struct mtk_parent pextp_tl_ck_parents[] = {
190 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D6),
191 TOP_PARENT(CK_TOP_MMPLL_D8), TOP_PARENT(CK_TOP_MPLL_D8_D2),
192 TOP_PARENT(CK_TOP_RTC_32K),
193};
Weijie Gao42143692023-07-19 17:16:28 +0800194
Christian Marangid061f732024-08-03 10:32:58 +0200195static const struct mtk_parent usb_frmcnt_parents[] = {
196 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MMPLL_D3_D5),
197};
Weijie Gao42143692023-07-19 17:16:28 +0800198
Christian Marangid061f732024-08-03 10:32:58 +0200199static const struct mtk_parent aud_parents[] = {
200 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_APLL2),
201};
Weijie Gao42143692023-07-19 17:16:28 +0800202
Christian Marangid061f732024-08-03 10:32:58 +0200203static const struct mtk_parent a1sys_parents[] = {
204 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_APLL2_D4),
205};
Weijie Gao42143692023-07-19 17:16:28 +0800206
Christian Marangid061f732024-08-03 10:32:58 +0200207static const struct mtk_parent aud_l_parents[] = {
208 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_APLL2),
209 TOP_PARENT(CK_TOP_MPLL_D8_D2),
210};
Weijie Gao42143692023-07-19 17:16:28 +0800211
Christian Marangid061f732024-08-03 10:32:58 +0200212static const struct mtk_parent sspxtp_parents[] = {
213 TOP_PARENT(CK_TOP_XTAL_D2), TOP_PARENT(CK_TOP_MPLL_D8_D2),
214};
Weijie Gao42143692023-07-19 17:16:28 +0800215
Christian Marangid061f732024-08-03 10:32:58 +0200216static const struct mtk_parent usxgmii_sbus_0_parents[] = {
217 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D8_D4),
218};
Weijie Gao42143692023-07-19 17:16:28 +0800219
Christian Marangid061f732024-08-03 10:32:58 +0200220static const struct mtk_parent sgm_0_parents[] = {
221 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_SGMPLL),
222};
Weijie Gao42143692023-07-19 17:16:28 +0800223
Christian Marangid061f732024-08-03 10:32:58 +0200224static const struct mtk_parent sysapb_parents[] = {
225 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MPLL_D3_D2),
226};
Weijie Gao42143692023-07-19 17:16:28 +0800227
Christian Marangid061f732024-08-03 10:32:58 +0200228static const struct mtk_parent eth_refck_50m_parents[] = {
229 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D4_D4),
230};
Weijie Gao42143692023-07-19 17:16:28 +0800231
Christian Marangid061f732024-08-03 10:32:58 +0200232static const struct mtk_parent eth_sys_200m_parents[] = {
233 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D4),
234};
Weijie Gao42143692023-07-19 17:16:28 +0800235
Christian Marangid061f732024-08-03 10:32:58 +0200236static const struct mtk_parent eth_xgmii_parents[] = {
237 TOP_PARENT(CK_TOP_XTAL_D2), TOP_PARENT(CK_TOP_NET1PLL_D8_D8),
238 TOP_PARENT(CK_TOP_NET1PLL_D8_D16),
239};
240
241static const struct mtk_parent bus_tops_parents[] = {
242 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D5),
243 TOP_PARENT(CK_TOP_NET2PLL_D2),
244};
245
246static const struct mtk_parent npu_tops_parents[] = {
247 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_NET2PLL),
248};
249
250static const struct mtk_parent dramc_md32_parents[] = {
251 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_MPLL_D2),
252 APMIXED_PARENT(CK_APMIXED_WEDMCUPLL),
253};
254
255static const struct mtk_parent da_xtp_glb_p0_parents[] = {
256 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D8),
257};
258
259static const struct mtk_parent mcusys_backup_625m_parents[] = {
260 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET1PLL_D4),
261};
262
263static const struct mtk_parent macsec_parents[] = {
264 TOP_PARENT(CK_TOP_XTAL), APMIXED_PARENT(CK_APMIXED_SGMPLL),
265 TOP_PARENT(CK_TOP_NET1PLL_D8),
266};
267
268static const struct mtk_parent netsys_tops_400m_parents[] = {
269 TOP_PARENT(CK_TOP_XTAL), TOP_PARENT(CK_TOP_NET2PLL_D2),
270};
271
272static const struct mtk_parent eth_mii_parents[] = {
273 TOP_PARENT(CK_TOP_XTAL_D2), TOP_PARENT(CK_TOP_NET2PLL_D4_D8),
274};
Weijie Gao42143692023-07-19 17:16:28 +0800275
276#define TOP_MUX(_id, _name, _parents, _mux_ofs, _mux_set_ofs, _mux_clr_ofs, \
277 _shift, _width, _gate, _upd_ofs, _upd) \
278 { \
279 .id = _id, .mux_reg = _mux_ofs, .mux_set_reg = _mux_set_ofs, \
280 .mux_clr_reg = _mux_clr_ofs, .upd_reg = _upd_ofs, \
281 .upd_shift = _upd, .mux_shift = _shift, \
282 .mux_mask = BIT(_width) - 1, .gate_reg = _mux_ofs, \
Christian Marangid061f732024-08-03 10:32:58 +0200283 .gate_shift = _gate, .parent_flags = _parents, \
Weijie Gao42143692023-07-19 17:16:28 +0800284 .num_parents = ARRAY_SIZE(_parents), \
Christian Marangid061f732024-08-03 10:32:58 +0200285 .flags = CLK_MUX_SETCLR_UPD | CLK_PARENT_MIXED, \
Weijie Gao42143692023-07-19 17:16:28 +0800286 }
287
288/* TOPCKGEN MUX_GATE */
289static const struct mtk_composite topckgen_mtk_muxes[] = {
290 TOP_MUX(CK_TOP_NETSYS_SEL, "netsys_sel", netsys_parents, 0x0, 0x4, 0x8,
291 0, 2, 7, 0x1c0, 0),
292 TOP_MUX(CK_TOP_NETSYS_500M_SEL, "netsys_500m_sel", netsys_500m_parents,
293 0x0, 0x4, 0x8, 8, 2, 15, 0x1c0, 1),
294 TOP_MUX(CK_TOP_NETSYS_2X_SEL, "netsys_2x_sel", netsys_2x_parents, 0x0,
295 0x4, 0x8, 16, 2, 23, 0x1c0, 2),
296 TOP_MUX(CK_TOP_NETSYS_GSW_SEL, "netsys_gsw_sel", netsys_gsw_parents,
297 0x0, 0x4, 0x8, 24, 2, 31, 0x1c0, 3),
298 TOP_MUX(CK_TOP_ETH_GMII_SEL, "eth_gmii_sel", eth_gmii_parents, 0x10,
299 0x14, 0x18, 0, 1, 7, 0x1c0, 4),
300 TOP_MUX(CK_TOP_NETSYS_MCU_SEL, "netsys_mcu_sel", netsys_mcu_parents,
301 0x10, 0x14, 0x18, 8, 3, 15, 0x1c0, 5),
302 TOP_MUX(CK_TOP_NETSYS_PAO_2X_SEL, "netsys_pao_2x_sel",
303 netsys_mcu_parents, 0x10, 0x14, 0x18, 16, 3, 23, 0x1c0, 6),
304 TOP_MUX(CK_TOP_EIP197_SEL, "eip197_sel", eip197_parents, 0x10, 0x14,
305 0x18, 24, 3, 31, 0x1c0, 7),
306 TOP_MUX(CK_TOP_AXI_INFRA_SEL, "axi_infra_sel", axi_infra_parents, 0x20,
307 0x24, 0x28, 0, 1, 7, 0x1c0, 8),
308 TOP_MUX(CK_TOP_UART_SEL, "uart_sel", uart_parents, 0x20, 0x24, 0x28, 8,
309 2, 15, 0x1c0, 9),
310 TOP_MUX(CK_TOP_EMMC_250M_SEL, "emmc_250m_sel", emmc_250m_parents, 0x20,
311 0x24, 0x28, 16, 2, 23, 0x1c0, 10),
312 TOP_MUX(CK_TOP_EMMC_400M_SEL, "emmc_400m_sel", emmc_400m_parents, 0x20,
313 0x24, 0x28, 24, 3, 31, 0x1c0, 11),
314 TOP_MUX(CK_TOP_SPI_SEL, "spi_sel", spi_parents, 0x30, 0x34, 0x38, 0, 3,
315 7, 0x1c0, 12),
316 TOP_MUX(CK_TOP_SPIM_MST_SEL, "spim_mst_sel", spi_parents, 0x30, 0x34,
317 0x38, 8, 3, 15, 0x1c0, 13),
318 TOP_MUX(CK_TOP_NFI1X_SEL, "nfi1x_sel", nfi1x_parents, 0x30, 0x34, 0x38,
319 16, 3, 23, 0x1c0, 14),
320 TOP_MUX(CK_TOP_SPINFI_SEL, "spinfi_sel", spinfi_parents, 0x30, 0x34,
321 0x38, 24, 3, 31, 0x1c0, 15),
322 TOP_MUX(CK_TOP_PWM_SEL, "pwm_sel", pwm_parents, 0x40, 0x44, 0x48, 0, 3,
323 7, 0x1c0, 16),
324 TOP_MUX(CK_TOP_I2C_SEL, "i2c_sel", i2c_parents, 0x40, 0x44, 0x48, 8, 2,
325 15, 0x1c0, 17),
326 TOP_MUX(CK_TOP_PCIE_MBIST_250M_SEL, "pcie_mbist_250m_sel",
327 pcie_mbist_250m_parents, 0x40, 0x44, 0x48, 16, 1, 23, 0x1c0,
328 18),
329 TOP_MUX(CK_TOP_PEXTP_TL_SEL, "pextp_tl_ck_sel", pextp_tl_ck_parents,
330 0x40, 0x44, 0x48, 24, 3, 31, 0x1c0, 19),
331 TOP_MUX(CK_TOP_PEXTP_TL_P1_SEL, "pextp_tl_ck_p1_sel",
332 pextp_tl_ck_parents, 0x50, 0x54, 0x58, 0, 3, 7, 0x1c0, 20),
333 TOP_MUX(CK_TOP_PEXTP_TL_P2_SEL, "pextp_tl_ck_p2_sel",
334 pextp_tl_ck_parents, 0x50, 0x54, 0x58, 8, 3, 15, 0x1c0, 21),
335 TOP_MUX(CK_TOP_PEXTP_TL_P3_SEL, "pextp_tl_ck_p3_sel",
336 pextp_tl_ck_parents, 0x50, 0x54, 0x58, 16, 3, 23, 0x1c0, 22),
337 TOP_MUX(CK_TOP_USB_SYS_SEL, "usb_sys_sel", eth_gmii_parents, 0x50, 0x54,
338 0x58, 24, 1, 31, 0x1c0, 23),
339 TOP_MUX(CK_TOP_USB_SYS_P1_SEL, "usb_sys_p1_sel", eth_gmii_parents, 0x60,
340 0x64, 0x68, 0, 1, 7, 0x1c0, 24),
341 TOP_MUX(CK_TOP_USB_XHCI_SEL, "usb_xhci_sel", eth_gmii_parents, 0x60,
342 0x64, 0x68, 8, 1, 15, 0x1c0, 25),
343 TOP_MUX(CK_TOP_USB_XHCI_P1_SEL, "usb_xhci_p1_sel", eth_gmii_parents,
344 0x60, 0x64, 0x68, 16, 1, 23, 0x1c0, 26),
345 TOP_MUX(CK_TOP_USB_FRMCNT_SEL, "usb_frmcnt_sel", usb_frmcnt_parents,
346 0x60, 0x64, 0x68, 24, 1, 31, 0x1c0, 27),
347 TOP_MUX(CK_TOP_USB_FRMCNT_P1_SEL, "usb_frmcnt_p1_sel",
348 usb_frmcnt_parents, 0x70, 0x74, 0x78, 0, 1, 7, 0x1c0, 28),
349 TOP_MUX(CK_TOP_AUD_SEL, "aud_sel", aud_parents, 0x70, 0x74, 0x78, 8, 1,
350 15, 0x1c0, 29),
351 TOP_MUX(CK_TOP_A1SYS_SEL, "a1sys_sel", a1sys_parents, 0x70, 0x74, 0x78,
352 16, 1, 23, 0x1c0, 30),
353 TOP_MUX(CK_TOP_AUD_L_SEL, "aud_l_sel", aud_l_parents, 0x70, 0x74, 0x78,
354 24, 2, 31, 0x1c4, 0),
355 TOP_MUX(CK_TOP_A_TUNER_SEL, "a_tuner_sel", a1sys_parents, 0x80, 0x84,
356 0x88, 0, 1, 7, 0x1c4, 1),
357 TOP_MUX(CK_TOP_SSPXTP_SEL, "sspxtp_sel", sspxtp_parents, 0x80, 0x84,
358 0x88, 8, 1, 15, 0x1c4, 2),
359 TOP_MUX(CK_TOP_USB_PHY_SEL, "usb_phy_sel", sspxtp_parents, 0x80, 0x84,
360 0x88, 16, 1, 23, 0x1c4, 3),
361 TOP_MUX(CK_TOP_USXGMII_SBUS_0_SEL, "usxgmii_sbus_0_sel",
362 usxgmii_sbus_0_parents, 0x80, 0x84, 0x88, 24, 1, 31, 0x1c4, 4),
363 TOP_MUX(CK_TOP_USXGMII_SBUS_1_SEL, "usxgmii_sbus_1_sel",
364 usxgmii_sbus_0_parents, 0x90, 0x94, 0x98, 0, 1, 7, 0x1c4, 5),
365 TOP_MUX(CK_TOP_SGM_0_SEL, "sgm_0_sel", sgm_0_parents, 0x90, 0x94, 0x98,
366 8, 1, 15, 0x1c4, 6),
367 TOP_MUX(CK_TOP_SGM_SBUS_0_SEL, "sgm_sbus_0_sel", usxgmii_sbus_0_parents,
368 0x90, 0x94, 0x98, 16, 1, 23, 0x1c4, 7),
369 TOP_MUX(CK_TOP_SGM_1_SEL, "sgm_1_sel", sgm_0_parents, 0x90, 0x94, 0x98,
370 24, 1, 31, 0x1c4, 8),
371 TOP_MUX(CK_TOP_SGM_SBUS_1_SEL, "sgm_sbus_1_sel", usxgmii_sbus_0_parents,
372 0xa0, 0xa4, 0xa8, 0, 1, 7, 0x1c4, 9),
373 TOP_MUX(CK_TOP_XFI_PHY_0_XTAL_SEL, "xfi_phy_0_xtal_sel", sspxtp_parents,
374 0xa0, 0xa4, 0xa8, 8, 1, 15, 0x1c4, 10),
375 TOP_MUX(CK_TOP_XFI_PHY_1_XTAL_SEL, "xfi_phy_1_xtal_sel", sspxtp_parents,
376 0xa0, 0xa4, 0xa8, 16, 1, 23, 0x1c4, 11),
377 TOP_MUX(CK_TOP_SYSAXI_SEL, "sysaxi_sel", axi_infra_parents, 0xa0, 0xa4,
378 0xa8, 24, 1, 31, 0x1c4, 12),
379 TOP_MUX(CK_TOP_SYSAPB_SEL, "sysapb_sel", sysapb_parents, 0xb0, 0xb4,
380 0xb8, 0, 1, 7, 0x1c4, 13),
381 TOP_MUX(CK_TOP_ETH_REFCK_50M_SEL, "eth_refck_50m_sel",
382 eth_refck_50m_parents, 0xb0, 0xb4, 0xb8, 8, 1, 15, 0x1c4, 14),
383 TOP_MUX(CK_TOP_ETH_SYS_200M_SEL, "eth_sys_200m_sel",
384 eth_sys_200m_parents, 0xb0, 0xb4, 0xb8, 16, 1, 23, 0x1c4, 15),
385 TOP_MUX(CK_TOP_ETH_SYS_SEL, "eth_sys_sel", pcie_mbist_250m_parents,
386 0xb0, 0xb4, 0xb8, 24, 1, 31, 0x1c4, 16),
387 TOP_MUX(CK_TOP_ETH_XGMII_SEL, "eth_xgmii_sel", eth_xgmii_parents, 0xc0,
388 0xc4, 0xc8, 0, 2, 7, 0x1c4, 17),
389 TOP_MUX(CK_TOP_BUS_TOPS_SEL, "bus_tops_sel", bus_tops_parents, 0xc0,
390 0xc4, 0xc8, 8, 2, 15, 0x1c4, 18),
391 TOP_MUX(CK_TOP_NPU_TOPS_SEL, "npu_tops_sel", npu_tops_parents, 0xc0,
392 0xc4, 0xc8, 16, 1, 23, 0x1c4, 19),
393 TOP_MUX(CK_TOP_DRAMC_SEL, "dramc_sel", sspxtp_parents, 0xc0, 0xc4, 0xc8,
394 24, 1, 31, 0x1c4, 20),
395 TOP_MUX(CK_TOP_DRAMC_MD32_SEL, "dramc_md32_sel", dramc_md32_parents,
396 0xd0, 0xd4, 0xd8, 0, 2, 7, 0x1c4, 21),
397 TOP_MUX(CK_TOP_INFRA_F26M_SEL, "csw_infra_f26m_sel", sspxtp_parents,
398 0xd0, 0xd4, 0xd8, 8, 1, 15, 0x1c4, 22),
399 TOP_MUX(CK_TOP_PEXTP_P0_SEL, "pextp_p0_sel", sspxtp_parents, 0xd0, 0xd4,
400 0xd8, 16, 1, 23, 0x1c4, 23),
401 TOP_MUX(CK_TOP_PEXTP_P1_SEL, "pextp_p1_sel", sspxtp_parents, 0xd0, 0xd4,
402 0xd8, 24, 1, 31, 0x1c4, 24),
403 TOP_MUX(CK_TOP_PEXTP_P2_SEL, "pextp_p2_sel", sspxtp_parents, 0xe0, 0xe4,
404 0xe8, 0, 1, 7, 0x1c4, 25),
405 TOP_MUX(CK_TOP_PEXTP_P3_SEL, "pextp_p3_sel", sspxtp_parents, 0xe0, 0xe4,
406 0xe8, 8, 1, 15, 0x1c4, 26),
407 TOP_MUX(CK_TOP_DA_XTP_GLB_P0_SEL, "da_xtp_glb_p0_sel",
408 da_xtp_glb_p0_parents, 0xe0, 0xe4, 0xe8, 16, 1, 23, 0x1c4, 27),
409 TOP_MUX(CK_TOP_DA_XTP_GLB_P1_SEL, "da_xtp_glb_p1_sel",
410 da_xtp_glb_p0_parents, 0xe0, 0xe4, 0xe8, 24, 1, 31, 0x1c4, 28),
411 TOP_MUX(CK_TOP_DA_XTP_GLB_P2_SEL, "da_xtp_glb_p2_sel",
412 da_xtp_glb_p0_parents, 0xf0, 0xf4, 0xf8, 0, 1, 7, 0x1c4, 29),
413 TOP_MUX(CK_TOP_DA_XTP_GLB_P3_SEL, "da_xtp_glb_p3_sel",
414 da_xtp_glb_p0_parents, 0xf0, 0xf4, 0xf8, 8, 1, 15, 0x1c4, 30),
415 TOP_MUX(CK_TOP_CKM_SEL, "ckm_sel", sspxtp_parents, 0xf0, 0xf4, 0xf8, 16,
416 1, 23, 0x1c8, 0),
Christian Marangie7ecdd52024-08-03 10:32:51 +0200417 TOP_MUX(CK_TOP_DA_SEL, "da_sel", sspxtp_parents,
Weijie Gao42143692023-07-19 17:16:28 +0800418 0xf0, 0xf4, 0xf8, 24, 1, 31, 0x1c8, 1),
419 TOP_MUX(CK_TOP_PEXTP_SEL, "pextp_sel", sspxtp_parents, 0x100, 0x104,
420 0x108, 0, 1, 7, 0x1c8, 2),
421 TOP_MUX(CK_TOP_TOPS_P2_26M_SEL, "tops_p2_26m_sel", sspxtp_parents,
422 0x100, 0x104, 0x108, 8, 1, 15, 0x1c8, 3),
423 TOP_MUX(CK_TOP_MCUSYS_BACKUP_625M_SEL, "mcusys_backup_625m_sel",
424 mcusys_backup_625m_parents, 0x100, 0x104, 0x108, 16, 1, 23,
425 0x1c8, 4),
426 TOP_MUX(CK_TOP_NETSYS_SYNC_250M_SEL, "netsys_sync_250m_sel",
427 pcie_mbist_250m_parents, 0x100, 0x104, 0x108, 24, 1, 31, 0x1c8,
428 5),
429 TOP_MUX(CK_TOP_MACSEC_SEL, "macsec_sel", macsec_parents, 0x110, 0x114,
430 0x118, 0, 2, 7, 0x1c8, 6),
431 TOP_MUX(CK_TOP_NETSYS_TOPS_400M_SEL, "netsys_tops_400m_sel",
432 netsys_tops_400m_parents, 0x110, 0x114, 0x118, 8, 1, 15, 0x1c8,
433 7),
434 TOP_MUX(CK_TOP_NETSYS_PPEFB_250M_SEL, "netsys_ppefb_250m_sel",
435 pcie_mbist_250m_parents, 0x110, 0x114, 0x118, 16, 1, 23, 0x1c8,
436 8),
437 TOP_MUX(CK_TOP_NETSYS_WARP_SEL, "netsys_warp_sel", netsys_parents,
438 0x110, 0x114, 0x118, 24, 2, 31, 0x1c8, 9),
439 TOP_MUX(CK_TOP_ETH_MII_SEL, "eth_mii_sel", eth_mii_parents, 0x120,
440 0x124, 0x128, 0, 1, 7, 0x1c8, 10),
Christian Marangi60358582024-08-03 10:32:52 +0200441 TOP_MUX(CK_TOP_NPU_SEL, "ck_npu_sel",
Weijie Gao42143692023-07-19 17:16:28 +0800442 netsys_2x_parents, 0x120, 0x124, 0x128, 8, 2, 15, 0x1c8, 11),
443};
444
Weijie Gao42143692023-07-19 17:16:28 +0800445/* INFRASYS MUX PARENTS */
Christian Marangi78507c32024-08-03 10:32:55 +0200446static const int infra_mux_uart0_parents[] = { CK_TOP_INFRA_F26M_SEL,
447 CK_TOP_UART_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800448
Christian Marangi78507c32024-08-03 10:32:55 +0200449static const int infra_mux_uart1_parents[] = { CK_TOP_INFRA_F26M_SEL,
450 CK_TOP_UART_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800451
Christian Marangi78507c32024-08-03 10:32:55 +0200452static const int infra_mux_uart2_parents[] = { CK_TOP_INFRA_F26M_SEL,
453 CK_TOP_UART_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800454
Christian Marangid061f732024-08-03 10:32:58 +0200455static const int infra_mux_spi0_parents[] = { CK_TOP_I2C_SEL, CK_TOP_SPI_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800456
Christian Marangid061f732024-08-03 10:32:58 +0200457static const int infra_mux_spi1_parents[] = { CK_TOP_I2C_SEL, CK_TOP_SPIM_MST_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800458
Christian Marangid061f732024-08-03 10:32:58 +0200459static const int infra_pwm_bck_parents[] = { CK_TOP_RTC_32P7K,
460 CK_TOP_INFRA_F26M_SEL, CK_TOP_SYSAXI_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200461 CK_TOP_PWM_SEL };
Weijie Gao42143692023-07-19 17:16:28 +0800462
463static const int infra_pcie_gfmux_tl_ck_o_p0_parents[] = {
Christian Marangid061f732024-08-03 10:32:58 +0200464 CK_TOP_RTC_32P7K, CK_TOP_INFRA_F26M_SEL, CK_TOP_INFRA_F26M_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200465 CK_TOP_PEXTP_TL_SEL
Weijie Gao42143692023-07-19 17:16:28 +0800466};
467
468static const int infra_pcie_gfmux_tl_ck_o_p1_parents[] = {
Christian Marangid061f732024-08-03 10:32:58 +0200469 CK_TOP_RTC_32P7K, CK_TOP_INFRA_F26M_SEL, CK_TOP_INFRA_F26M_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200470 CK_TOP_PEXTP_TL_P1_SEL
Weijie Gao42143692023-07-19 17:16:28 +0800471};
472
473static const int infra_pcie_gfmux_tl_ck_o_p2_parents[] = {
Christian Marangid061f732024-08-03 10:32:58 +0200474 CK_TOP_RTC_32P7K, CK_TOP_INFRA_F26M_SEL, CK_TOP_INFRA_F26M_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200475 CK_TOP_PEXTP_TL_P2_SEL
Weijie Gao42143692023-07-19 17:16:28 +0800476};
477
478static const int infra_pcie_gfmux_tl_ck_o_p3_parents[] = {
Christian Marangid061f732024-08-03 10:32:58 +0200479 CK_TOP_RTC_32P7K, CK_TOP_INFRA_F26M_SEL, CK_TOP_INFRA_F26M_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200480 CK_TOP_PEXTP_TL_P3_SEL
Weijie Gao42143692023-07-19 17:16:28 +0800481};
482
483#define INFRA_MUX(_id, _name, _parents, _reg, _shift, _width) \
484 { \
485 .id = _id, .mux_reg = _reg + 0x8, .mux_set_reg = _reg + 0x0, \
486 .mux_clr_reg = _reg + 0x4, .mux_shift = _shift, \
487 .mux_mask = BIT(_width) - 1, .parent = _parents, \
488 .num_parents = ARRAY_SIZE(_parents), \
Christian Marangi78507c32024-08-03 10:32:55 +0200489 .flags = CLK_MUX_SETCLR_UPD | CLK_PARENT_TOPCKGEN, \
Weijie Gao42143692023-07-19 17:16:28 +0800490 }
491
492/* INFRA MUX */
493static const struct mtk_composite infracfg_mtk_mux[] = {
494 INFRA_MUX(CK_INFRA_MUX_UART0_SEL, "infra_mux_uart0_sel",
495 infra_mux_uart0_parents, 0x10, 0, 1),
496 INFRA_MUX(CK_INFRA_MUX_UART1_SEL, "infra_mux_uart1_sel",
497 infra_mux_uart1_parents, 0x10, 1, 1),
498 INFRA_MUX(CK_INFRA_MUX_UART2_SEL, "infra_mux_uart2_sel",
499 infra_mux_uart2_parents, 0x10, 2, 1),
500 INFRA_MUX(CK_INFRA_MUX_SPI0_SEL, "infra_mux_spi0_sel",
501 infra_mux_spi0_parents, 0x10, 4, 1),
502 INFRA_MUX(CK_INFRA_MUX_SPI1_SEL, "infra_mux_spi1_sel",
503 infra_mux_spi1_parents, 0x10, 5, 1),
504 INFRA_MUX(CK_INFRA_MUX_SPI2_SEL, "infra_mux_spi2_sel",
505 infra_mux_spi0_parents, 0x10, 6, 1),
506 INFRA_MUX(CK_INFRA_PWM_SEL, "infra_pwm_sel", infra_pwm_bck_parents,
507 0x10, 14, 2),
508 INFRA_MUX(CK_INFRA_PWM_CK1_SEL, "infra_pwm_ck1_sel",
509 infra_pwm_bck_parents, 0x10, 16, 2),
510 INFRA_MUX(CK_INFRA_PWM_CK2_SEL, "infra_pwm_ck2_sel",
511 infra_pwm_bck_parents, 0x10, 18, 2),
512 INFRA_MUX(CK_INFRA_PWM_CK3_SEL, "infra_pwm_ck3_sel",
513 infra_pwm_bck_parents, 0x10, 20, 2),
514 INFRA_MUX(CK_INFRA_PWM_CK4_SEL, "infra_pwm_ck4_sel",
515 infra_pwm_bck_parents, 0x10, 22, 2),
516 INFRA_MUX(CK_INFRA_PWM_CK5_SEL, "infra_pwm_ck5_sel",
517 infra_pwm_bck_parents, 0x10, 24, 2),
518 INFRA_MUX(CK_INFRA_PWM_CK6_SEL, "infra_pwm_ck6_sel",
519 infra_pwm_bck_parents, 0x10, 26, 2),
520 INFRA_MUX(CK_INFRA_PWM_CK7_SEL, "infra_pwm_ck7_sel",
521 infra_pwm_bck_parents, 0x10, 28, 2),
522 INFRA_MUX(CK_INFRA_PWM_CK8_SEL, "infra_pwm_ck8_sel",
523 infra_pwm_bck_parents, 0x10, 30, 2),
524 INFRA_MUX(CK_INFRA_PCIE_GFMUX_TL_O_P0_SEL,
525 "infra_pcie_gfmux_tl_o_p0_sel",
526 infra_pcie_gfmux_tl_ck_o_p0_parents, 0x20, 0, 2),
527 INFRA_MUX(CK_INFRA_PCIE_GFMUX_TL_O_P1_SEL,
528 "infra_pcie_gfmux_tl_o_p1_sel",
529 infra_pcie_gfmux_tl_ck_o_p1_parents, 0x20, 2, 2),
530 INFRA_MUX(CK_INFRA_PCIE_GFMUX_TL_O_P2_SEL,
531 "infra_pcie_gfmux_tl_o_p2_sel",
532 infra_pcie_gfmux_tl_ck_o_p2_parents, 0x20, 4, 2),
533 INFRA_MUX(CK_INFRA_PCIE_GFMUX_TL_O_P3_SEL,
534 "infra_pcie_gfmux_tl_o_p3_sel",
535 infra_pcie_gfmux_tl_ck_o_p3_parents, 0x20, 6, 2),
536};
537
538static const struct mtk_gate_regs infra_0_cg_regs = {
539 .set_ofs = 0x10,
540 .clr_ofs = 0x14,
541 .sta_ofs = 0x18,
542};
543
544static const struct mtk_gate_regs infra_1_cg_regs = {
545 .set_ofs = 0x40,
546 .clr_ofs = 0x44,
547 .sta_ofs = 0x48,
548};
549
550static const struct mtk_gate_regs infra_2_cg_regs = {
551 .set_ofs = 0x50,
552 .clr_ofs = 0x54,
553 .sta_ofs = 0x58,
554};
555
556static const struct mtk_gate_regs infra_3_cg_regs = {
557 .set_ofs = 0x60,
558 .clr_ofs = 0x64,
559 .sta_ofs = 0x68,
560};
561
Christian Marangi78507c32024-08-03 10:32:55 +0200562#define GATE_INFRA0(_id, _name, _parent, _shift, _flags) \
Weijie Gao42143692023-07-19 17:16:28 +0800563 { \
564 .id = _id, .parent = _parent, .regs = &infra_0_cg_regs, \
565 .shift = _shift, \
Christian Marangi78507c32024-08-03 10:32:55 +0200566 .flags = _flags, \
Weijie Gao42143692023-07-19 17:16:28 +0800567 }
Christian Marangi78507c32024-08-03 10:32:55 +0200568#define GATE_INFRA0_INFRA(_id, _name, _parent, _shift) \
569 GATE_INFRA0(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_INFRASYS)
570#define GATE_INFRA0_TOP(_id, _name, _parent, _shift) \
571 GATE_INFRA0(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN)
Weijie Gao42143692023-07-19 17:16:28 +0800572
Christian Marangi78507c32024-08-03 10:32:55 +0200573#define GATE_INFRA1(_id, _name, _parent, _shift, _flags) \
Weijie Gao42143692023-07-19 17:16:28 +0800574 { \
575 .id = _id, .parent = _parent, .regs = &infra_1_cg_regs, \
576 .shift = _shift, \
Christian Marangi78507c32024-08-03 10:32:55 +0200577 .flags = _flags, \
Weijie Gao42143692023-07-19 17:16:28 +0800578 }
Christian Marangi78507c32024-08-03 10:32:55 +0200579#define GATE_INFRA1_INFRA(_id, _name, _parent, _shift) \
580 GATE_INFRA1(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_INFRASYS)
581#define GATE_INFRA1_TOP(_id, _name, _parent, _shift) \
582 GATE_INFRA1(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN)
Weijie Gao42143692023-07-19 17:16:28 +0800583
Christian Marangi78507c32024-08-03 10:32:55 +0200584#define GATE_INFRA2(_id, _name, _parent, _shift, _flags) \
Weijie Gao42143692023-07-19 17:16:28 +0800585 { \
586 .id = _id, .parent = _parent, .regs = &infra_2_cg_regs, \
587 .shift = _shift, \
Christian Marangi78507c32024-08-03 10:32:55 +0200588 .flags = _flags, \
Weijie Gao42143692023-07-19 17:16:28 +0800589 }
Christian Marangi78507c32024-08-03 10:32:55 +0200590#define GATE_INFRA2_INFRA(_id, _name, _parent, _shift) \
591 GATE_INFRA2(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_INFRASYS)
592#define GATE_INFRA2_TOP(_id, _name, _parent, _shift) \
593 GATE_INFRA2(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN)
Weijie Gao42143692023-07-19 17:16:28 +0800594
Christian Marangi78507c32024-08-03 10:32:55 +0200595#define GATE_INFRA3(_id, _name, _parent, _shift, _flags) \
Weijie Gao42143692023-07-19 17:16:28 +0800596 { \
597 .id = _id, .parent = _parent, .regs = &infra_3_cg_regs, \
598 .shift = _shift, \
Christian Marangi78507c32024-08-03 10:32:55 +0200599 .flags = _flags, \
Weijie Gao42143692023-07-19 17:16:28 +0800600 }
Christian Marangi78507c32024-08-03 10:32:55 +0200601#define GATE_INFRA3_INFRA(_id, _name, _parent, _shift) \
602 GATE_INFRA3(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_INFRASYS)
603#define GATE_INFRA3_TOP(_id, _name, _parent, _shift) \
604 GATE_INFRA3(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_TOPCKGEN)
605#define GATE_INFRA3_XTAL(_id, _name, _parent, _shift) \
606 GATE_INFRA3(_id, _name, _parent, _shift, CLK_GATE_SETCLR | CLK_PARENT_XTAL)
Weijie Gao42143692023-07-19 17:16:28 +0800607
608/* INFRA GATE */
609static const struct mtk_gate infracfg_mtk_gates[] = {
Christian Marangi78507c32024-08-03 10:32:55 +0200610 GATE_INFRA0_TOP(CK_INFRA_PCIE_PERI_26M_CK_P0,
Christian Marangid061f732024-08-03 10:32:58 +0200611 "infra_pcie_peri_ck_26m_ck_p0", CK_TOP_INFRA_F26M_SEL, 7),
Christian Marangi78507c32024-08-03 10:32:55 +0200612 GATE_INFRA0_TOP(CK_INFRA_PCIE_PERI_26M_CK_P1,
Christian Marangid061f732024-08-03 10:32:58 +0200613 "infra_pcie_peri_ck_26m_ck_p1", CK_TOP_INFRA_F26M_SEL, 8),
Christian Marangi78507c32024-08-03 10:32:55 +0200614 GATE_INFRA0_INFRA(CK_INFRA_PCIE_PERI_26M_CK_P2,
615 "infra_pcie_peri_ck_26m_ck_p2", CK_INFRA_PCIE_PERI_26M_CK_P3, 9),
616 GATE_INFRA0_TOP(CK_INFRA_PCIE_PERI_26M_CK_P3,
Christian Marangid061f732024-08-03 10:32:58 +0200617 "infra_pcie_peri_ck_26m_ck_p3", CK_TOP_INFRA_F26M_SEL, 10),
Christian Marangi78507c32024-08-03 10:32:55 +0200618 GATE_INFRA1_TOP(CK_INFRA_66M_GPT_BCK, "infra_hf_66m_gpt_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200619 CK_TOP_SYSAXI_SEL, 0),
Christian Marangi78507c32024-08-03 10:32:55 +0200620 GATE_INFRA1_TOP(CK_INFRA_66M_PWM_HCK, "infra_hf_66m_pwm_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200621 CK_TOP_SYSAXI_SEL, 1),
Christian Marangi78507c32024-08-03 10:32:55 +0200622 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_BCK, "infra_hf_66m_pwm_bck",
623 CK_INFRA_PWM_SEL, 2),
624 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK1, "infra_hf_66m_pwm_ck1",
625 CK_INFRA_PWM_CK1_SEL, 3),
626 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK2, "infra_hf_66m_pwm_ck2",
627 CK_INFRA_PWM_CK2_SEL, 4),
628 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK3, "infra_hf_66m_pwm_ck3",
629 CK_INFRA_PWM_CK3_SEL, 5),
630 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK4, "infra_hf_66m_pwm_ck4",
631 CK_INFRA_PWM_CK4_SEL, 6),
632 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK5, "infra_hf_66m_pwm_ck5",
633 CK_INFRA_PWM_CK5_SEL, 7),
634 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK6, "infra_hf_66m_pwm_ck6",
635 CK_INFRA_PWM_CK6_SEL, 8),
636 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK7, "infra_hf_66m_pwm_ck7",
637 CK_INFRA_PWM_CK7_SEL, 9),
638 GATE_INFRA1_INFRA(CK_INFRA_66M_PWM_CK8, "infra_hf_66m_pwm_ck8",
639 CK_INFRA_PWM_CK8_SEL, 10),
640 GATE_INFRA1_TOP(CK_INFRA_133M_CQDMA_BCK, "infra_hf_133m_cqdma_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200641 CK_TOP_SYSAXI_SEL, 12),
Christian Marangi78507c32024-08-03 10:32:55 +0200642 GATE_INFRA1_TOP(CK_INFRA_66M_AUD_SLV_BCK, "infra_66m_aud_slv_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200643 CK_TOP_SYSAXI_SEL, 13),
Christian Marangi78507c32024-08-03 10:32:55 +0200644 GATE_INFRA1_TOP(CK_INFRA_AUD_26M, "infra_f_faud_26m", CK_TOP_INFRA_F26M_SEL, 14),
Christian Marangid061f732024-08-03 10:32:58 +0200645 GATE_INFRA1_TOP(CK_INFRA_AUD_L, "infra_f_faud_l", CK_TOP_AUD_L_SEL, 15),
646 GATE_INFRA1_TOP(CK_INFRA_AUD_AUD, "infra_f_aud_aud", CK_TOP_A1SYS_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200647 16),
Christian Marangid061f732024-08-03 10:32:58 +0200648 GATE_INFRA1_TOP(CK_INFRA_AUD_EG2, "infra_f_faud_eg2", CK_TOP_A_TUNER_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200649 18),
650 GATE_INFRA1_TOP(CK_INFRA_DRAMC_F26M, "infra_dramc_f26m", CK_TOP_INFRA_F26M_SEL,
651 19),
652 GATE_INFRA1_TOP(CK_INFRA_133M_DBG_ACKM, "infra_hf_133m_dbg_ackm",
Christian Marangid061f732024-08-03 10:32:58 +0200653 CK_TOP_SYSAXI_SEL, 20),
Christian Marangi78507c32024-08-03 10:32:55 +0200654 GATE_INFRA1_TOP(CK_INFRA_66M_AP_DMA_BCK, "infra_66m_ap_dma_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200655 CK_TOP_SYSAXI_SEL, 21),
Christian Marangi78507c32024-08-03 10:32:55 +0200656 GATE_INFRA1_TOP(CK_INFRA_66M_SEJ_BCK, "infra_hf_66m_sej_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200657 CK_TOP_SYSAXI_SEL, 29),
Christian Marangi78507c32024-08-03 10:32:55 +0200658 GATE_INFRA1_TOP(CK_INFRA_PRE_CK_SEJ_F13M, "infra_pre_ck_sej_f13m",
659 CK_TOP_INFRA_F26M_SEL, 30),
Christian Marangi6e54f032024-08-03 10:32:59 +0200660 /* GATE_INFRA1_TOP(CK_INFRA_66M_TRNG, "infra_hf_66m_trng", CK_TOP_SYSAXI_SEL,
661 31), */
Christian Marangi78507c32024-08-03 10:32:55 +0200662 GATE_INFRA2_TOP(CK_INFRA_26M_THERM_SYSTEM, "infra_hf_26m_therm_system",
663 CK_TOP_INFRA_F26M_SEL, 0),
Christian Marangid061f732024-08-03 10:32:58 +0200664 GATE_INFRA2_TOP(CK_INFRA_I2C_BCK, "infra_i2c_bck", CK_TOP_I2C_SEL, 1),
Christian Marangi6e54f032024-08-03 10:32:59 +0200665 /* GATE_INFRA2_TOP(CK_INFRA_66M_UART0_PCK, "infra_hf_66m_uart0_pck",
666 CK_TOP_SYSAXI_SEL, 3), */
667 /* GATE_INFRA2_TOP(CK_INFRA_66M_UART1_PCK, "infra_hf_66m_uart1_pck",
668 CK_TOP_SYSAXI_SEL, 4), */
669 /* GATE_INFRA2_TOP(CK_INFRA_66M_UART2_PCK, "infra_hf_66m_uart2_pck",
670 CK_TOP_SYSAXI_SEL, 5), */
Christian Marangi78507c32024-08-03 10:32:55 +0200671 GATE_INFRA2_INFRA(CK_INFRA_52M_UART0_CK, "infra_f_52m_uart0",
672 CK_INFRA_MUX_UART0_SEL, 3),
673 GATE_INFRA2_INFRA(CK_INFRA_52M_UART1_CK, "infra_f_52m_uart1",
674 CK_INFRA_MUX_UART1_SEL, 4),
675 GATE_INFRA2_INFRA(CK_INFRA_52M_UART2_CK, "infra_f_52m_uart2",
676 CK_INFRA_MUX_UART2_SEL, 5),
Christian Marangid061f732024-08-03 10:32:58 +0200677 GATE_INFRA2_TOP(CK_INFRA_NFI, "infra_f_fnfi", CK_TOP_NFI1X_SEL, 9),
678 GATE_INFRA2_TOP(CK_INFRA_SPINFI, "infra_f_fspinfi", CK_TOP_SPINFI_SEL, 10),
Christian Marangi78507c32024-08-03 10:32:55 +0200679 GATE_INFRA2_TOP(CK_INFRA_66M_NFI_HCK, "infra_hf_66m_nfi_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200680 CK_TOP_SYSAXI_SEL, 11),
Christian Marangi78507c32024-08-03 10:32:55 +0200681 GATE_INFRA2_INFRA(CK_INFRA_104M_SPI0, "infra_hf_104m_spi0",
682 CK_INFRA_MUX_SPI0_SEL, 12),
683 GATE_INFRA2_INFRA(CK_INFRA_104M_SPI1, "infra_hf_104m_spi1",
684 CK_INFRA_MUX_SPI1_SEL, 13),
685 GATE_INFRA2_INFRA(CK_INFRA_104M_SPI2_BCK, "infra_hf_104m_spi2_bck",
686 CK_INFRA_MUX_SPI2_SEL, 14),
687 GATE_INFRA2_TOP(CK_INFRA_66M_SPI0_HCK, "infra_hf_66m_spi0_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200688 CK_TOP_SYSAXI_SEL, 15),
Christian Marangi78507c32024-08-03 10:32:55 +0200689 GATE_INFRA2_TOP(CK_INFRA_66M_SPI1_HCK, "infra_hf_66m_spi1_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200690 CK_TOP_SYSAXI_SEL, 16),
Christian Marangi78507c32024-08-03 10:32:55 +0200691 GATE_INFRA2_TOP(CK_INFRA_66M_SPI2_HCK, "infra_hf_66m_spi2_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200692 CK_TOP_SYSAXI_SEL, 17),
Christian Marangi78507c32024-08-03 10:32:55 +0200693 GATE_INFRA2_TOP(CK_INFRA_66M_FLASHIF_AXI, "infra_hf_66m_flashif_axi",
Christian Marangid061f732024-08-03 10:32:58 +0200694 CK_TOP_SYSAXI_SEL, 18),
Christian Marangi8b75c2c2024-08-03 10:32:56 +0200695 GATE_INFRA2_TOP(CK_INFRA_RTC, "infra_f_frtc", CK_TOP_RTC_32K, 19),
Christian Marangi78507c32024-08-03 10:32:55 +0200696 GATE_INFRA2_TOP(CK_INFRA_26M_ADC_BCK, "infra_f_26m_adc_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200697 CK_TOP_INFRA_F26M_SEL, 20),
Christian Marangi78507c32024-08-03 10:32:55 +0200698 GATE_INFRA2_INFRA(CK_INFRA_RC_ADC, "infra_f_frc_adc", CK_INFRA_26M_ADC_BCK,
699 21),
Christian Marangid061f732024-08-03 10:32:58 +0200700 GATE_INFRA2_TOP(CK_INFRA_MSDC400, "infra_f_fmsdc400", CK_TOP_EMMC_400M_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200701 22),
702 GATE_INFRA2_TOP(CK_INFRA_MSDC2_HCK, "infra_f_fmsdc2_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200703 CK_TOP_EMMC_250M_SEL, 23),
Christian Marangi78507c32024-08-03 10:32:55 +0200704 GATE_INFRA2_TOP(CK_INFRA_133M_MSDC_0_HCK, "infra_hf_133m_msdc_0_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200705 CK_TOP_SYSAXI_SEL, 24),
Christian Marangi78507c32024-08-03 10:32:55 +0200706 GATE_INFRA2_TOP(CK_INFRA_66M_MSDC_0_HCK, "infra_66m_msdc_0_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200707 CK_TOP_SYSAXI_SEL, 25),
Christian Marangi78507c32024-08-03 10:32:55 +0200708 GATE_INFRA2_TOP(CK_INFRA_133M_CPUM_BCK, "infra_hf_133m_cpum_bck",
Christian Marangid061f732024-08-03 10:32:58 +0200709 CK_TOP_SYSAXI_SEL, 26),
710 GATE_INFRA2_TOP(CK_INFRA_BIST2FPC, "infra_hf_fbist2fpc", CK_TOP_NFI1X_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200711 27),
712 GATE_INFRA2_TOP(CK_INFRA_I2C_X16W_MCK_CK_P1, "infra_hf_i2c_x16w_mck_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200713 CK_TOP_SYSAXI_SEL, 29),
Christian Marangi78507c32024-08-03 10:32:55 +0200714 GATE_INFRA2_TOP(CK_INFRA_I2C_X16W_PCK_CK_P1, "infra_hf_i2c_x16w_pck_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200715 CK_TOP_SYSAXI_SEL, 31),
Christian Marangi78507c32024-08-03 10:32:55 +0200716 GATE_INFRA3_TOP(CK_INFRA_133M_USB_HCK, "infra_133m_usb_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200717 CK_TOP_SYSAXI_SEL, 0),
Christian Marangi78507c32024-08-03 10:32:55 +0200718 GATE_INFRA3_TOP(CK_INFRA_133M_USB_HCK_CK_P1, "infra_133m_usb_hck_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200719 CK_TOP_SYSAXI_SEL, 1),
Christian Marangi78507c32024-08-03 10:32:55 +0200720 GATE_INFRA3_TOP(CK_INFRA_66M_USB_HCK, "infra_66m_usb_hck",
Christian Marangid061f732024-08-03 10:32:58 +0200721 CK_TOP_SYSAXI_SEL, 2),
Christian Marangi78507c32024-08-03 10:32:55 +0200722 GATE_INFRA3_TOP(CK_INFRA_66M_USB_HCK_CK_P1, "infra_66m_usb_hck_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200723 CK_TOP_SYSAXI_SEL, 3),
724 GATE_INFRA3_TOP(CK_INFRA_USB_SYS, "infra_usb_sys", CK_TOP_USB_SYS_SEL, 4),
Christian Marangi78507c32024-08-03 10:32:55 +0200725 GATE_INFRA3_TOP(CK_INFRA_USB_SYS_CK_P1, "infra_usb_sys_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200726 CK_TOP_USB_SYS_P1_SEL, 5),
727 GATE_INFRA3_XTAL(CK_INFRA_USB_REF, "infra_usb_ref", CLK_XTAL, 6),
728 GATE_INFRA3_XTAL(CK_INFRA_USB_CK_P1, "infra_usb_ck_p1", CLK_XTAL,
729 7),
Christian Marangi78507c32024-08-03 10:32:55 +0200730 GATE_INFRA3_TOP(CK_INFRA_USB_FRMCNT, "infra_usb_frmcnt",
Christian Marangid061f732024-08-03 10:32:58 +0200731 CK_TOP_USB_FRMCNT_SEL, 8),
Christian Marangi78507c32024-08-03 10:32:55 +0200732 GATE_INFRA3_TOP(CK_INFRA_USB_FRMCNT_CK_P1, "infra_usb_frmcnt_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200733 CK_TOP_USB_FRMCNT_P1_SEL, 9),
Christian Marangi78507c32024-08-03 10:32:55 +0200734 GATE_INFRA3_XTAL(CK_INFRA_USB_PIPE, "infra_usb_pipe", CLK_XTAL,
735 10),
736 GATE_INFRA3_XTAL(CK_INFRA_USB_PIPE_CK_P1, "infra_usb_pipe_ck_p1",
737 CLK_XTAL, 11),
738 GATE_INFRA3_XTAL(CK_INFRA_USB_UTMI, "infra_usb_utmi", CLK_XTAL,
739 12),
740 GATE_INFRA3_XTAL(CK_INFRA_USB_UTMI_CK_P1, "infra_usb_utmi_ck_p1",
741 CLK_XTAL, 13),
Christian Marangid061f732024-08-03 10:32:58 +0200742 GATE_INFRA3_TOP(CK_INFRA_USB_XHCI, "infra_usb_xhci", CK_TOP_USB_XHCI_SEL,
Christian Marangi78507c32024-08-03 10:32:55 +0200743 14),
744 GATE_INFRA3_TOP(CK_INFRA_USB_XHCI_CK_P1, "infra_usb_xhci_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200745 CK_TOP_USB_XHCI_P1_SEL, 15),
Christian Marangi78507c32024-08-03 10:32:55 +0200746 GATE_INFRA3_INFRA(CK_INFRA_PCIE_GFMUX_TL_P0, "infra_pcie_gfmux_tl_ck_p0",
747 CK_INFRA_PCIE_GFMUX_TL_O_P0_SEL, 20),
748 GATE_INFRA3_INFRA(CK_INFRA_PCIE_GFMUX_TL_P1, "infra_pcie_gfmux_tl_ck_p1",
749 CK_INFRA_PCIE_GFMUX_TL_O_P1_SEL, 21),
750 GATE_INFRA3_INFRA(CK_INFRA_PCIE_GFMUX_TL_P2, "infra_pcie_gfmux_tl_ck_p2",
751 CK_INFRA_PCIE_GFMUX_TL_O_P2_SEL, 22),
752 GATE_INFRA3_INFRA(CK_INFRA_PCIE_GFMUX_TL_P3, "infra_pcie_gfmux_tl_ck_p3",
753 CK_INFRA_PCIE_GFMUX_TL_O_P3_SEL, 23),
754 GATE_INFRA3_XTAL(CK_INFRA_PCIE_PIPE_P0, "infra_pcie_pipe_ck_p0",
755 CLK_XTAL, 24),
756 GATE_INFRA3_XTAL(CK_INFRA_PCIE_PIPE_P1, "infra_pcie_pipe_ck_p1",
757 CLK_XTAL, 25),
758 GATE_INFRA3_XTAL(CK_INFRA_PCIE_PIPE_P2, "infra_pcie_pipe_ck_p2",
759 CLK_XTAL, 26),
760 GATE_INFRA3_XTAL(CK_INFRA_PCIE_PIPE_P3, "infra_pcie_pipe_ck_p3",
761 CLK_XTAL, 27),
762 GATE_INFRA3_TOP(CK_INFRA_133M_PCIE_CK_P0, "infra_133m_pcie_ck_p0",
Christian Marangid061f732024-08-03 10:32:58 +0200763 CK_TOP_SYSAXI_SEL, 28),
Christian Marangi78507c32024-08-03 10:32:55 +0200764 GATE_INFRA3_TOP(CK_INFRA_133M_PCIE_CK_P1, "infra_133m_pcie_ck_p1",
Christian Marangid061f732024-08-03 10:32:58 +0200765 CK_TOP_SYSAXI_SEL, 29),
Christian Marangi78507c32024-08-03 10:32:55 +0200766 GATE_INFRA3_TOP(CK_INFRA_133M_PCIE_CK_P2, "infra_133m_pcie_ck_p2",
Christian Marangid061f732024-08-03 10:32:58 +0200767 CK_TOP_SYSAXI_SEL, 30),
Christian Marangi78507c32024-08-03 10:32:55 +0200768 GATE_INFRA3_TOP(CK_INFRA_133M_PCIE_CK_P3, "infra_133m_pcie_ck_p3",
Christian Marangid061f732024-08-03 10:32:58 +0200769 CK_TOP_SYSAXI_SEL, 31),
Weijie Gao42143692023-07-19 17:16:28 +0800770};
771
772static const struct mtk_clk_tree mt7988_fixed_pll_clk_tree = {
773 .fdivs_offs = ARRAY_SIZE(apmixedsys_mtk_plls),
774 .fclks = apmixedsys_mtk_plls,
Christian Marangid061f732024-08-03 10:32:58 +0200775 .flags = CLK_APMIXED,
Weijie Gao42143692023-07-19 17:16:28 +0800776 .xtal_rate = 40 * MHZ,
777};
778
779static const struct mtk_clk_tree mt7988_topckgen_clk_tree = {
Christian Marangid061f732024-08-03 10:32:58 +0200780 .fdivs_offs = CK_TOP_XTAL_D2,
Weijie Gao42143692023-07-19 17:16:28 +0800781 .muxes_offs = CK_TOP_NETSYS_SEL,
Christian Marangid061f732024-08-03 10:32:58 +0200782 .fclks = topckgen_mtk_fixed_clks,
Weijie Gao42143692023-07-19 17:16:28 +0800783 .fdivs = topckgen_mtk_fixed_factors,
784 .muxes = topckgen_mtk_muxes,
Christian Marangid061f732024-08-03 10:32:58 +0200785 .flags = CLK_BYPASS_XTAL | CLK_TOPCKGEN,
Weijie Gao42143692023-07-19 17:16:28 +0800786 .xtal_rate = 40 * MHZ,
787};
788
789static const struct mtk_clk_tree mt7988_infracfg_clk_tree = {
Weijie Gao42143692023-07-19 17:16:28 +0800790 .muxes_offs = CK_INFRA_MUX_UART0_SEL,
Weijie Gao42143692023-07-19 17:16:28 +0800791 .muxes = infracfg_mtk_mux,
792 .flags = CLK_BYPASS_XTAL,
793 .xtal_rate = 40 * MHZ,
794};
795
796static const struct udevice_id mt7988_fixed_pll_compat[] = {
797 { .compatible = "mediatek,mt7988-fixed-plls" },
Christian Marangi2fa520c2024-06-24 23:03:39 +0200798 { .compatible = "mediatek,mt7988-apmixedsys" },
Weijie Gao42143692023-07-19 17:16:28 +0800799 {}
800};
801
802static const struct udevice_id mt7988_topckgen_compat[] = {
803 { .compatible = "mediatek,mt7988-topckgen" },
804 {}
805};
806
807static int mt7988_fixed_pll_probe(struct udevice *dev)
808{
809 return mtk_common_clk_init(dev, &mt7988_fixed_pll_clk_tree);
810}
811
812static int mt7988_topckgen_probe(struct udevice *dev)
813{
814 struct mtk_clk_priv *priv = dev_get_priv(dev);
815
816 priv->base = dev_read_addr_ptr(dev);
817 if (!priv->base)
818 return -ENOENT;
819
820 writel(MT7988_CLK_PDN_EN_WRITE, priv->base + MT7988_CLK_PDN);
821 return mtk_common_clk_init(dev, &mt7988_topckgen_clk_tree);
822}
823
824U_BOOT_DRIVER(mtk_clk_apmixedsys) = {
825 .name = "mt7988-clock-fixed-pll",
826 .id = UCLASS_CLK,
827 .of_match = mt7988_fixed_pll_compat,
828 .probe = mt7988_fixed_pll_probe,
829 .priv_auto = sizeof(struct mtk_clk_priv),
830 .ops = &mtk_clk_topckgen_ops,
831 .flags = DM_FLAG_PRE_RELOC,
832};
833
834U_BOOT_DRIVER(mtk_clk_topckgen) = {
835 .name = "mt7988-clock-topckgen",
836 .id = UCLASS_CLK,
837 .of_match = mt7988_topckgen_compat,
838 .probe = mt7988_topckgen_probe,
839 .priv_auto = sizeof(struct mtk_clk_priv),
840 .ops = &mtk_clk_topckgen_ops,
841 .flags = DM_FLAG_PRE_RELOC,
842};
843
844static const struct udevice_id mt7988_infracfg_compat[] = {
845 { .compatible = "mediatek,mt7988-infracfg" },
846 {}
847};
848
849static const struct udevice_id mt7988_infracfg_ao_cgs_compat[] = {
850 { .compatible = "mediatek,mt7988-infracfg_ao_cgs" },
851 {}
852};
853
854static int mt7988_infracfg_probe(struct udevice *dev)
855{
856 return mtk_common_clk_init(dev, &mt7988_infracfg_clk_tree);
857}
858
859static int mt7988_infracfg_ao_cgs_probe(struct udevice *dev)
860{
861 return mtk_common_clk_gate_init(dev, &mt7988_infracfg_clk_tree,
862 infracfg_mtk_gates);
863}
864
865U_BOOT_DRIVER(mtk_clk_infracfg) = {
866 .name = "mt7988-clock-infracfg",
867 .id = UCLASS_CLK,
868 .of_match = mt7988_infracfg_compat,
869 .probe = mt7988_infracfg_probe,
870 .priv_auto = sizeof(struct mtk_clk_priv),
871 .ops = &mtk_clk_infrasys_ops,
872 .flags = DM_FLAG_PRE_RELOC,
873};
874
875U_BOOT_DRIVER(mtk_clk_infracfg_ao_cgs) = {
876 .name = "mt7988-clock-infracfg_ao_cgs",
877 .id = UCLASS_CLK,
878 .of_match = mt7988_infracfg_ao_cgs_compat,
879 .probe = mt7988_infracfg_ao_cgs_probe,
880 .priv_auto = sizeof(struct mtk_cg_priv),
881 .ops = &mtk_clk_gate_ops,
882 .flags = DM_FLAG_PRE_RELOC,
883};
884
885/* ETHDMA */
886
887static const struct mtk_gate_regs ethdma_cg_regs = {
888 .set_ofs = 0x30,
889 .clr_ofs = 0x30,
890 .sta_ofs = 0x30,
891};
892
893#define GATE_ETHDMA(_id, _name, _parent, _shift) \
894 { \
895 .id = _id, .parent = _parent, .regs = &ethdma_cg_regs, \
896 .shift = _shift, \
897 .flags = CLK_GATE_NO_SETCLR_INV | CLK_PARENT_TOPCKGEN, \
898 }
899
900static const struct mtk_gate ethdma_mtk_gate[] = {
Christian Marangid061f732024-08-03 10:32:58 +0200901 GATE_ETHDMA(CK_ETHDMA_FE_EN, "ethdma_fe_en", CK_TOP_NETSYS_2X_SEL, 6),
Weijie Gao42143692023-07-19 17:16:28 +0800902};
903
904static int mt7988_ethdma_probe(struct udevice *dev)
905{
906 return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
907 ethdma_mtk_gate);
908}
909
910static int mt7988_ethdma_bind(struct udevice *dev)
911{
912 int ret = 0;
913
914 if (CONFIG_IS_ENABLED(RESET_MEDIATEK)) {
915 ret = mediatek_reset_bind(dev, MT7988_ETHDMA_RST_CTRL_OFS, 1);
916 if (ret)
917 debug("Warning: failed to bind reset controller\n");
918 }
919
920 return ret;
921}
922
923static const struct udevice_id mt7988_ethdma_compat[] = {
924 {
925 .compatible = "mediatek,mt7988-ethdma",
926 },
927 {}
928};
929
930U_BOOT_DRIVER(mtk_clk_ethdma) = {
931 .name = "mt7988-clock-ethdma",
932 .id = UCLASS_CLK,
933 .of_match = mt7988_ethdma_compat,
934 .probe = mt7988_ethdma_probe,
935 .bind = mt7988_ethdma_bind,
936 .priv_auto = sizeof(struct mtk_cg_priv),
937 .ops = &mtk_clk_gate_ops,
938};
939
940/* SGMIISYS_0 */
941
942static const struct mtk_gate_regs sgmii0_cg_regs = {
943 .set_ofs = 0xE4,
944 .clr_ofs = 0xE4,
945 .sta_ofs = 0xE4,
946};
947
948#define GATE_SGMII0(_id, _name, _parent, _shift) \
949 { \
950 .id = _id, .parent = _parent, .regs = &sgmii0_cg_regs, \
951 .shift = _shift, \
952 .flags = CLK_GATE_NO_SETCLR_INV | CLK_PARENT_TOPCKGEN, \
953 }
954
955static const struct mtk_gate sgmiisys_0_mtk_gate[] = {
Christian Marangib76b75b2024-08-03 10:32:50 +0200956 /* connect to fake clock, so use CK_TOP_XTAL as the clock parent */
957 GATE_SGMII0(CK_SGM0_TX_EN, "sgm0_tx_en", CK_TOP_XTAL, 2),
958 /* connect to fake clock, so use CK_TOP_XTAL as the clock parent */
959 GATE_SGMII0(CK_SGM0_RX_EN, "sgm0_rx_en", CK_TOP_XTAL, 3),
Weijie Gao42143692023-07-19 17:16:28 +0800960};
961
962static int mt7988_sgmiisys_0_probe(struct udevice *dev)
963{
964 return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
965 sgmiisys_0_mtk_gate);
966}
967
968static const struct udevice_id mt7988_sgmiisys_0_compat[] = {
969 {
970 .compatible = "mediatek,mt7988-sgmiisys_0",
971 },
972 {}
973};
974
975U_BOOT_DRIVER(mtk_clk_sgmiisys_0) = {
976 .name = "mt7988-clock-sgmiisys_0",
977 .id = UCLASS_CLK,
978 .of_match = mt7988_sgmiisys_0_compat,
979 .probe = mt7988_sgmiisys_0_probe,
980 .priv_auto = sizeof(struct mtk_cg_priv),
981 .ops = &mtk_clk_gate_ops,
982};
983
984/* SGMIISYS_1 */
985
986static const struct mtk_gate_regs sgmii1_cg_regs = {
987 .set_ofs = 0xE4,
988 .clr_ofs = 0xE4,
989 .sta_ofs = 0xE4,
990};
991
992#define GATE_SGMII1(_id, _name, _parent, _shift) \
993 { \
994 .id = _id, .parent = _parent, .regs = &sgmii1_cg_regs, \
995 .shift = _shift, \
996 .flags = CLK_GATE_NO_SETCLR_INV | CLK_PARENT_TOPCKGEN, \
997 }
998
999static const struct mtk_gate sgmiisys_1_mtk_gate[] = {
Christian Marangib76b75b2024-08-03 10:32:50 +02001000 /* connect to fake clock, so use CK_TOP_XTAL as the clock parent */
1001 GATE_SGMII1(CK_SGM1_TX_EN, "sgm1_tx_en", CK_TOP_XTAL, 2),
1002 /* connect to fake clock, so use CK_TOP_XTAL as the clock parent */
1003 GATE_SGMII1(CK_SGM1_RX_EN, "sgm1_rx_en", CK_TOP_XTAL, 3),
Weijie Gao42143692023-07-19 17:16:28 +08001004};
1005
1006static int mt7988_sgmiisys_1_probe(struct udevice *dev)
1007{
1008 return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
1009 sgmiisys_1_mtk_gate);
1010}
1011
1012static const struct udevice_id mt7988_sgmiisys_1_compat[] = {
1013 {
1014 .compatible = "mediatek,mt7988-sgmiisys_1",
1015 },
1016 {}
1017};
1018
1019U_BOOT_DRIVER(mtk_clk_sgmiisys_1) = {
1020 .name = "mt7988-clock-sgmiisys_1",
1021 .id = UCLASS_CLK,
1022 .of_match = mt7988_sgmiisys_1_compat,
1023 .probe = mt7988_sgmiisys_1_probe,
1024 .priv_auto = sizeof(struct mtk_cg_priv),
1025 .ops = &mtk_clk_gate_ops,
1026};
1027
1028/* ETHWARP */
1029
1030static const struct mtk_gate_regs ethwarp_cg_regs = {
1031 .set_ofs = 0x14,
1032 .clr_ofs = 0x14,
1033 .sta_ofs = 0x14,
1034};
1035
1036#define GATE_ETHWARP(_id, _name, _parent, _shift) \
1037 { \
1038 .id = _id, .parent = _parent, .regs = &ethwarp_cg_regs, \
1039 .shift = _shift, \
1040 .flags = CLK_GATE_NO_SETCLR_INV | CLK_PARENT_TOPCKGEN, \
1041 }
1042
1043static const struct mtk_gate ethwarp_mtk_gate[] = {
1044 GATE_ETHWARP(CK_ETHWARP_WOCPU2_EN, "ethwarp_wocpu2_en",
Christian Marangid061f732024-08-03 10:32:58 +02001045 CK_TOP_NETSYS_MCU_SEL, 13),
Weijie Gao42143692023-07-19 17:16:28 +08001046 GATE_ETHWARP(CK_ETHWARP_WOCPU1_EN, "ethwarp_wocpu1_en",
Christian Marangid061f732024-08-03 10:32:58 +02001047 CK_TOP_NETSYS_MCU_SEL, 14),
Weijie Gao42143692023-07-19 17:16:28 +08001048 GATE_ETHWARP(CK_ETHWARP_WOCPU0_EN, "ethwarp_wocpu0_en",
Christian Marangid061f732024-08-03 10:32:58 +02001049 CK_TOP_NETSYS_MCU_SEL, 15),
Weijie Gao42143692023-07-19 17:16:28 +08001050};
1051
1052static int mt7988_ethwarp_probe(struct udevice *dev)
1053{
1054 return mtk_common_clk_gate_init(dev, &mt7988_topckgen_clk_tree,
1055 ethwarp_mtk_gate);
1056}
1057
1058static int mt7988_ethwarp_bind(struct udevice *dev)
1059{
1060 int ret = 0;
1061
1062 if (CONFIG_IS_ENABLED(RESET_MEDIATEK)) {
1063 ret = mediatek_reset_bind(dev, MT7988_ETHWARP_RST_CTRL_OFS, 2);
1064 if (ret)
1065 debug("Warning: failed to bind reset controller\n");
1066 }
1067
1068 return ret;
1069}
1070
1071static const struct udevice_id mt7988_ethwarp_compat[] = {
1072 {
1073 .compatible = "mediatek,mt7988-ethwarp",
1074 },
1075 {}
1076};
1077
1078U_BOOT_DRIVER(mtk_clk_ethwarp) = {
1079 .name = "mt7988-clock-ethwarp",
1080 .id = UCLASS_CLK,
1081 .of_match = mt7988_ethwarp_compat,
1082 .probe = mt7988_ethwarp_probe,
1083 .bind = mt7988_ethwarp_bind,
1084 .priv_auto = sizeof(struct mtk_cg_priv),
1085 .ops = &mtk_clk_gate_ops,
1086};