2 * Copyright (C) 2016-2017 Intel Corporation
4 * SPDX-License-Identifier: GPL-2.0
11 #include <asm/arch/clock_manager.h>
14 static u32 cb_intosc_hz;
15 static u32 f2s_free_hz;
16 static u32 cm_l4_main_clk_hz;
17 static u32 cm_l4_sp_clk_hz;
18 static u32 cm_l4_mp_clk_hz;
19 static u32 cm_l4_sys_free_clk_hz;
46 u32 nocdiv_cstraceclk;
71 u32 gpiodiv_gpiodbclk;
74 struct alteragrp_cfg {
79 static const struct socfpga_clock_manager *clock_manager_base =
80 (struct socfpga_clock_manager *)SOCFPGA_CLKMGR_ADDRESS;
82 static int of_to_struct(const void *blob, int node, int cfg_len, void *cfg)
84 if (fdtdec_get_int_array(blob, node, "altr,of_reg_value",
85 (u32 *)cfg, cfg_len)) {
86 /* could not find required property */
93 static int of_get_input_clks(const void *blob, int node, u32 *val)
95 *val = fdtdec_get_uint(blob, node, "clock-frequency", 0);
102 static int of_get_clk_cfg(const void *blob, struct mainpll_cfg *main_cfg,
103 struct perpll_cfg *per_cfg,
104 struct alteragrp_cfg *altrgrp_cfg)
106 int node, child, len;
107 const char *node_name;
109 node = fdtdec_next_compatible(blob, 0, COMPAT_ALTERA_SOCFPGA_CLK);
113 child = fdt_first_subnode(blob, node);
117 child = fdt_first_subnode(blob, child);
121 node_name = fdt_get_name(blob, child, &len);
124 if (!strcmp(node_name, "osc1")) {
125 if (of_get_input_clks(blob, child, &eosc1_hz))
127 } else if (!strcmp(node_name, "cb_intosc_ls_clk")) {
128 if (of_get_input_clks(blob, child, &cb_intosc_hz))
130 } else if (!strcmp(node_name, "f2s_free_clk")) {
131 if (of_get_input_clks(blob, child, &f2s_free_hz))
133 } else if (!strcmp(node_name, "main_pll")) {
134 if (of_to_struct(blob, child,
135 sizeof(*main_cfg)/sizeof(u32),
138 } else if (!strcmp(node_name, "periph_pll")) {
139 if (of_to_struct(blob, child,
140 sizeof(*per_cfg)/sizeof(u32),
143 } else if (!strcmp(node_name, "altera")) {
144 if (of_to_struct(blob, child,
145 sizeof(*altrgrp_cfg)/sizeof(u32),
149 main_cfg->mpuclk = altrgrp_cfg->mpuclk;
150 main_cfg->nocclk = altrgrp_cfg->nocclk;
152 child = fdt_next_subnode(blob, child);
157 node_name = fdt_get_name(blob, child, &len);
163 /* calculate the intended main VCO frequency based on handoff */
164 static unsigned int cm_calc_handoff_main_vco_clk_hz
165 (struct mainpll_cfg *main_cfg)
169 /* Check main VCO clock source: eosc, intosc or f2s? */
170 switch (main_cfg->vco0_psrc) {
171 case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
174 case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
175 clk_hz = cb_intosc_hz;
177 case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
178 clk_hz = f2s_free_hz;
184 /* calculate the VCO frequency */
185 clk_hz /= 1 + main_cfg->vco1_denom;
186 clk_hz *= 1 + main_cfg->vco1_numer;
191 /* calculate the intended periph VCO frequency based on handoff */
192 static unsigned int cm_calc_handoff_periph_vco_clk_hz(
193 struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
197 /* Check periph VCO clock source: eosc, intosc, f2s or mainpll? */
198 switch (per_cfg->vco0_psrc) {
199 case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
202 case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
203 clk_hz = cb_intosc_hz;
205 case CLKMGR_PERPLL_VCO0_PSRC_F2S:
206 clk_hz = f2s_free_hz;
208 case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
209 clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
210 clk_hz /= main_cfg->cntr15clk_cnt;
216 /* calculate the VCO frequency */
217 clk_hz /= 1 + per_cfg->vco1_denom;
218 clk_hz *= 1 + per_cfg->vco1_numer;
223 /* calculate the intended MPU clock frequency based on handoff */
224 static unsigned int cm_calc_handoff_mpu_clk_hz(struct mainpll_cfg *main_cfg,
225 struct perpll_cfg *per_cfg)
229 /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
230 switch (main_cfg->mpuclk_src) {
231 case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
232 clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
233 clk_hz /= (main_cfg->mpuclk & CLKMGR_MAINPLL_MPUCLK_CNT_MSK)
236 case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
237 clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
238 clk_hz /= ((main_cfg->mpuclk >>
239 CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
240 CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
242 case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
245 case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
246 clk_hz = cb_intosc_hz;
248 case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
249 clk_hz = f2s_free_hz;
255 clk_hz /= main_cfg->mpuclk_cnt + 1;
259 /* calculate the intended NOC clock frequency based on handoff */
260 static unsigned int cm_calc_handoff_noc_clk_hz(struct mainpll_cfg *main_cfg,
261 struct perpll_cfg *per_cfg)
265 /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
266 switch (main_cfg->nocclk_src) {
267 case CLKMGR_MAINPLL_NOCCLK_SRC_MAIN:
268 clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
269 clk_hz /= (main_cfg->nocclk & CLKMGR_MAINPLL_NOCCLK_CNT_MSK)
272 case CLKMGR_MAINPLL_NOCCLK_SRC_PERI:
273 clk_hz = cm_calc_handoff_periph_vco_clk_hz(main_cfg, per_cfg);
274 clk_hz /= ((main_cfg->nocclk >>
275 CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
276 CLKMGR_MAINPLL_NOCCLK_CNT_MSK) + 1;
278 case CLKMGR_MAINPLL_NOCCLK_SRC_OSC1:
281 case CLKMGR_MAINPLL_NOCCLK_SRC_INTOSC:
282 clk_hz = cb_intosc_hz;
284 case CLKMGR_MAINPLL_NOCCLK_SRC_FPGA:
285 clk_hz = f2s_free_hz;
291 clk_hz /= main_cfg->nocclk_cnt + 1;
295 /* return 1 if PLL ramp is required */
296 static int cm_is_pll_ramp_required(int main0periph1,
297 struct mainpll_cfg *main_cfg,
298 struct perpll_cfg *per_cfg)
300 /* Check for main PLL */
301 if (main0periph1 == 0) {
303 * PLL ramp is not required if both MPU clock and NOC clock are
304 * not sourced from main PLL
306 if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
307 main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_MAIN)
311 * PLL ramp is required if MPU clock is sourced from main PLL
312 * and MPU clock is over 900MHz (as advised by HW team)
314 if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN &&
315 (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
316 CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
320 * PLL ramp is required if NOC clock is sourced from main PLL
321 * and NOC clock is over 300MHz (as advised by HW team)
323 if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN &&
324 (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
325 CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
328 } else if (main0periph1 == 1) {
330 * PLL ramp is not required if both MPU clock and NOC clock are
331 * not sourced from periph PLL
333 if (main_cfg->mpuclk_src != CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
334 main_cfg->nocclk_src != CLKMGR_MAINPLL_NOCCLK_SRC_PERI)
338 * PLL ramp is required if MPU clock are source from periph PLL
339 * and MPU clock is over 900MHz (as advised by HW team)
341 if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI &&
342 (cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg) >
343 CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ))
347 * PLL ramp is required if NOC clock are source from periph PLL
348 * and NOC clock is over 300MHz (as advised by HW team)
350 if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI &&
351 (cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg) >
352 CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ))
359 static u32 cm_calculate_numer(struct mainpll_cfg *main_cfg,
360 struct perpll_cfg *per_cfg,
361 u32 safe_hz, u32 clk_hz)
369 if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
370 cnt = main_cfg->mpuclk_cnt;
371 clk = main_cfg->mpuclk;
373 mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
374 denom = main_cfg->vco1_denom;
375 } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
376 cnt = main_cfg->nocclk_cnt;
377 clk = main_cfg->nocclk;
379 mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
380 denom = main_cfg->vco1_denom;
381 } else if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
382 cnt = main_cfg->mpuclk_cnt;
383 clk = main_cfg->mpuclk;
384 shift = CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB;
385 mask = CLKMGR_MAINPLL_MPUCLK_CNT_MSK;
386 denom = per_cfg->vco1_denom;
387 } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
388 cnt = main_cfg->nocclk_cnt;
389 clk = main_cfg->nocclk;
390 shift = CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB;
391 mask = CLKMGR_MAINPLL_NOCCLK_CNT_MSK;
392 denom = per_cfg->vco1_denom;
397 return (safe_hz / clk_hz) * (cnt + 1) * (((clk >> shift) & mask) + 1) *
402 * Calculate the new PLL numerator which is based on existing DTS hand off and
403 * intended safe frequency (safe_hz). Note that PLL ramp is only modifying the
404 * numerator while maintaining denominator as denominator will influence the
405 * jitter condition. Please refer A10 HPS TRM for the jitter guide. Note final
406 * value for numerator is minus with 1 to cater our register value
409 static unsigned int cm_calc_safe_pll_numer(int main0periph1,
410 struct mainpll_cfg *main_cfg,
411 struct perpll_cfg *per_cfg,
412 unsigned int safe_hz)
414 unsigned int clk_hz = 0;
416 /* Check for main PLL */
417 if (main0periph1 == 0) {
418 /* Check main VCO clock source: eosc, intosc or f2s? */
419 switch (main_cfg->vco0_psrc) {
420 case CLKMGR_MAINPLL_VCO0_PSRC_EOSC:
423 case CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC:
424 clk_hz = cb_intosc_hz;
426 case CLKMGR_MAINPLL_VCO0_PSRC_F2S:
427 clk_hz = f2s_free_hz;
432 } else if (main0periph1 == 1) {
433 /* Check periph VCO clock source: eosc, intosc, f2s, mainpll */
434 switch (per_cfg->vco0_psrc) {
435 case CLKMGR_PERPLL_VCO0_PSRC_EOSC:
438 case CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC:
439 clk_hz = cb_intosc_hz;
441 case CLKMGR_PERPLL_VCO0_PSRC_F2S:
442 clk_hz = f2s_free_hz;
444 case CLKMGR_PERPLL_VCO0_PSRC_MAIN:
445 clk_hz = cm_calc_handoff_main_vco_clk_hz(main_cfg);
446 clk_hz /= main_cfg->cntr15clk_cnt;
455 return cm_calculate_numer(main_cfg, per_cfg, safe_hz, clk_hz);
458 /* ramping the main PLL to final value */
459 static void cm_pll_ramp_main(struct mainpll_cfg *main_cfg,
460 struct perpll_cfg *per_cfg,
461 unsigned int pll_ramp_main_hz)
463 unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
465 /* find out the increment value */
466 if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_MAIN) {
467 clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
468 clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
469 } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_MAIN) {
470 clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
471 clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
474 /* execute the ramping here */
475 for (clk_hz = pll_ramp_main_hz + clk_incr_hz;
476 clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
477 writel((main_cfg->vco1_denom <<
478 CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
479 cm_calc_safe_pll_numer(0, main_cfg, per_cfg, clk_hz),
480 &clock_manager_base->main_pll.vco1);
482 cm_wait_for_lock(LOCKED_MASK);
484 writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
485 main_cfg->vco1_numer, &clock_manager_base->main_pll.vco1);
487 cm_wait_for_lock(LOCKED_MASK);
490 /* ramping the periph PLL to final value */
491 static void cm_pll_ramp_periph(struct mainpll_cfg *main_cfg,
492 struct perpll_cfg *per_cfg,
493 unsigned int pll_ramp_periph_hz)
495 unsigned int clk_hz = 0, clk_incr_hz = 0, clk_final_hz = 0;
497 /* find out the increment value */
498 if (main_cfg->mpuclk_src == CLKMGR_MAINPLL_MPUCLK_SRC_PERI) {
499 clk_incr_hz = CLKMGR_PLL_RAMP_MPUCLK_INCREMENT_HZ;
500 clk_final_hz = cm_calc_handoff_mpu_clk_hz(main_cfg, per_cfg);
501 } else if (main_cfg->nocclk_src == CLKMGR_MAINPLL_NOCCLK_SRC_PERI) {
502 clk_incr_hz = CLKMGR_PLL_RAMP_NOCCLK_INCREMENT_HZ;
503 clk_final_hz = cm_calc_handoff_noc_clk_hz(main_cfg, per_cfg);
505 /* execute the ramping here */
506 for (clk_hz = pll_ramp_periph_hz + clk_incr_hz;
507 clk_hz < clk_final_hz; clk_hz += clk_incr_hz) {
508 writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
509 cm_calc_safe_pll_numer(1, main_cfg, per_cfg, clk_hz),
510 &clock_manager_base->per_pll.vco1);
512 cm_wait_for_lock(LOCKED_MASK);
514 writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
515 per_cfg->vco1_numer, &clock_manager_base->per_pll.vco1);
517 cm_wait_for_lock(LOCKED_MASK);
521 * Setup clocks while making no assumptions of the
522 * previous state of the clocks.
524 * Start by being paranoid and gate all sw managed clocks
526 * Put all plls in bypass
528 * Put all plls VCO registers back to reset value (bgpwr dwn).
530 * Put peripheral and main pll src to reset value to avoid glitch.
534 * Deassert bg pwr dn and set numerator and denominator
538 * set internal dividers
540 * Wait for 7 us timer.
544 * Set external dividers while plls are locking
548 * Assert/deassert outreset all.
550 * Take all pll's out of bypass
554 * set source main and peripheral clocks
559 static int cm_full_cfg(struct mainpll_cfg *main_cfg, struct perpll_cfg *per_cfg)
561 unsigned int pll_ramp_main_hz = 0, pll_ramp_periph_hz = 0,
564 /* gate off all mainpll clock excpet HW managed clock */
565 writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
566 CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
567 &clock_manager_base->main_pll.enr);
569 /* now we can gate off the rest of the peripheral clocks */
570 writel(0, &clock_manager_base->per_pll.en);
572 /* Put all plls in external bypass */
573 writel(CLKMGR_MAINPLL_BYPASS_RESET,
574 &clock_manager_base->main_pll.bypasss);
575 writel(CLKMGR_PERPLL_BYPASS_RESET,
576 &clock_manager_base->per_pll.bypasss);
579 * Put all plls VCO registers back to reset value.
580 * Some code might have messed with them. At same time set the
581 * desired clock source
583 writel(CLKMGR_MAINPLL_VCO0_RESET |
584 CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK |
585 (main_cfg->vco0_psrc << CLKMGR_MAINPLL_VCO0_PSRC_LSB),
586 &clock_manager_base->main_pll.vco0);
588 writel(CLKMGR_PERPLL_VCO0_RESET |
589 CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK |
590 (per_cfg->vco0_psrc << CLKMGR_PERPLL_VCO0_PSRC_LSB),
591 &clock_manager_base->per_pll.vco0);
593 writel(CLKMGR_MAINPLL_VCO1_RESET, &clock_manager_base->main_pll.vco1);
594 writel(CLKMGR_PERPLL_VCO1_RESET, &clock_manager_base->per_pll.vco1);
596 /* clear the interrupt register status register */
597 writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
598 CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
599 CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
600 CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
601 CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
602 CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK |
603 CLKMGR_CLKMGR_INTR_MAINPLLACHIEVED_SET_MSK |
604 CLKMGR_CLKMGR_INTR_PERPLLACHIEVED_SET_MSK,
605 &clock_manager_base->intr);
607 /* Program VCO Numerator and Denominator for main PLL */
608 ramp_required = cm_is_pll_ramp_required(0, main_cfg, per_cfg);
610 /* set main PLL to safe starting threshold frequency */
611 if (ramp_required == 1)
612 pll_ramp_main_hz = CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
613 else if (ramp_required == 2)
614 pll_ramp_main_hz = CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
616 writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
617 cm_calc_safe_pll_numer(0, main_cfg, per_cfg,
619 &clock_manager_base->main_pll.vco1);
621 writel((main_cfg->vco1_denom << CLKMGR_MAINPLL_VCO1_DENOM_LSB) |
622 main_cfg->vco1_numer,
623 &clock_manager_base->main_pll.vco1);
625 /* Program VCO Numerator and Denominator for periph PLL */
626 ramp_required = cm_is_pll_ramp_required(1, main_cfg, per_cfg);
628 /* set periph PLL to safe starting threshold frequency */
629 if (ramp_required == 1)
631 CLKMGR_PLL_RAMP_MPUCLK_THRESHOLD_HZ;
632 else if (ramp_required == 2)
634 CLKMGR_PLL_RAMP_NOCCLK_THRESHOLD_HZ;
636 writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
637 cm_calc_safe_pll_numer(1, main_cfg, per_cfg,
639 &clock_manager_base->per_pll.vco1);
641 writel((per_cfg->vco1_denom << CLKMGR_PERPLL_VCO1_DENOM_LSB) |
643 &clock_manager_base->per_pll.vco1);
645 /* Wait for at least 5 us */
648 /* Now deassert BGPWRDN and PWRDN */
649 clrbits_le32(&clock_manager_base->main_pll.vco0,
650 CLKMGR_MAINPLL_VCO0_BGPWRDN_SET_MSK |
651 CLKMGR_MAINPLL_VCO0_PWRDN_SET_MSK);
652 clrbits_le32(&clock_manager_base->per_pll.vco0,
653 CLKMGR_PERPLL_VCO0_BGPWRDN_SET_MSK |
654 CLKMGR_PERPLL_VCO0_PWRDN_SET_MSK);
656 /* Wait for at least 7 us */
659 /* enable the VCO and disable the external regulator to PLL */
660 writel((readl(&clock_manager_base->main_pll.vco0) &
661 ~CLKMGR_MAINPLL_VCO0_REGEXTSEL_SET_MSK) |
662 CLKMGR_MAINPLL_VCO0_EN_SET_MSK,
663 &clock_manager_base->main_pll.vco0);
664 writel((readl(&clock_manager_base->per_pll.vco0) &
665 ~CLKMGR_PERPLL_VCO0_REGEXTSEL_SET_MSK) |
666 CLKMGR_PERPLL_VCO0_EN_SET_MSK,
667 &clock_manager_base->per_pll.vco0);
669 /* setup all the main PLL counter and clock source */
670 writel(main_cfg->nocclk,
671 SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET);
672 writel(main_cfg->mpuclk,
673 SOCFPGA_CLKMGR_ADDRESS + CLKMGR_ALTERAGRP_MPU_CLK_OFFSET);
675 /* main_emaca_clk divider */
676 writel(main_cfg->cntr2clk_cnt, &clock_manager_base->main_pll.cntr2clk);
677 /* main_emacb_clk divider */
678 writel(main_cfg->cntr3clk_cnt, &clock_manager_base->main_pll.cntr3clk);
679 /* main_emac_ptp_clk divider */
680 writel(main_cfg->cntr4clk_cnt, &clock_manager_base->main_pll.cntr4clk);
681 /* main_gpio_db_clk divider */
682 writel(main_cfg->cntr5clk_cnt, &clock_manager_base->main_pll.cntr5clk);
683 /* main_sdmmc_clk divider */
684 writel(main_cfg->cntr6clk_cnt, &clock_manager_base->main_pll.cntr6clk);
685 /* main_s2f_user0_clk divider */
686 writel(main_cfg->cntr7clk_cnt |
687 (main_cfg->cntr7clk_src << CLKMGR_MAINPLL_CNTR7CLK_SRC_LSB),
688 &clock_manager_base->main_pll.cntr7clk);
689 /* main_s2f_user1_clk divider */
690 writel(main_cfg->cntr8clk_cnt, &clock_manager_base->main_pll.cntr8clk);
691 /* main_hmc_pll_clk divider */
692 writel(main_cfg->cntr9clk_cnt |
693 (main_cfg->cntr9clk_src << CLKMGR_MAINPLL_CNTR9CLK_SRC_LSB),
694 &clock_manager_base->main_pll.cntr9clk);
695 /* main_periph_ref_clk divider */
696 writel(main_cfg->cntr15clk_cnt,
697 &clock_manager_base->main_pll.cntr15clk);
699 /* setup all the peripheral PLL counter and clock source */
700 /* peri_emaca_clk divider */
701 writel(per_cfg->cntr2clk_cnt |
702 (per_cfg->cntr2clk_src << CLKMGR_PERPLL_CNTR2CLK_SRC_LSB),
703 &clock_manager_base->per_pll.cntr2clk);
704 /* peri_emacb_clk divider */
705 writel(per_cfg->cntr3clk_cnt |
706 (per_cfg->cntr3clk_src << CLKMGR_PERPLL_CNTR3CLK_SRC_LSB),
707 &clock_manager_base->per_pll.cntr3clk);
708 /* peri_emac_ptp_clk divider */
709 writel(per_cfg->cntr4clk_cnt |
710 (per_cfg->cntr4clk_src << CLKMGR_PERPLL_CNTR4CLK_SRC_LSB),
711 &clock_manager_base->per_pll.cntr4clk);
712 /* peri_gpio_db_clk divider */
713 writel(per_cfg->cntr5clk_cnt |
714 (per_cfg->cntr5clk_src << CLKMGR_PERPLL_CNTR5CLK_SRC_LSB),
715 &clock_manager_base->per_pll.cntr5clk);
716 /* peri_sdmmc_clk divider */
717 writel(per_cfg->cntr6clk_cnt |
718 (per_cfg->cntr6clk_src << CLKMGR_PERPLL_CNTR6CLK_SRC_LSB),
719 &clock_manager_base->per_pll.cntr6clk);
720 /* peri_s2f_user0_clk divider */
721 writel(per_cfg->cntr7clk_cnt, &clock_manager_base->per_pll.cntr7clk);
722 /* peri_s2f_user1_clk divider */
723 writel(per_cfg->cntr8clk_cnt |
724 (per_cfg->cntr8clk_src << CLKMGR_PERPLL_CNTR8CLK_SRC_LSB),
725 &clock_manager_base->per_pll.cntr8clk);
726 /* peri_hmc_pll_clk divider */
727 writel(per_cfg->cntr9clk_cnt, &clock_manager_base->per_pll.cntr9clk);
729 /* setup all the external PLL counter */
730 /* mpu wrapper / external divider */
731 writel(main_cfg->mpuclk_cnt |
732 (main_cfg->mpuclk_src << CLKMGR_MAINPLL_MPUCLK_SRC_LSB),
733 &clock_manager_base->main_pll.mpuclk);
734 /* NOC wrapper / external divider */
735 writel(main_cfg->nocclk_cnt |
736 (main_cfg->nocclk_src << CLKMGR_MAINPLL_NOCCLK_SRC_LSB),
737 &clock_manager_base->main_pll.nocclk);
738 /* NOC subclock divider such as l4 */
739 writel(main_cfg->nocdiv_l4mainclk |
740 (main_cfg->nocdiv_l4mpclk <<
741 CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) |
742 (main_cfg->nocdiv_l4spclk <<
743 CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB) |
744 (main_cfg->nocdiv_csatclk <<
745 CLKMGR_MAINPLL_NOCDIV_CSATCLK_LSB) |
746 (main_cfg->nocdiv_cstraceclk <<
747 CLKMGR_MAINPLL_NOCDIV_CSTRACECLK_LSB) |
748 (main_cfg->nocdiv_cspdbclk <<
749 CLKMGR_MAINPLL_NOCDIV_CSPDBGCLK_LSB),
750 &clock_manager_base->main_pll.nocdiv);
751 /* gpio_db external divider */
752 writel(per_cfg->gpiodiv_gpiodbclk,
753 &clock_manager_base->per_pll.gpiodiv);
755 /* setup the EMAC clock mux select */
756 writel((per_cfg->emacctl_emac0sel <<
757 CLKMGR_PERPLL_EMACCTL_EMAC0SEL_LSB) |
758 (per_cfg->emacctl_emac1sel <<
759 CLKMGR_PERPLL_EMACCTL_EMAC1SEL_LSB) |
760 (per_cfg->emacctl_emac2sel <<
761 CLKMGR_PERPLL_EMACCTL_EMAC2SEL_LSB),
762 &clock_manager_base->per_pll.emacctl);
764 /* at this stage, check for PLL lock status */
765 cm_wait_for_lock(LOCKED_MASK);
768 * after locking, but before taking out of bypass,
769 * assert/deassert outresetall
771 /* assert mainpll outresetall */
772 setbits_le32(&clock_manager_base->main_pll.vco0,
773 CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
774 /* assert perpll outresetall */
775 setbits_le32(&clock_manager_base->per_pll.vco0,
776 CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
777 /* de-assert mainpll outresetall */
778 clrbits_le32(&clock_manager_base->main_pll.vco0,
779 CLKMGR_MAINPLL_VCO0_OUTRSTALL_SET_MSK);
780 /* de-assert perpll outresetall */
781 clrbits_le32(&clock_manager_base->per_pll.vco0,
782 CLKMGR_PERPLL_VCO0_OUTRSTALL_SET_MSK);
784 /* Take all PLLs out of bypass when boot mode is cleared. */
785 /* release mainpll from bypass */
786 writel(CLKMGR_MAINPLL_BYPASS_RESET,
787 &clock_manager_base->main_pll.bypassr);
788 /* wait till Clock Manager is not busy */
791 /* release perpll from bypass */
792 writel(CLKMGR_PERPLL_BYPASS_RESET,
793 &clock_manager_base->per_pll.bypassr);
794 /* wait till Clock Manager is not busy */
797 /* clear boot mode */
798 clrbits_le32(&clock_manager_base->ctrl,
799 CLKMGR_CLKMGR_CTL_BOOTMOD_SET_MSK);
800 /* wait till Clock Manager is not busy */
803 /* At here, we need to ramp to final value if needed */
804 if (pll_ramp_main_hz != 0)
805 cm_pll_ramp_main(main_cfg, per_cfg, pll_ramp_main_hz);
806 if (pll_ramp_periph_hz != 0)
807 cm_pll_ramp_periph(main_cfg, per_cfg, pll_ramp_periph_hz);
809 /* Now ungate non-hw-managed clocks */
810 writel(CLKMGR_MAINPLL_EN_S2FUSER0CLKEN_SET_MSK |
811 CLKMGR_MAINPLL_EN_HMCPLLREFCLKEN_SET_MSK,
812 &clock_manager_base->main_pll.ens);
813 writel(CLKMGR_PERPLL_EN_RESET, &clock_manager_base->per_pll.ens);
815 /* Clear the loss lock and slip bits as they might set during
816 clock reconfiguration */
817 writel(CLKMGR_CLKMGR_INTR_MAINPLLLOST_SET_MSK |
818 CLKMGR_CLKMGR_INTR_PERPLLLOST_SET_MSK |
819 CLKMGR_CLKMGR_INTR_MAINPLLRFSLIP_SET_MSK |
820 CLKMGR_CLKMGR_INTR_PERPLLRFSLIP_SET_MSK |
821 CLKMGR_CLKMGR_INTR_MAINPLLFBSLIP_SET_MSK |
822 CLKMGR_CLKMGR_INTR_PERPLLFBSLIP_SET_MSK,
823 &clock_manager_base->intr);
828 void cm_use_intosc(void)
830 setbits_le32(&clock_manager_base->ctrl,
831 CLKMGR_CLKMGR_CTL_BOOTCLK_INTOSC_SET_MSK);
834 unsigned int cm_get_noc_clk_hz(void)
836 unsigned int clk_src, divisor, nocclk, src_hz;
838 nocclk = readl(&clock_manager_base->main_pll.nocclk);
839 clk_src = (nocclk >> CLKMGR_MAINPLL_NOCCLK_SRC_LSB) &
840 CLKMGR_MAINPLL_NOCCLK_SRC_MSK;
842 divisor = 1 + (nocclk & CLKMGR_MAINPLL_NOCDIV_MSK);
844 if (clk_src == CLKMGR_PERPLLGRP_SRC_MAIN) {
845 src_hz = cm_get_main_vco_clk_hz();
847 (readl(SOCFPGA_CLKMGR_ADDRESS + CLKMGR_MAINPLL_NOC_CLK_OFFSET) &
848 CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
849 } else if (clk_src == CLKMGR_PERPLLGRP_SRC_PERI) {
850 src_hz = cm_get_per_vco_clk_hz();
852 ((readl(SOCFPGA_CLKMGR_ADDRESS +
853 CLKMGR_MAINPLL_NOC_CLK_OFFSET) >>
854 CLKMGR_MAINPLL_NOCCLK_PERICNT_LSB) &
855 CLKMGR_MAINPLL_NOCCLK_CNT_MSK);
856 } else if (clk_src == CLKMGR_PERPLLGRP_SRC_OSC1) {
858 } else if (clk_src == CLKMGR_PERPLLGRP_SRC_INTOSC) {
859 src_hz = cb_intosc_hz;
860 } else if (clk_src == CLKMGR_PERPLLGRP_SRC_FPGA) {
861 src_hz = f2s_free_hz;
866 return src_hz / divisor;
869 unsigned int cm_get_l4_noc_hz(unsigned int nocdivshift)
871 unsigned int divisor2 = 1 <<
872 ((readl(&clock_manager_base->main_pll.nocdiv) >>
873 nocdivshift) & CLKMGR_MAINPLL_NOCDIV_MSK);
875 return cm_get_noc_clk_hz() / divisor2;
878 int cm_basic_init(const void *blob)
880 struct mainpll_cfg main_cfg;
881 struct perpll_cfg per_cfg;
882 struct alteragrp_cfg altrgrp_cfg;
885 /* initialize to zero for use case of optional node */
886 memset(&main_cfg, 0, sizeof(main_cfg));
887 memset(&per_cfg, 0, sizeof(per_cfg));
888 memset(&altrgrp_cfg, 0, sizeof(altrgrp_cfg));
890 rval = of_get_clk_cfg(blob, &main_cfg, &per_cfg, &altrgrp_cfg);
894 rval = cm_full_cfg(&main_cfg, &per_cfg);
897 cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
899 cm_l4_mp_clk_hz = cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
901 cm_l4_sp_clk_hz = cm_get_l4_sp_clk_hz();
903 cm_l4_sys_free_clk_hz = cm_get_noc_clk_hz() / 4;
908 unsigned long cm_get_mpu_clk_hz(void)
911 u32 clk_src, mainmpuclk_reg;
913 mainmpuclk_reg = readl(&clock_manager_base->main_pll.mpuclk);
915 clk_src = (mainmpuclk_reg >> CLKMGR_MAINPLL_MPUCLK_SRC_LSB) &
916 CLKMGR_MAINPLL_MPUCLK_SRC_MSK;
918 reg = readl(&clock_manager_base->altera.mpuclk);
919 /* Check MPU clock source: main, periph, osc1, intosc or f2s? */
921 case CLKMGR_MAINPLL_MPUCLK_SRC_MAIN:
922 clk_hz = cm_get_main_vco_clk_hz();
923 clk_hz /= (reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
925 case CLKMGR_MAINPLL_MPUCLK_SRC_PERI:
926 clk_hz = cm_get_per_vco_clk_hz();
927 clk_hz /= (((reg >> CLKMGR_MAINPLL_MPUCLK_PERICNT_LSB) &
928 CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1);
930 case CLKMGR_MAINPLL_MPUCLK_SRC_OSC1:
933 case CLKMGR_MAINPLL_MPUCLK_SRC_INTOSC:
934 clk_hz = cb_intosc_hz;
936 case CLKMGR_MAINPLL_MPUCLK_SRC_FPGA:
937 clk_hz = f2s_free_hz;
940 printf("cm_get_mpu_clk_hz invalid clk_src %d\n", clk_src);
944 clk_hz /= (mainmpuclk_reg & CLKMGR_MAINPLL_MPUCLK_CNT_MSK) + 1;
949 unsigned int cm_get_per_vco_clk_hz(void)
957 clk_src = readl(&clock_manager_base->per_pll.vco0);
959 clk_src = (clk_src >> CLKMGR_PERPLL_VCO0_PSRC_LSB) &
960 CLKMGR_PERPLL_VCO0_PSRC_MSK;
962 if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_EOSC) {
964 } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_E_INTOSC) {
965 src_hz = cb_intosc_hz;
966 } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_F2S) {
967 src_hz = f2s_free_hz;
968 } else if (clk_src == CLKMGR_PERPLL_VCO0_PSRC_MAIN) {
969 src_hz = cm_get_main_vco_clk_hz();
970 src_hz /= (readl(&clock_manager_base->main_pll.cntr15clk) &
971 CLKMGR_MAINPLL_CNTRCLK_MSK) + 1;
973 printf("cm_get_per_vco_clk_hz invalid clk_src %d\n", clk_src);
977 vco = readl(&clock_manager_base->per_pll.vco1);
979 numer = vco & CLKMGR_PERPLL_VCO1_NUMER_MSK;
981 denom = (vco >> CLKMGR_PERPLL_VCO1_DENOM_LSB) &
982 CLKMGR_PERPLL_VCO1_DENOM_MSK;
991 unsigned int cm_get_main_vco_clk_hz(void)
993 u32 src_hz, numer, denom, vco;
995 u32 clk_src = readl(&clock_manager_base->main_pll.vco0);
997 clk_src = (clk_src >> CLKMGR_MAINPLL_VCO0_PSRC_LSB) &
998 CLKMGR_MAINPLL_VCO0_PSRC_MSK;
1000 if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_EOSC) {
1002 } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_E_INTOSC) {
1003 src_hz = cb_intosc_hz;
1004 } else if (clk_src == CLKMGR_MAINPLL_VCO0_PSRC_F2S) {
1005 src_hz = f2s_free_hz;
1007 printf("cm_get_main_vco_clk_hz invalid clk_src %d\n", clk_src);
1011 vco = readl(&clock_manager_base->main_pll.vco1);
1013 numer = vco & CLKMGR_MAINPLL_VCO1_NUMER_MSK;
1015 denom = (vco >> CLKMGR_MAINPLL_VCO1_DENOM_LSB) &
1016 CLKMGR_MAINPLL_VCO1_DENOM_MSK;
1025 unsigned int cm_get_l4_sp_clk_hz(void)
1027 return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4SPCLK_LSB);
1030 unsigned int cm_get_mmc_controller_clk_hz(void)
1035 clk_input = readl(&clock_manager_base->per_pll.cntr6clk);
1036 clk_input = (clk_input >> CLKMGR_PERPLL_CNTR6CLK_SRC_LSB) &
1037 CLKMGR_PERPLLGRP_SRC_MSK;
1039 switch (clk_input) {
1040 case CLKMGR_PERPLLGRP_SRC_MAIN:
1041 clk_hz = cm_get_main_vco_clk_hz();
1042 clk_hz /= 1 + (readl(&clock_manager_base->main_pll.cntr6clk) &
1043 CLKMGR_MAINPLL_CNTRCLK_MSK);
1046 case CLKMGR_PERPLLGRP_SRC_PERI:
1047 clk_hz = cm_get_per_vco_clk_hz();
1048 clk_hz /= 1 + (readl(&clock_manager_base->per_pll.cntr6clk) &
1049 CLKMGR_PERPLL_CNTRCLK_MSK);
1052 case CLKMGR_PERPLLGRP_SRC_OSC1:
1056 case CLKMGR_PERPLLGRP_SRC_INTOSC:
1057 clk_hz = cb_intosc_hz;
1060 case CLKMGR_PERPLLGRP_SRC_FPGA:
1061 clk_hz = f2s_free_hz;
1068 unsigned int cm_get_spi_controller_clk_hz(void)
1070 return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB);
1073 unsigned int cm_get_qspi_controller_clk_hz(void)
1075 return cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB);
1078 /* Override weak dw_spi_get_clk implementation in designware_spi.c driver */
1079 int dw_spi_get_clk(struct udevice *bus, ulong *rate)
1081 *rate = cm_get_spi_controller_clk_hz();
1086 void cm_print_clock_quick_summary(void)
1088 printf("MPU %10ld kHz\n", cm_get_mpu_clk_hz() / 1000);
1089 printf("MMC %8d kHz\n", cm_get_mmc_controller_clk_hz() / 1000);
1090 printf("QSPI %8d kHz\n", cm_get_qspi_controller_clk_hz() / 1000);
1091 printf("SPI %8d kHz\n", cm_get_spi_controller_clk_hz() / 1000);
1092 printf("EOSC1 %8d kHz\n", eosc1_hz / 1000);
1093 printf("cb_intosc %8d kHz\n", cb_intosc_hz / 1000);
1094 printf("f2s_free %8d kHz\n", f2s_free_hz / 1000);
1095 printf("Main VCO %8d kHz\n", cm_get_main_vco_clk_hz() / 1000);
1096 printf("NOC %8d kHz\n", cm_get_noc_clk_hz() / 1000);
1097 printf("L4 Main %8d kHz\n",
1098 cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MAINCLK_LSB) / 1000);
1099 printf("L4 MP %8d kHz\n",
1100 cm_get_l4_noc_hz(CLKMGR_MAINPLL_NOCDIV_L4MPCLK_LSB) / 1000);
1101 printf("L4 SP %8d kHz\n", cm_get_l4_sp_clk_hz() / 1000);
1102 printf("L4 sys free %8d kHz\n", cm_l4_sys_free_clk_hz / 1000);