xref: /OK3568_Linux_fs/kernel/drivers/clk/rockchip/clk.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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