xref: /OK3568_Linux_fs/u-boot/arch/arm/cpu/armv7/bcm281xx/clk-bcm281xx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2013 Broadcom Corporation.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:      GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * bcm281xx-specific clock tables
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <common.h>
14*4882a593Smuzhiyun #include <asm/io.h>
15*4882a593Smuzhiyun #include <linux/errno.h>
16*4882a593Smuzhiyun #include <asm/arch/sysmap.h>
17*4882a593Smuzhiyun #include <asm/kona-common/clk.h>
18*4882a593Smuzhiyun #include "clk-core.h"
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define CLOCK_1K		1000
21*4882a593Smuzhiyun #define CLOCK_1M		(CLOCK_1K * 1000)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* declare a reference clock */
24*4882a593Smuzhiyun #define DECLARE_REF_CLK(clk_name, clk_parent, clk_rate, clk_div) \
25*4882a593Smuzhiyun static struct refclk clk_name = { \
26*4882a593Smuzhiyun 	.clk    =       { \
27*4882a593Smuzhiyun 		.name   =       #clk_name, \
28*4882a593Smuzhiyun 		.parent =       clk_parent, \
29*4882a593Smuzhiyun 		.rate   =       clk_rate, \
30*4882a593Smuzhiyun 		.div    =       clk_div, \
31*4882a593Smuzhiyun 		.ops    =       &ref_clk_ops, \
32*4882a593Smuzhiyun 	}, \
33*4882a593Smuzhiyun }
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /*
36*4882a593Smuzhiyun  * Reference clocks
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* Declare a list of reference clocks */
40*4882a593Smuzhiyun DECLARE_REF_CLK(ref_crystal,	0,		26  * CLOCK_1M,	1);
41*4882a593Smuzhiyun DECLARE_REF_CLK(var_96m,	0,		96  * CLOCK_1M,	1);
42*4882a593Smuzhiyun DECLARE_REF_CLK(ref_96m,	0,		96  * CLOCK_1M,	1);
43*4882a593Smuzhiyun DECLARE_REF_CLK(ref_312m,	0,		312 * CLOCK_1M,	0);
44*4882a593Smuzhiyun DECLARE_REF_CLK(ref_104m,	&ref_312m.clk,	104 * CLOCK_1M,	3);
45*4882a593Smuzhiyun DECLARE_REF_CLK(ref_52m,	&ref_104m.clk,	52  * CLOCK_1M,	2);
46*4882a593Smuzhiyun DECLARE_REF_CLK(ref_13m,	&ref_52m.clk,	13  * CLOCK_1M,	4);
47*4882a593Smuzhiyun DECLARE_REF_CLK(var_312m,	0,		312 * CLOCK_1M,	0);
48*4882a593Smuzhiyun DECLARE_REF_CLK(var_104m,	&var_312m.clk,	104 * CLOCK_1M,	3);
49*4882a593Smuzhiyun DECLARE_REF_CLK(var_52m,	&var_104m.clk,	52  * CLOCK_1M,	2);
50*4882a593Smuzhiyun DECLARE_REF_CLK(var_13m,	&var_52m.clk,	13  * CLOCK_1M,	4);
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun struct refclk_lkup {
53*4882a593Smuzhiyun 	struct refclk *procclk;
54*4882a593Smuzhiyun 	const char *name;
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* Lookup table for string to clk tranlation */
58*4882a593Smuzhiyun #define MKSTR(x) {&x, #x}
59*4882a593Smuzhiyun static struct refclk_lkup refclk_str_tbl[] = {
60*4882a593Smuzhiyun 	MKSTR(ref_crystal), MKSTR(var_96m), MKSTR(ref_96m),
61*4882a593Smuzhiyun 	MKSTR(ref_312m), MKSTR(ref_104m), MKSTR(ref_52m),
62*4882a593Smuzhiyun 	MKSTR(ref_13m), MKSTR(var_312m), MKSTR(var_104m),
63*4882a593Smuzhiyun 	MKSTR(var_52m), MKSTR(var_13m),
64*4882a593Smuzhiyun };
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun int refclk_entries = sizeof(refclk_str_tbl)/sizeof(refclk_str_tbl[0]);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* convert ref clock string to clock structure pointer */
refclk_str_to_clk(const char * name)69*4882a593Smuzhiyun struct refclk *refclk_str_to_clk(const char *name)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun 	int i;
72*4882a593Smuzhiyun 	struct refclk_lkup *tblp = refclk_str_tbl;
73*4882a593Smuzhiyun 	for (i = 0; i < refclk_entries; i++, tblp++) {
74*4882a593Smuzhiyun 		if (!(strcmp(name, tblp->name)))
75*4882a593Smuzhiyun 			return tblp->procclk;
76*4882a593Smuzhiyun 	}
77*4882a593Smuzhiyun 	return NULL;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /* frequency tables indexed by freq_id */
81*4882a593Smuzhiyun unsigned long master_axi_freq_tbl[8] = {
82*4882a593Smuzhiyun 	26 * CLOCK_1M,
83*4882a593Smuzhiyun 	52 * CLOCK_1M,
84*4882a593Smuzhiyun 	104 * CLOCK_1M,
85*4882a593Smuzhiyun 	156 * CLOCK_1M,
86*4882a593Smuzhiyun 	156 * CLOCK_1M,
87*4882a593Smuzhiyun 	208 * CLOCK_1M,
88*4882a593Smuzhiyun 	312 * CLOCK_1M,
89*4882a593Smuzhiyun 	312 * CLOCK_1M
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun unsigned long master_ahb_freq_tbl[8] = {
93*4882a593Smuzhiyun 	26 * CLOCK_1M,
94*4882a593Smuzhiyun 	52 * CLOCK_1M,
95*4882a593Smuzhiyun 	52 * CLOCK_1M,
96*4882a593Smuzhiyun 	52 * CLOCK_1M,
97*4882a593Smuzhiyun 	78 * CLOCK_1M,
98*4882a593Smuzhiyun 	104 * CLOCK_1M,
99*4882a593Smuzhiyun 	104 * CLOCK_1M,
100*4882a593Smuzhiyun 	156 * CLOCK_1M
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun unsigned long slave_axi_freq_tbl[8] = {
104*4882a593Smuzhiyun 	26 * CLOCK_1M,
105*4882a593Smuzhiyun 	52 * CLOCK_1M,
106*4882a593Smuzhiyun 	78 * CLOCK_1M,
107*4882a593Smuzhiyun 	104 * CLOCK_1M,
108*4882a593Smuzhiyun 	156 * CLOCK_1M,
109*4882a593Smuzhiyun 	156 * CLOCK_1M
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun unsigned long slave_apb_freq_tbl[8] = {
113*4882a593Smuzhiyun 	26 * CLOCK_1M,
114*4882a593Smuzhiyun 	26 * CLOCK_1M,
115*4882a593Smuzhiyun 	39 * CLOCK_1M,
116*4882a593Smuzhiyun 	52 * CLOCK_1M,
117*4882a593Smuzhiyun 	52 * CLOCK_1M,
118*4882a593Smuzhiyun 	78 * CLOCK_1M
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun unsigned long esub_freq_tbl[8] = {
122*4882a593Smuzhiyun 	78 * CLOCK_1M,
123*4882a593Smuzhiyun 	156 * CLOCK_1M,
124*4882a593Smuzhiyun 	156 * CLOCK_1M,
125*4882a593Smuzhiyun 	156 * CLOCK_1M,
126*4882a593Smuzhiyun 	208 * CLOCK_1M,
127*4882a593Smuzhiyun 	208 * CLOCK_1M,
128*4882a593Smuzhiyun 	208 * CLOCK_1M
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun static struct bus_clk_data bsc1_apb_data = {
132*4882a593Smuzhiyun 	.gate = HW_SW_GATE_AUTO(0x0458, 16, 0, 1),
133*4882a593Smuzhiyun };
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun static struct bus_clk_data bsc2_apb_data = {
136*4882a593Smuzhiyun 	.gate = HW_SW_GATE_AUTO(0x045c, 16, 0, 1),
137*4882a593Smuzhiyun };
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun static struct bus_clk_data bsc3_apb_data = {
140*4882a593Smuzhiyun 	.gate = HW_SW_GATE_AUTO(0x0484, 16, 0, 1),
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* * Master CCU clocks */
144*4882a593Smuzhiyun static struct peri_clk_data sdio1_data = {
145*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x0358, 18, 2, 3),
146*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
147*4882a593Smuzhiyun 				 "var_52m",
148*4882a593Smuzhiyun 				 "ref_52m",
149*4882a593Smuzhiyun 				 "var_96m",
150*4882a593Smuzhiyun 				 "ref_96m"),
151*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a28, 0, 3),
152*4882a593Smuzhiyun 	.div		= DIVIDER(0x0a28, 4, 14),
153*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 9),
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun static struct peri_clk_data sdio2_data = {
157*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x035c, 18, 2, 3),
158*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
159*4882a593Smuzhiyun 				 "var_52m",
160*4882a593Smuzhiyun 				 "ref_52m",
161*4882a593Smuzhiyun 				 "var_96m",
162*4882a593Smuzhiyun 				 "ref_96m"),
163*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a2c, 0, 3),
164*4882a593Smuzhiyun 	.div		= DIVIDER(0x0a2c, 4, 14),
165*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 10),
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun static struct peri_clk_data sdio3_data = {
169*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x0364, 18, 2, 3),
170*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
171*4882a593Smuzhiyun 				 "var_52m",
172*4882a593Smuzhiyun 				 "ref_52m",
173*4882a593Smuzhiyun 				 "var_96m",
174*4882a593Smuzhiyun 				 "ref_96m"),
175*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a34, 0, 3),
176*4882a593Smuzhiyun 	.div		= DIVIDER(0x0a34, 4, 14),
177*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 12),
178*4882a593Smuzhiyun };
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun static struct peri_clk_data sdio4_data = {
181*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x0360, 18, 2, 3),
182*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
183*4882a593Smuzhiyun 				 "var_52m",
184*4882a593Smuzhiyun 				 "ref_52m",
185*4882a593Smuzhiyun 				 "var_96m",
186*4882a593Smuzhiyun 				 "ref_96m"),
187*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a30, 0, 3),
188*4882a593Smuzhiyun 	.div		= DIVIDER(0x0a30, 4, 14),
189*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 11),
190*4882a593Smuzhiyun };
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun static struct peri_clk_data sdio1_sleep_data = {
193*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_32k"),
194*4882a593Smuzhiyun 	.gate		= SW_ONLY_GATE(0x0358, 20, 4),
195*4882a593Smuzhiyun };
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun static struct peri_clk_data sdio2_sleep_data = {
198*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_32k"),
199*4882a593Smuzhiyun 	.gate		= SW_ONLY_GATE(0x035c, 20, 4),
200*4882a593Smuzhiyun };
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun static struct peri_clk_data sdio3_sleep_data = {
203*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_32k"),
204*4882a593Smuzhiyun 	.gate		= SW_ONLY_GATE(0x0364, 20, 4),
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun static struct peri_clk_data sdio4_sleep_data = {
208*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_32k"),
209*4882a593Smuzhiyun 	.gate		= SW_ONLY_GATE(0x0360, 20, 4),
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun static struct bus_clk_data usb_otg_ahb_data = {
213*4882a593Smuzhiyun 	.gate		= HW_SW_GATE_AUTO(0x0348, 16, 0, 1),
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun static struct bus_clk_data sdio1_ahb_data = {
217*4882a593Smuzhiyun 	.gate		= HW_SW_GATE_AUTO(0x0358, 16, 0, 1),
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun static struct bus_clk_data sdio2_ahb_data = {
221*4882a593Smuzhiyun 	.gate		= HW_SW_GATE_AUTO(0x035c, 16, 0, 1),
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun static struct bus_clk_data sdio3_ahb_data = {
225*4882a593Smuzhiyun 	.gate		= HW_SW_GATE_AUTO(0x0364, 16, 0, 1),
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun static struct bus_clk_data sdio4_ahb_data = {
229*4882a593Smuzhiyun 	.gate		= HW_SW_GATE_AUTO(0x0360, 16, 0, 1),
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /* * Slave CCU clocks */
233*4882a593Smuzhiyun static struct peri_clk_data bsc1_data = {
234*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x0458, 18, 2, 3),
235*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
236*4882a593Smuzhiyun 				 "var_104m",
237*4882a593Smuzhiyun 				 "ref_104m",
238*4882a593Smuzhiyun 				 "var_13m",
239*4882a593Smuzhiyun 				 "ref_13m"),
240*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a64, 0, 3),
241*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 23),
242*4882a593Smuzhiyun };
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun static struct peri_clk_data bsc2_data = {
245*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x045c, 18, 2, 3),
246*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
247*4882a593Smuzhiyun 				 "var_104m",
248*4882a593Smuzhiyun 				 "ref_104m",
249*4882a593Smuzhiyun 				 "var_13m",
250*4882a593Smuzhiyun 				 "ref_13m"),
251*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a68, 0, 3),
252*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0afc, 24),
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun static struct peri_clk_data bsc3_data = {
256*4882a593Smuzhiyun 	.gate		= HW_SW_GATE(0x0484, 18, 2, 3),
257*4882a593Smuzhiyun 	.clocks		= CLOCKS("ref_crystal",
258*4882a593Smuzhiyun 				 "var_104m",
259*4882a593Smuzhiyun 				 "ref_104m",
260*4882a593Smuzhiyun 				 "var_13m",
261*4882a593Smuzhiyun 				 "ref_13m"),
262*4882a593Smuzhiyun 	.sel		= SELECTOR(0x0a84, 0, 3),
263*4882a593Smuzhiyun 	.trig		= TRIGGER(0x0b00, 2),
264*4882a593Smuzhiyun };
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun /*
267*4882a593Smuzhiyun  * CCU clocks
268*4882a593Smuzhiyun  */
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun static struct ccu_clock kpm_ccu_clk = {
271*4882a593Smuzhiyun 	.clk = {
272*4882a593Smuzhiyun 		.name = "kpm_ccu_clk",
273*4882a593Smuzhiyun 		.ops = &ccu_clk_ops,
274*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
275*4882a593Smuzhiyun 	},
276*4882a593Smuzhiyun 	.num_policy_masks = 1,
277*4882a593Smuzhiyun 	.policy_freq_offset = 0x00000008,
278*4882a593Smuzhiyun 	.freq_bit_shift = 8,
279*4882a593Smuzhiyun 	.policy_ctl_offset = 0x0000000c,
280*4882a593Smuzhiyun 	.policy0_mask_offset = 0x00000010,
281*4882a593Smuzhiyun 	.policy1_mask_offset = 0x00000014,
282*4882a593Smuzhiyun 	.policy2_mask_offset = 0x00000018,
283*4882a593Smuzhiyun 	.policy3_mask_offset = 0x0000001c,
284*4882a593Smuzhiyun 	.lvm_en_offset = 0x00000034,
285*4882a593Smuzhiyun 	.freq_id = 2,
286*4882a593Smuzhiyun 	.freq_tbl = master_axi_freq_tbl,
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun static struct ccu_clock kps_ccu_clk = {
290*4882a593Smuzhiyun 	.clk = {
291*4882a593Smuzhiyun 		.name = "kps_ccu_clk",
292*4882a593Smuzhiyun 		.ops = &ccu_clk_ops,
293*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
294*4882a593Smuzhiyun 	},
295*4882a593Smuzhiyun 	.num_policy_masks = 2,
296*4882a593Smuzhiyun 	.policy_freq_offset = 0x00000008,
297*4882a593Smuzhiyun 	.freq_bit_shift = 8,
298*4882a593Smuzhiyun 	.policy_ctl_offset = 0x0000000c,
299*4882a593Smuzhiyun 	.policy0_mask_offset = 0x00000010,
300*4882a593Smuzhiyun 	.policy1_mask_offset = 0x00000014,
301*4882a593Smuzhiyun 	.policy2_mask_offset = 0x00000018,
302*4882a593Smuzhiyun 	.policy3_mask_offset = 0x0000001c,
303*4882a593Smuzhiyun 	.policy0_mask2_offset = 0x00000048,
304*4882a593Smuzhiyun 	.policy1_mask2_offset = 0x0000004c,
305*4882a593Smuzhiyun 	.policy2_mask2_offset = 0x00000050,
306*4882a593Smuzhiyun 	.policy3_mask2_offset = 0x00000054,
307*4882a593Smuzhiyun 	.lvm_en_offset = 0x00000034,
308*4882a593Smuzhiyun 	.freq_id = 2,
309*4882a593Smuzhiyun 	.freq_tbl = slave_axi_freq_tbl,
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun #ifdef CONFIG_BCM_SF2_ETH
313*4882a593Smuzhiyun static struct ccu_clock esub_ccu_clk = {
314*4882a593Smuzhiyun 	.clk = {
315*4882a593Smuzhiyun 		.name = "esub_ccu_clk",
316*4882a593Smuzhiyun 		.ops = &ccu_clk_ops,
317*4882a593Smuzhiyun 		.ccu_clk_mgr_base = ESUB_CLK_BASE_ADDR,
318*4882a593Smuzhiyun 	},
319*4882a593Smuzhiyun 	.num_policy_masks = 1,
320*4882a593Smuzhiyun 	.policy_freq_offset = 0x00000008,
321*4882a593Smuzhiyun 	.freq_bit_shift = 8,
322*4882a593Smuzhiyun 	.policy_ctl_offset = 0x0000000c,
323*4882a593Smuzhiyun 	.policy0_mask_offset = 0x00000010,
324*4882a593Smuzhiyun 	.policy1_mask_offset = 0x00000014,
325*4882a593Smuzhiyun 	.policy2_mask_offset = 0x00000018,
326*4882a593Smuzhiyun 	.policy3_mask_offset = 0x0000001c,
327*4882a593Smuzhiyun 	.lvm_en_offset = 0x00000034,
328*4882a593Smuzhiyun 	.freq_id = 2,
329*4882a593Smuzhiyun 	.freq_tbl = esub_freq_tbl,
330*4882a593Smuzhiyun };
331*4882a593Smuzhiyun #endif
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /*
334*4882a593Smuzhiyun  * Bus clocks
335*4882a593Smuzhiyun  */
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /* KPM bus clocks */
338*4882a593Smuzhiyun static struct bus_clock usb_otg_ahb_clk = {
339*4882a593Smuzhiyun 	.clk = {
340*4882a593Smuzhiyun 		.name = "usb_otg_ahb_clk",
341*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
342*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
343*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
344*4882a593Smuzhiyun 	},
345*4882a593Smuzhiyun 	.freq_tbl = master_ahb_freq_tbl,
346*4882a593Smuzhiyun 	.data = &usb_otg_ahb_data,
347*4882a593Smuzhiyun };
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun static struct bus_clock sdio1_ahb_clk = {
350*4882a593Smuzhiyun 	.clk = {
351*4882a593Smuzhiyun 		.name = "sdio1_ahb_clk",
352*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
353*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
354*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
355*4882a593Smuzhiyun 	},
356*4882a593Smuzhiyun 	.freq_tbl = master_ahb_freq_tbl,
357*4882a593Smuzhiyun 	.data = &sdio1_ahb_data,
358*4882a593Smuzhiyun };
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun static struct bus_clock sdio2_ahb_clk = {
361*4882a593Smuzhiyun 	.clk = {
362*4882a593Smuzhiyun 		.name = "sdio2_ahb_clk",
363*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
364*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
365*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
366*4882a593Smuzhiyun 	},
367*4882a593Smuzhiyun 	.freq_tbl = master_ahb_freq_tbl,
368*4882a593Smuzhiyun 	.data = &sdio2_ahb_data,
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun static struct bus_clock sdio3_ahb_clk = {
372*4882a593Smuzhiyun 	.clk = {
373*4882a593Smuzhiyun 		.name = "sdio3_ahb_clk",
374*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
375*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
376*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
377*4882a593Smuzhiyun 	},
378*4882a593Smuzhiyun 	.freq_tbl = master_ahb_freq_tbl,
379*4882a593Smuzhiyun 	.data = &sdio3_ahb_data,
380*4882a593Smuzhiyun };
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun static struct bus_clock sdio4_ahb_clk = {
383*4882a593Smuzhiyun 	.clk = {
384*4882a593Smuzhiyun 		.name = "sdio4_ahb_clk",
385*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
386*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
387*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
388*4882a593Smuzhiyun 	},
389*4882a593Smuzhiyun 	.freq_tbl = master_ahb_freq_tbl,
390*4882a593Smuzhiyun 	.data = &sdio4_ahb_data,
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun static struct bus_clock bsc1_apb_clk = {
394*4882a593Smuzhiyun 	.clk = {
395*4882a593Smuzhiyun 		.name = "bsc1_apb_clk",
396*4882a593Smuzhiyun 		.parent = &kps_ccu_clk.clk,
397*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
398*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
399*4882a593Smuzhiyun 	},
400*4882a593Smuzhiyun 	.freq_tbl = slave_apb_freq_tbl,
401*4882a593Smuzhiyun 	.data = &bsc1_apb_data,
402*4882a593Smuzhiyun };
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun static struct bus_clock bsc2_apb_clk = {
405*4882a593Smuzhiyun 	.clk = {
406*4882a593Smuzhiyun 		.name = "bsc2_apb_clk",
407*4882a593Smuzhiyun 		.parent = &kps_ccu_clk.clk,
408*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
409*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
410*4882a593Smuzhiyun 		},
411*4882a593Smuzhiyun 	.freq_tbl = slave_apb_freq_tbl,
412*4882a593Smuzhiyun 	.data = &bsc2_apb_data,
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun static struct bus_clock bsc3_apb_clk = {
416*4882a593Smuzhiyun 	.clk = {
417*4882a593Smuzhiyun 		.name = "bsc3_apb_clk",
418*4882a593Smuzhiyun 		.parent = &kps_ccu_clk.clk,
419*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
420*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
421*4882a593Smuzhiyun 		},
422*4882a593Smuzhiyun 	.freq_tbl = slave_apb_freq_tbl,
423*4882a593Smuzhiyun 	.data = &bsc3_apb_data,
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun /* KPM peripheral */
427*4882a593Smuzhiyun static struct peri_clock sdio1_clk = {
428*4882a593Smuzhiyun 	.clk = {
429*4882a593Smuzhiyun 		.name = "sdio1_clk",
430*4882a593Smuzhiyun 		.parent = &ref_52m.clk,
431*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
432*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
433*4882a593Smuzhiyun 	},
434*4882a593Smuzhiyun 	.data = &sdio1_data,
435*4882a593Smuzhiyun };
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun static struct peri_clock sdio2_clk = {
438*4882a593Smuzhiyun 	.clk = {
439*4882a593Smuzhiyun 		.name = "sdio2_clk",
440*4882a593Smuzhiyun 		.parent = &ref_52m.clk,
441*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
442*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
443*4882a593Smuzhiyun 	},
444*4882a593Smuzhiyun 	.data = &sdio2_data,
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun static struct peri_clock sdio3_clk = {
448*4882a593Smuzhiyun 	.clk = {
449*4882a593Smuzhiyun 		.name = "sdio3_clk",
450*4882a593Smuzhiyun 		.parent = &ref_52m.clk,
451*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
452*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
453*4882a593Smuzhiyun 	},
454*4882a593Smuzhiyun 	.data = &sdio3_data,
455*4882a593Smuzhiyun };
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun static struct peri_clock sdio4_clk = {
458*4882a593Smuzhiyun 	.clk = {
459*4882a593Smuzhiyun 		.name = "sdio4_clk",
460*4882a593Smuzhiyun 		.parent = &ref_52m.clk,
461*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
462*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
463*4882a593Smuzhiyun 	},
464*4882a593Smuzhiyun 	.data = &sdio4_data,
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun static struct peri_clock sdio1_sleep_clk = {
468*4882a593Smuzhiyun 	.clk = {
469*4882a593Smuzhiyun 		.name = "sdio1_sleep_clk",
470*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
471*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
472*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
473*4882a593Smuzhiyun 	},
474*4882a593Smuzhiyun 	.data = &sdio1_sleep_data,
475*4882a593Smuzhiyun };
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun static struct peri_clock sdio2_sleep_clk = {
478*4882a593Smuzhiyun 	.clk = {
479*4882a593Smuzhiyun 		.name = "sdio2_sleep_clk",
480*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
481*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
482*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
483*4882a593Smuzhiyun 	},
484*4882a593Smuzhiyun 	.data = &sdio2_sleep_data,
485*4882a593Smuzhiyun };
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun static struct peri_clock sdio3_sleep_clk = {
488*4882a593Smuzhiyun 	.clk = {
489*4882a593Smuzhiyun 		.name = "sdio3_sleep_clk",
490*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
491*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
492*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
493*4882a593Smuzhiyun 	},
494*4882a593Smuzhiyun 	.data = &sdio3_sleep_data,
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun static struct peri_clock sdio4_sleep_clk = {
498*4882a593Smuzhiyun 	.clk = {
499*4882a593Smuzhiyun 		.name = "sdio4_sleep_clk",
500*4882a593Smuzhiyun 		.parent = &kpm_ccu_clk.clk,
501*4882a593Smuzhiyun 		.ops = &bus_clk_ops,
502*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_MST_CLK_BASE_ADDR,
503*4882a593Smuzhiyun 	},
504*4882a593Smuzhiyun 	.data = &sdio4_sleep_data,
505*4882a593Smuzhiyun };
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /* KPS peripheral clock */
508*4882a593Smuzhiyun static struct peri_clock bsc1_clk = {
509*4882a593Smuzhiyun 	.clk = {
510*4882a593Smuzhiyun 		.name = "bsc1_clk",
511*4882a593Smuzhiyun 		.parent = &ref_13m.clk,
512*4882a593Smuzhiyun 		.rate = 13 * CLOCK_1M,
513*4882a593Smuzhiyun 		.div = 1,
514*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
515*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
516*4882a593Smuzhiyun 	},
517*4882a593Smuzhiyun 	.data = &bsc1_data,
518*4882a593Smuzhiyun };
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun static struct peri_clock bsc2_clk = {
521*4882a593Smuzhiyun 	.clk = {
522*4882a593Smuzhiyun 		.name = "bsc2_clk",
523*4882a593Smuzhiyun 		.parent = &ref_13m.clk,
524*4882a593Smuzhiyun 		.rate = 13 * CLOCK_1M,
525*4882a593Smuzhiyun 		.div = 1,
526*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
527*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
528*4882a593Smuzhiyun 	},
529*4882a593Smuzhiyun 	.data = &bsc2_data,
530*4882a593Smuzhiyun };
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun static struct peri_clock bsc3_clk = {
533*4882a593Smuzhiyun 	.clk = {
534*4882a593Smuzhiyun 		.name = "bsc3_clk",
535*4882a593Smuzhiyun 		.parent = &ref_13m.clk,
536*4882a593Smuzhiyun 		.rate = 13 * CLOCK_1M,
537*4882a593Smuzhiyun 		.div = 1,
538*4882a593Smuzhiyun 		.ops = &peri_clk_ops,
539*4882a593Smuzhiyun 		.ccu_clk_mgr_base = KONA_SLV_CLK_BASE_ADDR,
540*4882a593Smuzhiyun 	},
541*4882a593Smuzhiyun 	.data = &bsc3_data,
542*4882a593Smuzhiyun };
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun /* public table for registering clocks */
545*4882a593Smuzhiyun struct clk_lookup arch_clk_tbl[] = {
546*4882a593Smuzhiyun 	/* Peripheral clocks */
547*4882a593Smuzhiyun 	CLK_LK(sdio1),
548*4882a593Smuzhiyun 	CLK_LK(sdio2),
549*4882a593Smuzhiyun 	CLK_LK(sdio3),
550*4882a593Smuzhiyun 	CLK_LK(sdio4),
551*4882a593Smuzhiyun 	CLK_LK(sdio1_sleep),
552*4882a593Smuzhiyun 	CLK_LK(sdio2_sleep),
553*4882a593Smuzhiyun 	CLK_LK(sdio3_sleep),
554*4882a593Smuzhiyun 	CLK_LK(sdio4_sleep),
555*4882a593Smuzhiyun 	CLK_LK(bsc1),
556*4882a593Smuzhiyun 	CLK_LK(bsc2),
557*4882a593Smuzhiyun 	CLK_LK(bsc3),
558*4882a593Smuzhiyun 	/* Bus clocks */
559*4882a593Smuzhiyun 	CLK_LK(usb_otg_ahb),
560*4882a593Smuzhiyun 	CLK_LK(sdio1_ahb),
561*4882a593Smuzhiyun 	CLK_LK(sdio2_ahb),
562*4882a593Smuzhiyun 	CLK_LK(sdio3_ahb),
563*4882a593Smuzhiyun 	CLK_LK(sdio4_ahb),
564*4882a593Smuzhiyun 	CLK_LK(bsc1_apb),
565*4882a593Smuzhiyun 	CLK_LK(bsc2_apb),
566*4882a593Smuzhiyun 	CLK_LK(bsc3_apb),
567*4882a593Smuzhiyun #ifdef CONFIG_BCM_SF2_ETH
568*4882a593Smuzhiyun 	CLK_LK(esub_ccu),
569*4882a593Smuzhiyun #endif
570*4882a593Smuzhiyun };
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun /* public array size */
573*4882a593Smuzhiyun unsigned int arch_clk_tbl_array_size = ARRAY_SIZE(arch_clk_tbl);
574