2 * This file is part of the coreboot project.
4 * Copyright (C) 2012 Samsung Electronics
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
16 /* Clock setup for SMDK5250 board based on EXYNOS5 */
19 #include <console/console.h>
22 #include <soc/setup.h>
24 void system_clock_init(struct mem_timings
*mem
,
25 struct arm_clk_ratios
*arm_clk_ratio
)
29 /* Turn on the MCT as early as possible. */
30 exynos_mct
->g_tcon
|= (1 << 8);
32 clrbits_le32(&exynos_clock
->src_cpu
, MUX_APLL_SEL_MASK
);
34 val
= read32(&exynos_clock
->mux_stat_cpu
);
35 } while ((val
| MUX_APLL_SEL_MASK
) != val
);
37 clrbits_le32(&exynos_clock
->src_core1
, MUX_MPLL_SEL_MASK
);
39 val
= read32(&exynos_clock
->mux_stat_core1
);
40 } while ((val
| MUX_MPLL_SEL_MASK
) != val
);
42 clrbits_le32(&exynos_clock
->src_top2
, MUX_CPLL_SEL_MASK
);
43 clrbits_le32(&exynos_clock
->src_top2
, MUX_EPLL_SEL_MASK
);
44 clrbits_le32(&exynos_clock
->src_top2
, MUX_VPLL_SEL_MASK
);
45 clrbits_le32(&exynos_clock
->src_top2
, MUX_GPLL_SEL_MASK
);
46 tmp
= MUX_CPLL_SEL_MASK
| MUX_EPLL_SEL_MASK
| MUX_VPLL_SEL_MASK
49 val
= read32(&exynos_clock
->mux_stat_top2
);
50 } while ((val
| tmp
) != val
);
52 clrbits_le32(&exynos_clock
->src_cdrex
, MUX_BPLL_SEL_MASK
);
54 val
= read32(&exynos_clock
->mux_stat_cdrex
);
55 } while ((val
| MUX_BPLL_SEL_MASK
) != val
);
58 write32(&exynos_clock
->apll_lock
, APLL_LOCK_VAL
);
60 write32(&exynos_clock
->mpll_lock
, MPLL_LOCK_VAL
);
62 write32(&exynos_clock
->bpll_lock
, BPLL_LOCK_VAL
);
64 write32(&exynos_clock
->cpll_lock
, CPLL_LOCK_VAL
);
66 write32(&exynos_clock
->gpll_lock
, GPLL_LOCK_VAL
);
68 write32(&exynos_clock
->epll_lock
, EPLL_LOCK_VAL
);
70 write32(&exynos_clock
->vpll_lock
, VPLL_LOCK_VAL
);
72 write32(&exynos_clock
->pll_div2_sel
, CLK_REG_DISABLE
);
74 write32(&exynos_clock
->src_cpu
, MUX_HPM_SEL_MASK
);
76 val
= read32(&exynos_clock
->mux_stat_cpu
);
77 } while ((val
| HPM_SEL_SCLK_MPLL
) != val
);
79 val
= arm_clk_ratio
->arm2_ratio
<< 28
80 | arm_clk_ratio
->apll_ratio
<< 24
81 | arm_clk_ratio
->pclk_dbg_ratio
<< 20
82 | arm_clk_ratio
->atb_ratio
<< 16
83 | arm_clk_ratio
->periph_ratio
<< 12
84 | arm_clk_ratio
->acp_ratio
<< 8
85 | arm_clk_ratio
->cpud_ratio
<< 4
86 | arm_clk_ratio
->arm_ratio
;
87 write32(&exynos_clock
->div_cpu0
, val
);
89 val
= read32(&exynos_clock
->div_stat_cpu0
);
92 write32(&exynos_clock
->div_cpu1
, CLK_DIV_CPU1_VAL
);
94 val
= read32(&exynos_clock
->div_stat_cpu1
);
97 /* switch A15 clock source to OSC clock before changing APLL */
98 clrbits_le32(&exynos_clock
->src_cpu
, APLL_FOUT
);
101 write32(&exynos_clock
->apll_con1
, APLL_CON1_VAL
);
102 val
= set_pll(arm_clk_ratio
->apll_mdiv
, arm_clk_ratio
->apll_pdiv
,
103 arm_clk_ratio
->apll_sdiv
);
104 write32(&exynos_clock
->apll_con0
, val
);
105 while ((read32(&exynos_clock
->apll_con0
) & APLL_CON0_LOCKED
) == 0)
108 /* now it is safe to switch to APLL */
109 setbits_le32(&exynos_clock
->src_cpu
, APLL_FOUT
);
112 write32(&exynos_clock
->mpll_con1
, MPLL_CON1_VAL
);
113 val
= set_pll(mem
->mpll_mdiv
, mem
->mpll_pdiv
, mem
->mpll_sdiv
);
114 write32(&exynos_clock
->mpll_con0
, val
);
115 while ((read32(&exynos_clock
->mpll_con0
) & MPLL_CON0_LOCKED
) == 0)
119 * Configure MUX_MPLL_FOUT to choose the direct clock source
120 * path and avoid the fixed DIV/2 block to save power
122 setbits_le32(&exynos_clock
->pll_div2_sel
, MUX_MPLL_FOUT_SEL
);
126 write32(&exynos_clock
->bpll_con1
, BPLL_CON1_VAL
);
127 val
= set_pll(mem
->bpll_mdiv
, mem
->bpll_pdiv
, mem
->bpll_sdiv
);
128 write32(&exynos_clock
->bpll_con0
, val
);
129 while ((read32(&exynos_clock
->bpll_con0
) & BPLL_CON0_LOCKED
) == 0)
132 setbits_le32(&exynos_clock
->pll_div2_sel
, MUX_BPLL_FOUT_SEL
);
136 write32(&exynos_clock
->cpll_con1
, CPLL_CON1_VAL
);
137 val
= set_pll(mem
->cpll_mdiv
, mem
->cpll_pdiv
, mem
->cpll_sdiv
);
138 write32(&exynos_clock
->cpll_con0
, val
);
139 while ((read32(&exynos_clock
->cpll_con0
) & CPLL_CON0_LOCKED
) == 0)
143 write32(&exynos_clock
->gpll_con1
, GPLL_CON1_VAL
);
144 val
= set_pll(mem
->gpll_mdiv
, mem
->gpll_pdiv
, mem
->gpll_sdiv
);
145 write32(&exynos_clock
->gpll_con0
, val
);
146 while ((read32(&exynos_clock
->gpll_con0
) & GPLL_CON0_LOCKED
) == 0)
150 write32(&exynos_clock
->epll_con2
, EPLL_CON2_VAL
);
151 write32(&exynos_clock
->epll_con1
, EPLL_CON1_VAL
);
152 val
= set_pll(mem
->epll_mdiv
, mem
->epll_pdiv
, mem
->epll_sdiv
);
153 write32(&exynos_clock
->epll_con0
, val
);
154 while ((read32(&exynos_clock
->epll_con0
) & EPLL_CON0_LOCKED
) == 0)
158 write32(&exynos_clock
->vpll_con2
, VPLL_CON2_VAL
);
159 write32(&exynos_clock
->vpll_con1
, VPLL_CON1_VAL
);
160 val
= set_pll(mem
->vpll_mdiv
, mem
->vpll_pdiv
, mem
->vpll_sdiv
);
161 write32(&exynos_clock
->vpll_con0
, val
);
162 while ((read32(&exynos_clock
->vpll_con0
) & VPLL_CON0_LOCKED
) == 0)
165 write32(&exynos_clock
->src_core0
, CLK_SRC_CORE0_VAL
);
166 write32(&exynos_clock
->div_core0
, CLK_DIV_CORE0_VAL
);
167 while (read32(&exynos_clock
->div_stat_core0
) != 0)
170 write32(&exynos_clock
->div_core1
, CLK_DIV_CORE1_VAL
);
171 while (read32(&exynos_clock
->div_stat_core1
) != 0)
174 write32(&exynos_clock
->div_sysrgt
, CLK_DIV_SYSRGT_VAL
);
175 while (read32(&exynos_clock
->div_stat_sysrgt
) != 0)
178 write32(&exynos_clock
->div_acp
, CLK_DIV_ACP_VAL
);
179 while (read32(&exynos_clock
->div_stat_acp
) != 0)
182 write32(&exynos_clock
->div_syslft
, CLK_DIV_SYSLFT_VAL
);
183 while (read32(&exynos_clock
->div_stat_syslft
) != 0)
186 write32(&exynos_clock
->src_top0
, CLK_SRC_TOP0_VAL
);
187 write32(&exynos_clock
->src_top1
, CLK_SRC_TOP1_VAL
);
188 write32(&exynos_clock
->src_top2
, TOP2_VAL
);
189 write32(&exynos_clock
->src_top3
, CLK_SRC_TOP3_VAL
);
191 write32(&exynos_clock
->div_top0
, CLK_DIV_TOP0_VAL
);
192 while (read32(&exynos_clock
->div_stat_top0
))
195 write32(&exynos_clock
->div_top1
, CLK_DIV_TOP1_VAL
);
196 while (read32(&exynos_clock
->div_stat_top1
))
199 write32(&exynos_clock
->src_lex
, CLK_SRC_LEX_VAL
);
201 val
= read32(&exynos_clock
->mux_stat_lex
);
202 if (val
== (val
| 1))
206 write32(&exynos_clock
->div_lex
, CLK_DIV_LEX_VAL
);
207 while (read32(&exynos_clock
->div_stat_lex
))
210 write32(&exynos_clock
->div_r0x
, CLK_DIV_R0X_VAL
);
211 while (read32(&exynos_clock
->div_stat_r0x
))
214 write32(&exynos_clock
->div_r0x
, CLK_DIV_R0X_VAL
);
215 while (read32(&exynos_clock
->div_stat_r0x
))
218 write32(&exynos_clock
->div_r1x
, CLK_DIV_R1X_VAL
);
219 while (read32(&exynos_clock
->div_stat_r1x
))
223 write32(&exynos_clock
->src_cdrex
, MUX_BPLL_SEL_MASK
|
224 MUX_MCLK_CDREX_SEL
| MUX_MCLK_DPHY_SEL
);
226 write32(&exynos_clock
->src_cdrex
, CLK_REG_DISABLE
);
229 write32(&exynos_clock
->div_cdrex
, CLK_DIV_CDREX_VAL
);
230 while (read32(&exynos_clock
->div_stat_cdrex
))
233 val
= read32(&exynos_clock
->src_cpu
);
234 val
|= CLK_SRC_CPU_VAL
;
235 write32(&exynos_clock
->src_cpu
, val
);
237 val
= read32(&exynos_clock
->src_top2
);
238 val
|= CLK_SRC_TOP2_VAL
;
239 write32(&exynos_clock
->src_top2
, val
);
241 val
= read32(&exynos_clock
->src_core1
);
242 val
|= CLK_SRC_CORE1_VAL
;
243 write32(&exynos_clock
->src_core1
, val
);
245 write32(&exynos_clock
->src_fsys
, CLK_SRC_FSYS0_VAL
);
246 write32(&exynos_clock
->div_fsys0
, CLK_DIV_FSYS0_VAL
);
247 while (read32(&exynos_clock
->div_stat_fsys0
))
250 write32(&exynos_clock
->clkout_cmu_cpu
, CLK_REG_DISABLE
);
251 write32(&exynos_clock
->clkout_cmu_core
, CLK_REG_DISABLE
);
252 write32(&exynos_clock
->clkout_cmu_acp
, CLK_REG_DISABLE
);
253 write32(&exynos_clock
->clkout_cmu_top
, CLK_REG_DISABLE
);
254 write32(&exynos_clock
->clkout_cmu_lex
, CLK_REG_DISABLE
);
255 write32(&exynos_clock
->clkout_cmu_r0x
, CLK_REG_DISABLE
);
256 write32(&exynos_clock
->clkout_cmu_r1x
, CLK_REG_DISABLE
);
257 write32(&exynos_clock
->clkout_cmu_cdrex
, CLK_REG_DISABLE
);
259 write32(&exynos_clock
->src_peric0
, CLK_SRC_PERIC0_VAL
);
260 write32(&exynos_clock
->div_peric0
, CLK_DIV_PERIC0_VAL
);
262 write32(&exynos_clock
->src_peric1
, CLK_SRC_PERIC1_VAL
);
263 write32(&exynos_clock
->div_peric1
, CLK_DIV_PERIC1_VAL
);
264 write32(&exynos_clock
->div_peric2
, CLK_DIV_PERIC2_VAL
);
265 write32(&exynos_clock
->sclk_src_isp
, SCLK_SRC_ISP_VAL
);
266 write32(&exynos_clock
->sclk_div_isp
, SCLK_DIV_ISP_VAL
);
267 write32(&exynos_clock
->div_isp0
, CLK_DIV_ISP0_VAL
);
268 write32(&exynos_clock
->div_isp1
, CLK_DIV_ISP1_VAL
);
269 write32(&exynos_clock
->div_isp2
, CLK_DIV_ISP2_VAL
);
271 /* FIMD1 SRC CLK SELECTION */
272 write32(&exynos_clock
->src_disp1_0
, CLK_SRC_DISP1_0_VAL
);
274 val
= MMC2_PRE_RATIO_VAL
<< MMC2_PRE_RATIO_OFFSET
275 | MMC2_RATIO_VAL
<< MMC2_RATIO_OFFSET
276 | MMC3_PRE_RATIO_VAL
<< MMC3_PRE_RATIO_OFFSET
277 | MMC3_RATIO_VAL
<< MMC3_RATIO_OFFSET
;
278 write32(&exynos_clock
->div_fsys2
, val
);
281 void clock_gate(void)
283 /* CLK_GATE_IP_SYSRGT */
284 clrbits_le32(&exynos_clock
->gate_ip_sysrgt
, CLK_C2C_MASK
);
286 /* CLK_GATE_IP_ACP */
287 clrbits_le32(&exynos_clock
->gate_ip_acp
, CLK_SMMUG2D_MASK
|
290 CLK_ID_REMAPPER_MASK
|
296 /* CLK_GATE_BUS_SYSLFT */
297 clrbits_le32(&exynos_clock
->gate_bus_syslft
, CLK_EFCLK_MASK
);
299 /* CLK_GATE_IP_ISP0 */
300 clrbits_le32(&exynos_clock
->gate_ip_isp0
, CLK_UART_ISP_MASK
|
303 CLK_MTCADC_ISP_MASK
|
307 CLK_MCUCTL_ISP_MASK
|
308 CLK_INT_COMB_ISP_MASK
|
309 CLK_SMMU_MCUISP_MASK
|
310 CLK_SMMU_SCALERP_MASK
|
311 CLK_SMMU_SCALERC_MASK
|
324 /* CLK_GATE_IP_ISP1 */
325 clrbits_le32(&exynos_clock
->gate_ip_isp1
, CLK_SPI1_ISP_MASK
|
335 /* CLK_GATE_SCLK_ISP */
336 clrbits_le32(&exynos_clock
->gate_sclk_isp
, SCLK_MPWM_ISP_MASK
);
338 /* CLK_GATE_IP_GSCL */
339 clrbits_le32(&exynos_clock
->gate_ip_gscl
, CLK_SMMUFIMC_LITE2_MASK
|
340 CLK_SMMUFIMC_LITE1_MASK
|
341 CLK_SMMUFIMC_LITE0_MASK
|
346 CLK_GSCL_WRAP_B_MASK
|
347 CLK_GSCL_WRAP_A_MASK
|
354 /* CLK_GATE_IP_DISP1 */
355 clrbits_le32(&exynos_clock
->gate_ip_disp1
, CLK_SMMUTVX_MASK
|
361 /* CLK_GATE_IP_MFC */
362 clrbits_le32(&exynos_clock
->gate_ip_mfc
, CLK_SMMUMFCR_MASK
|
366 /* CLK_GATE_IP_GEN */
367 clrbits_le32(&exynos_clock
->gate_ip_gen
, CLK_SMMUMDMA1_MASK
|
369 CLK_SMMUROTATOR_MASK
|
374 /* CLK_GATE_IP_FSYS */
375 clrbits_le32(&exynos_clock
->gate_ip_fsys
, CLK_WDT_IOP_MASK
|
376 CLK_SMMUMCU_IOP_MASK
|
377 CLK_SATA_PHY_I2C_MASK
|
378 CLK_SATA_PHY_CTRL_MASK
|
390 /* CLK_GATE_IP_PERIC */
391 clrbits_le32(&exynos_clock
->gate_ip_peric
, CLK_HS_I2C3_MASK
|
405 * Note: Keep CHIPID_APBIF ungated to ensure reading the product ID
406 * register (PRO_ID) works correctly when the OS kernel determines
407 * which chip it is running on.
409 clrbits_le32(&exynos_clock
->gate_ip_peris
, CLK_RTC_MASK
|
422 clrbits_le32(&exynos_clock
->gate_block
, CLK_ACP_MASK
);
424 /* CLK_GATE_IP_CDREX */
425 clrbits_le32(&exynos_clock
->gate_ip_cdrex
, CLK_DPHY0_MASK
|
427 CLK_TZASC_DRBXR_MASK
);
431 void clock_init_dp_clock(void)
433 /* DP clock enable */
434 setbits_le32(&exynos_clock
->gate_ip_disp1
, CLK_GATE_DP1_ALLOW
);
436 /* We run DP at 267 Mhz */
437 setbits_le32(&exynos_clock
->div_disp1_0
, CLK_DIV_DISP1_0_FIMD1
);