2 * This file is part of the coreboot project.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #include <arch/clock.h>
16 #include <device/mmio.h>
17 #include <console/console.h>
19 #include <soc/addressmap.h>
20 #include <soc/clk_rst.h>
21 #include <soc/clock.h>
23 #include <soc/maincpu.h>
25 #include <soc/sysctr.h>
28 static struct clk_rst_ctlr
*clk_rst
= (void *)TEGRA_CLK_RST_BASE
;
29 static struct flow_ctlr
*flow
= (void *)TEGRA_FLOW_BASE
;
30 static struct tegra_pmc_regs
*pmc
= (void *)TEGRA_PMC_BASE
;
31 static struct sysctr_regs
*sysctr
= (void *)TEGRA_SYSCTR0_BASE
;
42 /* Some PLLs have more restrictive divider bit lengths or are missing some
43 * fields. Make sure to use the right struct in the osc_table definition to get
44 * compile-time checking, but keep the bits aligned with struct pll_dividers so
45 * they can be used interchangeably at run time. Add new formats as required. */
46 struct pllcx_dividers
{
53 struct pllpad_dividers
{
62 struct pllu_dividers
{
73 union __attribute__((transparent_union
)) pll_fields
{
75 struct pll_dividers div
;
76 struct pllcx_dividers cx
;
77 struct pllpad_dividers pad
;
78 struct pllu_dividers u
;
81 /* This table defines the frequency dividers for every PLL to turn the external
82 * OSC clock into the frequencies defined by TEGRA_PLL*_KHZ in soc/clock.h.
83 * All PLLs have three dividers (n, m and p), with the governing formula for
84 * the output frequency being CF = (IN / m), VCO = CF * n and OUT = VCO / (2^p).
85 * All divisor configurations must meet the PLL's constraints for VCO and CF:
86 * PLLX: 12 MHz < CF < 50 MHz, 700 MHz < VCO < 3000 MHz
87 * PLLC: 12 MHz < CF < 50 MHz, 600 MHz < VCO < 1400 MHz
88 * PLLM: 12 MHz < CF < 50 MHz, 400 MHz < VCO < 1066 MHz
89 * PLLP: 1 MHz < CF < 6 MHz, 200 MHz < VCO < 700 MHz
90 * PLLD: 1 MHz < CF < 6 MHz, 500 MHz < VCO < 1000 MHz
91 * PLLU: 1 MHz < CF < 6 MHz, 480 MHz < VCO < 960 MHz
92 * PLLDP: 12 MHz < CF < 38 MHz, 600 MHz < VCO < 1200 MHz
93 * (values taken from Linux' drivers/clk/tegra/clk-tegra124.c). */
96 struct pllcx_dividers pllx
; /* target: CONFIG_PLLX_KHZ */
97 struct pllcx_dividers pllc
; /* target: 600 MHz */
98 /* PLLM is set up dynamically by clock_sdram(). */
99 /* PLLP is hardwired to 408 MHz in HW (unless we set BASE_OVRD). */
100 struct pllu_dividers pllu
; /* target; 960 MHz */
101 struct pllcx_dividers plldp
; /* target; 270 MHz */
102 /* PLLDP treats p differently (OUT = VCO / (p + 1) for p < 6). */
103 } static const osc_table
[16] = {
106 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 12000, .m
= 1, .p
= 0},
107 .pllc
= {.n
= 50, .m
= 1, .p
= 0},
108 .pllu
= {.n
= 960, .m
= 12, .p
= 0, .cpcon
= 12, .lfcon
= 2},
109 .plldp
= {.n
= 90, .m
= 1, .p
= 3},
113 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 13000, .m
= 1, .p
= 0},
114 .pllc
= {.n
= 46, .m
= 1, .p
= 0}, /* 598.0 MHz */
115 .pllu
= {.n
= 960, .m
= 13, .p
= 0, .cpcon
= 12, .lfcon
= 2},
116 .plldp
= {.n
= 83, .m
= 1, .p
= 3}, /* 269.8 MHz */
120 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 16800, .m
= 1, .p
= 0},
121 .pllc
= {.n
= 71, .m
= 1, .p
= 1}, /* 596.4 MHz */
122 .pllu
= {.n
= 400, .m
= 7, .p
= 0, .cpcon
= 5, .lfcon
= 2},
123 .plldp
= {.n
= 64, .m
= 1, .p
= 3}, /* 268.8 MHz */
127 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 19200, .m
= 1, .p
= 0},
128 .pllc
= {.n
= 62, .m
= 1, .p
= 1}, /* 595.2 MHz */
129 .pllu
= {.n
= 200, .m
= 4, .p
= 0, .cpcon
= 3, .lfcon
= 2},
130 .plldp
= {.n
= 56, .m
= 1, .p
= 3}, /* 268.8 MHz */
134 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 26000, .m
= 1, .p
= 0},
135 .pllc
= {.n
= 23, .m
= 1, .p
= 0}, /* 598.0 MHz */
136 .pllu
= {.n
= 960, .m
= 26, .p
= 0, .cpcon
= 12, .lfcon
= 2},
137 .plldp
= {.n
= 83, .m
= 2, .p
= 3}, /* 269.8 MHz */
139 /* These oscillators get predivided as PLL inputs... n/m/p divisors for
140 * 38.4 should always match 19.2, and 48 should always match 12. */
143 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 19200, .m
= 1, .p
= 0},
144 .pllc
= {.n
= 62, .m
= 1, .p
= 1}, /* 595.2 MHz */
145 .pllu
= {.n
= 200, .m
= 4, .p
= 0, .cpcon
= 3, .lfcon
= 2},
146 .plldp
= {.n
= 56, .m
= 1, .p
= 3}, /* 268.8 MHz */
150 .pllx
= {.n
= TEGRA_PLLX_KHZ
/ 12000, .m
= 1, .p
= 0},
151 .pllc
= {.n
= 50, .m
= 1, .p
= 0},
152 .pllu
= {.n
= 960, .m
= 12, .p
= 0, .cpcon
= 12, .lfcon
= 2},
153 .plldp
= {.n
= 90, .m
= 1, .p
= 3},
157 /* Get the oscillator frequency, from the corresponding hardware
158 * configuration field. This is actually a per-soc thing. Avoid the
159 * temptation to make it common.
161 static u32
clock_get_osc_bits(void)
163 return (read32(&clk_rst
->osc_ctrl
) & OSC_FREQ_MASK
) >> OSC_FREQ_SHIFT
;
166 int clock_get_osc_khz(void)
168 return osc_table
[clock_get_osc_bits()].khz
;
171 int clock_get_pll_input_khz(void)
173 u32 osc_ctrl
= read32(&clk_rst
->osc_ctrl
);
174 u32 osc_bits
= (osc_ctrl
& OSC_FREQ_MASK
) >> OSC_FREQ_SHIFT
;
175 u32 pll_ref_div
= (osc_ctrl
& OSC_PREDIV_MASK
) >> OSC_PREDIV_SHIFT
;
176 return osc_table
[osc_bits
].khz
>> pll_ref_div
;
179 void clock_init_arm_generic_timer(void)
181 uint32_t freq
= clock_get_osc_khz() * 1000;
182 // Set the cntfrq register.
185 // Record the system timer frequency.
186 write32(&sysctr
->cntfid0
, freq
);
187 // Enable the system counter.
188 uint32_t cntcr
= read32(&sysctr
->cntcr
);
189 cntcr
|= SYSCTR_CNTCR_EN
| SYSCTR_CNTCR_HDBG
;
190 write32(&sysctr
->cntcr
, cntcr
);
193 #define SOR0_CLK_SEL0 (1 << 14)
194 #define SOR0_CLK_SEL1 (1 << 15)
196 void sor_clock_stop(void)
198 /* The Serial Output Resource clock has to be off
199 * before we start the plldp. Learned the hard way.
200 * FIXME: this has to be cleaned up a bit more.
201 * Waiting on some new info from Nvidia.
203 clrbits32(&clk_rst
->clk_src_sor
, SOR0_CLK_SEL0
| SOR0_CLK_SEL1
);
206 void sor_clock_start(void)
208 /* uses PLLP, has a non-standard bit layout. */
209 setbits32(&clk_rst
->clk_src_sor
, SOR0_CLK_SEL0
);
212 static void init_pll(u32
*base
, u32
*misc
, const union pll_fields pll
, u32 lock
)
214 u32 dividers
= pll
.div
.n
<< PLL_BASE_DIVN_SHIFT
|
215 pll
.div
.m
<< PLL_BASE_DIVM_SHIFT
|
216 pll
.div
.p
<< PLL_BASE_DIVP_SHIFT
;
217 u32 misc_con
= pll
.div
.cpcon
<< PLL_MISC_CPCON_SHIFT
|
218 pll
.div
.lfcon
<< PLL_MISC_LFCON_SHIFT
;
220 /* Write dividers but BYPASS the PLL while we're messing with it. */
221 write32(base
, dividers
| PLL_BASE_BYPASS
);
223 * Set Lock bit, CPCON and LFCON fields (default to 0 if it doesn't
224 * exist for this PLL)
226 write32(misc
, lock
| misc_con
);
228 /* Enable PLL and take it back out of BYPASS */
229 write32(base
, dividers
| PLL_BASE_ENABLE
);
231 /* Wait for lock ready */
232 while (!(read32(base
) & PLL_BASE_LOCK
));
235 static void init_utmip_pll(void)
237 int khz
= clock_get_pll_input_khz();
239 /* Shut off PLL crystal clock while we mess with it */
240 clrbits32(&clk_rst
->utmip_pll_cfg2
, 1 << 30); /* PHY_XTAL_CLKEN */
243 write32(&clk_rst
->utmip_pll_cfg0
, /* 960MHz * 1 / 80 == 12 MHz */
244 80 << 16 | /* (rst) phy_divn */
245 1 << 8); /* (rst) phy_divm */
247 write32(&clk_rst
->utmip_pll_cfg1
,
248 DIV_ROUND_UP(khz
, 8000) << 27 | /* pllu_enbl_cnt / 8 (1us) */
249 0 << 16 | /* PLLU pwrdn */
250 0 << 14 | /* pll_enable pwrdn */
251 0 << 12 | /* pll_active pwrdn */
252 DIV_ROUND_UP(khz
, 102) << 0); /* phy_stbl_cnt / 256 (2.5ms) */
254 /* TODO: TRM can't decide if actv is 5us or 10us, keep an eye on it */
255 write32(&clk_rst
->utmip_pll_cfg2
,
256 0 << 24 | /* SAMP_D/XDEV pwrdn */
257 DIV_ROUND_UP(khz
, 3200) << 18 | /* phy_actv_cnt / 16 (5us) */
258 DIV_ROUND_UP(khz
, 256) << 6 | /* pllu_stbl_cnt / 256 (1ms) */
259 0 << 4 | /* SAMP_C/USB3 pwrdn */
260 0 << 2 | /* SAMP_B/XHOST pwrdn */
261 0 << 0); /* SAMP_A/USBD pwrdn */
263 setbits32(&clk_rst
->utmip_pll_cfg2
, 1 << 30); /* PHY_XTAL_CLKEN */
266 /* Graphics just has to be different. There's a few more bits we
267 * need to set in here, but it makes sense just to restrict all the
268 * special bits to this one function.
270 static void graphics_pll(void)
272 int osc
= clock_get_osc_bits();
273 u32
*cfg
= &clk_rst
->plldp_ss_cfg
;
274 /* the vendor code sets the dither bit (28)
275 * an undocumented bit (24)
276 * and clamp while we mess with it (22)
277 * Dither is pretty important to display port
278 * so we really do need to handle these bits.
279 * I'm not willing to not clamp it, even if
280 * it might "mostly work" with it not set,
281 * I don't want to find out in a few months
284 u32 scfg
= (1<<28) | (1<<24) | (1<<22);
286 init_pll(&clk_rst
->plldp_base
, &clk_rst
->plldp_misc
,
287 osc_table
[osc
].plldp
, PLLDPD2_MISC_LOCK_ENABLE
);
288 /* leave dither and undoc bits set, release clamp */
289 scfg
= (1<<28) | (1<<24);
292 /* disp1 will be set when panel information (pixel clock) is
293 * retrieved (clock_display).
298 * Init PLLD clock source.
300 * @frequency: the requested plld frequency
302 * Return the plld frequency if success, otherwise return 0.
305 clock_display(u32 frequency
)
308 * plld (fo) = vco >> p, where 500MHz < vco < 1000MHz
309 * = (cf * n) >> p, where 1MHz < cf < 6MHz
310 * = ((ref / m) * n) >> p
312 * Iterate the possible values of p (3 bits, 2^7) to find out a minimum
313 * safe vco, then find best (m, n). since m has only 5 bits, we can
314 * iterate all possible values. Note Tegra 124 supports 11 bits for n,
315 * but our pll_fields has only 10 bits for n.
317 * Note values undershoot or overshoot target output frequency may not
318 * work if the values are not in "safe" range by panel specification.
320 struct pllpad_dividers plld
= { 0 };
321 u32 ref
= clock_get_pll_input_khz() * 1000, m
, n
, p
= 0;
322 u32 cf
, vco
, rounded_rate
= frequency
;
324 const u32 max_m
= 1 << 5, max_n
= 1 << 10, max_p
= 1 << 3,
325 mhz
= 1000 * 1000, min_vco
= 500 * mhz
, max_vco
= 1000 * mhz
,
326 min_cf
= 1 * mhz
, max_cf
= 6 * mhz
;
328 for (vco
= frequency
; vco
< min_vco
&& p
< max_p
; p
++)
331 if (vco
< min_vco
|| vco
> max_vco
) {
332 printk(BIOS_ERR
, "%s: Cannot find out a supported VCO"
333 " for Frequency (%u).\n", __func__
, frequency
);
340 for (m
= 1; m
< max_m
&& best_diff
; m
++) {
352 if (n
+ 1 < max_n
&& diff
> cf
/ 2) {
357 if (diff
>= best_diff
)
367 else if (plld
.n
< 300)
369 else if (plld
.n
< 600)
375 printk(BIOS_WARNING
, "%s: Failed to match output frequency %u, "
376 "best difference is %u.\n", __func__
, frequency
,
379 rounded_rate
= (ref
/ plld
.m
* plld
.n
) >> plld
.p
;
382 printk(BIOS_DEBUG
, "%s: PLLD=%u ref=%u, m/n/p/cpcon=%u/%u/%u/%u\n",
383 __func__
, rounded_rate
, ref
, plld
.m
, plld
.n
, plld
.p
, plld
.cpcon
);
385 init_pll(&clk_rst
->plld_base
, &clk_rst
->plld_misc
, plld
,
386 (PLLUD_MISC_LOCK_ENABLE
| PLLD_MISC_CLK_ENABLE
));
391 /* Initialize the UART and put it on CLK_M so we can use it during clock_init().
392 * Will later move it to PLLP in clock_config(). The divisor must be very small
393 * to accommodate 12KHz OSCs, so we override the 16.0 UART divider with the 15.1
394 * CLK_SOURCE divider to get more precision. (This might still not be enough for
395 * some OSCs... if you use 13KHz, be prepared to have a bad time.) The 1900 has
396 * been determined through trial and error (must lead to div 13 at 24MHz). */
397 void clock_early_uart(void)
399 write32(&clk_rst
->clk_src_uarta
, CLK_M
<< CLK_SOURCE_SHIFT
|
400 CLK_UART_DIV_OVERRIDE
| CLK_DIVIDER(TEGRA_CLK_M_KHZ
, 1900));
401 setbits32(&clk_rst
->clk_out_enb_l
, CLK_L_UARTA
);
403 clrbits32(&clk_rst
->rst_dev_l
, CLK_L_UARTA
);
406 /* Enable output clock (CLK1~3) for external peripherals. */
407 void clock_external_output(int clk_id
)
411 setbits32(&pmc
->clk_out_cntrl
, 1 << 2);
414 setbits32(&pmc
->clk_out_cntrl
, 1 << 10);
417 setbits32(&pmc
->clk_out_cntrl
, 1 << 18);
420 printk(BIOS_CRIT
, "ERROR: Unknown output clock id %d\n",
426 /* Start PLLM for SDRAM. */
427 void clock_sdram(u32 m
, u32 n
, u32 p
, u32 setup
, u32 ph45
, u32 ph90
,
428 u32 ph135
, u32 kvco
, u32 kcp
, u32 stable_time
, u32 emc_source
,
431 u32 misc1
= ((setup
<< PLLM_MISC1_SETUP_SHIFT
) |
432 (ph45
<< PLLM_MISC1_PD_LSHIFT_PH45_SHIFT
) |
433 (ph90
<< PLLM_MISC1_PD_LSHIFT_PH90_SHIFT
) |
434 (ph135
<< PLLM_MISC1_PD_LSHIFT_PH135_SHIFT
)),
435 misc2
= ((kvco
<< PLLM_MISC2_KVCO_SHIFT
) |
436 (kcp
<< PLLM_MISC2_KCP_SHIFT
)),
440 emc_source
|= CLK_SOURCE_EMC_MC_EMC_SAME_FREQ
;
442 emc_source
&= ~CLK_SOURCE_EMC_MC_EMC_SAME_FREQ
;
445 * Note PLLM_BASE.PLLM_OUT1_RSTN must be in RESET_ENABLE mode, and
446 * PLLM_BASE.ENABLE must be in DISABLE state (both are the default
447 * values after coldboot reset).
450 write32(&clk_rst
->pllm_misc1
, misc1
);
451 write32(&clk_rst
->pllm_misc2
, misc2
);
453 /* PLLM.BASE needs BYPASS=0, different from general init_pll */
454 base
= read32(&clk_rst
->pllm_base
);
455 base
&= ~(PLLCMX_BASE_DIVN_MASK
| PLLCMX_BASE_DIVM_MASK
|
456 PLLM_BASE_DIVP_MASK
| PLL_BASE_BYPASS
);
457 base
|= ((m
<< PLL_BASE_DIVM_SHIFT
) | (n
<< PLL_BASE_DIVN_SHIFT
) |
458 (p
<< PLL_BASE_DIVP_SHIFT
));
459 write32(&clk_rst
->pllm_base
, base
);
461 setbits32(&clk_rst
->pllm_base
, PLL_BASE_ENABLE
);
462 /* stable_time is required, before we can start to check lock. */
465 while (!(read32(&clk_rst
->pllm_base
) & PLL_BASE_LOCK
)) {
469 * After PLLM reports being locked, we have to delay 10us before
474 /* Put OUT1 out of reset state (start to output). */
475 setbits32(&clk_rst
->pllm_out
, PLLM_OUT1_RSTN_RESET_DISABLE
);
477 /* Enable and start MEM(MC) and EMC. */
478 clock_enable_clear_reset(0, CLK_H_MEM
| CLK_H_EMC
, 0, 0, 0, 0);
479 write32(&clk_rst
->clk_src_emc
, emc_source
);
480 udelay(IO_STABILIZATION_DELAY
);
483 void clock_cpu0_config(void *entry
)
485 void *const evp_cpu_reset
= (uint8_t *)TEGRA_EVP_BASE
+ 0x100;
487 write32(&maincpu_stack_pointer
, (uintptr_t)_estack
);
488 write32(&maincpu_entry_point
, (uintptr_t)entry
);
489 write32(evp_cpu_reset
, (uintptr_t)&maincpu_setup
);
491 /* Set active CPU cluster to G */
492 clrbits32(&flow
->cluster_control
, 1);
494 // Set up cclk_brst and divider.
495 write32(&clk_rst
->cclk_brst_pol
,
496 (CRC_CCLK_BRST_POL_PLLX_OUT0
<< 0) |
497 (CRC_CCLK_BRST_POL_PLLX_OUT0
<< 4) |
498 (CRC_CCLK_BRST_POL_PLLX_OUT0
<< 8) |
499 (CRC_CCLK_BRST_POL_PLLX_OUT0
<< 12) |
500 (CRC_CCLK_BRST_POL_CPU_STATE_RUN
<< 28));
501 write32(&clk_rst
->super_cclk_div
,
502 CRC_SUPER_CCLK_DIVIDER_SUPER_CDIV_ENB
);
504 // Enable the clocks for CPUs 0-3.
505 uint32_t cpu_cmplx_clr
= read32(&clk_rst
->clk_cpu_cmplx_clr
);
506 cpu_cmplx_clr
|= CRC_CLK_CLR_CPU0_STP
| CRC_CLK_CLR_CPU1_STP
|
507 CRC_CLK_CLR_CPU2_STP
| CRC_CLK_CLR_CPU3_STP
;
508 write32(&clk_rst
->clk_cpu_cmplx_clr
, cpu_cmplx_clr
);
510 // Enable other CPU related clocks.
511 setbits32(&clk_rst
->clk_out_enb_l
, CLK_L_CPU
);
512 setbits32(&clk_rst
->clk_out_enb_v
, CLK_V_CPUG
);
513 setbits32(&clk_rst
->clk_out_enb_v
, CLK_V_CPULP
);
516 void clock_cpu0_remove_reset(void)
518 // Disable the reset on the non-CPU parts of the fast cluster.
519 write32(&clk_rst
->rst_cpug_cmplx_clr
, CRC_RST_CPUG_CLR_NONCPU
);
520 // Disable the various resets on the CPUs.
521 write32(&clk_rst
->rst_cpug_cmplx_clr
,
522 CRC_RST_CPUG_CLR_CPU0
| CRC_RST_CPUG_CLR_CPU1
|
523 CRC_RST_CPUG_CLR_CPU2
| CRC_RST_CPUG_CLR_CPU3
|
524 CRC_RST_CPUG_CLR_DBG0
| CRC_RST_CPUG_CLR_DBG1
|
525 CRC_RST_CPUG_CLR_DBG2
| CRC_RST_CPUG_CLR_DBG3
|
526 CRC_RST_CPUG_CLR_CORE0
| CRC_RST_CPUG_CLR_CORE1
|
527 CRC_RST_CPUG_CLR_CORE2
| CRC_RST_CPUG_CLR_CORE3
|
528 CRC_RST_CPUG_CLR_CX0
| CRC_RST_CPUG_CLR_CX1
|
529 CRC_RST_CPUG_CLR_CX2
| CRC_RST_CPUG_CLR_CX3
|
530 CRC_RST_CPUG_CLR_L2
| CRC_RST_CPUG_CLR_PDBG
);
532 // Disable the reset on the non-CPU parts of the slow cluster.
533 write32(&clk_rst
->rst_cpulp_cmplx_clr
, CRC_RST_CPULP_CLR_NONCPU
);
534 // Disable the various resets on the LP CPU.
535 write32(&clk_rst
->rst_cpulp_cmplx_clr
,
536 CRC_RST_CPULP_CLR_CPU0
| CRC_RST_CPULP_CLR_DBG0
|
537 CRC_RST_CPULP_CLR_CORE0
| CRC_RST_CPULP_CLR_CX0
|
538 CRC_RST_CPULP_CLR_L2
| CRC_RST_CPULP_CLR_PDBG
);
541 void clock_halt_avp(void)
544 write32(&flow
->halt_cop_events
,
545 FLOW_EVENT_JTAG
| FLOW_EVENT_LIC_IRQ
|
546 FLOW_EVENT_GIC_IRQ
| FLOW_MODE_WAITEVENT
);
550 void clock_init(void)
552 u32 osc
= clock_get_osc_bits();
554 /* Set PLLC dynramp_step A to 0x2b and B to 0xb (from U-Boot -- why? */
555 write32(&clk_rst
->pllc_misc2
, 0x2b << 17 | 0xb << 9);
557 /* Max out the AVP clock before everything else (need PLLC for that). */
558 init_pll(&clk_rst
->pllc_base
, &clk_rst
->pllc_misc
,
559 osc_table
[osc
].pllc
, PLLC_MISC_LOCK_ENABLE
);
561 /* Typical ratios are 1:2:2 or 1:2:3 sclk:hclk:pclk (See: APB DMA
562 * features section in the TRM). */
563 write32(&clk_rst
->clk_sys_rate
,
564 TEGRA_HCLK_RATIO
<< HCLK_DIVISOR_SHIFT
|
565 TEGRA_PCLK_RATIO
<< PCLK_DIVISOR_SHIFT
);
566 write32(&clk_rst
->pllc_out
, CLK_DIVIDER(TEGRA_PLLC_KHZ
, TEGRA_SCLK_KHZ
)
567 << PLL_OUT_RATIO_SHIFT
| PLL_OUT_CLKEN
| PLL_OUT_RSTN
);
568 write32(&clk_rst
->sclk_brst_pol
, /* sclk = 300 MHz */
569 SCLK_SYS_STATE_RUN
<< SCLK_SYS_STATE_SHIFT
|
570 SCLK_SOURCE_PLLC_OUT1
<< SCLK_RUN_SHIFT
);
572 /* Change the oscillator drive strength (from U-Boot -- why?) */
573 clrsetbits32(&clk_rst
->osc_ctrl
, OSC_XOFS_MASK
,
574 OSC_DRIVE_STRENGTH
<< OSC_XOFS_SHIFT
);
577 * Ambiguous quote from u-boot. TODO: what's this mean?
578 * "should update same value in PMC_OSC_EDPD_OVER XOFS
579 * field for warmboot "
581 clrsetbits32(&pmc
->osc_edpd_over
, PMC_OSC_EDPD_OVER_XOFS_MASK
,
582 OSC_DRIVE_STRENGTH
<< PMC_OSC_EDPD_OVER_XOFS_SHIFT
);
584 /* Disable IDDQ for PLLX before we set it up (from U-Boot -- why?) */
585 clrbits32(&clk_rst
->pllx_misc3
, PLLX_IDDQ_MASK
);
587 /* Set up PLLP_OUT(1|2|3|4) divisor to generate (9.6|48|102|204)MHz */
588 write32(&clk_rst
->pllp_outa
,
589 (CLK_DIVIDER(TEGRA_PLLP_KHZ
, 9600) << PLL_OUT_RATIO_SHIFT
|
590 PLL_OUT_OVR
| PLL_OUT_CLKEN
| PLL_OUT_RSTN
) << PLL_OUT1_SHIFT
|
591 (CLK_DIVIDER(TEGRA_PLLP_KHZ
, 48000) << PLL_OUT_RATIO_SHIFT
|
592 PLL_OUT_OVR
| PLL_OUT_CLKEN
| PLL_OUT_RSTN
) << PLL_OUT2_SHIFT
);
593 write32(&clk_rst
->pllp_outb
,
594 (CLK_DIVIDER(TEGRA_PLLP_KHZ
, 102000) << PLL_OUT_RATIO_SHIFT
|
595 PLL_OUT_OVR
| PLL_OUT_CLKEN
| PLL_OUT_RSTN
) << PLL_OUT3_SHIFT
|
596 (CLK_DIVIDER(TEGRA_PLLP_KHZ
, 204000) << PLL_OUT_RATIO_SHIFT
|
597 PLL_OUT_OVR
| PLL_OUT_CLKEN
| PLL_OUT_RSTN
) << PLL_OUT4_SHIFT
);
600 init_pll(&clk_rst
->pllx_base
, &clk_rst
->pllx_misc
,
601 osc_table
[osc
].pllx
, PLLPAXS_MISC_LOCK_ENABLE
);
604 init_pll(&clk_rst
->pllu_base
, &clk_rst
->pllu_misc
,
605 osc_table
[osc
].pllu
, PLLUD_MISC_LOCK_ENABLE
);
611 void clock_enable_clear_reset(u32 l
, u32 h
, u32 u
, u32 v
, u32 w
, u32 x
)
613 if (l
) write32(&clk_rst
->clk_enb_l_set
, l
);
614 if (h
) write32(&clk_rst
->clk_enb_h_set
, h
);
615 if (u
) write32(&clk_rst
->clk_enb_u_set
, u
);
616 if (v
) write32(&clk_rst
->clk_enb_v_set
, v
);
617 if (w
) write32(&clk_rst
->clk_enb_w_set
, w
);
618 if (x
) write32(&clk_rst
->clk_enb_x_set
, x
);
620 /* Give clocks time to stabilize. */
621 udelay(IO_STABILIZATION_DELAY
);
623 if (l
) write32(&clk_rst
->rst_dev_l_clr
, l
);
624 if (h
) write32(&clk_rst
->rst_dev_h_clr
, h
);
625 if (u
) write32(&clk_rst
->rst_dev_u_clr
, u
);
626 if (v
) write32(&clk_rst
->rst_dev_v_clr
, v
);
627 if (w
) write32(&clk_rst
->rst_dev_w_clr
, w
);
628 if (x
) write32(&clk_rst
->rst_dev_x_clr
, x
);
631 void clock_reset_l(u32 bit
)
633 write32(&clk_rst
->rst_dev_l_set
, bit
);
635 write32(&clk_rst
->rst_dev_l_clr
, bit
);
638 void clock_reset_h(u32 bit
)
640 write32(&clk_rst
->rst_dev_h_set
, bit
);
642 write32(&clk_rst
->rst_dev_h_clr
, bit
);
645 void clock_reset_u(u32 bit
)
647 write32(&clk_rst
->rst_dev_u_set
, bit
);
649 write32(&clk_rst
->rst_dev_u_clr
, bit
);
652 void clock_reset_v(u32 bit
)
654 write32(&clk_rst
->rst_dev_v_set
, bit
);
656 write32(&clk_rst
->rst_dev_v_clr
, bit
);
659 void clock_reset_w(u32 bit
)
661 write32(&clk_rst
->rst_dev_w_set
, bit
);
663 write32(&clk_rst
->rst_dev_w_clr
, bit
);
666 void clock_reset_x(u32 bit
)
668 write32(&clk_rst
->rst_dev_x_set
, bit
);
670 write32(&clk_rst
->rst_dev_x_clr
, bit
);