1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2014 MundoReader S.L.
4*4882a593Smuzhiyun * Author: Heiko Stuebner <heiko@sntech.de>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (c) 2015 Rockchip Electronics Co. Ltd.
7*4882a593Smuzhiyun * Author: Xing Zheng <zhengxing@rock-chips.com>
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * based on
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * samsung/clk.h
12*4882a593Smuzhiyun * Copyright (c) 2013 Samsung Electronics Co., Ltd.
13*4882a593Smuzhiyun * Copyright (c) 2013 Linaro Ltd.
14*4882a593Smuzhiyun * Author: Thomas Abraham <thomas.ab@samsung.com>
15*4882a593Smuzhiyun */
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #ifndef CLK_ROCKCHIP_CLK_H
18*4882a593Smuzhiyun #define CLK_ROCKCHIP_CLK_H
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include <linux/io.h>
21*4882a593Smuzhiyun #include <linux/clk-provider.h>
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun struct clk;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #define HIWORD_UPDATE(val, mask, shift) \
26*4882a593Smuzhiyun ((val) << (shift) | (mask) << ((shift) + 16))
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /* register positions shared by PX30, RV1108, RK2928, RK3036, RK3066, RK3188 and RK3228 */
29*4882a593Smuzhiyun #define BOOST_PLL_H_CON(x) ((x) * 0x4)
30*4882a593Smuzhiyun #define BOOST_CLK_CON 0x0008
31*4882a593Smuzhiyun #define BOOST_BOOST_CON 0x000c
32*4882a593Smuzhiyun #define BOOST_SWITCH_CNT 0x0010
33*4882a593Smuzhiyun #define BOOST_HIGH_PERF_CNT0 0x0014
34*4882a593Smuzhiyun #define BOOST_HIGH_PERF_CNT1 0x0018
35*4882a593Smuzhiyun #define BOOST_STATIS_THRESHOLD 0x001c
36*4882a593Smuzhiyun #define BOOST_SHORT_SWITCH_CNT 0x0020
37*4882a593Smuzhiyun #define BOOST_SWITCH_THRESHOLD 0x0024
38*4882a593Smuzhiyun #define BOOST_FSM_STATUS 0x0028
39*4882a593Smuzhiyun #define BOOST_PLL_L_CON(x) ((x) * 0x4 + 0x2c)
40*4882a593Smuzhiyun #define BOOST_PLL_CON_MASK 0xffff
41*4882a593Smuzhiyun #define BOOST_CORE_DIV_MASK 0x1f
42*4882a593Smuzhiyun #define BOOST_CORE_DIV_SHIFT 0
43*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_MASK 0x3
44*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_SHIFT 8
45*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_USAGE_MASK 0x1
46*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_USAGE_SHIFT 12
47*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_USAGE_BORROW 0
48*4882a593Smuzhiyun #define BOOST_BACKUP_PLL_USAGE_TARGET 1
49*4882a593Smuzhiyun #define BOOST_ENABLE_MASK 0x1
50*4882a593Smuzhiyun #define BOOST_ENABLE_SHIFT 0
51*4882a593Smuzhiyun #define BOOST_RECOVERY_MASK 0x1
52*4882a593Smuzhiyun #define BOOST_RECOVERY_SHIFT 1
53*4882a593Smuzhiyun #define BOOST_SW_CTRL_MASK 0x1
54*4882a593Smuzhiyun #define BOOST_SW_CTRL_SHIFT 2
55*4882a593Smuzhiyun #define BOOST_LOW_FREQ_EN_MASK 0x1
56*4882a593Smuzhiyun #define BOOST_LOW_FREQ_EN_SHIFT 3
57*4882a593Smuzhiyun #define BOOST_STATIS_ENABLE_MASK 0x1
58*4882a593Smuzhiyun #define BOOST_STATIS_ENABLE_SHIFT 4
59*4882a593Smuzhiyun #define BOOST_BUSY_STATE BIT(8)
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun #define PX30_PLL_CON(x) ((x) * 0x4)
62*4882a593Smuzhiyun #define PX30_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
63*4882a593Smuzhiyun #define PX30_CLKGATE_CON(x) ((x) * 0x4 + 0x200)
64*4882a593Smuzhiyun #define PX30_GLB_SRST_FST 0xb8
65*4882a593Smuzhiyun #define PX30_GLB_SRST_SND 0xbc
66*4882a593Smuzhiyun #define PX30_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
67*4882a593Smuzhiyun #define PX30_MODE_CON 0xa0
68*4882a593Smuzhiyun #define PX30_MISC_CON 0xa4
69*4882a593Smuzhiyun #define PX30_SDMMC_CON0 0x380
70*4882a593Smuzhiyun #define PX30_SDMMC_CON1 0x384
71*4882a593Smuzhiyun #define PX30_SDIO_CON0 0x388
72*4882a593Smuzhiyun #define PX30_SDIO_CON1 0x38c
73*4882a593Smuzhiyun #define PX30_EMMC_CON0 0x390
74*4882a593Smuzhiyun #define PX30_EMMC_CON1 0x394
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #define PX30_PMU_PLL_CON(x) ((x) * 0x4)
77*4882a593Smuzhiyun #define PX30_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x40)
78*4882a593Smuzhiyun #define PX30_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x80)
79*4882a593Smuzhiyun #define PX30_PMU_MODE 0x0020
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define RV1106_TOPCRU_BASE 0x10000
82*4882a593Smuzhiyun #define RV1106_PERICRU_BASE 0x12000
83*4882a593Smuzhiyun #define RV1106_VICRU_BASE 0x14000
84*4882a593Smuzhiyun #define RV1106_NPUCRU_BASE 0x16000
85*4882a593Smuzhiyun #define RV1106_CORECRU_BASE 0x18000
86*4882a593Smuzhiyun #define RV1106_VEPUCRU_BASE 0x1A000
87*4882a593Smuzhiyun #define RV1106_VOCRU_BASE 0x1C000
88*4882a593Smuzhiyun #define RV1106_DDRCRU_BASE 0x1E000
89*4882a593Smuzhiyun #define RV1106_SUBDDRCRU_BASE 0x1F000
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun #define RV1106_VI_GRF_BASE 0x50000
92*4882a593Smuzhiyun #define RV1106_VO_GRF_BASE 0x60000
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun #define RV1106_PMUCLKSEL_CON(x) ((x) * 0x4 + 0x300)
95*4882a593Smuzhiyun #define RV1106_PMUCLKGATE_CON(x) ((x) * 0x4 + 0x800)
96*4882a593Smuzhiyun #define RV1106_PMUSOFTRST_CON(x) ((x) * 0x4 + 0xa00)
97*4882a593Smuzhiyun #define RV1106_PLL_CON(x) ((x) * 0x4 + RV1106_TOPCRU_BASE)
98*4882a593Smuzhiyun #define RV1106_MODE_CON (0x280 + RV1106_TOPCRU_BASE)
99*4882a593Smuzhiyun #define RV1106_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_TOPCRU_BASE)
100*4882a593Smuzhiyun #define RV1106_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_TOPCRU_BASE)
101*4882a593Smuzhiyun #define RV1106_SOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_TOPCRU_BASE)
102*4882a593Smuzhiyun #define RV1106_GLB_SRST_FST (0xc08 + RV1106_TOPCRU_BASE)
103*4882a593Smuzhiyun #define RV1106_GLB_SRST_SND (0xc0c + RV1106_TOPCRU_BASE)
104*4882a593Smuzhiyun #define RV1106_SDIO_CON0 (0x1c + RV1106_VO_GRF_BASE)
105*4882a593Smuzhiyun #define RV1106_SDIO_CON1 (0x20 + RV1106_VO_GRF_BASE)
106*4882a593Smuzhiyun #define RV1106_SDMMC_CON0 (0x4 + RV1106_VI_GRF_BASE)
107*4882a593Smuzhiyun #define RV1106_SDMMC_CON1 (0x8 + RV1106_VI_GRF_BASE)
108*4882a593Smuzhiyun #define RV1106_EMMC_CON0 (0x20)
109*4882a593Smuzhiyun #define RV1106_EMMC_CON1 (0x24)
110*4882a593Smuzhiyun #define RV1106_PERICLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_PERICRU_BASE)
111*4882a593Smuzhiyun #define RV1106_PERICLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_PERICRU_BASE)
112*4882a593Smuzhiyun #define RV1106_PERISOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_PERICRU_BASE)
113*4882a593Smuzhiyun #define RV1106_VICLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_VICRU_BASE)
114*4882a593Smuzhiyun #define RV1106_VICLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_VICRU_BASE)
115*4882a593Smuzhiyun #define RV1106_VISOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_VICRU_BASE)
116*4882a593Smuzhiyun #define RV1106_VICLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_VICRU_BASE)
117*4882a593Smuzhiyun #define RV1106_VICLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_VICRU_BASE)
118*4882a593Smuzhiyun #define RV1106_VISOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_VICRU_BASE)
119*4882a593Smuzhiyun #define RV1106_NPUCLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_NPUCRU_BASE)
120*4882a593Smuzhiyun #define RV1106_NPUCLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_NPUCRU_BASE)
121*4882a593Smuzhiyun #define RV1106_NPUSOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_NPUCRU_BASE)
122*4882a593Smuzhiyun #define RV1106_CORECLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_CORECRU_BASE)
123*4882a593Smuzhiyun #define RV1106_CORECLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_CORECRU_BASE)
124*4882a593Smuzhiyun #define RV1106_CORESOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_CORECRU_BASE)
125*4882a593Smuzhiyun #define RV1106_VEPUCLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_VEPUCRU_BASE)
126*4882a593Smuzhiyun #define RV1106_VEPUCLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_VEPUCRU_BASE)
127*4882a593Smuzhiyun #define RV1106_VEPUSOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_VEPUCRU_BASE)
128*4882a593Smuzhiyun #define RV1106_VOCLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_VOCRU_BASE)
129*4882a593Smuzhiyun #define RV1106_VOCLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_VOCRU_BASE)
130*4882a593Smuzhiyun #define RV1106_VOSOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_VOCRU_BASE)
131*4882a593Smuzhiyun #define RV1106_DDRCLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_DDRCRU_BASE)
132*4882a593Smuzhiyun #define RV1106_DDRCLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_DDRCRU_BASE)
133*4882a593Smuzhiyun #define RV1106_DDRSOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_DDRCRU_BASE)
134*4882a593Smuzhiyun #define RV1106_SUBDDRCLKSEL_CON(x) ((x) * 0x4 + 0x300 + RV1106_SUBDDRCRU_BASE)
135*4882a593Smuzhiyun #define RV1106_SUBDDRCLKGATE_CON(x) ((x) * 0x4 + 0x800 + RV1106_SUBDDRCRU_BASE)
136*4882a593Smuzhiyun #define RV1106_SUBDDRSOFTRST_CON(x) ((x) * 0x4 + 0xa00 + RV1106_SUBDDRCRU_BASE)
137*4882a593Smuzhiyun #define RV1106_SUBDDRMODE_CON (0x280 + RV1106_SUBDDRCRU_BASE)
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun #define RV1108_PLL_CON(x) ((x) * 0x4)
140*4882a593Smuzhiyun #define RV1108_CLKSEL_CON(x) ((x) * 0x4 + 0x60)
141*4882a593Smuzhiyun #define RV1108_CLKGATE_CON(x) ((x) * 0x4 + 0x120)
142*4882a593Smuzhiyun #define RV1108_SOFTRST_CON(x) ((x) * 0x4 + 0x180)
143*4882a593Smuzhiyun #define RV1108_GLB_SRST_FST 0x1c0
144*4882a593Smuzhiyun #define RV1108_GLB_SRST_SND 0x1c4
145*4882a593Smuzhiyun #define RV1108_MISC_CON 0x1cc
146*4882a593Smuzhiyun #define RV1108_SDMMC_CON0 0x1d8
147*4882a593Smuzhiyun #define RV1108_SDMMC_CON1 0x1dc
148*4882a593Smuzhiyun #define RV1108_SDIO_CON0 0x1e0
149*4882a593Smuzhiyun #define RV1108_SDIO_CON1 0x1e4
150*4882a593Smuzhiyun #define RV1108_EMMC_CON0 0x1e8
151*4882a593Smuzhiyun #define RV1108_EMMC_CON1 0x1ec
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun #define RV1126_PMU_MODE 0x0
154*4882a593Smuzhiyun #define RV1126_PMU_PLL_CON(x) ((x) * 0x4 + 0x10)
155*4882a593Smuzhiyun #define RV1126_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
156*4882a593Smuzhiyun #define RV1126_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x180)
157*4882a593Smuzhiyun #define RV1126_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x200)
158*4882a593Smuzhiyun #define RV1126_PLL_CON(x) ((x) * 0x4)
159*4882a593Smuzhiyun #define RV1126_MODE_CON 0x90
160*4882a593Smuzhiyun #define RV1126_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
161*4882a593Smuzhiyun #define RV1126_CLKGATE_CON(x) ((x) * 0x4 + 0x280)
162*4882a593Smuzhiyun #define RV1126_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
163*4882a593Smuzhiyun #define RV1126_GLB_SRST_FST 0x408
164*4882a593Smuzhiyun #define RV1126_GLB_SRST_SND 0x40c
165*4882a593Smuzhiyun #define RV1126_SDMMC_CON0 0x440
166*4882a593Smuzhiyun #define RV1126_SDMMC_CON1 0x444
167*4882a593Smuzhiyun #define RV1126_SDIO_CON0 0x448
168*4882a593Smuzhiyun #define RV1126_SDIO_CON1 0x44c
169*4882a593Smuzhiyun #define RV1126_EMMC_CON0 0x450
170*4882a593Smuzhiyun #define RV1126_EMMC_CON1 0x454
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /*
173*4882a593Smuzhiyun * register positions shared by RK1808 RK2928, RK3036,
174*4882a593Smuzhiyun * RK3066, RK3188 and RK3228
175*4882a593Smuzhiyun */
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun #define RK1808_PLL_CON(x) ((x) * 0x4)
178*4882a593Smuzhiyun #define RK1808_MODE_CON 0xa0
179*4882a593Smuzhiyun #define RK1808_MISC_CON 0xa4
180*4882a593Smuzhiyun #define RK1808_MISC1_CON 0xa8
181*4882a593Smuzhiyun #define RK1808_GLB_SRST_FST 0xb8
182*4882a593Smuzhiyun #define RK1808_GLB_SRST_SND 0xbc
183*4882a593Smuzhiyun #define RK1808_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
184*4882a593Smuzhiyun #define RK1808_CLKGATE_CON(x) ((x) * 0x4 + 0x230)
185*4882a593Smuzhiyun #define RK1808_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
186*4882a593Smuzhiyun #define RK1808_SDMMC_CON0 0x380
187*4882a593Smuzhiyun #define RK1808_SDMMC_CON1 0x384
188*4882a593Smuzhiyun #define RK1808_SDIO_CON0 0x388
189*4882a593Smuzhiyun #define RK1808_SDIO_CON1 0x38c
190*4882a593Smuzhiyun #define RK1808_EMMC_CON0 0x390
191*4882a593Smuzhiyun #define RK1808_EMMC_CON1 0x394
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun #define RK1808_PMU_PLL_CON(x) ((x) * 0x4 + 0x4000)
194*4882a593Smuzhiyun #define RK1808_PMU_MODE_CON 0x4020
195*4882a593Smuzhiyun #define RK1808_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x4040)
196*4882a593Smuzhiyun #define RK1808_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x4080)
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun #define RK2928_PLL_CON(x) ((x) * 0x4)
199*4882a593Smuzhiyun #define RK2928_MODE_CON 0x40
200*4882a593Smuzhiyun #define RK2928_CLKSEL_CON(x) ((x) * 0x4 + 0x44)
201*4882a593Smuzhiyun #define RK2928_CLKGATE_CON(x) ((x) * 0x4 + 0xd0)
202*4882a593Smuzhiyun #define RK2928_GLB_SRST_FST 0x100
203*4882a593Smuzhiyun #define RK2928_GLB_SRST_SND 0x104
204*4882a593Smuzhiyun #define RK2928_SOFTRST_CON(x) ((x) * 0x4 + 0x110)
205*4882a593Smuzhiyun #define RK2928_MISC_CON 0x134
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun #define RK3036_SDMMC_CON0 0x144
208*4882a593Smuzhiyun #define RK3036_SDMMC_CON1 0x148
209*4882a593Smuzhiyun #define RK3036_SDIO_CON0 0x14c
210*4882a593Smuzhiyun #define RK3036_SDIO_CON1 0x150
211*4882a593Smuzhiyun #define RK3036_EMMC_CON0 0x154
212*4882a593Smuzhiyun #define RK3036_EMMC_CON1 0x158
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun #define RK3228_GLB_SRST_FST 0x1f0
215*4882a593Smuzhiyun #define RK3228_GLB_SRST_SND 0x1f4
216*4882a593Smuzhiyun #define RK3228_SDMMC_CON0 0x1c0
217*4882a593Smuzhiyun #define RK3228_SDMMC_CON1 0x1c4
218*4882a593Smuzhiyun #define RK3228_SDIO_CON0 0x1c8
219*4882a593Smuzhiyun #define RK3228_SDIO_CON1 0x1cc
220*4882a593Smuzhiyun #define RK3228_EMMC_CON0 0x1d8
221*4882a593Smuzhiyun #define RK3228_EMMC_CON1 0x1dc
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #define RK3288_PLL_CON(x) RK2928_PLL_CON(x)
224*4882a593Smuzhiyun #define RK3288_MODE_CON 0x50
225*4882a593Smuzhiyun #define RK3288_CLKSEL_CON(x) ((x) * 0x4 + 0x60)
226*4882a593Smuzhiyun #define RK3288_CLKGATE_CON(x) ((x) * 0x4 + 0x160)
227*4882a593Smuzhiyun #define RK3288_GLB_SRST_FST 0x1b0
228*4882a593Smuzhiyun #define RK3288_GLB_SRST_SND 0x1b4
229*4882a593Smuzhiyun #define RK3288_SOFTRST_CON(x) ((x) * 0x4 + 0x1b8)
230*4882a593Smuzhiyun #define RK3288_MISC_CON 0x1e8
231*4882a593Smuzhiyun #define RK3288_SDMMC_CON0 0x200
232*4882a593Smuzhiyun #define RK3288_SDMMC_CON1 0x204
233*4882a593Smuzhiyun #define RK3288_SDIO0_CON0 0x208
234*4882a593Smuzhiyun #define RK3288_SDIO0_CON1 0x20c
235*4882a593Smuzhiyun #define RK3288_SDIO1_CON0 0x210
236*4882a593Smuzhiyun #define RK3288_SDIO1_CON1 0x214
237*4882a593Smuzhiyun #define RK3288_EMMC_CON0 0x218
238*4882a593Smuzhiyun #define RK3288_EMMC_CON1 0x21c
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun #define RK3308_PLL_CON(x) RK2928_PLL_CON(x)
241*4882a593Smuzhiyun #define RK3308_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
242*4882a593Smuzhiyun #define RK3308_CLKGATE_CON(x) ((x) * 0x4 + 0x300)
243*4882a593Smuzhiyun #define RK3308_GLB_SRST_FST 0xb8
244*4882a593Smuzhiyun #define RK3308_SOFTRST_CON(x) ((x) * 0x4 + 0x400)
245*4882a593Smuzhiyun #define RK3308_MODE_CON 0xa0
246*4882a593Smuzhiyun #define RK3308_SDMMC_CON0 0x480
247*4882a593Smuzhiyun #define RK3308_SDMMC_CON1 0x484
248*4882a593Smuzhiyun #define RK3308_SDIO_CON0 0x488
249*4882a593Smuzhiyun #define RK3308_SDIO_CON1 0x48c
250*4882a593Smuzhiyun #define RK3308_EMMC_CON0 0x490
251*4882a593Smuzhiyun #define RK3308_EMMC_CON1 0x494
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun #define RK3328_PLL_CON(x) RK2928_PLL_CON(x)
254*4882a593Smuzhiyun #define RK3328_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
255*4882a593Smuzhiyun #define RK3328_CLKGATE_CON(x) ((x) * 0x4 + 0x200)
256*4882a593Smuzhiyun #define RK3328_GRFCLKSEL_CON(x) ((x) * 0x4 + 0x100)
257*4882a593Smuzhiyun #define RK3328_GLB_SRST_FST 0x9c
258*4882a593Smuzhiyun #define RK3328_GLB_SRST_SND 0x98
259*4882a593Smuzhiyun #define RK3328_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
260*4882a593Smuzhiyun #define RK3328_MODE_CON 0x80
261*4882a593Smuzhiyun #define RK3328_MISC_CON 0x84
262*4882a593Smuzhiyun #define RK3328_SDMMC_CON0 0x380
263*4882a593Smuzhiyun #define RK3328_SDMMC_CON1 0x384
264*4882a593Smuzhiyun #define RK3328_SDIO_CON0 0x388
265*4882a593Smuzhiyun #define RK3328_SDIO_CON1 0x38c
266*4882a593Smuzhiyun #define RK3328_EMMC_CON0 0x390
267*4882a593Smuzhiyun #define RK3328_EMMC_CON1 0x394
268*4882a593Smuzhiyun #define RK3328_SDMMC_EXT_CON0 0x398
269*4882a593Smuzhiyun #define RK3328_SDMMC_EXT_CON1 0x39C
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun #define RK3368_PLL_CON(x) RK2928_PLL_CON(x)
272*4882a593Smuzhiyun #define RK3368_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
273*4882a593Smuzhiyun #define RK3368_CLKGATE_CON(x) ((x) * 0x4 + 0x200)
274*4882a593Smuzhiyun #define RK3368_GLB_SRST_FST 0x280
275*4882a593Smuzhiyun #define RK3368_GLB_SRST_SND 0x284
276*4882a593Smuzhiyun #define RK3368_SOFTRST_CON(x) ((x) * 0x4 + 0x300)
277*4882a593Smuzhiyun #define RK3368_MISC_CON 0x380
278*4882a593Smuzhiyun #define RK3368_SDMMC_CON0 0x400
279*4882a593Smuzhiyun #define RK3368_SDMMC_CON1 0x404
280*4882a593Smuzhiyun #define RK3368_SDIO0_CON0 0x408
281*4882a593Smuzhiyun #define RK3368_SDIO0_CON1 0x40c
282*4882a593Smuzhiyun #define RK3368_SDIO1_CON0 0x410
283*4882a593Smuzhiyun #define RK3368_SDIO1_CON1 0x414
284*4882a593Smuzhiyun #define RK3368_EMMC_CON0 0x418
285*4882a593Smuzhiyun #define RK3368_EMMC_CON1 0x41c
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun #define RK3399_PLL_CON(x) RK2928_PLL_CON(x)
288*4882a593Smuzhiyun #define RK3399_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
289*4882a593Smuzhiyun #define RK3399_CLKGATE_CON(x) ((x) * 0x4 + 0x300)
290*4882a593Smuzhiyun #define RK3399_SOFTRST_CON(x) ((x) * 0x4 + 0x400)
291*4882a593Smuzhiyun #define RK3399_GLB_SRST_FST 0x500
292*4882a593Smuzhiyun #define RK3399_GLB_SRST_SND 0x504
293*4882a593Smuzhiyun #define RK3399_GLB_CNT_TH 0x508
294*4882a593Smuzhiyun #define RK3399_MISC_CON 0x50c
295*4882a593Smuzhiyun #define RK3399_RST_CON 0x510
296*4882a593Smuzhiyun #define RK3399_RST_ST 0x514
297*4882a593Smuzhiyun #define RK3399_SDMMC_CON0 0x580
298*4882a593Smuzhiyun #define RK3399_SDMMC_CON1 0x584
299*4882a593Smuzhiyun #define RK3399_SDIO_CON0 0x588
300*4882a593Smuzhiyun #define RK3399_SDIO_CON1 0x58c
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun #define RK3399_PMU_PLL_CON(x) RK2928_PLL_CON(x)
303*4882a593Smuzhiyun #define RK3399_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x80)
304*4882a593Smuzhiyun #define RK3399_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x100)
305*4882a593Smuzhiyun #define RK3399_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x110)
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun #define RK3528_PMU_CRU_BASE 0x10000
308*4882a593Smuzhiyun #define RK3528_PCIE_CRU_BASE 0x20000
309*4882a593Smuzhiyun #define RK3528_DDRPHY_CRU_BASE 0x28000
310*4882a593Smuzhiyun #define RK3528_VPU_GRF_BASE 0x40000
311*4882a593Smuzhiyun #define RK3528_VO_GRF_BASE 0x60000
312*4882a593Smuzhiyun #define RK3528_SDMMC_CON0 (RK3528_VO_GRF_BASE + 0x24)
313*4882a593Smuzhiyun #define RK3528_SDMMC_CON1 (RK3528_VO_GRF_BASE + 0x28)
314*4882a593Smuzhiyun #define RK3528_SDIO0_CON0 (RK3528_VPU_GRF_BASE + 0x4)
315*4882a593Smuzhiyun #define RK3528_SDIO0_CON1 (RK3528_VPU_GRF_BASE + 0x8)
316*4882a593Smuzhiyun #define RK3528_SDIO1_CON0 (RK3528_VPU_GRF_BASE + 0xc)
317*4882a593Smuzhiyun #define RK3528_SDIO1_CON1 (RK3528_VPU_GRF_BASE + 0x10)
318*4882a593Smuzhiyun #define RK3528_PLL_CON(x) RK2928_PLL_CON(x)
319*4882a593Smuzhiyun #define RK3528_PCIE_PLL_CON(x) ((x) * 0x4 + RK3528_PCIE_CRU_BASE)
320*4882a593Smuzhiyun #define RK3528_DDRPHY_PLL_CON(x) ((x) * 0x4 + RK3528_DDRPHY_CRU_BASE)
321*4882a593Smuzhiyun #define RK3528_MODE_CON 0x280
322*4882a593Smuzhiyun #define RK3528_CLKSEL_CON(x) ((x) * 0x4 + 0x300)
323*4882a593Smuzhiyun #define RK3528_CLKGATE_CON(x) ((x) * 0x4 + 0x800)
324*4882a593Smuzhiyun #define RK3528_SOFTRST_CON(x) ((x) * 0x4 + 0xa00)
325*4882a593Smuzhiyun #define RK3528_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PMU_CRU_BASE)
326*4882a593Smuzhiyun #define RK3528_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_PMU_CRU_BASE)
327*4882a593Smuzhiyun #define RK3528_PCIE_CLKSEL_CON(x) ((x) * 0x4 + 0x300 + RK3528_PCIE_CRU_BASE)
328*4882a593Smuzhiyun #define RK3528_PCIE_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_PCIE_CRU_BASE)
329*4882a593Smuzhiyun #define RK3528_DDRPHY_CLKGATE_CON(x) ((x) * 0x4 + 0x800 + RK3528_DDRPHY_CRU_BASE)
330*4882a593Smuzhiyun #define RK3528_DDRPHY_MODE_CON (0x280 + RK3528_DDRPHY_CRU_BASE)
331*4882a593Smuzhiyun #define RK3528_GLB_CNT_TH 0xc00
332*4882a593Smuzhiyun #define RK3528_GLB_SRST_FST 0xc08
333*4882a593Smuzhiyun #define RK3528_GLB_SRST_SND 0xc0c
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun #define RK3562_PMU0_CRU_BASE 0x10000
336*4882a593Smuzhiyun #define RK3562_PMU1_CRU_BASE 0x18000
337*4882a593Smuzhiyun #define RK3562_DDR_CRU_BASE 0x20000
338*4882a593Smuzhiyun #define RK3562_SUBDDR_CRU_BASE 0x28000
339*4882a593Smuzhiyun #define RK3562_PERI_CRU_BASE 0x30000
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun #define RK3562_PLL_CON(x) RK2928_PLL_CON(x)
342*4882a593Smuzhiyun #define RK3562_PMU1_PLL_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x40)
343*4882a593Smuzhiyun #define RK3562_SUBDDR_PLL_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x20)
344*4882a593Smuzhiyun #define RK3562_MODE_CON 0x600
345*4882a593Smuzhiyun #define RK3562_PMU1_MODE_CON (RK3562_PMU1_CRU_BASE + 0x380)
346*4882a593Smuzhiyun #define RK3562_SUBDDR_MODE_CON (RK3562_SUBDDR_CRU_BASE + 0x380)
347*4882a593Smuzhiyun #define RK3562_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
348*4882a593Smuzhiyun #define RK3562_CLKGATE_CON(x) ((x) * 0x4 + 0x300)
349*4882a593Smuzhiyun #define RK3562_SOFTRST_CON(x) ((x) * 0x4 + 0x400)
350*4882a593Smuzhiyun #define RK3562_DDR_CLKSEL_CON(x) ((x) * 0x4 + RK3562_DDR_CRU_BASE + 0x100)
351*4882a593Smuzhiyun #define RK3562_DDR_CLKGATE_CON(x) ((x) * 0x4 + RK3562_DDR_CRU_BASE + 0x180)
352*4882a593Smuzhiyun #define RK3562_DDR_SOFTRST_CON(x) ((x) * 0x4 + RK3562_DDR_CRU_BASE + 0x200)
353*4882a593Smuzhiyun #define RK3562_SUBDDR_CLKSEL_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x100)
354*4882a593Smuzhiyun #define RK3562_SUBDDR_CLKGATE_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x180)
355*4882a593Smuzhiyun #define RK3562_SUBDDR_SOFTRST_CON(x) ((x) * 0x4 + RK3562_SUBDDR_CRU_BASE + 0x200)
356*4882a593Smuzhiyun #define RK3562_PERI_CLKSEL_CON(x) ((x) * 0x4 + RK3562_PERI_CRU_BASE + 0x100)
357*4882a593Smuzhiyun #define RK3562_PERI_CLKGATE_CON(x) ((x) * 0x4 + RK3562_PERI_CRU_BASE + 0x300)
358*4882a593Smuzhiyun #define RK3562_PERI_SOFTRST_CON(x) ((x) * 0x4 + RK3562_PERI_CRU_BASE + 0x400)
359*4882a593Smuzhiyun #define RK3562_PMU0_CLKSEL_CON(x) ((x) * 0x4 + RK3562_PMU0_CRU_BASE + 0x100)
360*4882a593Smuzhiyun #define RK3562_PMU0_CLKGATE_CON(x) ((x) * 0x4 + RK3562_PMU0_CRU_BASE + 0x180)
361*4882a593Smuzhiyun #define RK3562_PMU0_SOFTRST_CON(x) ((x) * 0x4 + RK3562_PMU0_CRU_BASE + 0x200)
362*4882a593Smuzhiyun #define RK3562_PMU1_CLKSEL_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x100)
363*4882a593Smuzhiyun #define RK3562_PMU1_CLKGATE_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x180)
364*4882a593Smuzhiyun #define RK3562_PMU1_SOFTRST_CON(x) ((x) * 0x4 + RK3562_PMU1_CRU_BASE + 0x200)
365*4882a593Smuzhiyun #define RK3562_GLB_SRST_FST 0x614
366*4882a593Smuzhiyun #define RK3562_GLB_SRST_SND 0x618
367*4882a593Smuzhiyun #define RK3562_GLB_RST_CON 0x61c
368*4882a593Smuzhiyun #define RK3562_GLB_RST_ST 0x620
369*4882a593Smuzhiyun #define RK3562_SDMMC0_CON0 0x624
370*4882a593Smuzhiyun #define RK3562_SDMMC0_CON1 0x628
371*4882a593Smuzhiyun #define RK3562_SDMMC1_CON0 0x62c
372*4882a593Smuzhiyun #define RK3562_SDMMC1_CON1 0x630
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun #define RK3568_PLL_CON(x) RK2928_PLL_CON(x)
375*4882a593Smuzhiyun #define RK3568_MODE_CON0 0xc0
376*4882a593Smuzhiyun #define RK3568_MISC_CON0 0xc4
377*4882a593Smuzhiyun #define RK3568_MISC_CON1 0xc8
378*4882a593Smuzhiyun #define RK3568_MISC_CON2 0xcc
379*4882a593Smuzhiyun #define RK3568_GLB_CNT_TH 0xd0
380*4882a593Smuzhiyun #define RK3568_GLB_SRST_FST 0xd4
381*4882a593Smuzhiyun #define RK3568_GLB_SRST_SND 0xd8
382*4882a593Smuzhiyun #define RK3568_GLB_RST_CON 0xdc
383*4882a593Smuzhiyun #define RK3568_GLB_RST_ST 0xe0
384*4882a593Smuzhiyun #define RK3568_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
385*4882a593Smuzhiyun #define RK3568_CLKGATE_CON(x) ((x) * 0x4 + 0x300)
386*4882a593Smuzhiyun #define RK3568_SOFTRST_CON(x) ((x) * 0x4 + 0x400)
387*4882a593Smuzhiyun #define RK3568_SDMMC0_CON0 0x580
388*4882a593Smuzhiyun #define RK3568_SDMMC0_CON1 0x584
389*4882a593Smuzhiyun #define RK3568_SDMMC1_CON0 0x588
390*4882a593Smuzhiyun #define RK3568_SDMMC1_CON1 0x58c
391*4882a593Smuzhiyun #define RK3568_SDMMC2_CON0 0x590
392*4882a593Smuzhiyun #define RK3568_SDMMC2_CON1 0x594
393*4882a593Smuzhiyun #define RK3568_EMMC_CON0 0x598
394*4882a593Smuzhiyun #define RK3568_EMMC_CON1 0x59c
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun #define RK3568_PMU_PLL_CON(x) RK2928_PLL_CON(x)
397*4882a593Smuzhiyun #define RK3568_PMU_MODE_CON0 0x80
398*4882a593Smuzhiyun #define RK3568_PMU_CLKSEL_CON(x) ((x) * 0x4 + 0x100)
399*4882a593Smuzhiyun #define RK3568_PMU_CLKGATE_CON(x) ((x) * 0x4 + 0x180)
400*4882a593Smuzhiyun #define RK3568_PMU_SOFTRST_CON(x) ((x) * 0x4 + 0x200)
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun #define RK3588_PHP_CRU_BASE 0x8000
403*4882a593Smuzhiyun #define RK3588_PMU_CRU_BASE 0x30000
404*4882a593Smuzhiyun #define RK3588_BIGCORE0_CRU_BASE 0x50000
405*4882a593Smuzhiyun #define RK3588_BIGCORE1_CRU_BASE 0x52000
406*4882a593Smuzhiyun #define RK3588_DSU_CRU_BASE 0x58000
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun #define RK3588_PLL_CON(x) RK2928_PLL_CON(x)
409*4882a593Smuzhiyun #define RK3588_MODE_CON0 0x280
410*4882a593Smuzhiyun #define RK3588_B0_PLL_MODE_CON0 (RK3588_BIGCORE0_CRU_BASE + 0x280)
411*4882a593Smuzhiyun #define RK3588_B1_PLL_MODE_CON0 (RK3588_BIGCORE1_CRU_BASE + 0x280)
412*4882a593Smuzhiyun #define RK3588_LPLL_MODE_CON0 (RK3588_DSU_CRU_BASE + 0x280)
413*4882a593Smuzhiyun #define RK3588_CLKSEL_CON(x) ((x) * 0x4 + 0x300)
414*4882a593Smuzhiyun #define RK3588_CLKGATE_CON(x) ((x) * 0x4 + 0x800)
415*4882a593Smuzhiyun #define RK3588_SOFTRST_CON(x) ((x) * 0x4 + 0xa00)
416*4882a593Smuzhiyun #define RK3588_GLB_CNT_TH 0xc00
417*4882a593Smuzhiyun #define RK3588_GLB_SRST_FST 0xc08
418*4882a593Smuzhiyun #define RK3588_GLB_SRST_SND 0xc0c
419*4882a593Smuzhiyun #define RK3588_GLB_RST_CON 0xc10
420*4882a593Smuzhiyun #define RK3588_GLB_RST_ST 0xc04
421*4882a593Smuzhiyun #define RK3588_SDIO_CON0 0xC24
422*4882a593Smuzhiyun #define RK3588_SDIO_CON1 0xC28
423*4882a593Smuzhiyun #define RK3588_SDMMC_CON0 0xC30
424*4882a593Smuzhiyun #define RK3588_SDMMC_CON1 0xC34
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun #define RK3588_PHP_CLKGATE_CON(x) ((x) * 0x4 + RK3588_PHP_CRU_BASE + 0x800)
427*4882a593Smuzhiyun #define RK3588_PHP_SOFTRST_CON(x) ((x) * 0x4 + RK3588_PHP_CRU_BASE + 0xa00)
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun #define RK3588_PMU_PLL_CON(x) ((x) * 0x4 + RK3588_PHP_CRU_BASE)
430*4882a593Smuzhiyun #define RK3588_PMU_CLKSEL_CON(x) ((x) * 0x4 + RK3588_PMU_CRU_BASE + 0x300)
431*4882a593Smuzhiyun #define RK3588_PMU_CLKGATE_CON(x) ((x) * 0x4 + RK3588_PMU_CRU_BASE + 0x800)
432*4882a593Smuzhiyun #define RK3588_PMU_SOFTRST_CON(x) ((x) * 0x4 + RK3588_PMU_CRU_BASE + 0xa00)
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun #define RK3588_B0_PLL_CON(x) ((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE)
435*4882a593Smuzhiyun #define RK3588_BIGCORE0_CLKSEL_CON(x) ((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0x300)
436*4882a593Smuzhiyun #define RK3588_BIGCORE0_CLKGATE_CON(x) ((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0x800)
437*4882a593Smuzhiyun #define RK3588_BIGCORE0_SOFTRST_CON(x) ((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0xa00)
438*4882a593Smuzhiyun #define RK3588_B1_PLL_CON(x) ((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE)
439*4882a593Smuzhiyun #define RK3588_BIGCORE1_CLKSEL_CON(x) ((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0x300)
440*4882a593Smuzhiyun #define RK3588_BIGCORE1_CLKGATE_CON(x) ((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0x800)
441*4882a593Smuzhiyun #define RK3588_BIGCORE1_SOFTRST_CON(x) ((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0xa00)
442*4882a593Smuzhiyun #define RK3588_LPLL_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE)
443*4882a593Smuzhiyun #define RK3588_DSU_CLKSEL_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE + 0x300)
444*4882a593Smuzhiyun #define RK3588_DSU_CLKGATE_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE + 0x800)
445*4882a593Smuzhiyun #define RK3588_DSU_SOFTRST_CON(x) ((x) * 0x4 + RK3588_DSU_CRU_BASE + 0xa00)
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun enum rockchip_pll_type {
448*4882a593Smuzhiyun pll_rk3036,
449*4882a593Smuzhiyun pll_rk3066,
450*4882a593Smuzhiyun pll_rk3328,
451*4882a593Smuzhiyun pll_rk3399,
452*4882a593Smuzhiyun pll_rk3588,
453*4882a593Smuzhiyun pll_rk3588_core,
454*4882a593Smuzhiyun };
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun #define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, \
457*4882a593Smuzhiyun _postdiv2, _dsmpd, _frac) \
458*4882a593Smuzhiyun { \
459*4882a593Smuzhiyun .rate = _rate##U, \
460*4882a593Smuzhiyun .fbdiv = _fbdiv, \
461*4882a593Smuzhiyun .postdiv1 = _postdiv1, \
462*4882a593Smuzhiyun .refdiv = _refdiv, \
463*4882a593Smuzhiyun .postdiv2 = _postdiv2, \
464*4882a593Smuzhiyun .dsmpd = _dsmpd, \
465*4882a593Smuzhiyun .frac = _frac, \
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun #define RK3066_PLL_RATE(_rate, _nr, _nf, _no) \
469*4882a593Smuzhiyun { \
470*4882a593Smuzhiyun .rate = _rate##U, \
471*4882a593Smuzhiyun .nr = _nr, \
472*4882a593Smuzhiyun .nf = _nf, \
473*4882a593Smuzhiyun .no = _no, \
474*4882a593Smuzhiyun .nb = ((_nf) < 2) ? 1 : (_nf) >> 1, \
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun #define RK3066_PLL_RATE_NB(_rate, _nr, _nf, _no, _nb) \
478*4882a593Smuzhiyun { \
479*4882a593Smuzhiyun .rate = _rate##U, \
480*4882a593Smuzhiyun .nr = _nr, \
481*4882a593Smuzhiyun .nf = _nf, \
482*4882a593Smuzhiyun .no = _no, \
483*4882a593Smuzhiyun .nb = _nb, \
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun #define RK3588_PLL_RATE(_rate, _p, _m, _s, _k) \
487*4882a593Smuzhiyun { \
488*4882a593Smuzhiyun .rate = _rate##U, \
489*4882a593Smuzhiyun .p = _p, \
490*4882a593Smuzhiyun .m = _m, \
491*4882a593Smuzhiyun .s = _s, \
492*4882a593Smuzhiyun .k = _k, \
493*4882a593Smuzhiyun }
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun /**
496*4882a593Smuzhiyun * struct rockchip_clk_provider - information about clock provider
497*4882a593Smuzhiyun * @reg_base: virtual address for the register base.
498*4882a593Smuzhiyun * @clk_data: holds clock related data like clk* and number of clocks.
499*4882a593Smuzhiyun * @cru_node: device-node of the clock-provider
500*4882a593Smuzhiyun * @grf: regmap of the general-register-files syscon
501*4882a593Smuzhiyun * @lock: maintains exclusion between callbacks for a given clock-provider.
502*4882a593Smuzhiyun */
503*4882a593Smuzhiyun struct rockchip_clk_provider {
504*4882a593Smuzhiyun void __iomem *reg_base;
505*4882a593Smuzhiyun struct clk_onecell_data clk_data;
506*4882a593Smuzhiyun struct device_node *cru_node;
507*4882a593Smuzhiyun struct regmap *grf;
508*4882a593Smuzhiyun struct regmap *pmugrf;
509*4882a593Smuzhiyun spinlock_t lock;
510*4882a593Smuzhiyun };
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun struct rockchip_pll_rate_table {
513*4882a593Smuzhiyun unsigned long rate;
514*4882a593Smuzhiyun union {
515*4882a593Smuzhiyun struct {
516*4882a593Smuzhiyun /* for RK3066 */
517*4882a593Smuzhiyun unsigned int nr;
518*4882a593Smuzhiyun unsigned int nf;
519*4882a593Smuzhiyun unsigned int no;
520*4882a593Smuzhiyun unsigned int nb;
521*4882a593Smuzhiyun };
522*4882a593Smuzhiyun struct {
523*4882a593Smuzhiyun /* for RK3036/RK3399 */
524*4882a593Smuzhiyun unsigned int fbdiv;
525*4882a593Smuzhiyun unsigned int postdiv1;
526*4882a593Smuzhiyun unsigned int refdiv;
527*4882a593Smuzhiyun unsigned int postdiv2;
528*4882a593Smuzhiyun unsigned int dsmpd;
529*4882a593Smuzhiyun unsigned int frac;
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun struct {
532*4882a593Smuzhiyun /* for RK3588 */
533*4882a593Smuzhiyun unsigned int m;
534*4882a593Smuzhiyun unsigned int p;
535*4882a593Smuzhiyun unsigned int s;
536*4882a593Smuzhiyun unsigned int k;
537*4882a593Smuzhiyun };
538*4882a593Smuzhiyun };
539*4882a593Smuzhiyun };
540*4882a593Smuzhiyun
541*4882a593Smuzhiyun /**
542*4882a593Smuzhiyun * struct rockchip_pll_clock - information about pll clock
543*4882a593Smuzhiyun * @id: platform specific id of the clock.
544*4882a593Smuzhiyun * @name: name of this pll clock.
545*4882a593Smuzhiyun * @parent_names: name of the parent clock.
546*4882a593Smuzhiyun * @num_parents: number of parents
547*4882a593Smuzhiyun * @flags: optional flags for basic clock.
548*4882a593Smuzhiyun * @con_offset: offset of the register for configuring the PLL.
549*4882a593Smuzhiyun * @mode_offset: offset of the register for configuring the PLL-mode.
550*4882a593Smuzhiyun * @mode_shift: offset inside the mode-register for the mode of this pll.
551*4882a593Smuzhiyun * @lock_shift: offset inside the lock register for the lock status.
552*4882a593Smuzhiyun * @type: Type of PLL to be registered.
553*4882a593Smuzhiyun * @pll_flags: hardware-specific flags
554*4882a593Smuzhiyun * @rate_table: Table of usable pll rates
555*4882a593Smuzhiyun *
556*4882a593Smuzhiyun * Flags:
557*4882a593Smuzhiyun * ROCKCHIP_PLL_SYNC_RATE - check rate parameters to match against the
558*4882a593Smuzhiyun * rate_table parameters and ajust them if necessary.
559*4882a593Smuzhiyun */
560*4882a593Smuzhiyun struct rockchip_pll_clock {
561*4882a593Smuzhiyun unsigned int id;
562*4882a593Smuzhiyun const char *name;
563*4882a593Smuzhiyun const char *const *parent_names;
564*4882a593Smuzhiyun u8 num_parents;
565*4882a593Smuzhiyun unsigned long flags;
566*4882a593Smuzhiyun int con_offset;
567*4882a593Smuzhiyun int mode_offset;
568*4882a593Smuzhiyun int mode_shift;
569*4882a593Smuzhiyun int lock_shift;
570*4882a593Smuzhiyun enum rockchip_pll_type type;
571*4882a593Smuzhiyun u8 pll_flags;
572*4882a593Smuzhiyun struct rockchip_pll_rate_table *rate_table;
573*4882a593Smuzhiyun };
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun /*
576*4882a593Smuzhiyun * PLL flags
577*4882a593Smuzhiyun */
578*4882a593Smuzhiyun #define ROCKCHIP_PLL_SYNC_RATE BIT(0)
579*4882a593Smuzhiyun /* normal mode only. now only for pll_rk3036, pll_rk3328 type */
580*4882a593Smuzhiyun #define ROCKCHIP_PLL_FIXED_MODE BIT(1)
581*4882a593Smuzhiyun #define ROCKCHIP_PLL_ALLOW_POWER_DOWN BIT(2)
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift, \
584*4882a593Smuzhiyun _lshift, _pflags, _rtable) \
585*4882a593Smuzhiyun { \
586*4882a593Smuzhiyun .id = _id, \
587*4882a593Smuzhiyun .type = _type, \
588*4882a593Smuzhiyun .name = _name, \
589*4882a593Smuzhiyun .parent_names = _pnames, \
590*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(_pnames), \
591*4882a593Smuzhiyun .flags = CLK_GET_RATE_NOCACHE | _flags, \
592*4882a593Smuzhiyun .con_offset = _con, \
593*4882a593Smuzhiyun .mode_offset = _mode, \
594*4882a593Smuzhiyun .mode_shift = _mshift, \
595*4882a593Smuzhiyun .lock_shift = _lshift, \
596*4882a593Smuzhiyun .pll_flags = _pflags, \
597*4882a593Smuzhiyun .rate_table = _rtable, \
598*4882a593Smuzhiyun }
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
601*4882a593Smuzhiyun enum rockchip_pll_type pll_type,
602*4882a593Smuzhiyun const char *name, const char *const *parent_names,
603*4882a593Smuzhiyun u8 num_parents, int con_offset, int grf_lock_offset,
604*4882a593Smuzhiyun int lock_shift, int mode_offset, int mode_shift,
605*4882a593Smuzhiyun struct rockchip_pll_rate_table *rate_table,
606*4882a593Smuzhiyun unsigned long flags, u8 clk_pll_flags);
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun void rockchip_boost_init(struct clk_hw *hw);
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun void rockchip_boost_enable_recovery_sw_low(struct clk_hw *hw);
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun void rockchip_boost_disable_recovery_sw(struct clk_hw *hw);
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun void rockchip_boost_add_core_div(struct clk_hw *hw, unsigned long prate);
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun struct rockchip_cpuclk_clksel {
617*4882a593Smuzhiyun int reg;
618*4882a593Smuzhiyun u32 val;
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun #define ROCKCHIP_CPUCLK_NUM_DIVIDERS 6
622*4882a593Smuzhiyun #define ROCKCHIP_CPUCLK_MAX_CORES 4
623*4882a593Smuzhiyun struct rockchip_cpuclk_rate_table {
624*4882a593Smuzhiyun unsigned long prate;
625*4882a593Smuzhiyun struct rockchip_cpuclk_clksel divs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
626*4882a593Smuzhiyun struct rockchip_cpuclk_clksel pre_muxs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
627*4882a593Smuzhiyun struct rockchip_cpuclk_clksel post_muxs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
628*4882a593Smuzhiyun };
629*4882a593Smuzhiyun
630*4882a593Smuzhiyun /**
631*4882a593Smuzhiyun * struct rockchip_cpuclk_reg_data - register offsets and masks of the cpuclock
632*4882a593Smuzhiyun * @core_reg[]: register offset of the cores setting register
633*4882a593Smuzhiyun * @div_core_shift[]: cores divider offset used to divide the pll value
634*4882a593Smuzhiyun * @div_core_mask[]: cores divider mask
635*4882a593Smuzhiyun * @num_cores: number of cpu cores
636*4882a593Smuzhiyun * @mux_core_reg: register offset of the cores select parent
637*4882a593Smuzhiyun * @mux_core_alt: mux value to select alternate parent
638*4882a593Smuzhiyun * @mux_core_main: mux value to select main parent of core
639*4882a593Smuzhiyun * @mux_core_shift: offset of the core multiplexer
640*4882a593Smuzhiyun * @mux_core_mask: core multiplexer mask
641*4882a593Smuzhiyun */
642*4882a593Smuzhiyun struct rockchip_cpuclk_reg_data {
643*4882a593Smuzhiyun int core_reg[ROCKCHIP_CPUCLK_MAX_CORES];
644*4882a593Smuzhiyun u8 div_core_shift[ROCKCHIP_CPUCLK_MAX_CORES];
645*4882a593Smuzhiyun u32 div_core_mask[ROCKCHIP_CPUCLK_MAX_CORES];
646*4882a593Smuzhiyun int num_cores;
647*4882a593Smuzhiyun int mux_core_reg;
648*4882a593Smuzhiyun u8 mux_core_alt;
649*4882a593Smuzhiyun u8 mux_core_main;
650*4882a593Smuzhiyun u8 mux_core_shift;
651*4882a593Smuzhiyun u32 mux_core_mask;
652*4882a593Smuzhiyun const char *pll_name;
653*4882a593Smuzhiyun };
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun struct clk *rockchip_clk_register_cpuclk(const char *name,
656*4882a593Smuzhiyun u8 num_parents,
657*4882a593Smuzhiyun struct clk *parent, struct clk *alt_parent,
658*4882a593Smuzhiyun const struct rockchip_cpuclk_reg_data *reg_data,
659*4882a593Smuzhiyun const struct rockchip_cpuclk_rate_table *rates,
660*4882a593Smuzhiyun int nrates, void __iomem *reg_base, spinlock_t *lock);
661*4882a593Smuzhiyun
662*4882a593Smuzhiyun struct clk *rockchip_clk_register_cpuclk_v2(const char *name,
663*4882a593Smuzhiyun const char *const *parent_names,
664*4882a593Smuzhiyun u8 num_parents, void __iomem *base,
665*4882a593Smuzhiyun int muxdiv_offset, u8 mux_shift,
666*4882a593Smuzhiyun u8 mux_width, u8 mux_flags,
667*4882a593Smuzhiyun int div_offset, u8 div_shift,
668*4882a593Smuzhiyun u8 div_width, u8 div_flags,
669*4882a593Smuzhiyun unsigned long flags, spinlock_t *lock,
670*4882a593Smuzhiyun const struct rockchip_cpuclk_rate_table *rates,
671*4882a593Smuzhiyun int nrates);
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun struct clk *rockchip_clk_register_mmc(const char *name,
674*4882a593Smuzhiyun const char *const *parent_names, u8 num_parents,
675*4882a593Smuzhiyun void __iomem *reg, int shift);
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun /*
678*4882a593Smuzhiyun * DDRCLK flags, including method of setting the rate
679*4882a593Smuzhiyun * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.
680*4882a593Smuzhiyun */
681*4882a593Smuzhiyun #define ROCKCHIP_DDRCLK_SIP BIT(0)
682*4882a593Smuzhiyun #define ROCKCHIP_DDRCLK_SIP_V2 0x03
683*4882a593Smuzhiyun
684*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_DDRCLK
685*4882a593Smuzhiyun void rockchip_set_ddrclk_params(void __iomem *params);
686*4882a593Smuzhiyun void rockchip_set_ddrclk_dmcfreq_wait_complete(int (*func)(void));
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
689*4882a593Smuzhiyun const char *const *parent_names,
690*4882a593Smuzhiyun u8 num_parents, int mux_offset,
691*4882a593Smuzhiyun int mux_shift, int mux_width,
692*4882a593Smuzhiyun int div_shift, int div_width,
693*4882a593Smuzhiyun int ddr_flags, void __iomem *reg_base);
694*4882a593Smuzhiyun #else
rockchip_set_ddrclk_params(void __iomem * params)695*4882a593Smuzhiyun static inline void rockchip_set_ddrclk_params(void __iomem *params) {}
rockchip_set_ddrclk_dmcfreq_wait_complete(int (* func)(void))696*4882a593Smuzhiyun static inline void rockchip_set_ddrclk_dmcfreq_wait_complete(int (*func)(void)) {}
697*4882a593Smuzhiyun static inline
rockchip_clk_register_ddrclk(const char * name,int flags,const char * const * parent_names,u8 num_parents,int mux_offset,int mux_shift,int mux_width,int div_shift,int div_width,int ddr_flags,void __iomem * reg_base)698*4882a593Smuzhiyun struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
699*4882a593Smuzhiyun const char *const *parent_names,
700*4882a593Smuzhiyun u8 num_parents, int mux_offset,
701*4882a593Smuzhiyun int mux_shift, int mux_width,
702*4882a593Smuzhiyun int div_shift, int div_width,
703*4882a593Smuzhiyun int ddr_flags, void __iomem *reg_base)
704*4882a593Smuzhiyun {
705*4882a593Smuzhiyun return NULL;
706*4882a593Smuzhiyun }
707*4882a593Smuzhiyun #endif
708*4882a593Smuzhiyun
709*4882a593Smuzhiyun #define ROCKCHIP_INVERTER_HIWORD_MASK BIT(0)
710*4882a593Smuzhiyun
711*4882a593Smuzhiyun struct clk *rockchip_clk_register_inverter(const char *name,
712*4882a593Smuzhiyun const char *const *parent_names, u8 num_parents,
713*4882a593Smuzhiyun void __iomem *reg, int shift, int flags,
714*4882a593Smuzhiyun spinlock_t *lock);
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun struct clk *rockchip_clk_register_muxgrf(const char *name,
717*4882a593Smuzhiyun const char *const *parent_names, u8 num_parents,
718*4882a593Smuzhiyun int flags, struct regmap *grf, int reg,
719*4882a593Smuzhiyun int shift, int width, int mux_flags);
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun #define PNAME(x) static const char *const x[] __initconst
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun enum rockchip_clk_branch_type {
724*4882a593Smuzhiyun branch_composite,
725*4882a593Smuzhiyun branch_mux,
726*4882a593Smuzhiyun branch_muxgrf,
727*4882a593Smuzhiyun branch_muxpmugrf,
728*4882a593Smuzhiyun branch_divider,
729*4882a593Smuzhiyun branch_fraction_divider,
730*4882a593Smuzhiyun branch_gate,
731*4882a593Smuzhiyun branch_gate_no_set_rate,
732*4882a593Smuzhiyun branch_mmc,
733*4882a593Smuzhiyun branch_inverter,
734*4882a593Smuzhiyun branch_factor,
735*4882a593Smuzhiyun branch_ddrclk,
736*4882a593Smuzhiyun branch_half_divider,
737*4882a593Smuzhiyun };
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun struct rockchip_clk_branch {
740*4882a593Smuzhiyun unsigned int id;
741*4882a593Smuzhiyun enum rockchip_clk_branch_type branch_type;
742*4882a593Smuzhiyun const char *name;
743*4882a593Smuzhiyun const char *const *parent_names;
744*4882a593Smuzhiyun u8 num_parents;
745*4882a593Smuzhiyun unsigned long flags;
746*4882a593Smuzhiyun int muxdiv_offset;
747*4882a593Smuzhiyun u8 mux_shift;
748*4882a593Smuzhiyun u8 mux_width;
749*4882a593Smuzhiyun u8 mux_flags;
750*4882a593Smuzhiyun u32 *mux_table;
751*4882a593Smuzhiyun int div_offset;
752*4882a593Smuzhiyun u8 div_shift;
753*4882a593Smuzhiyun u8 div_width;
754*4882a593Smuzhiyun u8 div_flags;
755*4882a593Smuzhiyun struct clk_div_table *div_table;
756*4882a593Smuzhiyun int gate_offset;
757*4882a593Smuzhiyun u8 gate_shift;
758*4882a593Smuzhiyun u8 gate_flags;
759*4882a593Smuzhiyun struct rockchip_clk_branch *child;
760*4882a593Smuzhiyun };
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun #define COMPOSITE(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw,\
763*4882a593Smuzhiyun df, go, gs, gf) \
764*4882a593Smuzhiyun { \
765*4882a593Smuzhiyun .id = _id, \
766*4882a593Smuzhiyun .branch_type = branch_composite, \
767*4882a593Smuzhiyun .name = cname, \
768*4882a593Smuzhiyun .parent_names = pnames, \
769*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
770*4882a593Smuzhiyun .flags = f, \
771*4882a593Smuzhiyun .muxdiv_offset = mo, \
772*4882a593Smuzhiyun .mux_shift = ms, \
773*4882a593Smuzhiyun .mux_width = mw, \
774*4882a593Smuzhiyun .mux_flags = mf, \
775*4882a593Smuzhiyun .div_shift = ds, \
776*4882a593Smuzhiyun .div_width = dw, \
777*4882a593Smuzhiyun .div_flags = df, \
778*4882a593Smuzhiyun .gate_offset = go, \
779*4882a593Smuzhiyun .gate_shift = gs, \
780*4882a593Smuzhiyun .gate_flags = gf, \
781*4882a593Smuzhiyun }
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun #define COMPOSITE_MUXTBL(_id, cname, pnames, f, mo, ms, mw, mf, \
784*4882a593Smuzhiyun mt, ds, dw, df, go, gs, gf) \
785*4882a593Smuzhiyun { \
786*4882a593Smuzhiyun .id = _id, \
787*4882a593Smuzhiyun .branch_type = branch_composite, \
788*4882a593Smuzhiyun .name = cname, \
789*4882a593Smuzhiyun .parent_names = pnames, \
790*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
791*4882a593Smuzhiyun .flags = f, \
792*4882a593Smuzhiyun .muxdiv_offset = mo, \
793*4882a593Smuzhiyun .mux_shift = ms, \
794*4882a593Smuzhiyun .mux_width = mw, \
795*4882a593Smuzhiyun .mux_flags = mf, \
796*4882a593Smuzhiyun .mux_table = mt, \
797*4882a593Smuzhiyun .div_shift = ds, \
798*4882a593Smuzhiyun .div_width = dw, \
799*4882a593Smuzhiyun .div_flags = df, \
800*4882a593Smuzhiyun .gate_offset = go, \
801*4882a593Smuzhiyun .gate_shift = gs, \
802*4882a593Smuzhiyun .gate_flags = gf, \
803*4882a593Smuzhiyun }
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun #define COMPOSITE_DIV_OFFSET(_id, cname, pnames, f, mo, ms, mw, \
806*4882a593Smuzhiyun mf, do, ds, dw, df, go, gs, gf) \
807*4882a593Smuzhiyun { \
808*4882a593Smuzhiyun .id = _id, \
809*4882a593Smuzhiyun .branch_type = branch_composite, \
810*4882a593Smuzhiyun .name = cname, \
811*4882a593Smuzhiyun .parent_names = pnames, \
812*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
813*4882a593Smuzhiyun .flags = f, \
814*4882a593Smuzhiyun .muxdiv_offset = mo, \
815*4882a593Smuzhiyun .mux_shift = ms, \
816*4882a593Smuzhiyun .mux_width = mw, \
817*4882a593Smuzhiyun .mux_flags = mf, \
818*4882a593Smuzhiyun .div_offset = do, \
819*4882a593Smuzhiyun .div_shift = ds, \
820*4882a593Smuzhiyun .div_width = dw, \
821*4882a593Smuzhiyun .div_flags = df, \
822*4882a593Smuzhiyun .gate_offset = go, \
823*4882a593Smuzhiyun .gate_shift = gs, \
824*4882a593Smuzhiyun .gate_flags = gf, \
825*4882a593Smuzhiyun }
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun #define COMPOSITE_NOMUX(_id, cname, pname, f, mo, ds, dw, df, \
828*4882a593Smuzhiyun go, gs, gf) \
829*4882a593Smuzhiyun { \
830*4882a593Smuzhiyun .id = _id, \
831*4882a593Smuzhiyun .branch_type = branch_composite, \
832*4882a593Smuzhiyun .name = cname, \
833*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
834*4882a593Smuzhiyun .num_parents = 1, \
835*4882a593Smuzhiyun .flags = f, \
836*4882a593Smuzhiyun .muxdiv_offset = mo, \
837*4882a593Smuzhiyun .div_shift = ds, \
838*4882a593Smuzhiyun .div_width = dw, \
839*4882a593Smuzhiyun .div_flags = df, \
840*4882a593Smuzhiyun .gate_offset = go, \
841*4882a593Smuzhiyun .gate_shift = gs, \
842*4882a593Smuzhiyun .gate_flags = gf, \
843*4882a593Smuzhiyun }
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun #define COMPOSITE_NOMUX_DIVTBL(_id, cname, pname, f, mo, ds, dw,\
846*4882a593Smuzhiyun df, dt, go, gs, gf) \
847*4882a593Smuzhiyun { \
848*4882a593Smuzhiyun .id = _id, \
849*4882a593Smuzhiyun .branch_type = branch_composite, \
850*4882a593Smuzhiyun .name = cname, \
851*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
852*4882a593Smuzhiyun .num_parents = 1, \
853*4882a593Smuzhiyun .flags = f, \
854*4882a593Smuzhiyun .muxdiv_offset = mo, \
855*4882a593Smuzhiyun .div_shift = ds, \
856*4882a593Smuzhiyun .div_width = dw, \
857*4882a593Smuzhiyun .div_flags = df, \
858*4882a593Smuzhiyun .div_table = dt, \
859*4882a593Smuzhiyun .gate_offset = go, \
860*4882a593Smuzhiyun .gate_shift = gs, \
861*4882a593Smuzhiyun .gate_flags = gf, \
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun #define COMPOSITE_NODIV(_id, cname, pnames, f, mo, ms, mw, mf, \
865*4882a593Smuzhiyun go, gs, gf) \
866*4882a593Smuzhiyun { \
867*4882a593Smuzhiyun .id = _id, \
868*4882a593Smuzhiyun .branch_type = branch_composite, \
869*4882a593Smuzhiyun .name = cname, \
870*4882a593Smuzhiyun .parent_names = pnames, \
871*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
872*4882a593Smuzhiyun .flags = f, \
873*4882a593Smuzhiyun .muxdiv_offset = mo, \
874*4882a593Smuzhiyun .mux_shift = ms, \
875*4882a593Smuzhiyun .mux_width = mw, \
876*4882a593Smuzhiyun .mux_flags = mf, \
877*4882a593Smuzhiyun .gate_offset = go, \
878*4882a593Smuzhiyun .gate_shift = gs, \
879*4882a593Smuzhiyun .gate_flags = gf, \
880*4882a593Smuzhiyun }
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun #define COMPOSITE_NOGATE(_id, cname, pnames, f, mo, ms, mw, mf, \
883*4882a593Smuzhiyun ds, dw, df) \
884*4882a593Smuzhiyun { \
885*4882a593Smuzhiyun .id = _id, \
886*4882a593Smuzhiyun .branch_type = branch_composite, \
887*4882a593Smuzhiyun .name = cname, \
888*4882a593Smuzhiyun .parent_names = pnames, \
889*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
890*4882a593Smuzhiyun .flags = f, \
891*4882a593Smuzhiyun .muxdiv_offset = mo, \
892*4882a593Smuzhiyun .mux_shift = ms, \
893*4882a593Smuzhiyun .mux_width = mw, \
894*4882a593Smuzhiyun .mux_flags = mf, \
895*4882a593Smuzhiyun .div_shift = ds, \
896*4882a593Smuzhiyun .div_width = dw, \
897*4882a593Smuzhiyun .div_flags = df, \
898*4882a593Smuzhiyun .gate_offset = -1, \
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun #define COMPOSITE_NOGATE_DIVTBL(_id, cname, pnames, f, mo, ms, \
902*4882a593Smuzhiyun mw, mf, ds, dw, df, dt) \
903*4882a593Smuzhiyun { \
904*4882a593Smuzhiyun .id = _id, \
905*4882a593Smuzhiyun .branch_type = branch_composite, \
906*4882a593Smuzhiyun .name = cname, \
907*4882a593Smuzhiyun .parent_names = pnames, \
908*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
909*4882a593Smuzhiyun .flags = f, \
910*4882a593Smuzhiyun .muxdiv_offset = mo, \
911*4882a593Smuzhiyun .mux_shift = ms, \
912*4882a593Smuzhiyun .mux_width = mw, \
913*4882a593Smuzhiyun .mux_flags = mf, \
914*4882a593Smuzhiyun .div_shift = ds, \
915*4882a593Smuzhiyun .div_width = dw, \
916*4882a593Smuzhiyun .div_flags = df, \
917*4882a593Smuzhiyun .div_table = dt, \
918*4882a593Smuzhiyun .gate_offset = -1, \
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun #define COMPOSITE_FRAC(_id, cname, pname, f, mo, df, go, gs, gf)\
922*4882a593Smuzhiyun { \
923*4882a593Smuzhiyun .id = _id, \
924*4882a593Smuzhiyun .branch_type = branch_fraction_divider, \
925*4882a593Smuzhiyun .name = cname, \
926*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
927*4882a593Smuzhiyun .num_parents = 1, \
928*4882a593Smuzhiyun .flags = f, \
929*4882a593Smuzhiyun .muxdiv_offset = mo, \
930*4882a593Smuzhiyun .div_shift = 16, \
931*4882a593Smuzhiyun .div_width = 16, \
932*4882a593Smuzhiyun .div_flags = df, \
933*4882a593Smuzhiyun .gate_offset = go, \
934*4882a593Smuzhiyun .gate_shift = gs, \
935*4882a593Smuzhiyun .gate_flags = gf, \
936*4882a593Smuzhiyun }
937*4882a593Smuzhiyun
938*4882a593Smuzhiyun #define COMPOSITE_FRACMUX(_id, cname, pname, f, mo, df, go, gs, gf, ch) \
939*4882a593Smuzhiyun { \
940*4882a593Smuzhiyun .id = _id, \
941*4882a593Smuzhiyun .branch_type = branch_fraction_divider, \
942*4882a593Smuzhiyun .name = cname, \
943*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
944*4882a593Smuzhiyun .num_parents = 1, \
945*4882a593Smuzhiyun .flags = f, \
946*4882a593Smuzhiyun .muxdiv_offset = mo, \
947*4882a593Smuzhiyun .div_shift = 16, \
948*4882a593Smuzhiyun .div_width = 16, \
949*4882a593Smuzhiyun .div_flags = df, \
950*4882a593Smuzhiyun .gate_offset = go, \
951*4882a593Smuzhiyun .gate_shift = gs, \
952*4882a593Smuzhiyun .gate_flags = gf, \
953*4882a593Smuzhiyun .child = ch, \
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun
956*4882a593Smuzhiyun #define COMPOSITE_FRACMUX_NOGATE(_id, cname, pname, f, mo, df, ch) \
957*4882a593Smuzhiyun { \
958*4882a593Smuzhiyun .id = _id, \
959*4882a593Smuzhiyun .branch_type = branch_fraction_divider, \
960*4882a593Smuzhiyun .name = cname, \
961*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
962*4882a593Smuzhiyun .num_parents = 1, \
963*4882a593Smuzhiyun .flags = f, \
964*4882a593Smuzhiyun .muxdiv_offset = mo, \
965*4882a593Smuzhiyun .div_shift = 16, \
966*4882a593Smuzhiyun .div_width = 16, \
967*4882a593Smuzhiyun .div_flags = df, \
968*4882a593Smuzhiyun .gate_offset = -1, \
969*4882a593Smuzhiyun .child = ch, \
970*4882a593Smuzhiyun }
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun #define COMPOSITE_DDRCLK(_id, cname, pnames, f, mo, ms, mw, \
973*4882a593Smuzhiyun ds, dw, df) \
974*4882a593Smuzhiyun { \
975*4882a593Smuzhiyun .id = _id, \
976*4882a593Smuzhiyun .branch_type = branch_ddrclk, \
977*4882a593Smuzhiyun .name = cname, \
978*4882a593Smuzhiyun .parent_names = pnames, \
979*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
980*4882a593Smuzhiyun .flags = f, \
981*4882a593Smuzhiyun .muxdiv_offset = mo, \
982*4882a593Smuzhiyun .mux_shift = ms, \
983*4882a593Smuzhiyun .mux_width = mw, \
984*4882a593Smuzhiyun .div_shift = ds, \
985*4882a593Smuzhiyun .div_width = dw, \
986*4882a593Smuzhiyun .div_flags = df, \
987*4882a593Smuzhiyun .gate_offset = -1, \
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun #define MUX(_id, cname, pnames, f, o, s, w, mf) \
991*4882a593Smuzhiyun { \
992*4882a593Smuzhiyun .id = _id, \
993*4882a593Smuzhiyun .branch_type = branch_mux, \
994*4882a593Smuzhiyun .name = cname, \
995*4882a593Smuzhiyun .parent_names = pnames, \
996*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
997*4882a593Smuzhiyun .flags = f, \
998*4882a593Smuzhiyun .muxdiv_offset = o, \
999*4882a593Smuzhiyun .mux_shift = s, \
1000*4882a593Smuzhiyun .mux_width = w, \
1001*4882a593Smuzhiyun .mux_flags = mf, \
1002*4882a593Smuzhiyun .gate_offset = -1, \
1003*4882a593Smuzhiyun }
1004*4882a593Smuzhiyun
1005*4882a593Smuzhiyun #define MUXTBL(_id, cname, pnames, f, o, s, w, mf, mt) \
1006*4882a593Smuzhiyun { \
1007*4882a593Smuzhiyun .id = _id, \
1008*4882a593Smuzhiyun .branch_type = branch_mux, \
1009*4882a593Smuzhiyun .name = cname, \
1010*4882a593Smuzhiyun .parent_names = pnames, \
1011*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1012*4882a593Smuzhiyun .flags = f, \
1013*4882a593Smuzhiyun .muxdiv_offset = o, \
1014*4882a593Smuzhiyun .mux_shift = s, \
1015*4882a593Smuzhiyun .mux_width = w, \
1016*4882a593Smuzhiyun .mux_flags = mf, \
1017*4882a593Smuzhiyun .gate_offset = -1, \
1018*4882a593Smuzhiyun .mux_table = mt, \
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun #define MUXGRF(_id, cname, pnames, f, o, s, w, mf) \
1022*4882a593Smuzhiyun { \
1023*4882a593Smuzhiyun .id = _id, \
1024*4882a593Smuzhiyun .branch_type = branch_muxgrf, \
1025*4882a593Smuzhiyun .name = cname, \
1026*4882a593Smuzhiyun .parent_names = pnames, \
1027*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1028*4882a593Smuzhiyun .flags = f, \
1029*4882a593Smuzhiyun .muxdiv_offset = o, \
1030*4882a593Smuzhiyun .mux_shift = s, \
1031*4882a593Smuzhiyun .mux_width = w, \
1032*4882a593Smuzhiyun .mux_flags = mf, \
1033*4882a593Smuzhiyun .gate_offset = -1, \
1034*4882a593Smuzhiyun }
1035*4882a593Smuzhiyun
1036*4882a593Smuzhiyun #define MUXPMUGRF(_id, cname, pnames, f, o, s, w, mf) \
1037*4882a593Smuzhiyun { \
1038*4882a593Smuzhiyun .id = _id, \
1039*4882a593Smuzhiyun .branch_type = branch_muxpmugrf, \
1040*4882a593Smuzhiyun .name = cname, \
1041*4882a593Smuzhiyun .parent_names = pnames, \
1042*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1043*4882a593Smuzhiyun .flags = f, \
1044*4882a593Smuzhiyun .muxdiv_offset = o, \
1045*4882a593Smuzhiyun .mux_shift = s, \
1046*4882a593Smuzhiyun .mux_width = w, \
1047*4882a593Smuzhiyun .mux_flags = mf, \
1048*4882a593Smuzhiyun .gate_offset = -1, \
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun #define DIV(_id, cname, pname, f, o, s, w, df) \
1052*4882a593Smuzhiyun { \
1053*4882a593Smuzhiyun .id = _id, \
1054*4882a593Smuzhiyun .branch_type = branch_divider, \
1055*4882a593Smuzhiyun .name = cname, \
1056*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1057*4882a593Smuzhiyun .num_parents = 1, \
1058*4882a593Smuzhiyun .flags = f, \
1059*4882a593Smuzhiyun .muxdiv_offset = o, \
1060*4882a593Smuzhiyun .div_shift = s, \
1061*4882a593Smuzhiyun .div_width = w, \
1062*4882a593Smuzhiyun .div_flags = df, \
1063*4882a593Smuzhiyun .gate_offset = -1, \
1064*4882a593Smuzhiyun }
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun #define DIVTBL(_id, cname, pname, f, o, s, w, df, dt) \
1067*4882a593Smuzhiyun { \
1068*4882a593Smuzhiyun .id = _id, \
1069*4882a593Smuzhiyun .branch_type = branch_divider, \
1070*4882a593Smuzhiyun .name = cname, \
1071*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1072*4882a593Smuzhiyun .num_parents = 1, \
1073*4882a593Smuzhiyun .flags = f, \
1074*4882a593Smuzhiyun .muxdiv_offset = o, \
1075*4882a593Smuzhiyun .div_shift = s, \
1076*4882a593Smuzhiyun .div_width = w, \
1077*4882a593Smuzhiyun .div_flags = df, \
1078*4882a593Smuzhiyun .div_table = dt, \
1079*4882a593Smuzhiyun }
1080*4882a593Smuzhiyun
1081*4882a593Smuzhiyun #define GATE(_id, cname, pname, f, o, b, gf) \
1082*4882a593Smuzhiyun { \
1083*4882a593Smuzhiyun .id = _id, \
1084*4882a593Smuzhiyun .branch_type = branch_gate, \
1085*4882a593Smuzhiyun .name = cname, \
1086*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1087*4882a593Smuzhiyun .num_parents = 1, \
1088*4882a593Smuzhiyun .flags = f, \
1089*4882a593Smuzhiyun .gate_offset = o, \
1090*4882a593Smuzhiyun .gate_shift = b, \
1091*4882a593Smuzhiyun .gate_flags = gf, \
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun #define GATE_NO_SET_RATE(_id, cname, pname, f, o, b, gf) \
1095*4882a593Smuzhiyun { \
1096*4882a593Smuzhiyun .id = _id, \
1097*4882a593Smuzhiyun .branch_type = branch_gate_no_set_rate, \
1098*4882a593Smuzhiyun .name = cname, \
1099*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1100*4882a593Smuzhiyun .num_parents = 1, \
1101*4882a593Smuzhiyun .flags = f, \
1102*4882a593Smuzhiyun .gate_offset = o, \
1103*4882a593Smuzhiyun .gate_shift = b, \
1104*4882a593Smuzhiyun .gate_flags = gf, \
1105*4882a593Smuzhiyun }
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun #define MMC(_id, cname, pname, offset, shift) \
1108*4882a593Smuzhiyun { \
1109*4882a593Smuzhiyun .id = _id, \
1110*4882a593Smuzhiyun .branch_type = branch_mmc, \
1111*4882a593Smuzhiyun .name = cname, \
1112*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1113*4882a593Smuzhiyun .num_parents = 1, \
1114*4882a593Smuzhiyun .muxdiv_offset = offset, \
1115*4882a593Smuzhiyun .div_shift = shift, \
1116*4882a593Smuzhiyun }
1117*4882a593Smuzhiyun
1118*4882a593Smuzhiyun #define INVERTER(_id, cname, pname, io, is, if) \
1119*4882a593Smuzhiyun { \
1120*4882a593Smuzhiyun .id = _id, \
1121*4882a593Smuzhiyun .branch_type = branch_inverter, \
1122*4882a593Smuzhiyun .name = cname, \
1123*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1124*4882a593Smuzhiyun .num_parents = 1, \
1125*4882a593Smuzhiyun .muxdiv_offset = io, \
1126*4882a593Smuzhiyun .div_shift = is, \
1127*4882a593Smuzhiyun .div_flags = if, \
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun
1130*4882a593Smuzhiyun #define FACTOR(_id, cname, pname, f, fm, fd) \
1131*4882a593Smuzhiyun { \
1132*4882a593Smuzhiyun .id = _id, \
1133*4882a593Smuzhiyun .branch_type = branch_factor, \
1134*4882a593Smuzhiyun .name = cname, \
1135*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1136*4882a593Smuzhiyun .num_parents = 1, \
1137*4882a593Smuzhiyun .flags = f, \
1138*4882a593Smuzhiyun .div_shift = fm, \
1139*4882a593Smuzhiyun .div_width = fd, \
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun #define FACTOR_GATE(_id, cname, pname, f, fm, fd, go, gb, gf) \
1143*4882a593Smuzhiyun { \
1144*4882a593Smuzhiyun .id = _id, \
1145*4882a593Smuzhiyun .branch_type = branch_factor, \
1146*4882a593Smuzhiyun .name = cname, \
1147*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1148*4882a593Smuzhiyun .num_parents = 1, \
1149*4882a593Smuzhiyun .flags = f, \
1150*4882a593Smuzhiyun .div_shift = fm, \
1151*4882a593Smuzhiyun .div_width = fd, \
1152*4882a593Smuzhiyun .gate_offset = go, \
1153*4882a593Smuzhiyun .gate_shift = gb, \
1154*4882a593Smuzhiyun .gate_flags = gf, \
1155*4882a593Smuzhiyun }
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun #define COMPOSITE_HALFDIV(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw,\
1158*4882a593Smuzhiyun df, go, gs, gf) \
1159*4882a593Smuzhiyun { \
1160*4882a593Smuzhiyun .id = _id, \
1161*4882a593Smuzhiyun .branch_type = branch_half_divider, \
1162*4882a593Smuzhiyun .name = cname, \
1163*4882a593Smuzhiyun .parent_names = pnames, \
1164*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1165*4882a593Smuzhiyun .flags = f, \
1166*4882a593Smuzhiyun .muxdiv_offset = mo, \
1167*4882a593Smuzhiyun .mux_shift = ms, \
1168*4882a593Smuzhiyun .mux_width = mw, \
1169*4882a593Smuzhiyun .mux_flags = mf, \
1170*4882a593Smuzhiyun .div_shift = ds, \
1171*4882a593Smuzhiyun .div_width = dw, \
1172*4882a593Smuzhiyun .div_flags = df, \
1173*4882a593Smuzhiyun .gate_offset = go, \
1174*4882a593Smuzhiyun .gate_shift = gs, \
1175*4882a593Smuzhiyun .gate_flags = gf, \
1176*4882a593Smuzhiyun }
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun #define COMPOSITE_HALFDIV_OFFSET(_id, cname, pnames, f, mo, ms, mw, mf, do,\
1179*4882a593Smuzhiyun ds, dw, df, go, gs, gf) \
1180*4882a593Smuzhiyun { \
1181*4882a593Smuzhiyun .id = _id, \
1182*4882a593Smuzhiyun .branch_type = branch_half_divider, \
1183*4882a593Smuzhiyun .name = cname, \
1184*4882a593Smuzhiyun .parent_names = pnames, \
1185*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1186*4882a593Smuzhiyun .flags = f, \
1187*4882a593Smuzhiyun .muxdiv_offset = mo, \
1188*4882a593Smuzhiyun .mux_shift = ms, \
1189*4882a593Smuzhiyun .mux_width = mw, \
1190*4882a593Smuzhiyun .mux_flags = mf, \
1191*4882a593Smuzhiyun .div_offset = do, \
1192*4882a593Smuzhiyun .div_shift = ds, \
1193*4882a593Smuzhiyun .div_width = dw, \
1194*4882a593Smuzhiyun .div_flags = df, \
1195*4882a593Smuzhiyun .gate_offset = go, \
1196*4882a593Smuzhiyun .gate_shift = gs, \
1197*4882a593Smuzhiyun .gate_flags = gf, \
1198*4882a593Smuzhiyun }
1199*4882a593Smuzhiyun
1200*4882a593Smuzhiyun #define COMPOSITE_NOGATE_HALFDIV(_id, cname, pnames, f, mo, ms, mw, mf, \
1201*4882a593Smuzhiyun ds, dw, df) \
1202*4882a593Smuzhiyun { \
1203*4882a593Smuzhiyun .id = _id, \
1204*4882a593Smuzhiyun .branch_type = branch_half_divider, \
1205*4882a593Smuzhiyun .name = cname, \
1206*4882a593Smuzhiyun .parent_names = pnames, \
1207*4882a593Smuzhiyun .num_parents = ARRAY_SIZE(pnames), \
1208*4882a593Smuzhiyun .flags = f, \
1209*4882a593Smuzhiyun .muxdiv_offset = mo, \
1210*4882a593Smuzhiyun .mux_shift = ms, \
1211*4882a593Smuzhiyun .mux_width = mw, \
1212*4882a593Smuzhiyun .mux_flags = mf, \
1213*4882a593Smuzhiyun .div_shift = ds, \
1214*4882a593Smuzhiyun .div_width = dw, \
1215*4882a593Smuzhiyun .div_flags = df, \
1216*4882a593Smuzhiyun .gate_offset = -1, \
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun #define COMPOSITE_NOMUX_HALFDIV(_id, cname, pname, f, mo, ds, dw, df, \
1220*4882a593Smuzhiyun go, gs, gf) \
1221*4882a593Smuzhiyun { \
1222*4882a593Smuzhiyun .id = _id, \
1223*4882a593Smuzhiyun .branch_type = branch_half_divider, \
1224*4882a593Smuzhiyun .name = cname, \
1225*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1226*4882a593Smuzhiyun .num_parents = 1, \
1227*4882a593Smuzhiyun .flags = f, \
1228*4882a593Smuzhiyun .muxdiv_offset = mo, \
1229*4882a593Smuzhiyun .div_shift = ds, \
1230*4882a593Smuzhiyun .div_width = dw, \
1231*4882a593Smuzhiyun .div_flags = df, \
1232*4882a593Smuzhiyun .gate_offset = go, \
1233*4882a593Smuzhiyun .gate_shift = gs, \
1234*4882a593Smuzhiyun .gate_flags = gf, \
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun #define DIV_HALF(_id, cname, pname, f, o, s, w, df) \
1238*4882a593Smuzhiyun { \
1239*4882a593Smuzhiyun .id = _id, \
1240*4882a593Smuzhiyun .branch_type = branch_half_divider, \
1241*4882a593Smuzhiyun .name = cname, \
1242*4882a593Smuzhiyun .parent_names = (const char *[]){ pname }, \
1243*4882a593Smuzhiyun .num_parents = 1, \
1244*4882a593Smuzhiyun .flags = f, \
1245*4882a593Smuzhiyun .muxdiv_offset = o, \
1246*4882a593Smuzhiyun .div_shift = s, \
1247*4882a593Smuzhiyun .div_width = w, \
1248*4882a593Smuzhiyun .div_flags = df, \
1249*4882a593Smuzhiyun .gate_offset = -1, \
1250*4882a593Smuzhiyun }
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun /* SGRF clocks are only accessible from secure mode, so not controllable */
1253*4882a593Smuzhiyun #define SGRF_GATE(_id, cname, pname) \
1254*4882a593Smuzhiyun FACTOR(_id, cname, pname, 0, 1, 1)
1255*4882a593Smuzhiyun
1256*4882a593Smuzhiyun struct rockchip_clk_provider *rockchip_clk_init(struct device_node *np,
1257*4882a593Smuzhiyun void __iomem *base, unsigned long nr_clks);
1258*4882a593Smuzhiyun void rockchip_clk_of_add_provider(struct device_node *np,
1259*4882a593Smuzhiyun struct rockchip_clk_provider *ctx);
1260*4882a593Smuzhiyun void rockchip_clk_add_lookup(struct rockchip_clk_provider *ctx,
1261*4882a593Smuzhiyun struct clk *clk, unsigned int id);
1262*4882a593Smuzhiyun void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
1263*4882a593Smuzhiyun struct rockchip_clk_branch *list,
1264*4882a593Smuzhiyun unsigned int nr_clk);
1265*4882a593Smuzhiyun void rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
1266*4882a593Smuzhiyun struct rockchip_pll_clock *pll_list,
1267*4882a593Smuzhiyun unsigned int nr_pll, int grf_lock_offset);
1268*4882a593Smuzhiyun void rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx,
1269*4882a593Smuzhiyun unsigned int lookup_id,
1270*4882a593Smuzhiyun const char *name,
1271*4882a593Smuzhiyun u8 num_parents,
1272*4882a593Smuzhiyun struct clk *parent, struct clk *alt_parent,
1273*4882a593Smuzhiyun const struct rockchip_cpuclk_reg_data *reg_data,
1274*4882a593Smuzhiyun const struct rockchip_cpuclk_rate_table *rates,
1275*4882a593Smuzhiyun int nrates);
1276*4882a593Smuzhiyun void rockchip_clk_register_armclk_v2(struct rockchip_clk_provider *ctx,
1277*4882a593Smuzhiyun struct rockchip_clk_branch *list,
1278*4882a593Smuzhiyun const struct rockchip_cpuclk_rate_table *rates,
1279*4882a593Smuzhiyun int nrates);
1280*4882a593Smuzhiyun int rockchip_pll_clk_rate_to_scale(struct clk *clk, unsigned long rate);
1281*4882a593Smuzhiyun int rockchip_pll_clk_scale_to_rate(struct clk *clk, unsigned int scale);
1282*4882a593Smuzhiyun int rockchip_pll_clk_adaptive_scaling(struct clk *clk, int sel);
1283*4882a593Smuzhiyun void rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx,
1284*4882a593Smuzhiyun unsigned int reg, void (*cb)(void));
1285*4882a593Smuzhiyun
1286*4882a593Smuzhiyun #define ROCKCHIP_SOFTRST_HIWORD_MASK BIT(0)
1287*4882a593Smuzhiyun
1288*4882a593Smuzhiyun struct clk *rockchip_clk_register_halfdiv(const char *name,
1289*4882a593Smuzhiyun const char *const *parent_names,
1290*4882a593Smuzhiyun u8 num_parents, void __iomem *base,
1291*4882a593Smuzhiyun int muxdiv_offset, u8 mux_shift,
1292*4882a593Smuzhiyun u8 mux_width, u8 mux_flags,
1293*4882a593Smuzhiyun int div_offset, u8 div_shift,
1294*4882a593Smuzhiyun u8 div_width, u8 div_flags,
1295*4882a593Smuzhiyun int gate_offset, u8 gate_shift,
1296*4882a593Smuzhiyun u8 gate_flags, unsigned long flags,
1297*4882a593Smuzhiyun spinlock_t *lock);
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun #ifdef CONFIG_RESET_CONTROLLER
1300*4882a593Smuzhiyun void rockchip_register_softrst(struct device_node *np,
1301*4882a593Smuzhiyun unsigned int num_regs,
1302*4882a593Smuzhiyun void __iomem *base, u8 flags);
1303*4882a593Smuzhiyun #else
rockchip_register_softrst(struct device_node * np,unsigned int num_regs,void __iomem * base,u8 flags)1304*4882a593Smuzhiyun static inline void rockchip_register_softrst(struct device_node *np,
1305*4882a593Smuzhiyun unsigned int num_regs,
1306*4882a593Smuzhiyun void __iomem *base, u8 flags)
1307*4882a593Smuzhiyun {
1308*4882a593Smuzhiyun }
1309*4882a593Smuzhiyun #endif
1310*4882a593Smuzhiyun extern void (*rk_dump_cru)(void);
1311*4882a593Smuzhiyun
1312*4882a593Smuzhiyun #if IS_MODULE(CONFIG_COMMON_CLK_ROCKCHIP)
1313*4882a593Smuzhiyun int rockchip_clk_protect(struct rockchip_clk_provider *ctx,
1314*4882a593Smuzhiyun unsigned int *clocks, unsigned int nclocks);
1315*4882a593Smuzhiyun void rockchip_clk_unprotect(void);
1316*4882a593Smuzhiyun #else
rockchip_clk_protect(struct rockchip_clk_provider * ctx,unsigned int * clocks,unsigned int nclocks)1317*4882a593Smuzhiyun static inline int rockchip_clk_protect(struct rockchip_clk_provider *ctx,
1318*4882a593Smuzhiyun unsigned int *clocks,
1319*4882a593Smuzhiyun unsigned int nclocks)
1320*4882a593Smuzhiyun {
1321*4882a593Smuzhiyun return -EOPNOTSUPP;
1322*4882a593Smuzhiyun }
1323*4882a593Smuzhiyun
rockchip_clk_unprotect(void)1324*4882a593Smuzhiyun static inline void rockchip_clk_unprotect(void)
1325*4882a593Smuzhiyun {
1326*4882a593Smuzhiyun }
1327*4882a593Smuzhiyun #endif
1328*4882a593Smuzhiyun #endif
1329