xref: /openbmc/linux/drivers/clk/bcm/clk-sr.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1cb849fc5SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2654cdd32SSandeep Tripathy /*
3654cdd32SSandeep Tripathy  * Copyright 2017 Broadcom
4654cdd32SSandeep Tripathy  */
5654cdd32SSandeep Tripathy 
6654cdd32SSandeep Tripathy #include <linux/err.h>
7654cdd32SSandeep Tripathy #include <linux/clk-provider.h>
8*a96cbb14SRob Herring #include <linux/of.h>
9654cdd32SSandeep Tripathy #include <linux/platform_device.h>
10654cdd32SSandeep Tripathy 
11654cdd32SSandeep Tripathy #include <dt-bindings/clock/bcm-sr.h>
12654cdd32SSandeep Tripathy #include "clk-iproc.h"
13654cdd32SSandeep Tripathy 
14654cdd32SSandeep Tripathy #define REG_VAL(o, s, w) { .offset = o, .shift = s, .width = w, }
15654cdd32SSandeep Tripathy 
16654cdd32SSandeep Tripathy #define AON_VAL(o, pw, ps, is) { .offset = o, .pwr_width = pw, \
17654cdd32SSandeep Tripathy 	.pwr_shift = ps, .iso_shift = is }
18654cdd32SSandeep Tripathy 
19654cdd32SSandeep Tripathy #define SW_CTRL_VAL(o, s) { .offset = o, .shift = s, }
20654cdd32SSandeep Tripathy 
21654cdd32SSandeep Tripathy #define RESET_VAL(o, rs, prs) { .offset = o, .reset_shift = rs, \
22654cdd32SSandeep Tripathy 	.p_reset_shift = prs }
23654cdd32SSandeep Tripathy 
24654cdd32SSandeep Tripathy #define DF_VAL(o, kis, kiw, kps, kpw, kas, kaw) { .offset = o, \
25654cdd32SSandeep Tripathy 	.ki_shift = kis, .ki_width = kiw, .kp_shift = kps, .kp_width = kpw, \
26654cdd32SSandeep Tripathy 	.ka_shift = kas, .ka_width = kaw }
27654cdd32SSandeep Tripathy 
28654cdd32SSandeep Tripathy #define VCO_CTRL_VAL(uo, lo) { .u_offset = uo, .l_offset = lo }
29654cdd32SSandeep Tripathy 
30654cdd32SSandeep Tripathy #define ENABLE_VAL(o, es, hs, bs) { .offset = o, .enable_shift = es, \
31654cdd32SSandeep Tripathy 	.hold_shift = hs, .bypass_shift = bs }
32654cdd32SSandeep Tripathy 
33654cdd32SSandeep Tripathy 
34654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_genpll0 = {
35654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC |
36654cdd32SSandeep Tripathy 		IPROC_CLK_PLL_NEEDS_SW_CFG,
37654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 5, 1, 0),
38654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 12, 11),
39654cdd32SSandeep Tripathy 	.dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3),
40654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x10, 31),
41654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x10, 20, 10),
42654cdd32SSandeep Tripathy 	.ndiv_frac = REG_VAL(0x10, 0, 20),
43654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x14, 0, 4),
44654cdd32SSandeep Tripathy 	.status = REG_VAL(0x30, 12, 1),
45654cdd32SSandeep Tripathy };
46654cdd32SSandeep Tripathy 
47654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_genpll0_clk[] = {
485afa881cSPramod Kumar 	[BCM_SR_GENPLL0_125M_CLK] = {
495afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL0_125M_CLK,
50654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
51654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 6, 0, 12),
52654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 0, 9),
53654cdd32SSandeep Tripathy 	},
54654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL0_SCR_CLK] = {
55654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL0_SCR_CLK,
56654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
57654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 7, 1, 13),
58654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 10, 9),
59654cdd32SSandeep Tripathy 	},
60654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL0_250M_CLK] = {
61654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL0_250M_CLK,
62654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
63654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 8, 2, 14),
64654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 20, 9),
65654cdd32SSandeep Tripathy 	},
66654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL0_PCIE_AXI_CLK] = {
67654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL0_PCIE_AXI_CLK,
68654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
69654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 9, 3, 15),
70654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x1c, 0, 9),
71654cdd32SSandeep Tripathy 	},
72654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL0_PAXC_AXI_X2_CLK] = {
73654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL0_PAXC_AXI_X2_CLK,
74654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
75654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 10, 4, 16),
76654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x1c, 10, 9),
77654cdd32SSandeep Tripathy 	},
78654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL0_PAXC_AXI_CLK] = {
79654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL0_PAXC_AXI_CLK,
80654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
81654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 11, 5, 17),
82654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x1c, 20, 9),
83654cdd32SSandeep Tripathy 	},
84654cdd32SSandeep Tripathy };
85654cdd32SSandeep Tripathy 
sr_genpll0_clk_init(struct platform_device * pdev)86654cdd32SSandeep Tripathy static int sr_genpll0_clk_init(struct platform_device *pdev)
87654cdd32SSandeep Tripathy {
88654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
89654cdd32SSandeep Tripathy 			    &sr_genpll0, NULL, 0, sr_genpll0_clk,
90654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_genpll0_clk));
91654cdd32SSandeep Tripathy 	return 0;
92654cdd32SSandeep Tripathy }
93654cdd32SSandeep Tripathy 
945afa881cSPramod Kumar static const struct iproc_pll_ctrl sr_genpll2 = {
955afa881cSPramod Kumar 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC |
965afa881cSPramod Kumar 		IPROC_CLK_PLL_NEEDS_SW_CFG,
975afa881cSPramod Kumar 	.aon = AON_VAL(0x0, 1, 13, 12),
985afa881cSPramod Kumar 	.reset = RESET_VAL(0x0, 12, 11),
995afa881cSPramod Kumar 	.dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3),
1005afa881cSPramod Kumar 	.sw_ctrl = SW_CTRL_VAL(0x10, 31),
1015afa881cSPramod Kumar 	.ndiv_int = REG_VAL(0x10, 20, 10),
1025afa881cSPramod Kumar 	.ndiv_frac = REG_VAL(0x10, 0, 20),
1035afa881cSPramod Kumar 	.pdiv = REG_VAL(0x14, 0, 4),
1045afa881cSPramod Kumar 	.status = REG_VAL(0x30, 12, 1),
1055afa881cSPramod Kumar };
1065afa881cSPramod Kumar 
1075afa881cSPramod Kumar static const struct iproc_clk_ctrl sr_genpll2_clk[] = {
1085afa881cSPramod Kumar 	[BCM_SR_GENPLL2_NIC_CLK] = {
1095afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_NIC_CLK,
1105afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
1115afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 6, 0, 12),
1125afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 0, 9),
1135afa881cSPramod Kumar 	},
1145afa881cSPramod Kumar 	[BCM_SR_GENPLL2_TS_500_CLK] = {
1155afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_TS_500_CLK,
1165afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
1175afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 7, 1, 13),
1185afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 10, 9),
1195afa881cSPramod Kumar 	},
1205afa881cSPramod Kumar 	[BCM_SR_GENPLL2_125_NITRO_CLK] = {
1215afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_125_NITRO_CLK,
1225afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
1235afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 8, 2, 14),
1245afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 20, 9),
1255afa881cSPramod Kumar 	},
1265afa881cSPramod Kumar 	[BCM_SR_GENPLL2_CHIMP_CLK] = {
1275afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_CHIMP_CLK,
1285afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
1295afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 9, 3, 15),
1305afa881cSPramod Kumar 		.mdiv = REG_VAL(0x1c, 0, 9),
1315afa881cSPramod Kumar 	},
1325afa881cSPramod Kumar 	[BCM_SR_GENPLL2_NIC_FLASH_CLK] = {
1335afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_NIC_FLASH_CLK,
1345afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
1355afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 10, 4, 16),
1365afa881cSPramod Kumar 		.mdiv = REG_VAL(0x1c, 10, 9),
1375afa881cSPramod Kumar 	},
1385afa881cSPramod Kumar 	[BCM_SR_GENPLL2_FS4_CLK] = {
1395afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL2_FS4_CLK,
1405afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 11, 5, 17),
1415afa881cSPramod Kumar 		.mdiv = REG_VAL(0x1c, 20, 9),
1425afa881cSPramod Kumar 	},
1435afa881cSPramod Kumar };
1445afa881cSPramod Kumar 
sr_genpll2_clk_init(struct platform_device * pdev)1455afa881cSPramod Kumar static int sr_genpll2_clk_init(struct platform_device *pdev)
1465afa881cSPramod Kumar {
1475afa881cSPramod Kumar 	iproc_pll_clk_setup(pdev->dev.of_node,
1485afa881cSPramod Kumar 			    &sr_genpll2, NULL, 0, sr_genpll2_clk,
1495afa881cSPramod Kumar 			    ARRAY_SIZE(sr_genpll2_clk));
1505afa881cSPramod Kumar 	return 0;
1515afa881cSPramod Kumar }
1525afa881cSPramod Kumar 
153654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_genpll3 = {
154654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC |
155654cdd32SSandeep Tripathy 		IPROC_CLK_PLL_NEEDS_SW_CFG,
156654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 1, 19, 18),
157654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 12, 11),
158654cdd32SSandeep Tripathy 	.dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3),
159654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x10, 31),
160654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x10, 20, 10),
161654cdd32SSandeep Tripathy 	.ndiv_frac = REG_VAL(0x10, 0, 20),
162654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x14, 0, 4),
163654cdd32SSandeep Tripathy 	.status = REG_VAL(0x30, 12, 1),
164654cdd32SSandeep Tripathy };
165654cdd32SSandeep Tripathy 
166654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_genpll3_clk[] = {
167654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL3_HSLS_CLK] = {
168654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL3_HSLS_CLK,
169654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
170654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 6, 0, 12),
171654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 0, 9),
172654cdd32SSandeep Tripathy 	},
173654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL3_SDIO_CLK] = {
174654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL3_SDIO_CLK,
175654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
176654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 7, 1, 13),
177654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 10, 9),
178654cdd32SSandeep Tripathy 	},
179654cdd32SSandeep Tripathy };
180654cdd32SSandeep Tripathy 
sr_genpll3_clk_init(struct device_node * node)181654cdd32SSandeep Tripathy static void sr_genpll3_clk_init(struct device_node *node)
182654cdd32SSandeep Tripathy {
183654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(node, &sr_genpll3, NULL, 0, sr_genpll3_clk,
184654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_genpll3_clk));
185654cdd32SSandeep Tripathy }
186654cdd32SSandeep Tripathy CLK_OF_DECLARE(sr_genpll3_clk, "brcm,sr-genpll3", sr_genpll3_clk_init);
187654cdd32SSandeep Tripathy 
188654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_genpll4 = {
189654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC |
190654cdd32SSandeep Tripathy 		IPROC_CLK_PLL_NEEDS_SW_CFG,
191654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 1, 25, 24),
192654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 12, 11),
193654cdd32SSandeep Tripathy 	.dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3),
194654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x10, 31),
195654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x10, 20, 10),
196654cdd32SSandeep Tripathy 	.ndiv_frac = REG_VAL(0x10, 0, 20),
197654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x14, 0, 4),
198654cdd32SSandeep Tripathy 	.status = REG_VAL(0x30, 12, 1),
199654cdd32SSandeep Tripathy };
200654cdd32SSandeep Tripathy 
201654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_genpll4_clk[] = {
202654cdd32SSandeep Tripathy 	[BCM_SR_GENPLL4_CCN_CLK] = {
203654cdd32SSandeep Tripathy 		.channel = BCM_SR_GENPLL4_CCN_CLK,
204654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
205654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 6, 0, 12),
206654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 0, 9),
207654cdd32SSandeep Tripathy 	},
2085afa881cSPramod Kumar 	[BCM_SR_GENPLL4_TPIU_PLL_CLK] = {
2095afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL4_TPIU_PLL_CLK,
2105afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
2115afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 7, 1, 13),
2125afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 10, 9),
2135afa881cSPramod Kumar 	},
2145afa881cSPramod Kumar 	[BCM_SR_GENPLL4_NOC_CLK] = {
2155afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL4_NOC_CLK,
2165afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
2175afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 8, 2, 14),
2185afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 20, 9),
2195afa881cSPramod Kumar 	},
2205afa881cSPramod Kumar 	[BCM_SR_GENPLL4_CHCLK_FS4_CLK] = {
2215afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL4_CHCLK_FS4_CLK,
2225afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
2235afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 9, 3, 15),
2245afa881cSPramod Kumar 		.mdiv = REG_VAL(0x1c, 0, 9),
2255afa881cSPramod Kumar 	},
2265afa881cSPramod Kumar 	[BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK] = {
2275afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL4_BRIDGE_FSCPU_CLK,
2285afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
2295afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 10, 4, 16),
2305afa881cSPramod Kumar 		.mdiv = REG_VAL(0x1c, 10, 9),
2315afa881cSPramod Kumar 	},
232654cdd32SSandeep Tripathy };
233654cdd32SSandeep Tripathy 
sr_genpll4_clk_init(struct platform_device * pdev)234654cdd32SSandeep Tripathy static int sr_genpll4_clk_init(struct platform_device *pdev)
235654cdd32SSandeep Tripathy {
236654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
237654cdd32SSandeep Tripathy 			    &sr_genpll4, NULL, 0, sr_genpll4_clk,
238654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_genpll4_clk));
239654cdd32SSandeep Tripathy 	return 0;
240654cdd32SSandeep Tripathy }
241654cdd32SSandeep Tripathy 
242654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_genpll5 = {
243654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_HAS_NDIV_FRAC |
244654cdd32SSandeep Tripathy 		IPROC_CLK_PLL_NEEDS_SW_CFG,
245654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 1, 1, 0),
246654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 12, 11),
247654cdd32SSandeep Tripathy 	.dig_filter = DF_VAL(0x0, 4, 3, 0, 4, 7, 3),
248654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x10, 31),
249654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x10, 20, 10),
250654cdd32SSandeep Tripathy 	.ndiv_frac = REG_VAL(0x10, 0, 20),
251654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x14, 0, 4),
252654cdd32SSandeep Tripathy 	.status = REG_VAL(0x30, 12, 1),
253654cdd32SSandeep Tripathy };
254654cdd32SSandeep Tripathy 
255654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_genpll5_clk[] = {
2565afa881cSPramod Kumar 	[BCM_SR_GENPLL5_FS4_HF_CLK] = {
2575afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL5_FS4_HF_CLK,
258654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x4, 6, 0, 12),
259654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 0, 9),
260654cdd32SSandeep Tripathy 	},
2615afa881cSPramod Kumar 	[BCM_SR_GENPLL5_CRYPTO_AE_CLK] = {
2625afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL5_CRYPTO_AE_CLK,
2635afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 7, 1, 12),
264654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x18, 10, 9),
265654cdd32SSandeep Tripathy 	},
2665afa881cSPramod Kumar 	[BCM_SR_GENPLL5_RAID_AE_CLK] = {
2675afa881cSPramod Kumar 		.channel = BCM_SR_GENPLL5_RAID_AE_CLK,
2685afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x4, 8, 2, 14),
2695afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 20, 9),
2705afa881cSPramod Kumar 	},
271654cdd32SSandeep Tripathy };
272654cdd32SSandeep Tripathy 
sr_genpll5_clk_init(struct platform_device * pdev)273654cdd32SSandeep Tripathy static int sr_genpll5_clk_init(struct platform_device *pdev)
274654cdd32SSandeep Tripathy {
275654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
276654cdd32SSandeep Tripathy 			    &sr_genpll5, NULL, 0, sr_genpll5_clk,
277654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_genpll5_clk));
278654cdd32SSandeep Tripathy 	return 0;
279654cdd32SSandeep Tripathy }
280654cdd32SSandeep Tripathy 
281654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_lcpll0 = {
282654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_NEEDS_SW_CFG,
283654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 2, 19, 18),
284654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 31, 30),
285654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x4, 31),
286654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x4, 16, 10),
287654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x4, 26, 4),
288654cdd32SSandeep Tripathy 	.status = REG_VAL(0x38, 12, 1),
289654cdd32SSandeep Tripathy };
290654cdd32SSandeep Tripathy 
291654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_lcpll0_clk[] = {
2925afa881cSPramod Kumar 	[BCM_SR_LCPLL0_SATA_REFP_CLK] = {
2935afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL0_SATA_REFP_CLK,
294654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
295654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x0, 7, 1, 13),
296654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x14, 0, 9),
297654cdd32SSandeep Tripathy 	},
2985afa881cSPramod Kumar 	[BCM_SR_LCPLL0_SATA_REFN_CLK] = {
2995afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL0_SATA_REFN_CLK,
300654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
301654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x0, 8, 2, 14),
302654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x14, 10, 9),
303654cdd32SSandeep Tripathy 	},
3045afa881cSPramod Kumar 	[BCM_SR_LCPLL0_SATA_350_CLK] = {
3055afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL0_SATA_350_CLK,
306654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
307654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x0, 9, 3, 15),
308654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x14, 20, 9),
309654cdd32SSandeep Tripathy 	},
3105afa881cSPramod Kumar 	[BCM_SR_LCPLL0_SATA_500_CLK] = {
3115afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL0_SATA_500_CLK,
3125afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
3135afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x0, 10, 4, 16),
3145afa881cSPramod Kumar 		.mdiv = REG_VAL(0x18, 0, 9),
3155afa881cSPramod Kumar 	},
316654cdd32SSandeep Tripathy };
317654cdd32SSandeep Tripathy 
sr_lcpll0_clk_init(struct platform_device * pdev)318654cdd32SSandeep Tripathy static int sr_lcpll0_clk_init(struct platform_device *pdev)
319654cdd32SSandeep Tripathy {
320654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
321654cdd32SSandeep Tripathy 			    &sr_lcpll0, NULL, 0, sr_lcpll0_clk,
322654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_lcpll0_clk));
323654cdd32SSandeep Tripathy 	return 0;
324654cdd32SSandeep Tripathy }
325654cdd32SSandeep Tripathy 
326654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_lcpll1 = {
327654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_NEEDS_SW_CFG,
328654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 2, 22, 21),
329654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 31, 30),
330654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x4, 31),
331654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x4, 16, 10),
332654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x4, 26, 4),
333654cdd32SSandeep Tripathy 	.status = REG_VAL(0x38, 12, 1),
334654cdd32SSandeep Tripathy };
335654cdd32SSandeep Tripathy 
336654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_lcpll1_clk[] = {
337654cdd32SSandeep Tripathy 	[BCM_SR_LCPLL1_WAN_CLK] = {
338654cdd32SSandeep Tripathy 		.channel = BCM_SR_LCPLL1_WAN_CLK,
339654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
340654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x0, 7, 1, 13),
341654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x14, 0, 9),
342654cdd32SSandeep Tripathy 	},
3435afa881cSPramod Kumar 	[BCM_SR_LCPLL1_USB_REF_CLK] = {
3445afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL1_USB_REF_CLK,
3455afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
3465afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x0, 8, 2, 14),
3475afa881cSPramod Kumar 		.mdiv = REG_VAL(0x14, 10, 9),
3485afa881cSPramod Kumar 	},
3495afa881cSPramod Kumar 	[BCM_SR_LCPLL1_CRMU_TS_CLK] = {
3505afa881cSPramod Kumar 		.channel = BCM_SR_LCPLL1_CRMU_TS_CLK,
3515afa881cSPramod Kumar 		.flags = IPROC_CLK_AON,
3525afa881cSPramod Kumar 		.enable = ENABLE_VAL(0x0, 9, 3, 15),
3535afa881cSPramod Kumar 		.mdiv = REG_VAL(0x14, 20, 9),
3545afa881cSPramod Kumar 	},
355654cdd32SSandeep Tripathy };
356654cdd32SSandeep Tripathy 
sr_lcpll1_clk_init(struct platform_device * pdev)357654cdd32SSandeep Tripathy static int sr_lcpll1_clk_init(struct platform_device *pdev)
358654cdd32SSandeep Tripathy {
359654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
360654cdd32SSandeep Tripathy 			    &sr_lcpll1, NULL, 0, sr_lcpll1_clk,
361654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_lcpll1_clk));
362654cdd32SSandeep Tripathy 	return 0;
363654cdd32SSandeep Tripathy }
364654cdd32SSandeep Tripathy 
365654cdd32SSandeep Tripathy static const struct iproc_pll_ctrl sr_lcpll_pcie = {
366654cdd32SSandeep Tripathy 	.flags = IPROC_CLK_AON | IPROC_CLK_PLL_NEEDS_SW_CFG,
367654cdd32SSandeep Tripathy 	.aon = AON_VAL(0x0, 2, 25, 24),
368654cdd32SSandeep Tripathy 	.reset = RESET_VAL(0x0, 31, 30),
369654cdd32SSandeep Tripathy 	.sw_ctrl = SW_CTRL_VAL(0x4, 31),
370654cdd32SSandeep Tripathy 	.ndiv_int = REG_VAL(0x4, 16, 10),
371654cdd32SSandeep Tripathy 	.pdiv = REG_VAL(0x4, 26, 4),
372654cdd32SSandeep Tripathy 	.status = REG_VAL(0x38, 12, 1),
373654cdd32SSandeep Tripathy };
374654cdd32SSandeep Tripathy 
375654cdd32SSandeep Tripathy static const struct iproc_clk_ctrl sr_lcpll_pcie_clk[] = {
376654cdd32SSandeep Tripathy 	[BCM_SR_LCPLL_PCIE_PHY_REF_CLK] = {
377654cdd32SSandeep Tripathy 		.channel = BCM_SR_LCPLL_PCIE_PHY_REF_CLK,
378654cdd32SSandeep Tripathy 		.flags = IPROC_CLK_AON,
379654cdd32SSandeep Tripathy 		.enable = ENABLE_VAL(0x0, 7, 1, 13),
380654cdd32SSandeep Tripathy 		.mdiv = REG_VAL(0x14, 0, 9),
381654cdd32SSandeep Tripathy 	},
382654cdd32SSandeep Tripathy };
383654cdd32SSandeep Tripathy 
sr_lcpll_pcie_clk_init(struct platform_device * pdev)384654cdd32SSandeep Tripathy static int sr_lcpll_pcie_clk_init(struct platform_device *pdev)
385654cdd32SSandeep Tripathy {
386654cdd32SSandeep Tripathy 	iproc_pll_clk_setup(pdev->dev.of_node,
387654cdd32SSandeep Tripathy 			    &sr_lcpll_pcie, NULL, 0, sr_lcpll_pcie_clk,
388654cdd32SSandeep Tripathy 			    ARRAY_SIZE(sr_lcpll_pcie_clk));
389654cdd32SSandeep Tripathy 	return 0;
390654cdd32SSandeep Tripathy }
391654cdd32SSandeep Tripathy 
392654cdd32SSandeep Tripathy static const struct of_device_id sr_clk_dt_ids[] = {
393654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-genpll0", .data = sr_genpll0_clk_init },
3945afa881cSPramod Kumar 	{ .compatible = "brcm,sr-genpll2", .data = sr_genpll2_clk_init },
395654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-genpll4", .data = sr_genpll4_clk_init },
396654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-genpll5", .data = sr_genpll5_clk_init },
397654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-lcpll0", .data = sr_lcpll0_clk_init },
398654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-lcpll1", .data = sr_lcpll1_clk_init },
399654cdd32SSandeep Tripathy 	{ .compatible = "brcm,sr-lcpll-pcie", .data = sr_lcpll_pcie_clk_init },
400654cdd32SSandeep Tripathy 	{ /* sentinel */ }
401654cdd32SSandeep Tripathy };
402654cdd32SSandeep Tripathy 
sr_clk_probe(struct platform_device * pdev)403654cdd32SSandeep Tripathy static int sr_clk_probe(struct platform_device *pdev)
404654cdd32SSandeep Tripathy {
405654cdd32SSandeep Tripathy 	int (*probe_func)(struct platform_device *);
406654cdd32SSandeep Tripathy 
407654cdd32SSandeep Tripathy 	probe_func = of_device_get_match_data(&pdev->dev);
408654cdd32SSandeep Tripathy 	if (!probe_func)
409654cdd32SSandeep Tripathy 		return -ENODEV;
410654cdd32SSandeep Tripathy 
411654cdd32SSandeep Tripathy 	return probe_func(pdev);
412654cdd32SSandeep Tripathy }
413654cdd32SSandeep Tripathy 
414654cdd32SSandeep Tripathy static struct platform_driver sr_clk_driver = {
415654cdd32SSandeep Tripathy 	.driver = {
416654cdd32SSandeep Tripathy 		.name = "sr-clk",
417654cdd32SSandeep Tripathy 		.of_match_table = sr_clk_dt_ids,
418654cdd32SSandeep Tripathy 	},
419654cdd32SSandeep Tripathy 	.probe = sr_clk_probe,
420654cdd32SSandeep Tripathy };
421654cdd32SSandeep Tripathy builtin_platform_driver(sr_clk_driver);
422