coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
clock_init.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 /* Clock setup for SMDK5420 board based on EXYNOS5 */
4 
5 #include <device/mmio.h>
6 #include <soc/clk.h>
7 #include <soc/cpu.h>
8 #include <soc/dp.h>
9 #include <soc/dmc.h>
10 #include <soc/setup.h>
11 
13 {
14  u32 val;
15 
16  /* Turn on the MCT as early as possible. */
17  exynos_mct->g_tcon |= (1 << 8);
18 
19  /* PLL locktime */
24  write32(&exynos_clock->dpll_lock, DPLL_LOCK_VAL);
27  write32(&exynos_clock->ipll_lock, IPLL_LOCK_VAL);
28  write32(&exynos_clock->spll_lock, SPLL_LOCK_VAL);
29  write32(&exynos_clock->kpll_lock, KPLL_LOCK_VAL);
30  write32(&exynos_clock->rpll_lock, RPLL_LOCK_VAL);
31 
32  setbits32(&exynos_clock->clk_src_cpu, MUX_HPM_SEL_MASK);
33 
34  write32(&exynos_clock->clk_src_top6, 0);
35 
36  write32(&exynos_clock->clk_src_cdrex, 0);
37  write32(&exynos_clock->clk_src_kfc, SRC_KFC_HPM_SEL);
38  write32(&exynos_clock->clk_div_cpu1, HPM_RATIO);
39  write32(&exynos_clock->clk_div_cpu0, CLK_DIV_CPU0_VAL);
40 
41  /* switch A15 clock source to OSC clock before changing APLL */
42  clrbits32(&exynos_clock->clk_src_cpu, APLL_FOUT);
43 
44  /* Set APLL */
46  val = set_pll(225, 3, 0); /* FOUT=1800MHz */
48  while ((read32(&exynos_clock->apll_con0) & PLL_LOCKED) == 0)
49  ;
50 
51  /* now it is safe to switch to APLL */
52  setbits32(&exynos_clock->clk_src_cpu, APLL_FOUT);
53 
54  write32(&exynos_clock->clk_src_kfc, SRC_KFC_HPM_SEL);
55  write32(&exynos_clock->clk_div_kfc0, CLK_DIV_KFC_VAL);
56 
57  /* switch A7 clock source to OSC clock before changing KPLL */
58  clrbits32(&exynos_clock->clk_src_kfc, KPLL_FOUT);
59 
60  /* Set KPLL*/
61  write32(&exynos_clock->kpll_con1, KPLL_CON1_VAL);
62  val = set_pll(0x190, 0x4, 0x2);
63  write32(&exynos_clock->kpll_con0, val);
64  while ((read32(&exynos_clock->kpll_con0) & PLL_LOCKED) == 0)
65  ;
66 
67  /* now it is safe to switch to KPLL */
68  setbits32(&exynos_clock->clk_src_kfc, KPLL_FOUT);
69 
70  /* Set MPLL */
72  val = set_pll(0xc8, 0x3, 0x1);
74  while ((read32(&exynos_clock->mpll_con0) & PLL_LOCKED) == 0)
75  ;
76 
77  /* Set DPLL */
78  write32(&exynos_clock->dpll_con1, DPLL_CON1_VAL);
79  val = set_pll(0x190, 0x4, 0x2);
80  write32(&exynos_clock->dpll_con0, val);
81  while ((read32(&exynos_clock->dpll_con0) & PLL_LOCKED) == 0)
82  ;
83 
84  /* Set EPLL */
87  val = set_pll(0x64, 0x2, 0x1);
89  while ((read32(&exynos_clock->epll_con0) & PLL_LOCKED) == 0)
90  ;
91 
92  /* Set CPLL */
94  val = set_pll(0xde, 0x4, 0x1);
96  while ((read32(&exynos_clock->cpll_con0) & PLL_LOCKED) == 0)
97  ;
98 
99  /* Set IPLL */
100  write32(&exynos_clock->ipll_con1, IPLL_CON1_VAL);
101  val = set_pll(0xB9, 0x3, 0x2);
102  write32(&exynos_clock->ipll_con0, val);
103  while ((read32(&exynos_clock->ipll_con0) & PLL_LOCKED) == 0)
104  ;
105 
106  /* Set VPLL */
108  val = set_pll(0xd7, 0x3, 0x2);
110  while ((read32(&exynos_clock->vpll_con0) & PLL_LOCKED) == 0)
111  ;
112 
113  /* Set BPLL */
115  val = set_pll(0xc8, 0x3, 0x1);
117  while ((read32(&exynos_clock->bpll_con0) & PLL_LOCKED) == 0)
118  ;
119 
120  /* Set SPLL */
121  write32(&exynos_clock->spll_con1, SPLL_CON1_VAL);
122  val = set_pll(200, 0x3, 0x2); /* 400MHz */
123  write32(&exynos_clock->spll_con0, val);
124  while ((read32(&exynos_clock->spll_con0) & PLL_LOCKED) == 0)
125  ;
126 
127  /* We use RPLL as the source for FIMD video stream clock */
128  write32(&exynos_clock->rpll_con1, RPLL_CON1_VAL);
129  write32(&exynos_clock->rpll_con2, RPLL_CON2_VAL);
130  /* computed by gabe from first principles; u-boot is probably
131  * wrong again
132  */
133  val = set_pll(0xa0, 0x3, 0x2);
134  write32(&exynos_clock->rpll_con0, val);
135  /* note: this is a meaningless exercise. The hardware lock
136  * detection does not work. So this just spins for some
137  * time and is done. NO indication of success should attach
138  * to this or any other spin on a con0 value.
139  */
140  while ((read32(&exynos_clock->rpll_con0) & PLL_LOCKED) == 0)
141  ;
142 
143  write32(&exynos_clock->clk_div_cdrex0, CLK_DIV_CDREX0_VAL);
144  write32(&exynos_clock->clk_div_cdrex1, CLK_DIV_CDREX1_VAL);
145 
146  write32(&exynos_clock->clk_src_top0, CLK_SRC_TOP0_VAL);
147  write32(&exynos_clock->clk_src_top1, CLK_SRC_TOP1_VAL);
148  write32(&exynos_clock->clk_src_top2, CLK_SRC_TOP2_VAL);
149  write32(&exynos_clock->clk_src_top7, CLK_SRC_TOP7_VAL);
150 
151  write32(&exynos_clock->clk_div_top0, CLK_DIV_TOP0_VAL);
152  write32(&exynos_clock->clk_div_top1, CLK_DIV_TOP1_VAL);
153  write32(&exynos_clock->clk_div_top2, CLK_DIV_TOP2_VAL);
154 
155  write32(&exynos_clock->clk_src_top10, 0);
156  write32(&exynos_clock->clk_src_top11, 0);
157  write32(&exynos_clock->clk_src_top12, 0);
158 
159  write32(&exynos_clock->clk_src_top3, CLK_SRC_TOP3_VAL);
160  write32(&exynos_clock->clk_src_top4, CLK_SRC_TOP4_VAL);
161  write32(&exynos_clock->clk_src_top5, CLK_SRC_TOP5_VAL);
162 
163  /* DISP1 BLK CLK SELECTION */
164  write32(&exynos_clock->clk_src_disp10, CLK_SRC_DISP1_0_VAL);
165  write32(&exynos_clock->clk_div_disp10, CLK_DIV_DISP1_0_VAL);
166 
167  /* AUDIO BLK */
168  write32(&exynos_clock->clk_src_mau, AUDIO0_SEL_EPLL);
169  write32(&exynos_clock->clk_div_mau, DIV_MAU_VAL);
170 
171  /* FSYS */
172  write32(&exynos_clock->clk_src_fsys, CLK_SRC_FSYS0_VAL);
173  write32(&exynos_clock->clk_div_fsys0, CLK_DIV_FSYS0_VAL);
174  write32(&exynos_clock->clk_div_fsys1, CLK_DIV_FSYS1_VAL);
175  write32(&exynos_clock->clk_div_fsys2, CLK_DIV_FSYS2_VAL);
176 
177  write32(&exynos_clock->clk_src_isp, CLK_SRC_ISP_VAL);
178  write32(&exynos_clock->clk_div_isp0, CLK_DIV_ISP0_VAL);
179  write32(&exynos_clock->clk_div_isp1, CLK_DIV_ISP1_VAL);
180 
181  write32(&exynos_clock->clk_src_peric0, CLK_SRC_PERIC0_VAL);
182  write32(&exynos_clock->clk_src_peric1, CLK_SRC_PERIC1_VAL);
183 
184  write32(&exynos_clock->clk_div_peric0, CLK_DIV_PERIC0_VAL);
185  write32(&exynos_clock->clk_div_peric1, CLK_DIV_PERIC1_VAL);
186  write32(&exynos_clock->clk_div_peric2, CLK_DIV_PERIC2_VAL);
187  write32(&exynos_clock->clk_div_peric3, CLK_DIV_PERIC3_VAL);
188  write32(&exynos_clock->clk_div_peric4, CLK_DIV_PERIC4_VAL);
189 
190  write32(&exynos_clock->clk_div_cperi1, CLK_DIV_CPERI1_VAL);
191 
192  write32(&exynos_clock->clkdiv2_ratio, CLK_DIV2_RATIO);
193  write32(&exynos_clock->clkdiv4_ratio, CLK_DIV4_RATIO);
194  write32(&exynos_clock->clk_div_g2d, CLK_DIV_G2D);
195 
196  write32(&exynos_clock->clk_src_cpu, CLK_SRC_CPU_VAL);
197  write32(&exynos_clock->clk_src_top6, CLK_SRC_TOP6_VAL);
198  write32(&exynos_clock->clk_src_cdrex, CLK_SRC_CDREX_VAL);
199  write32(&exynos_clock->clk_src_kfc, CLK_SRC_KFC_VAL);
200 }
201 
202 void clock_gate(void)
203 {
204  /* Not implemented for now. */
205 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
void clock_gate(void)
Definition: clock_init.c:267
void system_clock_init(struct mem_timings *mem, struct arm_clk_ratios *arm_clk_ratio)
Definition: clock_init.c:10
static struct exynos5_mct *const exynos_mct
Definition: clk.h:507
static struct exynos5_clock *const exynos_clock
Definition: clk.h:446
#define CLK_DIV_ISP0_VAL
Definition: setup.h:423
#define VPLL_CON1_VAL
Definition: setup.h:43
#define CLK_DIV_PERIC2_VAL
Definition: setup.h:391
#define set_pll(mdiv, pdiv, sdiv)
Definition: setup.h:50
#define MPLL_LOCK_VAL
Definition: setup.h:295
#define CLK_DIV_CPU0_VAL
Definition: setup.h:135
#define BPLL_LOCK_VAL
Definition: setup.h:305
#define APLL_LOCK_VAL
Definition: setup.h:293
#define CPLL_LOCK_VAL
Definition: setup.h:297
#define MUX_HPM_SEL_MASK
Definition: setup.h:320
#define CLK_DIV_TOP0_VAL
Definition: setup.h:270
#define CLK_SRC_CDREX_VAL
Definition: setup.h:178
#define CLK_SRC_TOP3_VAL
Definition: setup.h:251
#define CPLL_CON1_VAL
Definition: setup.h:33
#define CLK_SRC_TOP2_VAL
Definition: setup.h:235
#define MPLL_CON1_VAL
Definition: setup.h:30
#define EPLL_LOCK_VAL
Definition: setup.h:301
#define EPLL_CON2_VAL
Definition: setup.h:40
#define CLK_SRC_TOP1_VAL
Definition: setup.h:220
#define CLK_DIV_PERIC1_VAL
Definition: setup.h:383
#define CLK_DIV_FSYS0_VAL
Definition: setup.h:146
#define VPLL_LOCK_VAL
Definition: setup.h:303
#define APLL_CON1_VAL
Definition: setup.h:27
#define HPM_RATIO
Definition: setup.h:149
#define CLK_SRC_FSYS0_VAL
Definition: setup.h:145
#define CLK_SRC_TOP0_VAL
Definition: setup.h:204
#define CLK_DIV_PERIC0_VAL
Definition: setup.h:374
#define CLK_DIV_TOP1_VAL
Definition: setup.h:286
#define CLK_DIV_ISP1_VAL
Definition: setup.h:426
#define EPLL_CON1_VAL
Definition: setup.h:39
#define APLL_FOUT
Definition: setup.h:24
#define CLK_SRC_DISP1_0_VAL
Definition: setup.h:432
#define CLK_SRC_PERIC1_VAL
Definition: setup.h:350
#define CLK_SRC_PERIC0_VAL
Definition: setup.h:339
#define BPLL_CON1_VAL
Definition: setup.h:47
#define CLK_SRC_CPU_VAL
Definition: setup.h:58
#define KPLL_FOUT
Definition: setup.h:32
#define KPLL_LOCK_VAL
Definition: setup.h:235
#define CLK_DIV_CDREX1_VAL
Definition: setup.h:198
#define RPLL_CON1_VAL
Definition: setup.h:60
#define CLK_SRC_TOP6_VAL
Definition: setup.h:212
#define PLL_LOCKED
Definition: setup.h:255
#define KPLL_CON1_VAL
Definition: setup.h:73
#define CLK_DIV_G2D
Definition: setup.h:297
#define CLK_SRC_ISP_VAL
Definition: setup.h:333
#define IPLL_CON1_VAL
Definition: setup.h:70
#define AUDIO0_SEL_EPLL
Definition: setup.h:516
#define CLK_SRC_TOP4_VAL
Definition: setup.h:210
#define DIV_MAU_VAL
Definition: setup.h:519
#define RPLL_CON2_VAL
Definition: setup.h:61
#define CLK_DIV_PERIC4_VAL
Definition: setup.h:384
#define CLK_DIV_CDREX0_VAL
Definition: setup.h:197
#define CLK_SRC_KFC_VAL
Definition: setup.h:285
#define SRC_KFC_HPM_SEL
Definition: setup.h:282
#define CLK_DIV_PERIC3_VAL
Definition: setup.h:376
#define CLK_DIV4_RATIO
Definition: setup.h:294
#define SPLL_LOCK_VAL
Definition: setup.h:237
#define CLK_DIV2_RATIO
Definition: setup.h:291
#define IPLL_LOCK_VAL
Definition: setup.h:233
#define CLK_DIV_FSYS1_VAL
Definition: setup.h:155
#define SPLL_CON1_VAL
Definition: setup.h:67
#define DPLL_LOCK_VAL
Definition: setup.h:229
#define CLK_DIV_CPERI1_VAL
Definition: setup.h:34
#define CLK_SRC_TOP7_VAL
Definition: setup.h:213
#define CLK_SRC_TOP5_VAL
Definition: setup.h:211
#define CLK_DIV_KFC_VAL
Definition: setup.h:288
#define CLK_DIV_TOP2_VAL
Definition: setup.h:218
#define CLK_DIV_DISP1_0_VAL
Definition: setup.h:422
#define DPLL_CON1_VAL
Definition: setup.h:46
#define CLK_DIV_FSYS2_VAL
Definition: setup.h:156
#define RPLL_LOCK_VAL
Definition: setup.h:239
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrbits32(addr, clear)
Definition: mmio.h:26
uint32_t u32
Definition: stdint.h:51
unsigned int bpll_con0
Definition: clk.h:416
unsigned int vpll_lock
Definition: clk.h:232
unsigned int bpll_con1
Definition: clk.h:417
unsigned int epll_con2
Definition: clk.h:241
unsigned int apll_con1
Definition: clk.h:92
unsigned int cpll_con0
Definition: clk.h:236
unsigned int vpll_con0
Definition: clk.h:243
unsigned int mpll_lock
Definition: clk.h:148
unsigned int epll_con1
Definition: clk.h:240
unsigned int apll_lock
Definition: clk.h:89
unsigned int mpll_con1
Definition: clk.h:151
unsigned int cpll_lock
Definition: clk.h:228
unsigned int epll_lock
Definition: clk.h:230
unsigned int cpll_con1
Definition: clk.h:237
unsigned int bpll_lock
Definition: clk.h:414
unsigned int epll_con0
Definition: clk.h:239
unsigned int apll_con0
Definition: clk.h:91
unsigned int mpll_con0
Definition: clk.h:150
unsigned int vpll_con1
Definition: clk.h:244
uint32_t g_tcon
Definition: clk.h:472
u8 val
Definition: sys.c:300