xref: /openbmc/linux/drivers/clk/rockchip/clk.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2a245fecbSHeiko Stübner /*
3a245fecbSHeiko Stübner  * Copyright (c) 2014 MundoReader S.L.
4a245fecbSHeiko Stübner  * Author: Heiko Stuebner <heiko@sntech.de>
5a245fecbSHeiko Stübner  *
69c4d6e55SXing Zheng  * Copyright (c) 2015 Rockchip Electronics Co. Ltd.
79c4d6e55SXing Zheng  * Author: Xing Zheng <zhengxing@rock-chips.com>
89c4d6e55SXing Zheng  *
9a245fecbSHeiko Stübner  * based on
10a245fecbSHeiko Stübner  *
11a245fecbSHeiko Stübner  * samsung/clk.h
12a245fecbSHeiko Stübner  * Copyright (c) 2013 Samsung Electronics Co., Ltd.
13a245fecbSHeiko Stübner  * Copyright (c) 2013 Linaro Ltd.
14a245fecbSHeiko Stübner  * Author: Thomas Abraham <thomas.ab@samsung.com>
15a245fecbSHeiko Stübner  */
16a245fecbSHeiko Stübner 
17a245fecbSHeiko Stübner #ifndef CLK_ROCKCHIP_CLK_H
18a245fecbSHeiko Stübner #define CLK_ROCKCHIP_CLK_H
19a245fecbSHeiko Stübner 
20a245fecbSHeiko Stübner #include <linux/io.h>
21ef1d9feeSXing Zheng #include <linux/clk-provider.h>
22f684ff8bSStephen Boyd 
23f684ff8bSStephen Boyd struct clk;
24a245fecbSHeiko Stübner 
25a245fecbSHeiko Stübner #define HIWORD_UPDATE(val, mask, shift) \
26a245fecbSHeiko Stübner 		((val) << (shift) | (mask) << ((shift) + 16))
27a245fecbSHeiko Stübner 
28243229b1SElaine Zhang /* register positions shared by PX30, RV1108, RK2928, RK3036, RK3066, RK3188 and RK3228 */
29243229b1SElaine Zhang #define BOOST_PLL_H_CON(x)		((x) * 0x4)
30243229b1SElaine Zhang #define BOOST_CLK_CON			0x0008
31243229b1SElaine Zhang #define BOOST_BOOST_CON			0x000c
32243229b1SElaine Zhang #define BOOST_SWITCH_CNT		0x0010
33243229b1SElaine Zhang #define BOOST_HIGH_PERF_CNT0		0x0014
34243229b1SElaine Zhang #define BOOST_HIGH_PERF_CNT1		0x0018
35243229b1SElaine Zhang #define BOOST_STATIS_THRESHOLD		0x001c
36243229b1SElaine Zhang #define BOOST_SHORT_SWITCH_CNT		0x0020
37243229b1SElaine Zhang #define BOOST_SWITCH_THRESHOLD		0x0024
38243229b1SElaine Zhang #define BOOST_FSM_STATUS		0x0028
39243229b1SElaine Zhang #define BOOST_PLL_L_CON(x)		((x) * 0x4 + 0x2c)
40243229b1SElaine Zhang #define BOOST_RECOVERY_MASK		0x1
41243229b1SElaine Zhang #define BOOST_RECOVERY_SHIFT		1
42243229b1SElaine Zhang #define BOOST_SW_CTRL_MASK		0x1
43243229b1SElaine Zhang #define BOOST_SW_CTRL_SHIFT		2
44243229b1SElaine Zhang #define BOOST_LOW_FREQ_EN_MASK		0x1
45243229b1SElaine Zhang #define BOOST_LOW_FREQ_EN_SHIFT		3
46243229b1SElaine Zhang #define BOOST_BUSY_STATE		BIT(8)
47243229b1SElaine Zhang 
48243229b1SElaine Zhang #define PX30_PLL_CON(x)			((x) * 0x4)
49243229b1SElaine Zhang #define PX30_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
50243229b1SElaine Zhang #define PX30_CLKGATE_CON(x)		((x) * 0x4 + 0x200)
51243229b1SElaine Zhang #define PX30_GLB_SRST_FST		0xb8
52243229b1SElaine Zhang #define PX30_GLB_SRST_SND		0xbc
53243229b1SElaine Zhang #define PX30_SOFTRST_CON(x)		((x) * 0x4 + 0x300)
54243229b1SElaine Zhang #define PX30_MODE_CON			0xa0
55243229b1SElaine Zhang #define PX30_MISC_CON			0xa4
56243229b1SElaine Zhang #define PX30_SDMMC_CON0			0x380
57243229b1SElaine Zhang #define PX30_SDMMC_CON1			0x384
58243229b1SElaine Zhang #define PX30_SDIO_CON0			0x388
59243229b1SElaine Zhang #define PX30_SDIO_CON1			0x38c
60243229b1SElaine Zhang #define PX30_EMMC_CON0			0x390
61243229b1SElaine Zhang #define PX30_EMMC_CON1			0x394
62243229b1SElaine Zhang 
63243229b1SElaine Zhang #define PX30_PMU_PLL_CON(x)		((x) * 0x4)
64243229b1SElaine Zhang #define PX30_PMU_CLKSEL_CON(x)		((x) * 0x4 + 0x40)
65243229b1SElaine Zhang #define PX30_PMU_CLKGATE_CON(x)		((x) * 0x4 + 0x80)
66243229b1SElaine Zhang #define PX30_PMU_MODE			0x0020
67243229b1SElaine Zhang 
687e2a9035SAndy Yan #define RV1108_PLL_CON(x)		((x) * 0x4)
697e2a9035SAndy Yan #define RV1108_CLKSEL_CON(x)		((x) * 0x4 + 0x60)
707e2a9035SAndy Yan #define RV1108_CLKGATE_CON(x)		((x) * 0x4 + 0x120)
717e2a9035SAndy Yan #define RV1108_SOFTRST_CON(x)		((x) * 0x4 + 0x180)
727e2a9035SAndy Yan #define RV1108_GLB_SRST_FST		0x1c0
737e2a9035SAndy Yan #define RV1108_GLB_SRST_SND		0x1c4
747e2a9035SAndy Yan #define RV1108_MISC_CON			0x1cc
757e2a9035SAndy Yan #define RV1108_SDMMC_CON0		0x1d8
767e2a9035SAndy Yan #define RV1108_SDMMC_CON1		0x1dc
777e2a9035SAndy Yan #define RV1108_SDIO_CON0		0x1e0
787e2a9035SAndy Yan #define RV1108_SDIO_CON1		0x1e4
797e2a9035SAndy Yan #define RV1108_EMMC_CON0		0x1e8
807e2a9035SAndy Yan #define RV1108_EMMC_CON1		0x1ec
81e44dde27SShawn Lin 
822408ab5aSJagan Teki #define RV1126_PMU_MODE			0x0
832408ab5aSJagan Teki #define RV1126_PMU_PLL_CON(x)		((x) * 0x4 + 0x10)
842408ab5aSJagan Teki #define RV1126_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x100)
852408ab5aSJagan Teki #define RV1126_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x180)
862408ab5aSJagan Teki #define RV1126_PMU_SOFTRST_CON(x)	((x) * 0x4 + 0x200)
872408ab5aSJagan Teki #define RV1126_PLL_CON(x)		((x) * 0x4)
882408ab5aSJagan Teki #define RV1126_MODE_CON			0x90
892408ab5aSJagan Teki #define RV1126_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
902408ab5aSJagan Teki #define RV1126_CLKGATE_CON(x)		((x) * 0x4 + 0x280)
912408ab5aSJagan Teki #define RV1126_SOFTRST_CON(x)		((x) * 0x4 + 0x300)
922408ab5aSJagan Teki #define RV1126_GLB_SRST_FST		0x408
932408ab5aSJagan Teki #define RV1126_GLB_SRST_SND		0x40c
942408ab5aSJagan Teki #define RV1126_SDMMC_CON0		0x440
952408ab5aSJagan Teki #define RV1126_SDMMC_CON1		0x444
962408ab5aSJagan Teki #define RV1126_SDIO_CON0		0x448
972408ab5aSJagan Teki #define RV1126_SDIO_CON1		0x44c
982408ab5aSJagan Teki #define RV1126_EMMC_CON0		0x450
992408ab5aSJagan Teki #define RV1126_EMMC_CON1		0x454
1002408ab5aSJagan Teki 
1012d7884a7SHeiko Stuebner #define RK2928_PLL_CON(x)		((x) * 0x4)
102a245fecbSHeiko Stübner #define RK2928_MODE_CON		0x40
1032d7884a7SHeiko Stuebner #define RK2928_CLKSEL_CON(x)	((x) * 0x4 + 0x44)
1042d7884a7SHeiko Stuebner #define RK2928_CLKGATE_CON(x)	((x) * 0x4 + 0xd0)
105a245fecbSHeiko Stübner #define RK2928_GLB_SRST_FST		0x100
106a245fecbSHeiko Stübner #define RK2928_GLB_SRST_SND		0x104
1072d7884a7SHeiko Stuebner #define RK2928_SOFTRST_CON(x)	((x) * 0x4 + 0x110)
108a245fecbSHeiko Stübner #define RK2928_MISC_CON		0x134
109a245fecbSHeiko Stübner 
1105190c08bSXing Zheng #define RK3036_SDMMC_CON0		0x144
1115190c08bSXing Zheng #define RK3036_SDMMC_CON1		0x148
1125190c08bSXing Zheng #define RK3036_SDIO_CON0		0x14c
1135190c08bSXing Zheng #define RK3036_SDIO_CON1		0x150
1145190c08bSXing Zheng #define RK3036_EMMC_CON0		0x154
1155190c08bSXing Zheng #define RK3036_EMMC_CON1		0x158
1165190c08bSXing Zheng 
117307a2e9aSJeffy Chen #define RK3228_GLB_SRST_FST		0x1f0
118307a2e9aSJeffy Chen #define RK3228_GLB_SRST_SND		0x1f4
119307a2e9aSJeffy Chen #define RK3228_SDMMC_CON0		0x1c0
120307a2e9aSJeffy Chen #define RK3228_SDMMC_CON1		0x1c4
121307a2e9aSJeffy Chen #define RK3228_SDIO_CON0		0x1c8
122307a2e9aSJeffy Chen #define RK3228_SDIO_CON1		0x1cc
123307a2e9aSJeffy Chen #define RK3228_EMMC_CON0		0x1d8
124307a2e9aSJeffy Chen #define RK3228_EMMC_CON1		0x1dc
125307a2e9aSJeffy Chen 
126b9e4ba54SHeiko Stübner #define RK3288_PLL_CON(x)		RK2928_PLL_CON(x)
127b9e4ba54SHeiko Stübner #define RK3288_MODE_CON			0x50
1282d7884a7SHeiko Stuebner #define RK3288_CLKSEL_CON(x)		((x) * 0x4 + 0x60)
1292d7884a7SHeiko Stuebner #define RK3288_CLKGATE_CON(x)		((x) * 0x4 + 0x160)
130b9e4ba54SHeiko Stübner #define RK3288_GLB_SRST_FST		0x1b0
131b9e4ba54SHeiko Stübner #define RK3288_GLB_SRST_SND		0x1b4
1322d7884a7SHeiko Stuebner #define RK3288_SOFTRST_CON(x)		((x) * 0x4 + 0x1b8)
133b9e4ba54SHeiko Stübner #define RK3288_MISC_CON			0x1e8
13489bf26cbSAlexandru M Stan #define RK3288_SDMMC_CON0		0x200
13589bf26cbSAlexandru M Stan #define RK3288_SDMMC_CON1		0x204
13689bf26cbSAlexandru M Stan #define RK3288_SDIO0_CON0		0x208
13789bf26cbSAlexandru M Stan #define RK3288_SDIO0_CON1		0x20c
13889bf26cbSAlexandru M Stan #define RK3288_SDIO1_CON0		0x210
13989bf26cbSAlexandru M Stan #define RK3288_SDIO1_CON1		0x214
14089bf26cbSAlexandru M Stan #define RK3288_EMMC_CON0		0x218
14189bf26cbSAlexandru M Stan #define RK3288_EMMC_CON1		0x21c
142b9e4ba54SHeiko Stübner 
143ac68dfd3SFinley Xiao #define RK3308_PLL_CON(x)		RK2928_PLL_CON(x)
144ac68dfd3SFinley Xiao #define RK3308_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
145ac68dfd3SFinley Xiao #define RK3308_CLKGATE_CON(x)		((x) * 0x4 + 0x300)
146ac68dfd3SFinley Xiao #define RK3308_GLB_SRST_FST		0xb8
147ac68dfd3SFinley Xiao #define RK3308_SOFTRST_CON(x)		((x) * 0x4 + 0x400)
148ac68dfd3SFinley Xiao #define RK3308_MODE_CON			0xa0
149ac68dfd3SFinley Xiao #define RK3308_SDMMC_CON0		0x480
150ac68dfd3SFinley Xiao #define RK3308_SDMMC_CON1		0x484
151ac68dfd3SFinley Xiao #define RK3308_SDIO_CON0		0x488
152ac68dfd3SFinley Xiao #define RK3308_SDIO_CON1		0x48c
153ac68dfd3SFinley Xiao #define RK3308_EMMC_CON0		0x490
154ac68dfd3SFinley Xiao #define RK3308_EMMC_CON1		0x494
155ac68dfd3SFinley Xiao 
156fe3511adSElaine Zhang #define RK3328_PLL_CON(x)		RK2928_PLL_CON(x)
157fe3511adSElaine Zhang #define RK3328_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
158fe3511adSElaine Zhang #define RK3328_CLKGATE_CON(x)		((x) * 0x4 + 0x200)
159fe3511adSElaine Zhang #define RK3328_GRFCLKSEL_CON(x)		((x) * 0x4 + 0x100)
160fe3511adSElaine Zhang #define RK3328_GLB_SRST_FST		0x9c
161fe3511adSElaine Zhang #define RK3328_GLB_SRST_SND		0x98
162fe3511adSElaine Zhang #define RK3328_SOFTRST_CON(x)		((x) * 0x4 + 0x300)
163fe3511adSElaine Zhang #define RK3328_MODE_CON			0x80
164fe3511adSElaine Zhang #define RK3328_MISC_CON			0x84
165fe3511adSElaine Zhang #define RK3328_SDMMC_CON0		0x380
166fe3511adSElaine Zhang #define RK3328_SDMMC_CON1		0x384
167fe3511adSElaine Zhang #define RK3328_SDIO_CON0		0x388
168fe3511adSElaine Zhang #define RK3328_SDIO_CON1		0x38c
169fe3511adSElaine Zhang #define RK3328_EMMC_CON0		0x390
170fe3511adSElaine Zhang #define RK3328_EMMC_CON1		0x394
171fe3511adSElaine Zhang #define RK3328_SDMMC_EXT_CON0		0x398
172fe3511adSElaine Zhang #define RK3328_SDMMC_EXT_CON1		0x39C
173fe3511adSElaine Zhang 
1743536c97aSHeiko Stuebner #define RK3368_PLL_CON(x)		RK2928_PLL_CON(x)
1753536c97aSHeiko Stuebner #define RK3368_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
1763536c97aSHeiko Stuebner #define RK3368_CLKGATE_CON(x)		((x) * 0x4 + 0x200)
1773536c97aSHeiko Stuebner #define RK3368_GLB_SRST_FST		0x280
1783536c97aSHeiko Stuebner #define RK3368_GLB_SRST_SND		0x284
1793536c97aSHeiko Stuebner #define RK3368_SOFTRST_CON(x)		((x) * 0x4 + 0x300)
1803536c97aSHeiko Stuebner #define RK3368_MISC_CON			0x380
1813536c97aSHeiko Stuebner #define RK3368_SDMMC_CON0		0x400
1823536c97aSHeiko Stuebner #define RK3368_SDMMC_CON1		0x404
1833536c97aSHeiko Stuebner #define RK3368_SDIO0_CON0		0x408
1843536c97aSHeiko Stuebner #define RK3368_SDIO0_CON1		0x40c
1853536c97aSHeiko Stuebner #define RK3368_SDIO1_CON0		0x410
1863536c97aSHeiko Stuebner #define RK3368_SDIO1_CON1		0x414
1873536c97aSHeiko Stuebner #define RK3368_EMMC_CON0		0x418
1883536c97aSHeiko Stuebner #define RK3368_EMMC_CON1		0x41c
1893536c97aSHeiko Stuebner 
19011551005SXing Zheng #define RK3399_PLL_CON(x)		RK2928_PLL_CON(x)
19111551005SXing Zheng #define RK3399_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
19211551005SXing Zheng #define RK3399_CLKGATE_CON(x)		((x) * 0x4 + 0x300)
19311551005SXing Zheng #define RK3399_SOFTRST_CON(x)		((x) * 0x4 + 0x400)
19411551005SXing Zheng #define RK3399_GLB_SRST_FST		0x500
19511551005SXing Zheng #define RK3399_GLB_SRST_SND		0x504
19611551005SXing Zheng #define RK3399_GLB_CNT_TH		0x508
19711551005SXing Zheng #define RK3399_MISC_CON			0x50c
19811551005SXing Zheng #define RK3399_RST_CON			0x510
19911551005SXing Zheng #define RK3399_RST_ST			0x514
20011551005SXing Zheng #define RK3399_SDMMC_CON0		0x580
20111551005SXing Zheng #define RK3399_SDMMC_CON1		0x584
20211551005SXing Zheng #define RK3399_SDIO_CON0		0x588
20311551005SXing Zheng #define RK3399_SDIO_CON1		0x58c
20411551005SXing Zheng 
20511551005SXing Zheng #define RK3399_PMU_PLL_CON(x)		RK2928_PLL_CON(x)
20611551005SXing Zheng #define RK3399_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x80)
20711551005SXing Zheng #define RK3399_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x100)
20811551005SXing Zheng #define RK3399_PMU_SOFTRST_CON(x)	((x) * 0x4 + 0x110)
20911551005SXing Zheng 
210cf911d89SElaine Zhang #define RK3568_PLL_CON(x)		RK2928_PLL_CON(x)
211cf911d89SElaine Zhang #define RK3568_MODE_CON0		0xc0
212cf911d89SElaine Zhang #define RK3568_MISC_CON0		0xc4
213cf911d89SElaine Zhang #define RK3568_MISC_CON1		0xc8
214cf911d89SElaine Zhang #define RK3568_MISC_CON2		0xcc
215cf911d89SElaine Zhang #define RK3568_GLB_CNT_TH		0xd0
216cf911d89SElaine Zhang #define RK3568_GLB_SRST_FST		0xd4
217cf911d89SElaine Zhang #define RK3568_GLB_SRST_SND		0xd8
218cf911d89SElaine Zhang #define RK3568_GLB_RST_CON		0xdc
219cf911d89SElaine Zhang #define RK3568_GLB_RST_ST		0xe0
220cf911d89SElaine Zhang #define RK3568_CLKSEL_CON(x)		((x) * 0x4 + 0x100)
221cf911d89SElaine Zhang #define RK3568_CLKGATE_CON(x)		((x) * 0x4 + 0x300)
222cf911d89SElaine Zhang #define RK3568_SOFTRST_CON(x)		((x) * 0x4 + 0x400)
223cf911d89SElaine Zhang #define RK3568_SDMMC0_CON0		0x580
224cf911d89SElaine Zhang #define RK3568_SDMMC0_CON1		0x584
225cf911d89SElaine Zhang #define RK3568_SDMMC1_CON0		0x588
226cf911d89SElaine Zhang #define RK3568_SDMMC1_CON1		0x58c
227cf911d89SElaine Zhang #define RK3568_SDMMC2_CON0		0x590
228cf911d89SElaine Zhang #define RK3568_SDMMC2_CON1		0x594
229cf911d89SElaine Zhang #define RK3568_EMMC_CON0		0x598
230cf911d89SElaine Zhang #define RK3568_EMMC_CON1		0x59c
231cf911d89SElaine Zhang 
232cf911d89SElaine Zhang #define RK3568_PMU_PLL_CON(x)		RK2928_PLL_CON(x)
233cf911d89SElaine Zhang #define RK3568_PMU_MODE_CON0		0x80
234cf911d89SElaine Zhang #define RK3568_PMU_CLKSEL_CON(x)	((x) * 0x4 + 0x100)
235cf911d89SElaine Zhang #define RK3568_PMU_CLKGATE_CON(x)	((x) * 0x4 + 0x180)
236cf911d89SElaine Zhang #define RK3568_PMU_SOFTRST_CON(x)	((x) * 0x4 + 0x200)
237cf911d89SElaine Zhang 
238*f1c506d1SElaine Zhang #define RK3588_PHP_CRU_BASE		0x8000
239*f1c506d1SElaine Zhang #define RK3588_PMU_CRU_BASE		0x30000
240*f1c506d1SElaine Zhang #define RK3588_BIGCORE0_CRU_BASE	0x50000
241*f1c506d1SElaine Zhang #define RK3588_BIGCORE1_CRU_BASE	0x52000
242*f1c506d1SElaine Zhang #define RK3588_DSU_CRU_BASE		0x58000
243*f1c506d1SElaine Zhang 
244*f1c506d1SElaine Zhang #define RK3588_PLL_CON(x)		RK2928_PLL_CON(x)
245*f1c506d1SElaine Zhang #define RK3588_MODE_CON0		0x280
246*f1c506d1SElaine Zhang #define RK3588_B0_PLL_MODE_CON0		(RK3588_BIGCORE0_CRU_BASE + 0x280)
247*f1c506d1SElaine Zhang #define RK3588_B1_PLL_MODE_CON0		(RK3588_BIGCORE1_CRU_BASE + 0x280)
248*f1c506d1SElaine Zhang #define RK3588_LPLL_MODE_CON0		(RK3588_DSU_CRU_BASE + 0x280)
249*f1c506d1SElaine Zhang #define RK3588_CLKSEL_CON(x)		((x) * 0x4 + 0x300)
250*f1c506d1SElaine Zhang #define RK3588_CLKGATE_CON(x)		((x) * 0x4 + 0x800)
251*f1c506d1SElaine Zhang #define RK3588_SOFTRST_CON(x)		((x) * 0x4 + 0xa00)
252*f1c506d1SElaine Zhang #define RK3588_GLB_CNT_TH		0xc00
253*f1c506d1SElaine Zhang #define RK3588_GLB_SRST_FST		0xc08
254*f1c506d1SElaine Zhang #define RK3588_GLB_SRST_SND		0xc0c
255*f1c506d1SElaine Zhang #define RK3588_GLB_RST_CON		0xc10
256*f1c506d1SElaine Zhang #define RK3588_GLB_RST_ST		0xc04
257*f1c506d1SElaine Zhang #define RK3588_SDIO_CON0		0xC24
258*f1c506d1SElaine Zhang #define RK3588_SDIO_CON1		0xC28
259*f1c506d1SElaine Zhang #define RK3588_SDMMC_CON0		0xC30
260*f1c506d1SElaine Zhang #define RK3588_SDMMC_CON1		0xC34
261*f1c506d1SElaine Zhang 
262*f1c506d1SElaine Zhang #define RK3588_PHP_CLKGATE_CON(x)	((x) * 0x4 + RK3588_PHP_CRU_BASE + 0x800)
263*f1c506d1SElaine Zhang #define RK3588_PHP_SOFTRST_CON(x)	((x) * 0x4 + RK3588_PHP_CRU_BASE + 0xa00)
264*f1c506d1SElaine Zhang 
265*f1c506d1SElaine Zhang #define RK3588_PMU_PLL_CON(x)		((x) * 0x4 + RK3588_PHP_CRU_BASE)
266*f1c506d1SElaine Zhang #define RK3588_PMU_CLKSEL_CON(x)	((x) * 0x4 + RK3588_PMU_CRU_BASE + 0x300)
267*f1c506d1SElaine Zhang #define RK3588_PMU_CLKGATE_CON(x)	((x) * 0x4 + RK3588_PMU_CRU_BASE + 0x800)
268*f1c506d1SElaine Zhang #define RK3588_PMU_SOFTRST_CON(x)	((x) * 0x4 + RK3588_PMU_CRU_BASE + 0xa00)
269*f1c506d1SElaine Zhang 
270*f1c506d1SElaine Zhang #define RK3588_B0_PLL_CON(x)		((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE)
271*f1c506d1SElaine Zhang #define RK3588_BIGCORE0_CLKSEL_CON(x)	((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0x300)
272*f1c506d1SElaine Zhang #define RK3588_BIGCORE0_CLKGATE_CON(x)	((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0x800)
273*f1c506d1SElaine Zhang #define RK3588_BIGCORE0_SOFTRST_CON(x)	((x) * 0x4 + RK3588_BIGCORE0_CRU_BASE + 0xa00)
274*f1c506d1SElaine Zhang #define RK3588_B1_PLL_CON(x)		((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE)
275*f1c506d1SElaine Zhang #define RK3588_BIGCORE1_CLKSEL_CON(x)	((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0x300)
276*f1c506d1SElaine Zhang #define RK3588_BIGCORE1_CLKGATE_CON(x)	((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0x800)
277*f1c506d1SElaine Zhang #define RK3588_BIGCORE1_SOFTRST_CON(x)	((x) * 0x4 + RK3588_BIGCORE1_CRU_BASE + 0xa00)
278*f1c506d1SElaine Zhang #define RK3588_LPLL_CON(x)		((x) * 0x4 + RK3588_DSU_CRU_BASE)
279*f1c506d1SElaine Zhang #define RK3588_DSU_CLKSEL_CON(x)	((x) * 0x4 + RK3588_DSU_CRU_BASE + 0x300)
280*f1c506d1SElaine Zhang #define RK3588_DSU_CLKGATE_CON(x)	((x) * 0x4 + RK3588_DSU_CRU_BASE + 0x800)
281*f1c506d1SElaine Zhang #define RK3588_DSU_SOFTRST_CON(x)	((x) * 0x4 + RK3588_DSU_CRU_BASE + 0xa00)
282*f1c506d1SElaine Zhang 
28390c59025SHeiko Stübner enum rockchip_pll_type {
2849c4d6e55SXing Zheng 	pll_rk3036,
28590c59025SHeiko Stübner 	pll_rk3066,
2867bed9246SElaine Zhang 	pll_rk3328,
287b40baccdSXing Zheng 	pll_rk3399,
2888f659449SElaine Zhang 	pll_rk3588,
2898f659449SElaine Zhang 	pll_rk3588_core,
29090c59025SHeiko Stübner };
29190c59025SHeiko Stübner 
2929c4d6e55SXing Zheng #define RK3036_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1,	\
2939c4d6e55SXing Zheng 			_postdiv2, _dsmpd, _frac)		\
2949c4d6e55SXing Zheng {								\
2959c4d6e55SXing Zheng 	.rate	= _rate##U,					\
2969c4d6e55SXing Zheng 	.fbdiv = _fbdiv,					\
2979c4d6e55SXing Zheng 	.postdiv1 = _postdiv1,					\
2989c4d6e55SXing Zheng 	.refdiv = _refdiv,					\
2999c4d6e55SXing Zheng 	.postdiv2 = _postdiv2,					\
3009c4d6e55SXing Zheng 	.dsmpd = _dsmpd,					\
3019c4d6e55SXing Zheng 	.frac = _frac,						\
3029c4d6e55SXing Zheng }
3039c4d6e55SXing Zheng 
30490c59025SHeiko Stübner #define RK3066_PLL_RATE(_rate, _nr, _nf, _no)	\
30590c59025SHeiko Stübner {						\
30690c59025SHeiko Stübner 	.rate	= _rate##U,			\
30790c59025SHeiko Stübner 	.nr = _nr,				\
30890c59025SHeiko Stübner 	.nf = _nf,				\
30990c59025SHeiko Stübner 	.no = _no,				\
3102bbfe001SDouglas Anderson 	.nb = ((_nf) < 2) ? 1 : (_nf) >> 1,	\
31190c59025SHeiko Stübner }
31290c59025SHeiko Stübner 
3132bbfe001SDouglas Anderson #define RK3066_PLL_RATE_NB(_rate, _nr, _nf, _no, _nb)		\
31449ed9ee4SKever Yang {								\
31549ed9ee4SKever Yang 	.rate	= _rate##U,					\
31649ed9ee4SKever Yang 	.nr = _nr,						\
31749ed9ee4SKever Yang 	.nf = _nf,						\
31849ed9ee4SKever Yang 	.no = _no,						\
3192bbfe001SDouglas Anderson 	.nb = _nb,						\
32049ed9ee4SKever Yang }
32149ed9ee4SKever Yang 
3228f659449SElaine Zhang #define RK3588_PLL_RATE(_rate, _p, _m, _s, _k)			\
3238f659449SElaine Zhang {								\
3248f659449SElaine Zhang 	.rate   = _rate##U,					\
3258f659449SElaine Zhang 	.p = _p,						\
3268f659449SElaine Zhang 	.m = _m,						\
3278f659449SElaine Zhang 	.s = _s,						\
3288f659449SElaine Zhang 	.k = _k,						\
3298f659449SElaine Zhang }
3308f659449SElaine Zhang 
331ef1d9feeSXing Zheng /**
3322af2544dSShawn Lin  * struct rockchip_clk_provider - information about clock provider
333ef1d9feeSXing Zheng  * @reg_base: virtual address for the register base.
334ef1d9feeSXing Zheng  * @clk_data: holds clock related data like clk* and number of clocks.
335ef1d9feeSXing Zheng  * @cru_node: device-node of the clock-provider
336ef1d9feeSXing Zheng  * @grf: regmap of the general-register-files syscon
337ef1d9feeSXing Zheng  * @lock: maintains exclusion between callbacks for a given clock-provider.
338ef1d9feeSXing Zheng  */
339ef1d9feeSXing Zheng struct rockchip_clk_provider {
340ef1d9feeSXing Zheng 	void __iomem *reg_base;
341ef1d9feeSXing Zheng 	struct clk_onecell_data clk_data;
342ef1d9feeSXing Zheng 	struct device_node *cru_node;
343ef1d9feeSXing Zheng 	struct regmap *grf;
344ef1d9feeSXing Zheng 	spinlock_t lock;
345ef1d9feeSXing Zheng };
346ef1d9feeSXing Zheng 
34790c59025SHeiko Stübner struct rockchip_pll_rate_table {
34890c59025SHeiko Stübner 	unsigned long rate;
34923029150SElaine Zhang 	union {
35023029150SElaine Zhang 		struct {
35123029150SElaine Zhang 			/* for RK3066 */
35290c59025SHeiko Stübner 			unsigned int nr;
35390c59025SHeiko Stübner 			unsigned int nf;
35490c59025SHeiko Stübner 			unsigned int no;
3552bbfe001SDouglas Anderson 			unsigned int nb;
35623029150SElaine Zhang 		};
35723029150SElaine Zhang 		struct {
358b40baccdSXing Zheng 			/* for RK3036/RK3399 */
3599c4d6e55SXing Zheng 			unsigned int fbdiv;
3609c4d6e55SXing Zheng 			unsigned int postdiv1;
3619c4d6e55SXing Zheng 			unsigned int refdiv;
3629c4d6e55SXing Zheng 			unsigned int postdiv2;
3639c4d6e55SXing Zheng 			unsigned int dsmpd;
3649c4d6e55SXing Zheng 			unsigned int frac;
36590c59025SHeiko Stübner 		};
3668f659449SElaine Zhang 		struct {
3678f659449SElaine Zhang 			/* for RK3588 */
3688f659449SElaine Zhang 			unsigned int m;
3698f659449SElaine Zhang 			unsigned int p;
3708f659449SElaine Zhang 			unsigned int s;
3718f659449SElaine Zhang 			unsigned int k;
3728f659449SElaine Zhang 		};
37323029150SElaine Zhang 	};
37423029150SElaine Zhang };
37590c59025SHeiko Stübner 
37690c59025SHeiko Stübner /**
3772af2544dSShawn Lin  * struct rockchip_pll_clock - information about pll clock
37890c59025SHeiko Stübner  * @id: platform specific id of the clock.
37990c59025SHeiko Stübner  * @name: name of this pll clock.
3802af2544dSShawn Lin  * @parent_names: name of the parent clock.
3812af2544dSShawn Lin  * @num_parents: number of parents
38290c59025SHeiko Stübner  * @flags: optional flags for basic clock.
38390c59025SHeiko Stübner  * @con_offset: offset of the register for configuring the PLL.
38490c59025SHeiko Stübner  * @mode_offset: offset of the register for configuring the PLL-mode.
38590c59025SHeiko Stübner  * @mode_shift: offset inside the mode-register for the mode of this pll.
38690c59025SHeiko Stübner  * @lock_shift: offset inside the lock register for the lock status.
38790c59025SHeiko Stübner  * @type: Type of PLL to be registered.
3884f8a7c54SHeiko Stuebner  * @pll_flags: hardware-specific flags
38990c59025SHeiko Stübner  * @rate_table: Table of usable pll rates
3900bb66d3bSHeiko Stuebner  *
3910bb66d3bSHeiko Stuebner  * Flags:
3920bb66d3bSHeiko Stuebner  * ROCKCHIP_PLL_SYNC_RATE - check rate parameters to match against the
3930bb66d3bSHeiko Stuebner  *	rate_table parameters and ajust them if necessary.
39490c59025SHeiko Stübner  */
39590c59025SHeiko Stübner struct rockchip_pll_clock {
39690c59025SHeiko Stübner 	unsigned int		id;
39790c59025SHeiko Stübner 	const char		*name;
3984a1caed3SUwe Kleine-König 	const char		*const *parent_names;
39990c59025SHeiko Stübner 	u8			num_parents;
40090c59025SHeiko Stübner 	unsigned long		flags;
40190c59025SHeiko Stübner 	int			con_offset;
40290c59025SHeiko Stübner 	int			mode_offset;
40390c59025SHeiko Stübner 	int			mode_shift;
40490c59025SHeiko Stübner 	int			lock_shift;
40590c59025SHeiko Stübner 	enum rockchip_pll_type	type;
4064f8a7c54SHeiko Stuebner 	u8			pll_flags;
40790c59025SHeiko Stübner 	struct rockchip_pll_rate_table *rate_table;
40890c59025SHeiko Stübner };
40990c59025SHeiko Stübner 
4100bb66d3bSHeiko Stuebner #define ROCKCHIP_PLL_SYNC_RATE		BIT(0)
4110bb66d3bSHeiko Stuebner 
41290c59025SHeiko Stübner #define PLL(_type, _id, _name, _pnames, _flags, _con, _mode, _mshift,	\
4134f8a7c54SHeiko Stuebner 		_lshift, _pflags, _rtable)				\
41490c59025SHeiko Stübner 	{								\
41590c59025SHeiko Stübner 		.id		= _id,					\
41690c59025SHeiko Stübner 		.type		= _type,				\
41790c59025SHeiko Stübner 		.name		= _name,				\
41890c59025SHeiko Stübner 		.parent_names	= _pnames,				\
41990c59025SHeiko Stübner 		.num_parents	= ARRAY_SIZE(_pnames),			\
42090c59025SHeiko Stübner 		.flags		= CLK_GET_RATE_NOCACHE | _flags,	\
42190c59025SHeiko Stübner 		.con_offset	= _con,					\
42290c59025SHeiko Stübner 		.mode_offset	= _mode,				\
42390c59025SHeiko Stübner 		.mode_shift	= _mshift,				\
42490c59025SHeiko Stübner 		.lock_shift	= _lshift,				\
4254f8a7c54SHeiko Stuebner 		.pll_flags	= _pflags,				\
42690c59025SHeiko Stübner 		.rate_table	= _rtable,				\
42790c59025SHeiko Stübner 	}
42890c59025SHeiko Stübner 
429ef1d9feeSXing Zheng struct clk *rockchip_clk_register_pll(struct rockchip_clk_provider *ctx,
430ef1d9feeSXing Zheng 		enum rockchip_pll_type pll_type,
4314a1caed3SUwe Kleine-König 		const char *name, const char *const *parent_names,
432ef1d9feeSXing Zheng 		u8 num_parents, int con_offset, int grf_lock_offset,
433ef1d9feeSXing Zheng 		int lock_shift, int mode_offset, int mode_shift,
434ef1d9feeSXing Zheng 		struct rockchip_pll_rate_table *rate_table,
435e6cebc72SHeiko Stübner 		unsigned long flags, u8 clk_pll_flags);
43690c59025SHeiko Stübner 
437f6fba5f6SHeiko Stuebner struct rockchip_cpuclk_clksel {
438f6fba5f6SHeiko Stuebner 	int reg;
439f6fba5f6SHeiko Stuebner 	u32 val;
440f6fba5f6SHeiko Stuebner };
441f6fba5f6SHeiko Stuebner 
442*f1c506d1SElaine Zhang #define ROCKCHIP_CPUCLK_NUM_DIVIDERS	6
443a3561e77SElaine Zhang #define ROCKCHIP_CPUCLK_MAX_CORES	4
444f6fba5f6SHeiko Stuebner struct rockchip_cpuclk_rate_table {
445f6fba5f6SHeiko Stuebner 	unsigned long prate;
446f6fba5f6SHeiko Stuebner 	struct rockchip_cpuclk_clksel divs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
4472004b7b1SElaine Zhang 	struct rockchip_cpuclk_clksel pre_muxs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
4482004b7b1SElaine Zhang 	struct rockchip_cpuclk_clksel post_muxs[ROCKCHIP_CPUCLK_NUM_DIVIDERS];
449f6fba5f6SHeiko Stuebner };
450f6fba5f6SHeiko Stuebner 
451f6fba5f6SHeiko Stuebner /**
45203ae1747SHeiko Stuebner  * struct rockchip_cpuclk_reg_data - register offsets and masks of the cpuclock
453a3561e77SElaine Zhang  * @core_reg[]:	register offset of the cores setting register
454a3561e77SElaine Zhang  * @div_core_shift[]:	cores divider offset used to divide the pll value
455a3561e77SElaine Zhang  * @div_core_mask[]:	cores divider mask
456a3561e77SElaine Zhang  * @num_cores:	number of cpu cores
457cf87691fSElaine Zhang  * @mux_core_reg:       register offset of the cores select parent
458cf87691fSElaine Zhang  * @mux_core_alt:       mux value to select alternate parent
459268aebaaSXing Zheng  * @mux_core_main:	mux value to select main parent of core
460f6fba5f6SHeiko Stuebner  * @mux_core_shift:	offset of the core multiplexer
461268aebaaSXing Zheng  * @mux_core_mask:	core multiplexer mask
462f6fba5f6SHeiko Stuebner  */
463f6fba5f6SHeiko Stuebner struct rockchip_cpuclk_reg_data {
464a3561e77SElaine Zhang 	int	core_reg[ROCKCHIP_CPUCLK_MAX_CORES];
465a3561e77SElaine Zhang 	u8	div_core_shift[ROCKCHIP_CPUCLK_MAX_CORES];
466a3561e77SElaine Zhang 	u32	div_core_mask[ROCKCHIP_CPUCLK_MAX_CORES];
467a3561e77SElaine Zhang 	int	num_cores;
468cf87691fSElaine Zhang 	int	mux_core_reg;
469268aebaaSXing Zheng 	u8	mux_core_alt;
470268aebaaSXing Zheng 	u8	mux_core_main;
471f6fba5f6SHeiko Stuebner 	u8	mux_core_shift;
472268aebaaSXing Zheng 	u32	mux_core_mask;
473f6fba5f6SHeiko Stuebner };
474f6fba5f6SHeiko Stuebner 
475f6fba5f6SHeiko Stuebner struct clk *rockchip_clk_register_cpuclk(const char *name,
4764a1caed3SUwe Kleine-König 			const char *const *parent_names, u8 num_parents,
477f6fba5f6SHeiko Stuebner 			const struct rockchip_cpuclk_reg_data *reg_data,
478f6fba5f6SHeiko Stuebner 			const struct rockchip_cpuclk_rate_table *rates,
479f6fba5f6SHeiko Stuebner 			int nrates, void __iomem *reg_base, spinlock_t *lock);
480f6fba5f6SHeiko Stuebner 
48189bf26cbSAlexandru M Stan struct clk *rockchip_clk_register_mmc(const char *name,
4824a1caed3SUwe Kleine-König 				const char *const *parent_names, u8 num_parents,
48389bf26cbSAlexandru M Stan 				void __iomem *reg, int shift);
48489bf26cbSAlexandru M Stan 
485a4f182bfSLin Huang /*
486a4f182bfSLin Huang  * DDRCLK flags, including method of setting the rate
487a4f182bfSLin Huang  * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate.
488a4f182bfSLin Huang  */
489a4f182bfSLin Huang #define ROCKCHIP_DDRCLK_SIP		BIT(0)
490a4f182bfSLin Huang 
491a4f182bfSLin Huang struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
492a4f182bfSLin Huang 					 const char *const *parent_names,
493a4f182bfSLin Huang 					 u8 num_parents, int mux_offset,
494a4f182bfSLin Huang 					 int mux_shift, int mux_width,
495a4f182bfSLin Huang 					 int div_shift, int div_width,
496a4f182bfSLin Huang 					 int ddr_flags, void __iomem *reg_base,
497a4f182bfSLin Huang 					 spinlock_t *lock);
498a4f182bfSLin Huang 
4998a76f443SHeiko Stuebner #define ROCKCHIP_INVERTER_HIWORD_MASK	BIT(0)
5008a76f443SHeiko Stuebner 
5018a76f443SHeiko Stuebner struct clk *rockchip_clk_register_inverter(const char *name,
5028a76f443SHeiko Stuebner 				const char *const *parent_names, u8 num_parents,
5038a76f443SHeiko Stuebner 				void __iomem *reg, int shift, int flags,
5048a76f443SHeiko Stuebner 				spinlock_t *lock);
5058a76f443SHeiko Stuebner 
506cb1d9f6dSHeiko Stuebner struct clk *rockchip_clk_register_muxgrf(const char *name,
507cb1d9f6dSHeiko Stuebner 				const char *const *parent_names, u8 num_parents,
508cb1d9f6dSHeiko Stuebner 				int flags, struct regmap *grf, int reg,
509cb1d9f6dSHeiko Stuebner 				int shift, int width, int mux_flags);
510cb1d9f6dSHeiko Stuebner 
5114a1caed3SUwe Kleine-König #define PNAME(x) static const char *const x[] __initconst
512a245fecbSHeiko Stübner 
513a245fecbSHeiko Stübner enum rockchip_clk_branch_type {
514a245fecbSHeiko Stübner 	branch_composite,
515a245fecbSHeiko Stübner 	branch_mux,
516cb1d9f6dSHeiko Stuebner 	branch_muxgrf,
517a245fecbSHeiko Stübner 	branch_divider,
518a245fecbSHeiko Stübner 	branch_fraction_divider,
519a245fecbSHeiko Stübner 	branch_gate,
52089bf26cbSAlexandru M Stan 	branch_mmc,
5218a76f443SHeiko Stuebner 	branch_inverter,
52229a30c26SHeiko Stuebner 	branch_factor,
523a4f182bfSLin Huang 	branch_ddrclk,
524956060a5SElaine Zhang 	branch_half_divider,
525a245fecbSHeiko Stübner };
526a245fecbSHeiko Stübner 
527a245fecbSHeiko Stübner struct rockchip_clk_branch {
528a245fecbSHeiko Stübner 	unsigned int			id;
529a245fecbSHeiko Stübner 	enum rockchip_clk_branch_type	branch_type;
530a245fecbSHeiko Stübner 	const char			*name;
5314a1caed3SUwe Kleine-König 	const char			*const *parent_names;
532a245fecbSHeiko Stübner 	u8				num_parents;
533a245fecbSHeiko Stübner 	unsigned long			flags;
534a245fecbSHeiko Stübner 	int				muxdiv_offset;
535a245fecbSHeiko Stübner 	u8				mux_shift;
536a245fecbSHeiko Stübner 	u8				mux_width;
537a245fecbSHeiko Stübner 	u8				mux_flags;
53830d8b7d4SElaine Zhang 	u32				*mux_table;
5391f55660fSFinley Xiao 	int				div_offset;
540a245fecbSHeiko Stübner 	u8				div_shift;
541a245fecbSHeiko Stübner 	u8				div_width;
542a245fecbSHeiko Stübner 	u8				div_flags;
543a245fecbSHeiko Stübner 	struct clk_div_table		*div_table;
544a245fecbSHeiko Stübner 	int				gate_offset;
545a245fecbSHeiko Stübner 	u8				gate_shift;
546a245fecbSHeiko Stübner 	u8				gate_flags;
5478ca1ca8fSHeiko Stuebner 	struct rockchip_clk_branch	*child;
548a245fecbSHeiko Stübner };
549a245fecbSHeiko Stübner 
550a245fecbSHeiko Stübner #define COMPOSITE(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw,\
551a245fecbSHeiko Stübner 		  df, go, gs, gf)				\
552a245fecbSHeiko Stübner 	{							\
553a245fecbSHeiko Stübner 		.id		= _id,				\
554a245fecbSHeiko Stübner 		.branch_type	= branch_composite,		\
555a245fecbSHeiko Stübner 		.name		= cname,			\
556a245fecbSHeiko Stübner 		.parent_names	= pnames,			\
557a245fecbSHeiko Stübner 		.num_parents	= ARRAY_SIZE(pnames),		\
558a245fecbSHeiko Stübner 		.flags		= f,				\
559a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
560a245fecbSHeiko Stübner 		.mux_shift	= ms,				\
561a245fecbSHeiko Stübner 		.mux_width	= mw,				\
562a245fecbSHeiko Stübner 		.mux_flags	= mf,				\
563a245fecbSHeiko Stübner 		.div_shift	= ds,				\
564a245fecbSHeiko Stübner 		.div_width	= dw,				\
565a245fecbSHeiko Stübner 		.div_flags	= df,				\
566a245fecbSHeiko Stübner 		.gate_offset	= go,				\
567a245fecbSHeiko Stübner 		.gate_shift	= gs,				\
568a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
569a245fecbSHeiko Stübner 	}
570a245fecbSHeiko Stübner 
5711f55660fSFinley Xiao #define COMPOSITE_DIV_OFFSET(_id, cname, pnames, f, mo, ms, mw,	\
5721f55660fSFinley Xiao 			     mf, do, ds, dw, df, go, gs, gf)	\
5731f55660fSFinley Xiao 	{							\
5741f55660fSFinley Xiao 		.id		= _id,				\
5751f55660fSFinley Xiao 		.branch_type	= branch_composite,		\
5761f55660fSFinley Xiao 		.name		= cname,			\
5771f55660fSFinley Xiao 		.parent_names	= pnames,			\
5781f55660fSFinley Xiao 		.num_parents	= ARRAY_SIZE(pnames),		\
5791f55660fSFinley Xiao 		.flags		= f,				\
5801f55660fSFinley Xiao 		.muxdiv_offset	= mo,				\
5811f55660fSFinley Xiao 		.mux_shift	= ms,				\
5821f55660fSFinley Xiao 		.mux_width	= mw,				\
5831f55660fSFinley Xiao 		.mux_flags	= mf,				\
5841f55660fSFinley Xiao 		.div_offset	= do,				\
5851f55660fSFinley Xiao 		.div_shift	= ds,				\
5861f55660fSFinley Xiao 		.div_width	= dw,				\
5871f55660fSFinley Xiao 		.div_flags	= df,				\
5881f55660fSFinley Xiao 		.gate_offset	= go,				\
5891f55660fSFinley Xiao 		.gate_shift	= gs,				\
5901f55660fSFinley Xiao 		.gate_flags	= gf,				\
5911f55660fSFinley Xiao 	}
5921f55660fSFinley Xiao 
593a245fecbSHeiko Stübner #define COMPOSITE_NOMUX(_id, cname, pname, f, mo, ds, dw, df,	\
594a245fecbSHeiko Stübner 			go, gs, gf)				\
595a245fecbSHeiko Stübner 	{							\
596a245fecbSHeiko Stübner 		.id		= _id,				\
597a245fecbSHeiko Stübner 		.branch_type	= branch_composite,		\
598a245fecbSHeiko Stübner 		.name		= cname,			\
599a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
600a245fecbSHeiko Stübner 		.num_parents	= 1,				\
601a245fecbSHeiko Stübner 		.flags		= f,				\
602a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
603a245fecbSHeiko Stübner 		.div_shift	= ds,				\
604a245fecbSHeiko Stübner 		.div_width	= dw,				\
605a245fecbSHeiko Stübner 		.div_flags	= df,				\
606a245fecbSHeiko Stübner 		.gate_offset	= go,				\
607a245fecbSHeiko Stübner 		.gate_shift	= gs,				\
608a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
609a245fecbSHeiko Stübner 	}
610a245fecbSHeiko Stübner 
611a245fecbSHeiko Stübner #define COMPOSITE_NOMUX_DIVTBL(_id, cname, pname, f, mo, ds, dw,\
612a245fecbSHeiko Stübner 			       df, dt, go, gs, gf)		\
613a245fecbSHeiko Stübner 	{							\
614a245fecbSHeiko Stübner 		.id		= _id,				\
615a245fecbSHeiko Stübner 		.branch_type	= branch_composite,		\
616a245fecbSHeiko Stübner 		.name		= cname,			\
617a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
618a245fecbSHeiko Stübner 		.num_parents	= 1,				\
619a245fecbSHeiko Stübner 		.flags		= f,				\
620a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
621a245fecbSHeiko Stübner 		.div_shift	= ds,				\
622a245fecbSHeiko Stübner 		.div_width	= dw,				\
623a245fecbSHeiko Stübner 		.div_flags	= df,				\
624a245fecbSHeiko Stübner 		.div_table	= dt,				\
625a245fecbSHeiko Stübner 		.gate_offset	= go,				\
626a245fecbSHeiko Stübner 		.gate_shift	= gs,				\
627a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
628a245fecbSHeiko Stübner 	}
629a245fecbSHeiko Stübner 
630a245fecbSHeiko Stübner #define COMPOSITE_NODIV(_id, cname, pnames, f, mo, ms, mw, mf,	\
631a245fecbSHeiko Stübner 			go, gs, gf)				\
632a245fecbSHeiko Stübner 	{							\
633a245fecbSHeiko Stübner 		.id		= _id,				\
634a245fecbSHeiko Stübner 		.branch_type	= branch_composite,		\
635a245fecbSHeiko Stübner 		.name		= cname,			\
636a245fecbSHeiko Stübner 		.parent_names	= pnames,			\
637a245fecbSHeiko Stübner 		.num_parents	= ARRAY_SIZE(pnames),		\
638a245fecbSHeiko Stübner 		.flags		= f,				\
639a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
640a245fecbSHeiko Stübner 		.mux_shift	= ms,				\
641a245fecbSHeiko Stübner 		.mux_width	= mw,				\
642a245fecbSHeiko Stübner 		.mux_flags	= mf,				\
643a245fecbSHeiko Stübner 		.gate_offset	= go,				\
644a245fecbSHeiko Stübner 		.gate_shift	= gs,				\
645a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
646a245fecbSHeiko Stübner 	}
647a245fecbSHeiko Stübner 
648a245fecbSHeiko Stübner #define COMPOSITE_NOGATE(_id, cname, pnames, f, mo, ms, mw, mf,	\
649a245fecbSHeiko Stübner 			 ds, dw, df)				\
650a245fecbSHeiko Stübner 	{							\
651a245fecbSHeiko Stübner 		.id		= _id,				\
652a245fecbSHeiko Stübner 		.branch_type	= branch_composite,		\
653a245fecbSHeiko Stübner 		.name		= cname,			\
654a245fecbSHeiko Stübner 		.parent_names	= pnames,			\
655a245fecbSHeiko Stübner 		.num_parents	= ARRAY_SIZE(pnames),		\
656a245fecbSHeiko Stübner 		.flags		= f,				\
657a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
658a245fecbSHeiko Stübner 		.mux_shift	= ms,				\
659a245fecbSHeiko Stübner 		.mux_width	= mw,				\
660a245fecbSHeiko Stübner 		.mux_flags	= mf,				\
661a245fecbSHeiko Stübner 		.div_shift	= ds,				\
662a245fecbSHeiko Stübner 		.div_width	= dw,				\
663a245fecbSHeiko Stübner 		.div_flags	= df,				\
664a245fecbSHeiko Stübner 		.gate_offset	= -1,				\
665a245fecbSHeiko Stübner 	}
666a245fecbSHeiko Stübner 
6676f085072SHeiko Stuebner #define COMPOSITE_NOGATE_DIVTBL(_id, cname, pnames, f, mo, ms,	\
6686f085072SHeiko Stuebner 				mw, mf, ds, dw, df, dt)		\
6696f085072SHeiko Stuebner 	{							\
6706f085072SHeiko Stuebner 		.id		= _id,				\
6716f085072SHeiko Stuebner 		.branch_type	= branch_composite,		\
6726f085072SHeiko Stuebner 		.name		= cname,			\
6736f085072SHeiko Stuebner 		.parent_names	= pnames,			\
6746f085072SHeiko Stuebner 		.num_parents	= ARRAY_SIZE(pnames),		\
6756f085072SHeiko Stuebner 		.flags		= f,				\
6766f085072SHeiko Stuebner 		.muxdiv_offset	= mo,				\
6776f085072SHeiko Stuebner 		.mux_shift	= ms,				\
6786f085072SHeiko Stuebner 		.mux_width	= mw,				\
6796f085072SHeiko Stuebner 		.mux_flags	= mf,				\
6806f085072SHeiko Stuebner 		.div_shift	= ds,				\
6816f085072SHeiko Stuebner 		.div_width	= dw,				\
6826f085072SHeiko Stuebner 		.div_flags	= df,				\
6836f085072SHeiko Stuebner 		.div_table	= dt,				\
6846f085072SHeiko Stuebner 		.gate_offset	= -1,				\
6856f085072SHeiko Stuebner 	}
6866f085072SHeiko Stuebner 
687a245fecbSHeiko Stübner #define COMPOSITE_FRAC(_id, cname, pname, f, mo, df, go, gs, gf)\
688a245fecbSHeiko Stübner 	{							\
689a245fecbSHeiko Stübner 		.id		= _id,				\
690a245fecbSHeiko Stübner 		.branch_type	= branch_fraction_divider,	\
691a245fecbSHeiko Stübner 		.name		= cname,			\
692a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
693a245fecbSHeiko Stübner 		.num_parents	= 1,				\
694a245fecbSHeiko Stübner 		.flags		= f,				\
695a245fecbSHeiko Stübner 		.muxdiv_offset	= mo,				\
696a245fecbSHeiko Stübner 		.div_shift	= 16,				\
697a245fecbSHeiko Stübner 		.div_width	= 16,				\
698a245fecbSHeiko Stübner 		.div_flags	= df,				\
699a245fecbSHeiko Stübner 		.gate_offset	= go,				\
700a245fecbSHeiko Stübner 		.gate_shift	= gs,				\
701a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
702a245fecbSHeiko Stübner 	}
703a245fecbSHeiko Stübner 
7048ca1ca8fSHeiko Stuebner #define COMPOSITE_FRACMUX(_id, cname, pname, f, mo, df, go, gs, gf, ch) \
7058ca1ca8fSHeiko Stuebner 	{							\
7068ca1ca8fSHeiko Stuebner 		.id		= _id,				\
7078ca1ca8fSHeiko Stuebner 		.branch_type	= branch_fraction_divider,	\
7088ca1ca8fSHeiko Stuebner 		.name		= cname,			\
7098ca1ca8fSHeiko Stuebner 		.parent_names	= (const char *[]){ pname },	\
7108ca1ca8fSHeiko Stuebner 		.num_parents	= 1,				\
7118ca1ca8fSHeiko Stuebner 		.flags		= f,				\
7128ca1ca8fSHeiko Stuebner 		.muxdiv_offset	= mo,				\
7138ca1ca8fSHeiko Stuebner 		.div_shift	= 16,				\
7148ca1ca8fSHeiko Stuebner 		.div_width	= 16,				\
7158ca1ca8fSHeiko Stuebner 		.div_flags	= df,				\
7168ca1ca8fSHeiko Stuebner 		.gate_offset	= go,				\
7178ca1ca8fSHeiko Stuebner 		.gate_shift	= gs,				\
7188ca1ca8fSHeiko Stuebner 		.gate_flags	= gf,				\
7195b738403SHeiko Stübner 		.child		= ch,				\
7208ca1ca8fSHeiko Stuebner 	}
7218ca1ca8fSHeiko Stuebner 
7229387bfd1SXing Zheng #define COMPOSITE_FRACMUX_NOGATE(_id, cname, pname, f, mo, df, ch) \
7239387bfd1SXing Zheng 	{							\
7249387bfd1SXing Zheng 		.id		= _id,				\
7259387bfd1SXing Zheng 		.branch_type	= branch_fraction_divider,	\
7269387bfd1SXing Zheng 		.name		= cname,			\
7279387bfd1SXing Zheng 		.parent_names	= (const char *[]){ pname },	\
7289387bfd1SXing Zheng 		.num_parents	= 1,				\
7299387bfd1SXing Zheng 		.flags		= f,				\
7309387bfd1SXing Zheng 		.muxdiv_offset	= mo,				\
7319387bfd1SXing Zheng 		.div_shift	= 16,				\
7329387bfd1SXing Zheng 		.div_width	= 16,				\
7339387bfd1SXing Zheng 		.div_flags	= df,				\
7349387bfd1SXing Zheng 		.gate_offset	= -1,				\
7359387bfd1SXing Zheng 		.child		= ch,				\
7369387bfd1SXing Zheng 	}
7379387bfd1SXing Zheng 
738a4f182bfSLin Huang #define COMPOSITE_DDRCLK(_id, cname, pnames, f, mo, ms, mw,	\
739a4f182bfSLin Huang 			 ds, dw, df)				\
740a4f182bfSLin Huang 	{							\
741a4f182bfSLin Huang 		.id		= _id,				\
742a4f182bfSLin Huang 		.branch_type	= branch_ddrclk,		\
743a4f182bfSLin Huang 		.name		= cname,			\
744a4f182bfSLin Huang 		.parent_names	= pnames,			\
745a4f182bfSLin Huang 		.num_parents	= ARRAY_SIZE(pnames),		\
746a4f182bfSLin Huang 		.flags		= f,				\
747a4f182bfSLin Huang 		.muxdiv_offset  = mo,                           \
748a4f182bfSLin Huang 		.mux_shift      = ms,                           \
749a4f182bfSLin Huang 		.mux_width      = mw,                           \
750a4f182bfSLin Huang 		.div_shift      = ds,                           \
751a4f182bfSLin Huang 		.div_width      = dw,                           \
752a4f182bfSLin Huang 		.div_flags	= df,				\
753a4f182bfSLin Huang 		.gate_offset    = -1,                           \
754a4f182bfSLin Huang 	}
755a4f182bfSLin Huang 
756a245fecbSHeiko Stübner #define MUX(_id, cname, pnames, f, o, s, w, mf)			\
757a245fecbSHeiko Stübner 	{							\
758a245fecbSHeiko Stübner 		.id		= _id,				\
759a245fecbSHeiko Stübner 		.branch_type	= branch_mux,			\
760a245fecbSHeiko Stübner 		.name		= cname,			\
761a245fecbSHeiko Stübner 		.parent_names	= pnames,			\
762a245fecbSHeiko Stübner 		.num_parents	= ARRAY_SIZE(pnames),		\
763a245fecbSHeiko Stübner 		.flags		= f,				\
764a245fecbSHeiko Stübner 		.muxdiv_offset	= o,				\
765a245fecbSHeiko Stübner 		.mux_shift	= s,				\
766a245fecbSHeiko Stübner 		.mux_width	= w,				\
767a245fecbSHeiko Stübner 		.mux_flags	= mf,				\
768a245fecbSHeiko Stübner 		.gate_offset	= -1,				\
769a245fecbSHeiko Stübner 	}
770a245fecbSHeiko Stübner 
77130d8b7d4SElaine Zhang #define MUXTBL(_id, cname, pnames, f, o, s, w, mf, mt)		\
77230d8b7d4SElaine Zhang 	{							\
77330d8b7d4SElaine Zhang 		.id		= _id,				\
77430d8b7d4SElaine Zhang 		.branch_type	= branch_mux,			\
77530d8b7d4SElaine Zhang 		.name		= cname,			\
77630d8b7d4SElaine Zhang 		.parent_names	= pnames,			\
77730d8b7d4SElaine Zhang 		.num_parents	= ARRAY_SIZE(pnames),		\
77830d8b7d4SElaine Zhang 		.flags		= f,				\
77930d8b7d4SElaine Zhang 		.muxdiv_offset	= o,				\
78030d8b7d4SElaine Zhang 		.mux_shift	= s,				\
78130d8b7d4SElaine Zhang 		.mux_width	= w,				\
78230d8b7d4SElaine Zhang 		.mux_flags	= mf,				\
78330d8b7d4SElaine Zhang 		.gate_offset	= -1,				\
78430d8b7d4SElaine Zhang 		.mux_table	= mt,				\
78530d8b7d4SElaine Zhang 	}
78630d8b7d4SElaine Zhang 
787cb1d9f6dSHeiko Stuebner #define MUXGRF(_id, cname, pnames, f, o, s, w, mf)		\
788cb1d9f6dSHeiko Stuebner 	{							\
789cb1d9f6dSHeiko Stuebner 		.id		= _id,				\
790cb1d9f6dSHeiko Stuebner 		.branch_type	= branch_muxgrf,		\
791cb1d9f6dSHeiko Stuebner 		.name		= cname,			\
792cb1d9f6dSHeiko Stuebner 		.parent_names	= pnames,			\
793cb1d9f6dSHeiko Stuebner 		.num_parents	= ARRAY_SIZE(pnames),		\
794cb1d9f6dSHeiko Stuebner 		.flags		= f,				\
795cb1d9f6dSHeiko Stuebner 		.muxdiv_offset	= o,				\
796cb1d9f6dSHeiko Stuebner 		.mux_shift	= s,				\
797cb1d9f6dSHeiko Stuebner 		.mux_width	= w,				\
798cb1d9f6dSHeiko Stuebner 		.mux_flags	= mf,				\
799cb1d9f6dSHeiko Stuebner 		.gate_offset	= -1,				\
800cb1d9f6dSHeiko Stuebner 	}
801cb1d9f6dSHeiko Stuebner 
802a245fecbSHeiko Stübner #define DIV(_id, cname, pname, f, o, s, w, df)			\
803a245fecbSHeiko Stübner 	{							\
804a245fecbSHeiko Stübner 		.id		= _id,				\
805a245fecbSHeiko Stübner 		.branch_type	= branch_divider,		\
806a245fecbSHeiko Stübner 		.name		= cname,			\
807a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
808a245fecbSHeiko Stübner 		.num_parents	= 1,				\
809a245fecbSHeiko Stübner 		.flags		= f,				\
810a245fecbSHeiko Stübner 		.muxdiv_offset	= o,				\
811a245fecbSHeiko Stübner 		.div_shift	= s,				\
812a245fecbSHeiko Stübner 		.div_width	= w,				\
813a245fecbSHeiko Stübner 		.div_flags	= df,				\
814a245fecbSHeiko Stübner 		.gate_offset	= -1,				\
815a245fecbSHeiko Stübner 	}
816a245fecbSHeiko Stübner 
817a245fecbSHeiko Stübner #define DIVTBL(_id, cname, pname, f, o, s, w, df, dt)		\
818a245fecbSHeiko Stübner 	{							\
819a245fecbSHeiko Stübner 		.id		= _id,				\
820a245fecbSHeiko Stübner 		.branch_type	= branch_divider,		\
821a245fecbSHeiko Stübner 		.name		= cname,			\
822a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
823a245fecbSHeiko Stübner 		.num_parents	= 1,				\
824a245fecbSHeiko Stübner 		.flags		= f,				\
825a245fecbSHeiko Stübner 		.muxdiv_offset	= o,				\
826a245fecbSHeiko Stübner 		.div_shift	= s,				\
827a245fecbSHeiko Stübner 		.div_width	= w,				\
828a245fecbSHeiko Stübner 		.div_flags	= df,				\
829a245fecbSHeiko Stübner 		.div_table	= dt,				\
830a245fecbSHeiko Stübner 	}
831a245fecbSHeiko Stübner 
832a245fecbSHeiko Stübner #define GATE(_id, cname, pname, f, o, b, gf)			\
833a245fecbSHeiko Stübner 	{							\
834a245fecbSHeiko Stübner 		.id		= _id,				\
835a245fecbSHeiko Stübner 		.branch_type	= branch_gate,			\
836a245fecbSHeiko Stübner 		.name		= cname,			\
837a245fecbSHeiko Stübner 		.parent_names	= (const char *[]){ pname },	\
838a245fecbSHeiko Stübner 		.num_parents	= 1,				\
839a245fecbSHeiko Stübner 		.flags		= f,				\
840a245fecbSHeiko Stübner 		.gate_offset	= o,				\
841a245fecbSHeiko Stübner 		.gate_shift	= b,				\
842a245fecbSHeiko Stübner 		.gate_flags	= gf,				\
843a245fecbSHeiko Stübner 	}
844a245fecbSHeiko Stübner 
84589bf26cbSAlexandru M Stan #define MMC(_id, cname, pname, offset, shift)			\
84689bf26cbSAlexandru M Stan 	{							\
84789bf26cbSAlexandru M Stan 		.id		= _id,				\
84889bf26cbSAlexandru M Stan 		.branch_type	= branch_mmc,			\
84989bf26cbSAlexandru M Stan 		.name		= cname,			\
85089bf26cbSAlexandru M Stan 		.parent_names	= (const char *[]){ pname },	\
85189bf26cbSAlexandru M Stan 		.num_parents	= 1,				\
85289bf26cbSAlexandru M Stan 		.muxdiv_offset	= offset,			\
85389bf26cbSAlexandru M Stan 		.div_shift	= shift,			\
85489bf26cbSAlexandru M Stan 	}
855a245fecbSHeiko Stübner 
8568a76f443SHeiko Stuebner #define INVERTER(_id, cname, pname, io, is, if)			\
8578a76f443SHeiko Stuebner 	{							\
8588a76f443SHeiko Stuebner 		.id		= _id,				\
8598a76f443SHeiko Stuebner 		.branch_type	= branch_inverter,		\
8608a76f443SHeiko Stuebner 		.name		= cname,			\
8618a76f443SHeiko Stuebner 		.parent_names	= (const char *[]){ pname },	\
8628a76f443SHeiko Stuebner 		.num_parents	= 1,				\
8638a76f443SHeiko Stuebner 		.muxdiv_offset	= io,				\
8648a76f443SHeiko Stuebner 		.div_shift	= is,				\
8658a76f443SHeiko Stuebner 		.div_flags	= if,				\
8668a76f443SHeiko Stuebner 	}
8678a76f443SHeiko Stuebner 
86829a30c26SHeiko Stuebner #define FACTOR(_id, cname, pname,  f, fm, fd)			\
86929a30c26SHeiko Stuebner 	{							\
87029a30c26SHeiko Stuebner 		.id		= _id,				\
87129a30c26SHeiko Stuebner 		.branch_type	= branch_factor,		\
87229a30c26SHeiko Stuebner 		.name		= cname,			\
87329a30c26SHeiko Stuebner 		.parent_names	= (const char *[]){ pname },	\
87429a30c26SHeiko Stuebner 		.num_parents	= 1,				\
87529a30c26SHeiko Stuebner 		.flags		= f,				\
87629a30c26SHeiko Stuebner 		.div_shift	= fm,				\
87729a30c26SHeiko Stuebner 		.div_width	= fd,				\
87829a30c26SHeiko Stuebner 	}
87929a30c26SHeiko Stuebner 
88029a30c26SHeiko Stuebner #define FACTOR_GATE(_id, cname, pname,  f, fm, fd, go, gb, gf)	\
88129a30c26SHeiko Stuebner 	{							\
88229a30c26SHeiko Stuebner 		.id		= _id,				\
88329a30c26SHeiko Stuebner 		.branch_type	= branch_factor,		\
88429a30c26SHeiko Stuebner 		.name		= cname,			\
88529a30c26SHeiko Stuebner 		.parent_names	= (const char *[]){ pname },	\
88629a30c26SHeiko Stuebner 		.num_parents	= 1,				\
88729a30c26SHeiko Stuebner 		.flags		= f,				\
88829a30c26SHeiko Stuebner 		.div_shift	= fm,				\
88929a30c26SHeiko Stuebner 		.div_width	= fd,				\
89029a30c26SHeiko Stuebner 		.gate_offset	= go,				\
89129a30c26SHeiko Stuebner 		.gate_shift	= gb,				\
89229a30c26SHeiko Stuebner 		.gate_flags	= gf,				\
89329a30c26SHeiko Stuebner 	}
89429a30c26SHeiko Stuebner 
895956060a5SElaine Zhang #define COMPOSITE_HALFDIV(_id, cname, pnames, f, mo, ms, mw, mf, ds, dw,\
896956060a5SElaine Zhang 			  df, go, gs, gf)				\
897956060a5SElaine Zhang 	{							\
898956060a5SElaine Zhang 		.id		= _id,				\
899956060a5SElaine Zhang 		.branch_type	= branch_half_divider,		\
900956060a5SElaine Zhang 		.name		= cname,			\
901956060a5SElaine Zhang 		.parent_names	= pnames,			\
902956060a5SElaine Zhang 		.num_parents	= ARRAY_SIZE(pnames),		\
903956060a5SElaine Zhang 		.flags		= f,				\
904956060a5SElaine Zhang 		.muxdiv_offset	= mo,				\
905956060a5SElaine Zhang 		.mux_shift	= ms,				\
906956060a5SElaine Zhang 		.mux_width	= mw,				\
907956060a5SElaine Zhang 		.mux_flags	= mf,				\
908956060a5SElaine Zhang 		.div_shift	= ds,				\
909956060a5SElaine Zhang 		.div_width	= dw,				\
910956060a5SElaine Zhang 		.div_flags	= df,				\
911956060a5SElaine Zhang 		.gate_offset	= go,				\
912956060a5SElaine Zhang 		.gate_shift	= gs,				\
913956060a5SElaine Zhang 		.gate_flags	= gf,				\
914956060a5SElaine Zhang 	}
915956060a5SElaine Zhang 
916956060a5SElaine Zhang #define COMPOSITE_NOGATE_HALFDIV(_id, cname, pnames, f, mo, ms, mw, mf,	\
917956060a5SElaine Zhang 				 ds, dw, df)				\
918956060a5SElaine Zhang 	{							\
919956060a5SElaine Zhang 		.id		= _id,				\
920956060a5SElaine Zhang 		.branch_type	= branch_half_divider,		\
921956060a5SElaine Zhang 		.name		= cname,			\
922956060a5SElaine Zhang 		.parent_names	= pnames,			\
923956060a5SElaine Zhang 		.num_parents	= ARRAY_SIZE(pnames),		\
924956060a5SElaine Zhang 		.flags		= f,				\
925956060a5SElaine Zhang 		.muxdiv_offset	= mo,				\
926956060a5SElaine Zhang 		.mux_shift	= ms,				\
927956060a5SElaine Zhang 		.mux_width	= mw,				\
928956060a5SElaine Zhang 		.mux_flags	= mf,				\
929956060a5SElaine Zhang 		.div_shift	= ds,				\
930956060a5SElaine Zhang 		.div_width	= dw,				\
931956060a5SElaine Zhang 		.div_flags	= df,				\
932956060a5SElaine Zhang 		.gate_offset	= -1,				\
933956060a5SElaine Zhang 	}
934956060a5SElaine Zhang 
935956060a5SElaine Zhang #define COMPOSITE_NOMUX_HALFDIV(_id, cname, pname, f, mo, ds, dw, df,	\
936956060a5SElaine Zhang 			go, gs, gf)				\
937956060a5SElaine Zhang 	{							\
938956060a5SElaine Zhang 		.id		= _id,				\
939956060a5SElaine Zhang 		.branch_type	= branch_half_divider,		\
940956060a5SElaine Zhang 		.name		= cname,			\
941956060a5SElaine Zhang 		.parent_names	= (const char *[]){ pname },	\
942956060a5SElaine Zhang 		.num_parents	= 1,				\
943956060a5SElaine Zhang 		.flags		= f,				\
944956060a5SElaine Zhang 		.muxdiv_offset	= mo,				\
945956060a5SElaine Zhang 		.div_shift	= ds,				\
946956060a5SElaine Zhang 		.div_width	= dw,				\
947956060a5SElaine Zhang 		.div_flags	= df,				\
948956060a5SElaine Zhang 		.gate_offset	= go,				\
949956060a5SElaine Zhang 		.gate_shift	= gs,				\
950956060a5SElaine Zhang 		.gate_flags	= gf,				\
951956060a5SElaine Zhang 	}
952956060a5SElaine Zhang 
953956060a5SElaine Zhang #define DIV_HALF(_id, cname, pname, f, o, s, w, df)			\
954956060a5SElaine Zhang 	{							\
955956060a5SElaine Zhang 		.id		= _id,				\
956956060a5SElaine Zhang 		.branch_type	= branch_half_divider,		\
957956060a5SElaine Zhang 		.name		= cname,			\
958956060a5SElaine Zhang 		.parent_names	= (const char *[]){ pname },	\
959956060a5SElaine Zhang 		.num_parents	= 1,				\
960956060a5SElaine Zhang 		.flags		= f,				\
961956060a5SElaine Zhang 		.muxdiv_offset	= o,				\
962956060a5SElaine Zhang 		.div_shift	= s,				\
963956060a5SElaine Zhang 		.div_width	= w,				\
964956060a5SElaine Zhang 		.div_flags	= df,				\
965956060a5SElaine Zhang 		.gate_offset	= -1,				\
966956060a5SElaine Zhang 	}
967956060a5SElaine Zhang 
968b3b723d8SHeiko Stuebner /* SGRF clocks are only accessible from secure mode, so not controllable */
969b3b723d8SHeiko Stuebner #define SGRF_GATE(_id, cname, pname)				\
970b3b723d8SHeiko Stuebner 		FACTOR(_id, cname, pname, 0, 1, 1)
971b3b723d8SHeiko Stuebner 
972ef1d9feeSXing Zheng struct rockchip_clk_provider *rockchip_clk_init(struct device_node *np,
973ef1d9feeSXing Zheng 			void __iomem *base, unsigned long nr_clks);
974ef1d9feeSXing Zheng void rockchip_clk_of_add_provider(struct device_node *np,
975ef1d9feeSXing Zheng 				struct rockchip_clk_provider *ctx);
976ef1d9feeSXing Zheng void rockchip_clk_register_branches(struct rockchip_clk_provider *ctx,
977ef1d9feeSXing Zheng 				    struct rockchip_clk_branch *list,
978a245fecbSHeiko Stübner 				    unsigned int nr_clk);
979ef1d9feeSXing Zheng void rockchip_clk_register_plls(struct rockchip_clk_provider *ctx,
980ef1d9feeSXing Zheng 				struct rockchip_pll_clock *pll_list,
98190c59025SHeiko Stübner 				unsigned int nr_pll, int grf_lock_offset);
982ef1d9feeSXing Zheng void rockchip_clk_register_armclk(struct rockchip_clk_provider *ctx,
983ef1d9feeSXing Zheng 			unsigned int lookup_id, const char *name,
9844a1caed3SUwe Kleine-König 			const char *const *parent_names, u8 num_parents,
985f6fba5f6SHeiko Stuebner 			const struct rockchip_cpuclk_reg_data *reg_data,
986f6fba5f6SHeiko Stuebner 			const struct rockchip_cpuclk_rate_table *rates,
987f6fba5f6SHeiko Stuebner 			int nrates);
988692d8328SUwe Kleine-König void rockchip_clk_protect_critical(const char *const clocks[], int nclocks);
989ef1d9feeSXing Zheng void rockchip_register_restart_notifier(struct rockchip_clk_provider *ctx,
990ef1d9feeSXing Zheng 					unsigned int reg, void (*cb)(void));
991a245fecbSHeiko Stübner 
99285fa0c7fSHeiko Stübner #define ROCKCHIP_SOFTRST_HIWORD_MASK	BIT(0)
99385fa0c7fSHeiko Stübner 
994956060a5SElaine Zhang struct clk *rockchip_clk_register_halfdiv(const char *name,
995956060a5SElaine Zhang 					  const char *const *parent_names,
996956060a5SElaine Zhang 					  u8 num_parents, void __iomem *base,
997956060a5SElaine Zhang 					  int muxdiv_offset, u8 mux_shift,
998956060a5SElaine Zhang 					  u8 mux_width, u8 mux_flags,
999956060a5SElaine Zhang 					  u8 div_shift, u8 div_width,
1000956060a5SElaine Zhang 					  u8 div_flags, int gate_offset,
1001956060a5SElaine Zhang 					  u8 gate_shift, u8 gate_flags,
1002956060a5SElaine Zhang 					  unsigned long flags,
1003956060a5SElaine Zhang 					  spinlock_t *lock);
1004956060a5SElaine Zhang 
100585fa0c7fSHeiko Stübner #ifdef CONFIG_RESET_CONTROLLER
1006ada8f95bSSebastian Reichel void rockchip_register_softrst_lut(struct device_node *np,
1007ada8f95bSSebastian Reichel 				   const int *lookup_table,
100885fa0c7fSHeiko Stübner 				   unsigned int num_regs,
100985fa0c7fSHeiko Stübner 				   void __iomem *base, u8 flags);
101085fa0c7fSHeiko Stübner #else
rockchip_register_softrst_lut(struct device_node * np,const int * lookup_table,unsigned int num_regs,void __iomem * base,u8 flags)1011ada8f95bSSebastian Reichel static inline void rockchip_register_softrst_lut(struct device_node *np,
1012ada8f95bSSebastian Reichel 				   const int *lookup_table,
101385fa0c7fSHeiko Stübner 				   unsigned int num_regs,
101485fa0c7fSHeiko Stübner 				   void __iomem *base, u8 flags)
101585fa0c7fSHeiko Stübner {
101685fa0c7fSHeiko Stübner }
101785fa0c7fSHeiko Stübner #endif
101885fa0c7fSHeiko Stübner 
rockchip_register_softrst(struct device_node * np,unsigned int num_regs,void __iomem * base,u8 flags)1019ada8f95bSSebastian Reichel static inline void rockchip_register_softrst(struct device_node *np,
1020ada8f95bSSebastian Reichel 					     unsigned int num_regs,
1021ada8f95bSSebastian Reichel 					     void __iomem *base, u8 flags)
1022ada8f95bSSebastian Reichel {
1023ada8f95bSSebastian Reichel 	return rockchip_register_softrst_lut(np, NULL, num_regs, base, flags);
1024ada8f95bSSebastian Reichel }
1025ada8f95bSSebastian Reichel 
1026*f1c506d1SElaine Zhang void rk3588_rst_init(struct device_node *np, void __iomem *reg_base);
1027*f1c506d1SElaine Zhang 
1028a245fecbSHeiko Stübner #endif
1029