2 * Copyright 2013 Broadcom Corporation.
4 * SPDX-License-Identifier: GPL-2.0+
9 * bcm235xx-specific clock tables
15 #include <asm/errno.h>
16 #include <asm/arch/sysmap.h>
17 #include <asm/kona-common/clk.h>
21 #define CLOCK_1M (CLOCK_1K * 1000)
23 /* declare a reference clock */
24 #define DECLARE_REF_CLK(clk_name, clk_parent, clk_rate, clk_div) \
25 static struct refclk clk_name = { \
28 .parent = clk_parent, \
31 .ops = &ref_clk_ops, \
39 /* Declare a list of reference clocks */
40 DECLARE_REF_CLK(ref_crystal
, 0, 26 * CLOCK_1M
, 1);
41 DECLARE_REF_CLK(var_96m
, 0, 96 * CLOCK_1M
, 1);
42 DECLARE_REF_CLK(ref_96m
, 0, 96 * CLOCK_1M
, 1);
43 DECLARE_REF_CLK(ref_312m
, 0, 312 * CLOCK_1M
, 0);
44 DECLARE_REF_CLK(ref_104m
, &ref_312m
.clk
, 104 * CLOCK_1M
, 3);
45 DECLARE_REF_CLK(ref_52m
, &ref_104m
.clk
, 52 * CLOCK_1M
, 2);
46 DECLARE_REF_CLK(ref_13m
, &ref_52m
.clk
, 13 * CLOCK_1M
, 4);
47 DECLARE_REF_CLK(var_312m
, 0, 312 * CLOCK_1M
, 0);
48 DECLARE_REF_CLK(var_104m
, &var_312m
.clk
, 104 * CLOCK_1M
, 3);
49 DECLARE_REF_CLK(var_52m
, &var_104m
.clk
, 52 * CLOCK_1M
, 2);
50 DECLARE_REF_CLK(var_13m
, &var_52m
.clk
, 13 * CLOCK_1M
, 4);
53 struct refclk
*procclk
;
57 /* Lookup table for string to clk tranlation */
58 #define MKSTR(x) {&x, #x}
59 static struct refclk_lkup refclk_str_tbl
[] = {
60 MKSTR(ref_crystal
), MKSTR(var_96m
), MKSTR(ref_96m
),
61 MKSTR(ref_312m
), MKSTR(ref_104m
), MKSTR(ref_52m
),
62 MKSTR(ref_13m
), MKSTR(var_312m
), MKSTR(var_104m
),
63 MKSTR(var_52m
), MKSTR(var_13m
),
66 int refclk_entries
= sizeof(refclk_str_tbl
)/sizeof(refclk_str_tbl
[0]);
68 /* convert ref clock string to clock structure pointer */
69 struct refclk
*refclk_str_to_clk(const char *name
)
72 struct refclk_lkup
*tblp
= refclk_str_tbl
;
73 for (i
= 0; i
< refclk_entries
; i
++, tblp
++) {
74 if (!(strcmp(name
, tblp
->name
)))
80 /* frequency tables indexed by freq_id */
81 unsigned long master_axi_freq_tbl
[8] = {
92 unsigned long master_ahb_freq_tbl
[8] = {
103 unsigned long slave_axi_freq_tbl
[8] = {
112 unsigned long slave_apb_freq_tbl
[8] = {
121 unsigned long esub_freq_tbl
[8] = {
131 static struct bus_clk_data bsc1_apb_data
= {
132 .gate
= HW_SW_GATE_AUTO(0x0458, 16, 0, 1),
135 static struct bus_clk_data bsc2_apb_data
= {
136 .gate
= HW_SW_GATE_AUTO(0x045c, 16, 0, 1),
139 static struct bus_clk_data bsc3_apb_data
= {
140 .gate
= HW_SW_GATE_AUTO(0x0484, 16, 0, 1),
143 /* * Master CCU clocks */
144 static struct peri_clk_data sdio1_data
= {
145 .gate
= HW_SW_GATE(0x0358, 18, 2, 3),
146 .clocks
= CLOCKS("ref_crystal",
151 .sel
= SELECTOR(0x0a28, 0, 3),
152 .div
= DIVIDER(0x0a28, 4, 14),
153 .trig
= TRIGGER(0x0afc, 9),
156 static struct peri_clk_data sdio2_data
= {
157 .gate
= HW_SW_GATE(0x035c, 18, 2, 3),
158 .clocks
= CLOCKS("ref_crystal",
163 .sel
= SELECTOR(0x0a2c, 0, 3),
164 .div
= DIVIDER(0x0a2c, 4, 14),
165 .trig
= TRIGGER(0x0afc, 10),
168 static struct peri_clk_data sdio3_data
= {
169 .gate
= HW_SW_GATE(0x0364, 18, 2, 3),
170 .clocks
= CLOCKS("ref_crystal",
175 .sel
= SELECTOR(0x0a34, 0, 3),
176 .div
= DIVIDER(0x0a34, 4, 14),
177 .trig
= TRIGGER(0x0afc, 12),
180 static struct peri_clk_data sdio4_data
= {
181 .gate
= HW_SW_GATE(0x0360, 18, 2, 3),
182 .clocks
= CLOCKS("ref_crystal",
187 .sel
= SELECTOR(0x0a30, 0, 3),
188 .div
= DIVIDER(0x0a30, 4, 14),
189 .trig
= TRIGGER(0x0afc, 11),
192 static struct peri_clk_data sdio1_sleep_data
= {
193 .clocks
= CLOCKS("ref_32k"),
194 .gate
= SW_ONLY_GATE(0x0358, 20, 4),
197 static struct peri_clk_data sdio2_sleep_data
= {
198 .clocks
= CLOCKS("ref_32k"),
199 .gate
= SW_ONLY_GATE(0x035c, 20, 4),
202 static struct peri_clk_data sdio3_sleep_data
= {
203 .clocks
= CLOCKS("ref_32k"),
204 .gate
= SW_ONLY_GATE(0x0364, 20, 4),
207 static struct peri_clk_data sdio4_sleep_data
= {
208 .clocks
= CLOCKS("ref_32k"),
209 .gate
= SW_ONLY_GATE(0x0360, 20, 4),
212 static struct bus_clk_data usb_otg_ahb_data
= {
213 .gate
= HW_SW_GATE_AUTO(0x0348, 16, 0, 1),
216 static struct bus_clk_data sdio1_ahb_data
= {
217 .gate
= HW_SW_GATE_AUTO(0x0358, 16, 0, 1),
220 static struct bus_clk_data sdio2_ahb_data
= {
221 .gate
= HW_SW_GATE_AUTO(0x035c, 16, 0, 1),
224 static struct bus_clk_data sdio3_ahb_data
= {
225 .gate
= HW_SW_GATE_AUTO(0x0364, 16, 0, 1),
228 static struct bus_clk_data sdio4_ahb_data
= {
229 .gate
= HW_SW_GATE_AUTO(0x0360, 16, 0, 1),
232 /* * Slave CCU clocks */
233 static struct peri_clk_data bsc1_data
= {
234 .gate
= HW_SW_GATE(0x0458, 18, 2, 3),
235 .clocks
= CLOCKS("ref_crystal",
240 .sel
= SELECTOR(0x0a64, 0, 3),
241 .trig
= TRIGGER(0x0afc, 23),
244 static struct peri_clk_data bsc2_data
= {
245 .gate
= HW_SW_GATE(0x045c, 18, 2, 3),
246 .clocks
= CLOCKS("ref_crystal",
251 .sel
= SELECTOR(0x0a68, 0, 3),
252 .trig
= TRIGGER(0x0afc, 24),
255 static struct peri_clk_data bsc3_data
= {
256 .gate
= HW_SW_GATE(0x0484, 18, 2, 3),
257 .clocks
= CLOCKS("ref_crystal",
262 .sel
= SELECTOR(0x0a84, 0, 3),
263 .trig
= TRIGGER(0x0b00, 2),
270 static struct ccu_clock kpm_ccu_clk
= {
272 .name
= "kpm_ccu_clk",
274 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
276 .num_policy_masks
= 1,
277 .policy_freq_offset
= 0x00000008,
279 .policy_ctl_offset
= 0x0000000c,
280 .policy0_mask_offset
= 0x00000010,
281 .policy1_mask_offset
= 0x00000014,
282 .policy2_mask_offset
= 0x00000018,
283 .policy3_mask_offset
= 0x0000001c,
284 .lvm_en_offset
= 0x00000034,
286 .freq_tbl
= master_axi_freq_tbl
,
289 static struct ccu_clock kps_ccu_clk
= {
291 .name
= "kps_ccu_clk",
293 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
295 .num_policy_masks
= 2,
296 .policy_freq_offset
= 0x00000008,
298 .policy_ctl_offset
= 0x0000000c,
299 .policy0_mask_offset
= 0x00000010,
300 .policy1_mask_offset
= 0x00000014,
301 .policy2_mask_offset
= 0x00000018,
302 .policy3_mask_offset
= 0x0000001c,
303 .policy0_mask2_offset
= 0x00000048,
304 .policy1_mask2_offset
= 0x0000004c,
305 .policy2_mask2_offset
= 0x00000050,
306 .policy3_mask2_offset
= 0x00000054,
307 .lvm_en_offset
= 0x00000034,
309 .freq_tbl
= slave_axi_freq_tbl
,
312 #ifdef CONFIG_BCM_SF2_ETH
313 static struct ccu_clock esub_ccu_clk
= {
315 .name
= "esub_ccu_clk",
317 .ccu_clk_mgr_base
= ESUB_CLK_BASE_ADDR
,
319 .num_policy_masks
= 1,
320 .policy_freq_offset
= 0x00000008,
322 .policy_ctl_offset
= 0x0000000c,
323 .policy0_mask_offset
= 0x00000010,
324 .policy1_mask_offset
= 0x00000014,
325 .policy2_mask_offset
= 0x00000018,
326 .policy3_mask_offset
= 0x0000001c,
327 .lvm_en_offset
= 0x00000034,
329 .freq_tbl
= esub_freq_tbl
,
338 static struct bus_clock usb_otg_ahb_clk
= {
340 .name
= "usb_otg_ahb_clk",
341 .parent
= &kpm_ccu_clk
.clk
,
343 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
345 .freq_tbl
= master_ahb_freq_tbl
,
346 .data
= &usb_otg_ahb_data
,
349 static struct bus_clock sdio1_ahb_clk
= {
351 .name
= "sdio1_ahb_clk",
352 .parent
= &kpm_ccu_clk
.clk
,
354 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
356 .freq_tbl
= master_ahb_freq_tbl
,
357 .data
= &sdio1_ahb_data
,
360 static struct bus_clock sdio2_ahb_clk
= {
362 .name
= "sdio2_ahb_clk",
363 .parent
= &kpm_ccu_clk
.clk
,
365 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
367 .freq_tbl
= master_ahb_freq_tbl
,
368 .data
= &sdio2_ahb_data
,
371 static struct bus_clock sdio3_ahb_clk
= {
373 .name
= "sdio3_ahb_clk",
374 .parent
= &kpm_ccu_clk
.clk
,
376 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
378 .freq_tbl
= master_ahb_freq_tbl
,
379 .data
= &sdio3_ahb_data
,
382 static struct bus_clock sdio4_ahb_clk
= {
384 .name
= "sdio4_ahb_clk",
385 .parent
= &kpm_ccu_clk
.clk
,
387 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
389 .freq_tbl
= master_ahb_freq_tbl
,
390 .data
= &sdio4_ahb_data
,
393 static struct bus_clock bsc1_apb_clk
= {
395 .name
= "bsc1_apb_clk",
396 .parent
= &kps_ccu_clk
.clk
,
398 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
400 .freq_tbl
= slave_apb_freq_tbl
,
401 .data
= &bsc1_apb_data
,
404 static struct bus_clock bsc2_apb_clk
= {
406 .name
= "bsc2_apb_clk",
407 .parent
= &kps_ccu_clk
.clk
,
409 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
411 .freq_tbl
= slave_apb_freq_tbl
,
412 .data
= &bsc2_apb_data
,
415 static struct bus_clock bsc3_apb_clk
= {
417 .name
= "bsc3_apb_clk",
418 .parent
= &kps_ccu_clk
.clk
,
420 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
422 .freq_tbl
= slave_apb_freq_tbl
,
423 .data
= &bsc3_apb_data
,
427 static struct peri_clock sdio1_clk
= {
430 .parent
= &ref_52m
.clk
,
431 .ops
= &peri_clk_ops
,
432 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
437 static struct peri_clock sdio2_clk
= {
440 .parent
= &ref_52m
.clk
,
441 .ops
= &peri_clk_ops
,
442 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
447 static struct peri_clock sdio3_clk
= {
450 .parent
= &ref_52m
.clk
,
451 .ops
= &peri_clk_ops
,
452 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
457 static struct peri_clock sdio4_clk
= {
460 .parent
= &ref_52m
.clk
,
461 .ops
= &peri_clk_ops
,
462 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
467 static struct peri_clock sdio1_sleep_clk
= {
469 .name
= "sdio1_sleep_clk",
470 .parent
= &kpm_ccu_clk
.clk
,
472 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
474 .data
= &sdio1_sleep_data
,
477 static struct peri_clock sdio2_sleep_clk
= {
479 .name
= "sdio2_sleep_clk",
480 .parent
= &kpm_ccu_clk
.clk
,
482 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
484 .data
= &sdio2_sleep_data
,
487 static struct peri_clock sdio3_sleep_clk
= {
489 .name
= "sdio3_sleep_clk",
490 .parent
= &kpm_ccu_clk
.clk
,
492 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
494 .data
= &sdio3_sleep_data
,
497 static struct peri_clock sdio4_sleep_clk
= {
499 .name
= "sdio4_sleep_clk",
500 .parent
= &kpm_ccu_clk
.clk
,
502 .ccu_clk_mgr_base
= KONA_MST_CLK_BASE_ADDR
,
504 .data
= &sdio4_sleep_data
,
507 /* KPS peripheral clock */
508 static struct peri_clock bsc1_clk
= {
511 .parent
= &ref_13m
.clk
,
512 .rate
= 13 * CLOCK_1M
,
514 .ops
= &peri_clk_ops
,
515 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
520 static struct peri_clock bsc2_clk
= {
523 .parent
= &ref_13m
.clk
,
524 .rate
= 13 * CLOCK_1M
,
526 .ops
= &peri_clk_ops
,
527 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
532 static struct peri_clock bsc3_clk
= {
535 .parent
= &ref_13m
.clk
,
536 .rate
= 13 * CLOCK_1M
,
538 .ops
= &peri_clk_ops
,
539 .ccu_clk_mgr_base
= KONA_SLV_CLK_BASE_ADDR
,
544 /* public table for registering clocks */
545 struct clk_lookup arch_clk_tbl
[] = {
546 /* Peripheral clocks */
567 #ifdef CONFIG_BCM_SF2_ETH
572 /* public array size */
573 unsigned int arch_clk_tbl_array_size
= ARRAY_SIZE(arch_clk_tbl
);