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