xref: /openbmc/u-boot/arch/arm/cpu/armv7/bcm281xx/clk-bcm281xx.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2989ce049SDarwin Rambo /*
3989ce049SDarwin Rambo  * Copyright 2013 Broadcom Corporation.
4989ce049SDarwin Rambo  */
5989ce049SDarwin Rambo 
6989ce049SDarwin Rambo /*
7989ce049SDarwin Rambo  *
8989ce049SDarwin Rambo  * bcm281xx-specific clock tables
9989ce049SDarwin Rambo  *
10989ce049SDarwin Rambo  */
11989ce049SDarwin Rambo 
12989ce049SDarwin Rambo #include <common.h>
13989ce049SDarwin Rambo #include <asm/io.h>
141221ce45SMasahiro Yamada #include <linux/errno.h>
15989ce049SDarwin Rambo #include <asm/arch/sysmap.h>
16989ce049SDarwin Rambo #include <asm/kona-common/clk.h>
17989ce049SDarwin Rambo #include "clk-core.h"
18989ce049SDarwin Rambo 
19989ce049SDarwin Rambo #define CLOCK_1K		1000
20989ce049SDarwin Rambo #define CLOCK_1M		(CLOCK_1K * 1000)
21989ce049SDarwin Rambo 
22989ce049SDarwin Rambo /* declare a reference clock */
23989ce049SDarwin Rambo #define DECLARE_REF_CLK(clk_name, clk_parent, clk_rate, clk_div) \
24989ce049SDarwin Rambo static struct refclk clk_name = { \
25989ce049SDarwin Rambo 	.clk    =       { \
26989ce049SDarwin Rambo 		.name   =       #clk_name, \
27989ce049SDarwin Rambo 		.parent =       clk_parent, \
28989ce049SDarwin Rambo 		.rate   =       clk_rate, \
29989ce049SDarwin Rambo 		.div    =       clk_div, \
30989ce049SDarwin Rambo 		.ops    =       &ref_clk_ops, \
31989ce049SDarwin Rambo 	}, \
32989ce049SDarwin Rambo }
33989ce049SDarwin Rambo 
34989ce049SDarwin Rambo /*
35989ce049SDarwin Rambo  * Reference clocks
36989ce049SDarwin Rambo  */
37989ce049SDarwin Rambo 
38989ce049SDarwin Rambo /* Declare a list of reference clocks */
39989ce049SDarwin Rambo DECLARE_REF_CLK(ref_crystal,	0,		26  * CLOCK_1M,	1);
40989ce049SDarwin Rambo DECLARE_REF_CLK(var_96m,	0,		96  * CLOCK_1M,	1);
41989ce049SDarwin Rambo DECLARE_REF_CLK(ref_96m,	0,		96  * CLOCK_1M,	1);
42989ce049SDarwin Rambo DECLARE_REF_CLK(ref_312m,	0,		312 * CLOCK_1M,	0);
43989ce049SDarwin Rambo DECLARE_REF_CLK(ref_104m,	&ref_312m.clk,	104 * CLOCK_1M,	3);
44989ce049SDarwin Rambo DECLARE_REF_CLK(ref_52m,	&ref_104m.clk,	52  * CLOCK_1M,	2);
45989ce049SDarwin Rambo DECLARE_REF_CLK(ref_13m,	&ref_52m.clk,	13  * CLOCK_1M,	4);
46989ce049SDarwin Rambo DECLARE_REF_CLK(var_312m,	0,		312 * CLOCK_1M,	0);
47989ce049SDarwin Rambo DECLARE_REF_CLK(var_104m,	&var_312m.clk,	104 * CLOCK_1M,	3);
48989ce049SDarwin Rambo DECLARE_REF_CLK(var_52m,	&var_104m.clk,	52  * CLOCK_1M,	2);
49989ce049SDarwin Rambo DECLARE_REF_CLK(var_13m,	&var_52m.clk,	13  * CLOCK_1M,	4);
50989ce049SDarwin Rambo 
51989ce049SDarwin Rambo struct refclk_lkup {
52989ce049SDarwin Rambo 	struct refclk *procclk;
53989ce049SDarwin Rambo 	const char *name;
54989ce049SDarwin Rambo };
55989ce049SDarwin Rambo 
56989ce049SDarwin Rambo /* Lookup table for string to clk tranlation */
57989ce049SDarwin Rambo #define MKSTR(x) {&x, #x}
58989ce049SDarwin Rambo static struct refclk_lkup refclk_str_tbl[] = {
59989ce049SDarwin Rambo 	MKSTR(ref_crystal), MKSTR(var_96m), MKSTR(ref_96m),
60989ce049SDarwin Rambo 	MKSTR(ref_312m), MKSTR(ref_104m), MKSTR(ref_52m),
61989ce049SDarwin Rambo 	MKSTR(ref_13m), MKSTR(var_312m), MKSTR(var_104m),
62989ce049SDarwin Rambo 	MKSTR(var_52m), MKSTR(var_13m),
63989ce049SDarwin Rambo };
64989ce049SDarwin Rambo 
65989ce049SDarwin Rambo int refclk_entries = sizeof(refclk_str_tbl)/sizeof(refclk_str_tbl[0]);
66989ce049SDarwin Rambo 
67989ce049SDarwin Rambo /* convert ref clock string to clock structure pointer */
refclk_str_to_clk(const char * name)68989ce049SDarwin Rambo struct refclk *refclk_str_to_clk(const char *name)
69989ce049SDarwin Rambo {
70989ce049SDarwin Rambo 	int i;
71989ce049SDarwin Rambo 	struct refclk_lkup *tblp = refclk_str_tbl;
72989ce049SDarwin Rambo 	for (i = 0; i < refclk_entries; i++, tblp++) {
73989ce049SDarwin Rambo 		if (!(strcmp(name, tblp->name)))
74989ce049SDarwin Rambo 			return tblp->procclk;
75989ce049SDarwin Rambo 	}
76989ce049SDarwin Rambo 	return NULL;
77989ce049SDarwin Rambo }
78989ce049SDarwin Rambo 
79989ce049SDarwin Rambo /* frequency tables indexed by freq_id */
80989ce049SDarwin Rambo unsigned long master_axi_freq_tbl[8] = {
81989ce049SDarwin Rambo 	26 * CLOCK_1M,
82989ce049SDarwin Rambo 	52 * CLOCK_1M,
83989ce049SDarwin Rambo 	104 * CLOCK_1M,
84989ce049SDarwin Rambo 	156 * CLOCK_1M,
85989ce049SDarwin Rambo 	156 * CLOCK_1M,
86989ce049SDarwin Rambo 	208 * CLOCK_1M,
87989ce049SDarwin Rambo 	312 * CLOCK_1M,
88989ce049SDarwin Rambo 	312 * CLOCK_1M
89989ce049SDarwin Rambo };
90989ce049SDarwin Rambo 
91989ce049SDarwin Rambo unsigned long master_ahb_freq_tbl[8] = {
92989ce049SDarwin Rambo 	26 * CLOCK_1M,
93989ce049SDarwin Rambo 	52 * CLOCK_1M,
94989ce049SDarwin Rambo 	52 * CLOCK_1M,
95989ce049SDarwin Rambo 	52 * CLOCK_1M,
96989ce049SDarwin Rambo 	78 * CLOCK_1M,
97989ce049SDarwin Rambo 	104 * CLOCK_1M,
98989ce049SDarwin Rambo 	104 * CLOCK_1M,
99989ce049SDarwin Rambo 	156 * CLOCK_1M
100989ce049SDarwin Rambo };
101989ce049SDarwin Rambo 
102989ce049SDarwin Rambo unsigned long slave_axi_freq_tbl[8] = {
103989ce049SDarwin Rambo 	26 * CLOCK_1M,
104989ce049SDarwin Rambo 	52 * CLOCK_1M,
105989ce049SDarwin Rambo 	78 * CLOCK_1M,
106989ce049SDarwin Rambo 	104 * CLOCK_1M,
107989ce049SDarwin Rambo 	156 * CLOCK_1M,
108989ce049SDarwin Rambo 	156 * CLOCK_1M
109989ce049SDarwin Rambo };
110989ce049SDarwin Rambo 
111989ce049SDarwin Rambo unsigned long slave_apb_freq_tbl[8] = {
112989ce049SDarwin Rambo 	26 * CLOCK_1M,
113989ce049SDarwin Rambo 	26 * CLOCK_1M,
114989ce049SDarwin Rambo 	39 * CLOCK_1M,
115989ce049SDarwin Rambo 	52 * CLOCK_1M,
116989ce049SDarwin Rambo 	52 * CLOCK_1M,
117989ce049SDarwin Rambo 	78 * CLOCK_1M
118989ce049SDarwin Rambo };
119989ce049SDarwin Rambo 
1202d66a0fdSJiandong Zheng unsigned long esub_freq_tbl[8] = {
1212d66a0fdSJiandong Zheng 	78 * CLOCK_1M,
1222d66a0fdSJiandong Zheng 	156 * CLOCK_1M,
1232d66a0fdSJiandong Zheng 	156 * CLOCK_1M,
1242d66a0fdSJiandong Zheng 	156 * CLOCK_1M,
1252d66a0fdSJiandong Zheng 	208 * CLOCK_1M,
1262d66a0fdSJiandong Zheng 	208 * CLOCK_1M,
1272d66a0fdSJiandong Zheng 	208 * CLOCK_1M
1282d66a0fdSJiandong Zheng };
1292d66a0fdSJiandong Zheng 
130989ce049SDarwin Rambo static struct bus_clk_data bsc1_apb_data = {
131989ce049SDarwin Rambo 	.gate = HW_SW_GATE_AUTO(0x0458, 16, 0, 1),
132989ce049SDarwin Rambo };
133989ce049SDarwin Rambo 
134989ce049SDarwin Rambo static struct bus_clk_data bsc2_apb_data = {
135989ce049SDarwin Rambo 	.gate = HW_SW_GATE_AUTO(0x045c, 16, 0, 1),
136989ce049SDarwin Rambo };
137989ce049SDarwin Rambo 
138989ce049SDarwin Rambo static struct bus_clk_data bsc3_apb_data = {
139989ce049SDarwin Rambo 	.gate = HW_SW_GATE_AUTO(0x0484, 16, 0, 1),
140989ce049SDarwin Rambo };
141989ce049SDarwin Rambo 
142989ce049SDarwin Rambo /* * Master CCU clocks */
143989ce049SDarwin Rambo static struct peri_clk_data sdio1_data = {
144989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x0358, 18, 2, 3),
145989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
146989ce049SDarwin Rambo 				 "var_52m",
147989ce049SDarwin Rambo 				 "ref_52m",
148989ce049SDarwin Rambo 				 "var_96m",
149989ce049SDarwin Rambo 				 "ref_96m"),
150989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a28, 0, 3),
151989ce049SDarwin Rambo 	.div		= DIVIDER(0x0a28, 4, 14),
152989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 9),
153989ce049SDarwin Rambo };
154989ce049SDarwin Rambo 
155989ce049SDarwin Rambo static struct peri_clk_data sdio2_data = {
156989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x035c, 18, 2, 3),
157989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
158989ce049SDarwin Rambo 				 "var_52m",
159989ce049SDarwin Rambo 				 "ref_52m",
160989ce049SDarwin Rambo 				 "var_96m",
161989ce049SDarwin Rambo 				 "ref_96m"),
162989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a2c, 0, 3),
163989ce049SDarwin Rambo 	.div		= DIVIDER(0x0a2c, 4, 14),
164989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 10),
165989ce049SDarwin Rambo };
166989ce049SDarwin Rambo 
167989ce049SDarwin Rambo static struct peri_clk_data sdio3_data = {
168989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x0364, 18, 2, 3),
169989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
170989ce049SDarwin Rambo 				 "var_52m",
171989ce049SDarwin Rambo 				 "ref_52m",
172989ce049SDarwin Rambo 				 "var_96m",
173989ce049SDarwin Rambo 				 "ref_96m"),
174989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a34, 0, 3),
175989ce049SDarwin Rambo 	.div		= DIVIDER(0x0a34, 4, 14),
176989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 12),
177989ce049SDarwin Rambo };
178989ce049SDarwin Rambo 
179989ce049SDarwin Rambo static struct peri_clk_data sdio4_data = {
180989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x0360, 18, 2, 3),
181989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
182989ce049SDarwin Rambo 				 "var_52m",
183989ce049SDarwin Rambo 				 "ref_52m",
184989ce049SDarwin Rambo 				 "var_96m",
185989ce049SDarwin Rambo 				 "ref_96m"),
186989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a30, 0, 3),
187989ce049SDarwin Rambo 	.div		= DIVIDER(0x0a30, 4, 14),
188989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 11),
189989ce049SDarwin Rambo };
190989ce049SDarwin Rambo 
191989ce049SDarwin Rambo static struct peri_clk_data sdio1_sleep_data = {
192989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_32k"),
193989ce049SDarwin Rambo 	.gate		= SW_ONLY_GATE(0x0358, 20, 4),
194989ce049SDarwin Rambo };
195989ce049SDarwin Rambo 
196989ce049SDarwin Rambo static struct peri_clk_data sdio2_sleep_data = {
197989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_32k"),
198989ce049SDarwin Rambo 	.gate		= SW_ONLY_GATE(0x035c, 20, 4),
199989ce049SDarwin Rambo };
200989ce049SDarwin Rambo 
201989ce049SDarwin Rambo static struct peri_clk_data sdio3_sleep_data = {
202989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_32k"),
203989ce049SDarwin Rambo 	.gate		= SW_ONLY_GATE(0x0364, 20, 4),
204989ce049SDarwin Rambo };
205989ce049SDarwin Rambo 
206989ce049SDarwin Rambo static struct peri_clk_data sdio4_sleep_data = {
207989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_32k"),
208989ce049SDarwin Rambo 	.gate		= SW_ONLY_GATE(0x0360, 20, 4),
209989ce049SDarwin Rambo };
210989ce049SDarwin Rambo 
2114d013d8fSSteve Rae static struct bus_clk_data usb_otg_ahb_data = {
2124d013d8fSSteve Rae 	.gate		= HW_SW_GATE_AUTO(0x0348, 16, 0, 1),
2134d013d8fSSteve Rae };
2144d013d8fSSteve Rae 
215989ce049SDarwin Rambo static struct bus_clk_data sdio1_ahb_data = {
216989ce049SDarwin Rambo 	.gate		= HW_SW_GATE_AUTO(0x0358, 16, 0, 1),
217989ce049SDarwin Rambo };
218989ce049SDarwin Rambo 
219989ce049SDarwin Rambo static struct bus_clk_data sdio2_ahb_data = {
220989ce049SDarwin Rambo 	.gate		= HW_SW_GATE_AUTO(0x035c, 16, 0, 1),
221989ce049SDarwin Rambo };
222989ce049SDarwin Rambo 
223989ce049SDarwin Rambo static struct bus_clk_data sdio3_ahb_data = {
224989ce049SDarwin Rambo 	.gate		= HW_SW_GATE_AUTO(0x0364, 16, 0, 1),
225989ce049SDarwin Rambo };
226989ce049SDarwin Rambo 
227989ce049SDarwin Rambo static struct bus_clk_data sdio4_ahb_data = {
228989ce049SDarwin Rambo 	.gate		= HW_SW_GATE_AUTO(0x0360, 16, 0, 1),
229989ce049SDarwin Rambo };
230989ce049SDarwin Rambo 
231989ce049SDarwin Rambo /* * Slave CCU clocks */
232989ce049SDarwin Rambo static struct peri_clk_data bsc1_data = {
233989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x0458, 18, 2, 3),
234989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
235989ce049SDarwin Rambo 				 "var_104m",
236989ce049SDarwin Rambo 				 "ref_104m",
237989ce049SDarwin Rambo 				 "var_13m",
238989ce049SDarwin Rambo 				 "ref_13m"),
239989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a64, 0, 3),
240989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 23),
241989ce049SDarwin Rambo };
242989ce049SDarwin Rambo 
243989ce049SDarwin Rambo static struct peri_clk_data bsc2_data = {
244989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x045c, 18, 2, 3),
245989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
246989ce049SDarwin Rambo 				 "var_104m",
247989ce049SDarwin Rambo 				 "ref_104m",
248989ce049SDarwin Rambo 				 "var_13m",
249989ce049SDarwin Rambo 				 "ref_13m"),
250989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a68, 0, 3),
251989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0afc, 24),
252989ce049SDarwin Rambo };
253989ce049SDarwin Rambo 
254989ce049SDarwin Rambo static struct peri_clk_data bsc3_data = {
255989ce049SDarwin Rambo 	.gate		= HW_SW_GATE(0x0484, 18, 2, 3),
256989ce049SDarwin Rambo 	.clocks		= CLOCKS("ref_crystal",
257989ce049SDarwin Rambo 				 "var_104m",
258989ce049SDarwin Rambo 				 "ref_104m",
259989ce049SDarwin Rambo 				 "var_13m",
260989ce049SDarwin Rambo 				 "ref_13m"),
261989ce049SDarwin Rambo 	.sel		= SELECTOR(0x0a84, 0, 3),
262989ce049SDarwin Rambo 	.trig		= TRIGGER(0x0b00, 2),
263989ce049SDarwin Rambo };
264989ce049SDarwin Rambo 
265989ce049SDarwin Rambo /*
266989ce049SDarwin Rambo  * CCU clocks
267989ce049SDarwin Rambo  */
268989ce049SDarwin Rambo 
269989ce049SDarwin Rambo static struct ccu_clock kpm_ccu_clk = {
270989ce049SDarwin Rambo 	.clk = {
271989ce049SDarwin Rambo 		.name = "kpm_ccu_clk",
272989ce049SDarwin Rambo 		.ops = &ccu_clk_ops,
273989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
274989ce049SDarwin Rambo 	},
275989ce049SDarwin Rambo 	.num_policy_masks = 1,
276989ce049SDarwin Rambo 	.policy_freq_offset = 0x00000008,
277989ce049SDarwin Rambo 	.freq_bit_shift = 8,
278989ce049SDarwin Rambo 	.policy_ctl_offset = 0x0000000c,
279989ce049SDarwin Rambo 	.policy0_mask_offset = 0x00000010,
280989ce049SDarwin Rambo 	.policy1_mask_offset = 0x00000014,
281989ce049SDarwin Rambo 	.policy2_mask_offset = 0x00000018,
282989ce049SDarwin Rambo 	.policy3_mask_offset = 0x0000001c,
283989ce049SDarwin Rambo 	.lvm_en_offset = 0x00000034,
284989ce049SDarwin Rambo 	.freq_id = 2,
285989ce049SDarwin Rambo 	.freq_tbl = master_axi_freq_tbl,
286989ce049SDarwin Rambo };
287989ce049SDarwin Rambo 
288989ce049SDarwin Rambo static struct ccu_clock kps_ccu_clk = {
289989ce049SDarwin Rambo 	.clk = {
290989ce049SDarwin Rambo 		.name = "kps_ccu_clk",
291989ce049SDarwin Rambo 		.ops = &ccu_clk_ops,
292989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
293989ce049SDarwin Rambo 	},
294989ce049SDarwin Rambo 	.num_policy_masks = 2,
295989ce049SDarwin Rambo 	.policy_freq_offset = 0x00000008,
296989ce049SDarwin Rambo 	.freq_bit_shift = 8,
297989ce049SDarwin Rambo 	.policy_ctl_offset = 0x0000000c,
298989ce049SDarwin Rambo 	.policy0_mask_offset = 0x00000010,
299989ce049SDarwin Rambo 	.policy1_mask_offset = 0x00000014,
300989ce049SDarwin Rambo 	.policy2_mask_offset = 0x00000018,
301989ce049SDarwin Rambo 	.policy3_mask_offset = 0x0000001c,
302989ce049SDarwin Rambo 	.policy0_mask2_offset = 0x00000048,
303989ce049SDarwin Rambo 	.policy1_mask2_offset = 0x0000004c,
304989ce049SDarwin Rambo 	.policy2_mask2_offset = 0x00000050,
305989ce049SDarwin Rambo 	.policy3_mask2_offset = 0x00000054,
306989ce049SDarwin Rambo 	.lvm_en_offset = 0x00000034,
307989ce049SDarwin Rambo 	.freq_id = 2,
308989ce049SDarwin Rambo 	.freq_tbl = slave_axi_freq_tbl,
309989ce049SDarwin Rambo };
310989ce049SDarwin Rambo 
3112d66a0fdSJiandong Zheng #ifdef CONFIG_BCM_SF2_ETH
3122d66a0fdSJiandong Zheng static struct ccu_clock esub_ccu_clk = {
3132d66a0fdSJiandong Zheng 	.clk = {
3142d66a0fdSJiandong Zheng 		.name = "esub_ccu_clk",
3152d66a0fdSJiandong Zheng 		.ops = &ccu_clk_ops,
3162d66a0fdSJiandong Zheng 		.ccu_clk_mgr_base = ESUB_CLK_BASE_ADDR,
3172d66a0fdSJiandong Zheng 	},
3182d66a0fdSJiandong Zheng 	.num_policy_masks = 1,
3192d66a0fdSJiandong Zheng 	.policy_freq_offset = 0x00000008,
3202d66a0fdSJiandong Zheng 	.freq_bit_shift = 8,
3212d66a0fdSJiandong Zheng 	.policy_ctl_offset = 0x0000000c,
3222d66a0fdSJiandong Zheng 	.policy0_mask_offset = 0x00000010,
3232d66a0fdSJiandong Zheng 	.policy1_mask_offset = 0x00000014,
3242d66a0fdSJiandong Zheng 	.policy2_mask_offset = 0x00000018,
3252d66a0fdSJiandong Zheng 	.policy3_mask_offset = 0x0000001c,
3262d66a0fdSJiandong Zheng 	.lvm_en_offset = 0x00000034,
3272d66a0fdSJiandong Zheng 	.freq_id = 2,
3282d66a0fdSJiandong Zheng 	.freq_tbl = esub_freq_tbl,
3292d66a0fdSJiandong Zheng };
3302d66a0fdSJiandong Zheng #endif
3312d66a0fdSJiandong Zheng 
332989ce049SDarwin Rambo /*
333989ce049SDarwin Rambo  * Bus clocks
334989ce049SDarwin Rambo  */
335989ce049SDarwin Rambo 
336989ce049SDarwin Rambo /* KPM bus clocks */
3374d013d8fSSteve Rae static struct bus_clock usb_otg_ahb_clk = {
3384d013d8fSSteve Rae 	.clk = {
3394d013d8fSSteve Rae 		.name = "usb_otg_ahb_clk",
3404d013d8fSSteve Rae 		.parent = &kpm_ccu_clk.clk,
3414d013d8fSSteve Rae 		.ops = &bus_clk_ops,
3424d013d8fSSteve Rae 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
3434d013d8fSSteve Rae 	},
3444d013d8fSSteve Rae 	.freq_tbl = master_ahb_freq_tbl,
3454d013d8fSSteve Rae 	.data = &usb_otg_ahb_data,
3464d013d8fSSteve Rae };
3474d013d8fSSteve Rae 
348989ce049SDarwin Rambo static struct bus_clock sdio1_ahb_clk = {
349989ce049SDarwin Rambo 	.clk = {
350989ce049SDarwin Rambo 		.name = "sdio1_ahb_clk",
351989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
352989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
353989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
354989ce049SDarwin Rambo 	},
355989ce049SDarwin Rambo 	.freq_tbl = master_ahb_freq_tbl,
356989ce049SDarwin Rambo 	.data = &sdio1_ahb_data,
357989ce049SDarwin Rambo };
358989ce049SDarwin Rambo 
359989ce049SDarwin Rambo static struct bus_clock sdio2_ahb_clk = {
360989ce049SDarwin Rambo 	.clk = {
361989ce049SDarwin Rambo 		.name = "sdio2_ahb_clk",
362989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
363989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
364989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
365989ce049SDarwin Rambo 	},
366989ce049SDarwin Rambo 	.freq_tbl = master_ahb_freq_tbl,
367989ce049SDarwin Rambo 	.data = &sdio2_ahb_data,
368989ce049SDarwin Rambo };
369989ce049SDarwin Rambo 
370989ce049SDarwin Rambo static struct bus_clock sdio3_ahb_clk = {
371989ce049SDarwin Rambo 	.clk = {
372989ce049SDarwin Rambo 		.name = "sdio3_ahb_clk",
373989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
374989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
375989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
376989ce049SDarwin Rambo 	},
377989ce049SDarwin Rambo 	.freq_tbl = master_ahb_freq_tbl,
378989ce049SDarwin Rambo 	.data = &sdio3_ahb_data,
379989ce049SDarwin Rambo };
380989ce049SDarwin Rambo 
381989ce049SDarwin Rambo static struct bus_clock sdio4_ahb_clk = {
382989ce049SDarwin Rambo 	.clk = {
383989ce049SDarwin Rambo 		.name = "sdio4_ahb_clk",
384989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
385989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
386989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
387989ce049SDarwin Rambo 	},
388989ce049SDarwin Rambo 	.freq_tbl = master_ahb_freq_tbl,
389989ce049SDarwin Rambo 	.data = &sdio4_ahb_data,
390989ce049SDarwin Rambo };
391989ce049SDarwin Rambo 
392989ce049SDarwin Rambo static struct bus_clock bsc1_apb_clk = {
393989ce049SDarwin Rambo 	.clk = {
394989ce049SDarwin Rambo 		.name = "bsc1_apb_clk",
395989ce049SDarwin Rambo 		.parent = &kps_ccu_clk.clk,
396989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
397989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
398989ce049SDarwin Rambo 	},
399989ce049SDarwin Rambo 	.freq_tbl = slave_apb_freq_tbl,
400989ce049SDarwin Rambo 	.data = &bsc1_apb_data,
401989ce049SDarwin Rambo };
402989ce049SDarwin Rambo 
403989ce049SDarwin Rambo static struct bus_clock bsc2_apb_clk = {
404989ce049SDarwin Rambo 	.clk = {
405989ce049SDarwin Rambo 		.name = "bsc2_apb_clk",
406989ce049SDarwin Rambo 		.parent = &kps_ccu_clk.clk,
407989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
408989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
409989ce049SDarwin Rambo 		},
410989ce049SDarwin Rambo 	.freq_tbl = slave_apb_freq_tbl,
411989ce049SDarwin Rambo 	.data = &bsc2_apb_data,
412989ce049SDarwin Rambo };
413989ce049SDarwin Rambo 
414989ce049SDarwin Rambo static struct bus_clock bsc3_apb_clk = {
415989ce049SDarwin Rambo 	.clk = {
416989ce049SDarwin Rambo 		.name = "bsc3_apb_clk",
417989ce049SDarwin Rambo 		.parent = &kps_ccu_clk.clk,
418989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
419989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
420989ce049SDarwin Rambo 		},
421989ce049SDarwin Rambo 	.freq_tbl = slave_apb_freq_tbl,
422989ce049SDarwin Rambo 	.data = &bsc3_apb_data,
423989ce049SDarwin Rambo };
424989ce049SDarwin Rambo 
425989ce049SDarwin Rambo /* KPM peripheral */
426989ce049SDarwin Rambo static struct peri_clock sdio1_clk = {
427989ce049SDarwin Rambo 	.clk = {
428989ce049SDarwin Rambo 		.name = "sdio1_clk",
429989ce049SDarwin Rambo 		.parent = &ref_52m.clk,
430989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
431989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
432989ce049SDarwin Rambo 	},
433989ce049SDarwin Rambo 	.data = &sdio1_data,
434989ce049SDarwin Rambo };
435989ce049SDarwin Rambo 
436989ce049SDarwin Rambo static struct peri_clock sdio2_clk = {
437989ce049SDarwin Rambo 	.clk = {
438989ce049SDarwin Rambo 		.name = "sdio2_clk",
439989ce049SDarwin Rambo 		.parent = &ref_52m.clk,
440989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
441989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
442989ce049SDarwin Rambo 	},
443989ce049SDarwin Rambo 	.data = &sdio2_data,
444989ce049SDarwin Rambo };
445989ce049SDarwin Rambo 
446989ce049SDarwin Rambo static struct peri_clock sdio3_clk = {
447989ce049SDarwin Rambo 	.clk = {
448989ce049SDarwin Rambo 		.name = "sdio3_clk",
449989ce049SDarwin Rambo 		.parent = &ref_52m.clk,
450989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
451989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
452989ce049SDarwin Rambo 	},
453989ce049SDarwin Rambo 	.data = &sdio3_data,
454989ce049SDarwin Rambo };
455989ce049SDarwin Rambo 
456989ce049SDarwin Rambo static struct peri_clock sdio4_clk = {
457989ce049SDarwin Rambo 	.clk = {
458989ce049SDarwin Rambo 		.name = "sdio4_clk",
459989ce049SDarwin Rambo 		.parent = &ref_52m.clk,
460989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
461989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
462989ce049SDarwin Rambo 	},
463989ce049SDarwin Rambo 	.data = &sdio4_data,
464989ce049SDarwin Rambo };
465989ce049SDarwin Rambo 
466989ce049SDarwin Rambo static struct peri_clock sdio1_sleep_clk = {
467989ce049SDarwin Rambo 	.clk = {
468989ce049SDarwin Rambo 		.name = "sdio1_sleep_clk",
469989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
470989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
471989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
472989ce049SDarwin Rambo 	},
473989ce049SDarwin Rambo 	.data = &sdio1_sleep_data,
474989ce049SDarwin Rambo };
475989ce049SDarwin Rambo 
476989ce049SDarwin Rambo static struct peri_clock sdio2_sleep_clk = {
477989ce049SDarwin Rambo 	.clk = {
478989ce049SDarwin Rambo 		.name = "sdio2_sleep_clk",
479989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
480989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
481989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
482989ce049SDarwin Rambo 	},
483989ce049SDarwin Rambo 	.data = &sdio2_sleep_data,
484989ce049SDarwin Rambo };
485989ce049SDarwin Rambo 
486989ce049SDarwin Rambo static struct peri_clock sdio3_sleep_clk = {
487989ce049SDarwin Rambo 	.clk = {
488989ce049SDarwin Rambo 		.name = "sdio3_sleep_clk",
489989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
490989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
491989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
492989ce049SDarwin Rambo 	},
493989ce049SDarwin Rambo 	.data = &sdio3_sleep_data,
494989ce049SDarwin Rambo };
495989ce049SDarwin Rambo 
496989ce049SDarwin Rambo static struct peri_clock sdio4_sleep_clk = {
497989ce049SDarwin Rambo 	.clk = {
498989ce049SDarwin Rambo 		.name = "sdio4_sleep_clk",
499989ce049SDarwin Rambo 		.parent = &kpm_ccu_clk.clk,
500989ce049SDarwin Rambo 		.ops = &bus_clk_ops,
501989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
502989ce049SDarwin Rambo 	},
503989ce049SDarwin Rambo 	.data = &sdio4_sleep_data,
504989ce049SDarwin Rambo };
505989ce049SDarwin Rambo 
506989ce049SDarwin Rambo /* KPS peripheral clock */
507989ce049SDarwin Rambo static struct peri_clock bsc1_clk = {
508989ce049SDarwin Rambo 	.clk = {
509989ce049SDarwin Rambo 		.name = "bsc1_clk",
510989ce049SDarwin Rambo 		.parent = &ref_13m.clk,
511989ce049SDarwin Rambo 		.rate = 13 * CLOCK_1M,
512989ce049SDarwin Rambo 		.div = 1,
513989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
514989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
515989ce049SDarwin Rambo 	},
516989ce049SDarwin Rambo 	.data = &bsc1_data,
517989ce049SDarwin Rambo };
518989ce049SDarwin Rambo 
519989ce049SDarwin Rambo static struct peri_clock bsc2_clk = {
520989ce049SDarwin Rambo 	.clk = {
521989ce049SDarwin Rambo 		.name = "bsc2_clk",
522989ce049SDarwin Rambo 		.parent = &ref_13m.clk,
523989ce049SDarwin Rambo 		.rate = 13 * CLOCK_1M,
524989ce049SDarwin Rambo 		.div = 1,
525989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
526989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
527989ce049SDarwin Rambo 	},
528989ce049SDarwin Rambo 	.data = &bsc2_data,
529989ce049SDarwin Rambo };
530989ce049SDarwin Rambo 
531989ce049SDarwin Rambo static struct peri_clock bsc3_clk = {
532989ce049SDarwin Rambo 	.clk = {
533989ce049SDarwin Rambo 		.name = "bsc3_clk",
534989ce049SDarwin Rambo 		.parent = &ref_13m.clk,
535989ce049SDarwin Rambo 		.rate = 13 * CLOCK_1M,
536989ce049SDarwin Rambo 		.div = 1,
537989ce049SDarwin Rambo 		.ops = &peri_clk_ops,
538989ce049SDarwin Rambo 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
539989ce049SDarwin Rambo 	},
540989ce049SDarwin Rambo 	.data = &bsc3_data,
541989ce049SDarwin Rambo };
542989ce049SDarwin Rambo 
543989ce049SDarwin Rambo /* public table for registering clocks */
544989ce049SDarwin Rambo struct clk_lookup arch_clk_tbl[] = {
545989ce049SDarwin Rambo 	/* Peripheral clocks */
546989ce049SDarwin Rambo 	CLK_LK(sdio1),
547989ce049SDarwin Rambo 	CLK_LK(sdio2),
548989ce049SDarwin Rambo 	CLK_LK(sdio3),
549989ce049SDarwin Rambo 	CLK_LK(sdio4),
550989ce049SDarwin Rambo 	CLK_LK(sdio1_sleep),
551989ce049SDarwin Rambo 	CLK_LK(sdio2_sleep),
552989ce049SDarwin Rambo 	CLK_LK(sdio3_sleep),
553989ce049SDarwin Rambo 	CLK_LK(sdio4_sleep),
554989ce049SDarwin Rambo 	CLK_LK(bsc1),
555989ce049SDarwin Rambo 	CLK_LK(bsc2),
556989ce049SDarwin Rambo 	CLK_LK(bsc3),
557989ce049SDarwin Rambo 	/* Bus clocks */
5584d013d8fSSteve Rae 	CLK_LK(usb_otg_ahb),
559989ce049SDarwin Rambo 	CLK_LK(sdio1_ahb),
560989ce049SDarwin Rambo 	CLK_LK(sdio2_ahb),
561989ce049SDarwin Rambo 	CLK_LK(sdio3_ahb),
562989ce049SDarwin Rambo 	CLK_LK(sdio4_ahb),
563989ce049SDarwin Rambo 	CLK_LK(bsc1_apb),
564989ce049SDarwin Rambo 	CLK_LK(bsc2_apb),
565989ce049SDarwin Rambo 	CLK_LK(bsc3_apb),
5662d66a0fdSJiandong Zheng #ifdef CONFIG_BCM_SF2_ETH
5672d66a0fdSJiandong Zheng 	CLK_LK(esub_ccu),
5682d66a0fdSJiandong Zheng #endif
569989ce049SDarwin Rambo };
570989ce049SDarwin Rambo 
571989ce049SDarwin Rambo /* public array size */
572989ce049SDarwin Rambo unsigned int arch_clk_tbl_array_size = ARRAY_SIZE(arch_clk_tbl);
573