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