blob: 13e2421ba9e64d30d347d93cfce28a313a576664 [file] [log] [blame]
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001/* linux/arch/arm/mach-exynos4/clock.c
Changhwan Younc8bef142010-07-27 17:52:39 +09002 *
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09003 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
Changhwan Younc8bef142010-07-27 17:52:39 +09005 *
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09006 * EXYNOS4 - Clock support
Changhwan Younc8bef142010-07-27 17:52:39 +09007 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13#include <linux/kernel.h>
14#include <linux/err.h>
15#include <linux/io.h>
16
17#include <plat/cpu-freq.h>
18#include <plat/clock.h>
19#include <plat/cpu.h>
20#include <plat/pll.h>
21#include <plat/s5p-clock.h>
22#include <plat/clock-clksrc.h>
23
24#include <mach/map.h>
25#include <mach/regs-clock.h>
KyongHo Chob0b6ff02011-03-07 09:10:24 +090026#include <mach/sysmmu.h>
Changhwan Younc8bef142010-07-27 17:52:39 +090027
28static struct clk clk_sclk_hdmi27m = {
29 .name = "sclk_hdmi27m",
Changhwan Younc8bef142010-07-27 17:52:39 +090030 .rate = 27000000,
31};
32
Jongpill Leeb99380e2010-08-18 22:16:45 +090033static struct clk clk_sclk_hdmiphy = {
34 .name = "sclk_hdmiphy",
Jongpill Leeb99380e2010-08-18 22:16:45 +090035};
36
37static struct clk clk_sclk_usbphy0 = {
38 .name = "sclk_usbphy0",
Jongpill Leeb99380e2010-08-18 22:16:45 +090039 .rate = 27000000,
40};
41
42static struct clk clk_sclk_usbphy1 = {
43 .name = "sclk_usbphy1",
Jongpill Leeb99380e2010-08-18 22:16:45 +090044};
45
Boojin Kimbf856fb2011-09-02 09:44:36 +090046static struct clk dummy_apb_pclk = {
47 .name = "apb_pclk",
48 .id = -1,
49};
50
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090051static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
Jongpill Lee37e01722010-08-18 22:33:43 +090052{
53 return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
54}
55
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090056static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +090057{
58 return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
59}
60
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090061static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +090062{
63 return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
64}
65
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090066static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +090067{
68 return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
69}
70
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090071static int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
Jongpill Lee340ea1e2010-08-18 22:39:26 +090072{
73 return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
74}
75
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090076static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
Jongpill Lee3297c2e2010-08-27 17:53:26 +090077{
78 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
79}
80
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090081static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +090082{
83 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
84}
85
KyongHo Chob0b6ff02011-03-07 09:10:24 +090086static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
87{
88 return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
89}
90
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +090091static int exynos4_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
92{
93 return s5p_gatectrl(S5P_CLKSRC_MASK_TV, clk, enable);
94}
95
Kukjin Kimb3ed3a12011-02-14 16:08:04 +090096static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +090097{
98 return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
99}
100
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900101static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
102{
103 return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
104}
105
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900106static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900107{
108 return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
109}
110
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900111static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900112{
113 return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
114}
115
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900116static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900117{
118 return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
119}
120
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900121static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900122{
123 return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
124}
125
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900126static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
Jongpill Lee5a847b42010-08-27 16:50:47 +0900127{
128 return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
129}
130
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900131static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900132{
133 return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
134}
135
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +0900136static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable)
137{
138 return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
139}
140
141static int exynos4_clk_dac_ctrl(struct clk *clk, int enable)
142{
143 return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
144}
145
Changhwan Younc8bef142010-07-27 17:52:39 +0900146/* Core list of CMU_CPU side */
147
148static struct clksrc_clk clk_mout_apll = {
149 .clk = {
150 .name = "mout_apll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900151 },
152 .sources = &clk_src_apll,
153 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
Jongpill Lee3ff31022010-08-18 22:20:31 +0900154};
155
156static struct clksrc_clk clk_sclk_apll = {
157 .clk = {
158 .name = "sclk_apll",
Jongpill Lee3ff31022010-08-18 22:20:31 +0900159 .parent = &clk_mout_apll.clk,
160 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900161 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
162};
163
164static struct clksrc_clk clk_mout_epll = {
165 .clk = {
166 .name = "mout_epll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900167 },
168 .sources = &clk_src_epll,
169 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
170};
171
172static struct clksrc_clk clk_mout_mpll = {
173 .clk = {
174 .name = "mout_mpll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900175 },
176 .sources = &clk_src_mpll,
177 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
178};
179
180static struct clk *clkset_moutcore_list[] = {
Jaecheol Lee8f3b9cf2010-09-18 10:50:46 +0900181 [0] = &clk_mout_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900182 [1] = &clk_mout_mpll.clk,
183};
184
185static struct clksrc_sources clkset_moutcore = {
186 .sources = clkset_moutcore_list,
187 .nr_sources = ARRAY_SIZE(clkset_moutcore_list),
188};
189
190static struct clksrc_clk clk_moutcore = {
191 .clk = {
192 .name = "moutcore",
Changhwan Younc8bef142010-07-27 17:52:39 +0900193 },
194 .sources = &clkset_moutcore,
195 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
196};
197
198static struct clksrc_clk clk_coreclk = {
199 .clk = {
200 .name = "core_clk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900201 .parent = &clk_moutcore.clk,
202 },
203 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
204};
205
206static struct clksrc_clk clk_armclk = {
207 .clk = {
208 .name = "armclk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900209 .parent = &clk_coreclk.clk,
210 },
211};
212
213static struct clksrc_clk clk_aclk_corem0 = {
214 .clk = {
215 .name = "aclk_corem0",
Changhwan Younc8bef142010-07-27 17:52:39 +0900216 .parent = &clk_coreclk.clk,
217 },
218 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
219};
220
221static struct clksrc_clk clk_aclk_cores = {
222 .clk = {
223 .name = "aclk_cores",
Changhwan Younc8bef142010-07-27 17:52:39 +0900224 .parent = &clk_coreclk.clk,
225 },
226 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
227};
228
229static struct clksrc_clk clk_aclk_corem1 = {
230 .clk = {
231 .name = "aclk_corem1",
Changhwan Younc8bef142010-07-27 17:52:39 +0900232 .parent = &clk_coreclk.clk,
233 },
234 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
235};
236
237static struct clksrc_clk clk_periphclk = {
238 .clk = {
239 .name = "periphclk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900240 .parent = &clk_coreclk.clk,
241 },
242 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
243};
244
Changhwan Younc8bef142010-07-27 17:52:39 +0900245/* Core list of CMU_CORE side */
246
247static struct clk *clkset_corebus_list[] = {
248 [0] = &clk_mout_mpll.clk,
Jongpill Lee3ff31022010-08-18 22:20:31 +0900249 [1] = &clk_sclk_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900250};
251
252static struct clksrc_sources clkset_mout_corebus = {
253 .sources = clkset_corebus_list,
254 .nr_sources = ARRAY_SIZE(clkset_corebus_list),
255};
256
257static struct clksrc_clk clk_mout_corebus = {
258 .clk = {
259 .name = "mout_corebus",
Changhwan Younc8bef142010-07-27 17:52:39 +0900260 },
261 .sources = &clkset_mout_corebus,
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900262 .reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 4, .size = 1 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900263};
264
265static struct clksrc_clk clk_sclk_dmc = {
266 .clk = {
267 .name = "sclk_dmc",
Changhwan Younc8bef142010-07-27 17:52:39 +0900268 .parent = &clk_mout_corebus.clk,
269 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900270 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900271};
272
273static struct clksrc_clk clk_aclk_cored = {
274 .clk = {
275 .name = "aclk_cored",
Changhwan Younc8bef142010-07-27 17:52:39 +0900276 .parent = &clk_sclk_dmc.clk,
277 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900278 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900279};
280
281static struct clksrc_clk clk_aclk_corep = {
282 .clk = {
283 .name = "aclk_corep",
Changhwan Younc8bef142010-07-27 17:52:39 +0900284 .parent = &clk_aclk_cored.clk,
285 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900286 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900287};
288
289static struct clksrc_clk clk_aclk_acp = {
290 .clk = {
291 .name = "aclk_acp",
Changhwan Younc8bef142010-07-27 17:52:39 +0900292 .parent = &clk_mout_corebus.clk,
293 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900294 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900295};
296
297static struct clksrc_clk clk_pclk_acp = {
298 .clk = {
299 .name = "pclk_acp",
Changhwan Younc8bef142010-07-27 17:52:39 +0900300 .parent = &clk_aclk_acp.clk,
301 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900302 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900303};
304
305/* Core list of CMU_TOP side */
306
307static struct clk *clkset_aclk_top_list[] = {
308 [0] = &clk_mout_mpll.clk,
Jongpill Lee3ff31022010-08-18 22:20:31 +0900309 [1] = &clk_sclk_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900310};
311
Kukjin Kim9e235522010-08-18 22:06:02 +0900312static struct clksrc_sources clkset_aclk = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900313 .sources = clkset_aclk_top_list,
314 .nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
315};
316
317static struct clksrc_clk clk_aclk_200 = {
318 .clk = {
319 .name = "aclk_200",
Changhwan Younc8bef142010-07-27 17:52:39 +0900320 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900321 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900322 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
323 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
324};
325
Changhwan Younc8bef142010-07-27 17:52:39 +0900326static struct clksrc_clk clk_aclk_100 = {
327 .clk = {
328 .name = "aclk_100",
Changhwan Younc8bef142010-07-27 17:52:39 +0900329 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900330 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900331 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
332 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
333};
334
Changhwan Younc8bef142010-07-27 17:52:39 +0900335static struct clksrc_clk clk_aclk_160 = {
336 .clk = {
337 .name = "aclk_160",
Changhwan Younc8bef142010-07-27 17:52:39 +0900338 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900339 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900340 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
341 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
342};
343
Changhwan Younc8bef142010-07-27 17:52:39 +0900344static struct clksrc_clk clk_aclk_133 = {
345 .clk = {
346 .name = "aclk_133",
Changhwan Younc8bef142010-07-27 17:52:39 +0900347 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900348 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900349 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
350 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
351};
352
353static struct clk *clkset_vpllsrc_list[] = {
354 [0] = &clk_fin_vpll,
355 [1] = &clk_sclk_hdmi27m,
356};
357
358static struct clksrc_sources clkset_vpllsrc = {
359 .sources = clkset_vpllsrc_list,
360 .nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
361};
362
363static struct clksrc_clk clk_vpllsrc = {
364 .clk = {
365 .name = "vpll_src",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900366 .enable = exynos4_clksrc_mask_top_ctrl,
Jongpill Lee37e01722010-08-18 22:33:43 +0900367 .ctrlbit = (1 << 0),
Changhwan Younc8bef142010-07-27 17:52:39 +0900368 },
369 .sources = &clkset_vpllsrc,
370 .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
371};
372
373static struct clk *clkset_sclk_vpll_list[] = {
374 [0] = &clk_vpllsrc.clk,
375 [1] = &clk_fout_vpll,
376};
377
378static struct clksrc_sources clkset_sclk_vpll = {
379 .sources = clkset_sclk_vpll_list,
380 .nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
381};
382
383static struct clksrc_clk clk_sclk_vpll = {
384 .clk = {
385 .name = "sclk_vpll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900386 },
387 .sources = &clkset_sclk_vpll,
388 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
389};
390
Kukjin Kim957c4612011-01-04 17:58:22 +0900391static struct clk init_clocks_off[] = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900392 {
393 .name = "timers",
Changhwan Younc8bef142010-07-27 17:52:39 +0900394 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900395 .enable = exynos4_clk_ip_peril_ctrl,
Changhwan Younc8bef142010-07-27 17:52:39 +0900396 .ctrlbit = (1<<24),
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900397 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900398 .name = "csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900399 .devname = "s5p-mipi-csis.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900400 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900401 .ctrlbit = (1 << 4),
402 }, {
403 .name = "csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900404 .devname = "s5p-mipi-csis.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900405 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900406 .ctrlbit = (1 << 5),
407 }, {
408 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900409 .devname = "exynos4-fimc.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900410 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900411 .ctrlbit = (1 << 0),
412 }, {
413 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900414 .devname = "exynos4-fimc.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900415 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900416 .ctrlbit = (1 << 1),
417 }, {
418 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900419 .devname = "exynos4-fimc.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900420 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900421 .ctrlbit = (1 << 2),
422 }, {
423 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900424 .devname = "exynos4-fimc.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900425 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900426 .ctrlbit = (1 << 3),
427 }, {
428 .name = "fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +0900429 .devname = "exynos4-fb.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900430 .enable = exynos4_clk_ip_lcd0_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900431 .ctrlbit = (1 << 0),
432 }, {
433 .name = "fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +0900434 .devname = "exynos4-fb.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900435 .enable = exynos4_clk_ip_lcd1_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900436 .ctrlbit = (1 << 0),
437 }, {
Abhilash Kesavan40360212011-03-15 18:35:24 +0900438 .name = "sataphy",
Abhilash Kesavan40360212011-03-15 18:35:24 +0900439 .parent = &clk_aclk_133.clk,
440 .enable = exynos4_clk_ip_fsys_ctrl,
441 .ctrlbit = (1 << 3),
442 }, {
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900443 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900444 .devname = "s3c-sdhci.0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900445 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900446 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900447 .ctrlbit = (1 << 5),
448 }, {
449 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900450 .devname = "s3c-sdhci.1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900451 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900452 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900453 .ctrlbit = (1 << 6),
454 }, {
455 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900456 .devname = "s3c-sdhci.2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900457 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900458 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900459 .ctrlbit = (1 << 7),
460 }, {
461 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900462 .devname = "s3c-sdhci.3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900463 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900464 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900465 .ctrlbit = (1 << 8),
466 }, {
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900467 .name = "dwmmc",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900468 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900469 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900470 .ctrlbit = (1 << 9),
Jongpill Lee82260bf2010-08-18 22:49:24 +0900471 }, {
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +0900472 .name = "dac",
473 .devname = "s5p-sdo",
474 .enable = exynos4_clk_ip_tv_ctrl,
475 .ctrlbit = (1 << 2),
476 }, {
477 .name = "mixer",
478 .devname = "s5p-mixer",
479 .enable = exynos4_clk_ip_tv_ctrl,
480 .ctrlbit = (1 << 1),
481 }, {
482 .name = "vp",
483 .devname = "s5p-mixer",
484 .enable = exynos4_clk_ip_tv_ctrl,
485 .ctrlbit = (1 << 0),
486 }, {
487 .name = "hdmi",
488 .devname = "exynos4-hdmi",
489 .enable = exynos4_clk_ip_tv_ctrl,
490 .ctrlbit = (1 << 3),
491 }, {
492 .name = "hdmiphy",
493 .devname = "exynos4-hdmi",
494 .enable = exynos4_clk_hdmiphy_ctrl,
495 .ctrlbit = (1 << 0),
496 }, {
497 .name = "dacphy",
498 .devname = "s5p-sdo",
499 .enable = exynos4_clk_dac_ctrl,
500 .ctrlbit = (1 << 0),
501 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900502 .name = "sata",
Abhilash Kesavan40360212011-03-15 18:35:24 +0900503 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900504 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900505 .ctrlbit = (1 << 10),
506 }, {
Boojin Kimbf856fb2011-09-02 09:44:36 +0900507 .name = "dma",
Vladimir Zapolskiy2c929422011-08-18 19:24:54 +0900508 .devname = "dma-pl330.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900509 .enable = exynos4_clk_ip_fsys_ctrl,
Jassi Brar3055c6d2010-12-21 09:54:35 +0900510 .ctrlbit = (1 << 0),
511 }, {
Boojin Kimbf856fb2011-09-02 09:44:36 +0900512 .name = "dma",
Vladimir Zapolskiy2c929422011-08-18 19:24:54 +0900513 .devname = "dma-pl330.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900514 .enable = exynos4_clk_ip_fsys_ctrl,
Jassi Brar3055c6d2010-12-21 09:54:35 +0900515 .ctrlbit = (1 << 1),
516 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900517 .name = "adc",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900518 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900519 .ctrlbit = (1 << 15),
520 }, {
Naveen Krishna Chf9d7bcb2011-02-22 17:13:42 +0900521 .name = "keypad",
Naveen Krishna Chf9d7bcb2011-02-22 17:13:42 +0900522 .enable = exynos4_clk_ip_perir_ctrl,
523 .ctrlbit = (1 << 16),
524 }, {
Changhwan Youncdff6e62010-09-20 15:25:51 +0900525 .name = "rtc",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900526 .enable = exynos4_clk_ip_perir_ctrl,
Changhwan Youncdff6e62010-09-20 15:25:51 +0900527 .ctrlbit = (1 << 15),
528 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900529 .name = "watchdog",
Inderpal Singhf5fb4a22011-03-08 07:13:45 +0900530 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900531 .enable = exynos4_clk_ip_perir_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900532 .ctrlbit = (1 << 14),
533 }, {
534 .name = "usbhost",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900535 .enable = exynos4_clk_ip_fsys_ctrl ,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900536 .ctrlbit = (1 << 12),
537 }, {
538 .name = "otg",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900539 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900540 .ctrlbit = (1 << 13),
541 }, {
542 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900543 .devname = "s3c64xx-spi.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900544 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900545 .ctrlbit = (1 << 16),
546 }, {
547 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900548 .devname = "s3c64xx-spi.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900549 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900550 .ctrlbit = (1 << 17),
551 }, {
552 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900553 .devname = "s3c64xx-spi.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900554 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900555 .ctrlbit = (1 << 18),
556 }, {
Jassi Brar2d270432010-12-21 09:57:03 +0900557 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900558 .devname = "samsung-i2s.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900559 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900560 .ctrlbit = (1 << 19),
561 }, {
562 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900563 .devname = "samsung-i2s.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900564 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900565 .ctrlbit = (1 << 20),
566 }, {
567 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900568 .devname = "samsung-i2s.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900569 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900570 .ctrlbit = (1 << 21),
571 }, {
Jassi Braraa227552010-12-21 09:54:57 +0900572 .name = "ac97",
Jonghwan Choiaf8a9f62011-08-12 18:15:42 +0900573 .devname = "samsung-ac97",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900574 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Braraa227552010-12-21 09:54:57 +0900575 .ctrlbit = (1 << 27),
576 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900577 .name = "fimg2d",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900578 .enable = exynos4_clk_ip_image_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900579 .ctrlbit = (1 << 0),
580 }, {
Kamil Debski0f75a962011-07-21 16:42:30 +0900581 .name = "mfc",
582 .devname = "s5p-mfc",
583 .enable = exynos4_clk_ip_mfc_ctrl,
584 .ctrlbit = (1 << 0),
585 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900586 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900587 .devname = "s3c2440-i2c.0",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900588 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900589 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900590 .ctrlbit = (1 << 6),
591 }, {
592 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900593 .devname = "s3c2440-i2c.1",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900594 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900595 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900596 .ctrlbit = (1 << 7),
597 }, {
598 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900599 .devname = "s3c2440-i2c.2",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900600 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900601 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900602 .ctrlbit = (1 << 8),
603 }, {
604 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900605 .devname = "s3c2440-i2c.3",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900606 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900607 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900608 .ctrlbit = (1 << 9),
609 }, {
610 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900611 .devname = "s3c2440-i2c.4",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900612 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900613 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900614 .ctrlbit = (1 << 10),
615 }, {
616 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900617 .devname = "s3c2440-i2c.5",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900618 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900619 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900620 .ctrlbit = (1 << 11),
621 }, {
622 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900623 .devname = "s3c2440-i2c.6",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900624 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900625 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900626 .ctrlbit = (1 << 12),
627 }, {
628 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900629 .devname = "s3c2440-i2c.7",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900630 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900631 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900632 .ctrlbit = (1 << 13),
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900633 }, {
Tomasz Stanislawskic40e7e02011-09-16 18:44:36 +0900634 .name = "i2c",
635 .devname = "s3c2440-hdmiphy-i2c",
636 .parent = &clk_aclk_100.clk,
637 .enable = exynos4_clk_ip_peril_ctrl,
638 .ctrlbit = (1 << 14),
639 }, {
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900640 .name = "SYSMMU_MDMA",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900641 .enable = exynos4_clk_ip_image_ctrl,
642 .ctrlbit = (1 << 5),
643 }, {
644 .name = "SYSMMU_FIMC0",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900645 .enable = exynos4_clk_ip_cam_ctrl,
646 .ctrlbit = (1 << 7),
647 }, {
648 .name = "SYSMMU_FIMC1",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900649 .enable = exynos4_clk_ip_cam_ctrl,
650 .ctrlbit = (1 << 8),
651 }, {
652 .name = "SYSMMU_FIMC2",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900653 .enable = exynos4_clk_ip_cam_ctrl,
654 .ctrlbit = (1 << 9),
655 }, {
656 .name = "SYSMMU_FIMC3",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900657 .enable = exynos4_clk_ip_cam_ctrl,
658 .ctrlbit = (1 << 10),
659 }, {
660 .name = "SYSMMU_JPEG",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900661 .enable = exynos4_clk_ip_cam_ctrl,
662 .ctrlbit = (1 << 11),
663 }, {
664 .name = "SYSMMU_FIMD0",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900665 .enable = exynos4_clk_ip_lcd0_ctrl,
666 .ctrlbit = (1 << 4),
667 }, {
668 .name = "SYSMMU_FIMD1",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900669 .enable = exynos4_clk_ip_lcd1_ctrl,
670 .ctrlbit = (1 << 4),
671 }, {
672 .name = "SYSMMU_PCIe",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900673 .enable = exynos4_clk_ip_fsys_ctrl,
674 .ctrlbit = (1 << 18),
675 }, {
676 .name = "SYSMMU_G2D",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900677 .enable = exynos4_clk_ip_image_ctrl,
678 .ctrlbit = (1 << 3),
679 }, {
680 .name = "SYSMMU_ROTATOR",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900681 .enable = exynos4_clk_ip_image_ctrl,
682 .ctrlbit = (1 << 4),
683 }, {
684 .name = "SYSMMU_TV",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900685 .enable = exynos4_clk_ip_tv_ctrl,
686 .ctrlbit = (1 << 4),
687 }, {
688 .name = "SYSMMU_MFC_L",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900689 .enable = exynos4_clk_ip_mfc_ctrl,
690 .ctrlbit = (1 << 1),
691 }, {
692 .name = "SYSMMU_MFC_R",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900693 .enable = exynos4_clk_ip_mfc_ctrl,
694 .ctrlbit = (1 << 2),
695 }
Changhwan Younc8bef142010-07-27 17:52:39 +0900696};
697
698static struct clk init_clocks[] = {
Jongpill Lee5a847b42010-08-27 16:50:47 +0900699 {
700 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900701 .devname = "s5pv210-uart.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900702 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900703 .ctrlbit = (1 << 0),
704 }, {
705 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900706 .devname = "s5pv210-uart.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900707 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900708 .ctrlbit = (1 << 1),
709 }, {
710 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900711 .devname = "s5pv210-uart.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900712 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900713 .ctrlbit = (1 << 2),
714 }, {
715 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900716 .devname = "s5pv210-uart.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900717 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900718 .ctrlbit = (1 << 3),
719 }, {
720 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900721 .devname = "s5pv210-uart.4",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900722 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900723 .ctrlbit = (1 << 4),
724 }, {
725 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900726 .devname = "s5pv210-uart.5",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900727 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900728 .ctrlbit = (1 << 5),
729 }
Changhwan Younc8bef142010-07-27 17:52:39 +0900730};
731
732static struct clk *clkset_group_list[] = {
733 [0] = &clk_ext_xtal_mux,
734 [1] = &clk_xusbxti,
735 [2] = &clk_sclk_hdmi27m,
Jongpill Leeb99380e2010-08-18 22:16:45 +0900736 [3] = &clk_sclk_usbphy0,
737 [4] = &clk_sclk_usbphy1,
738 [5] = &clk_sclk_hdmiphy,
Changhwan Younc8bef142010-07-27 17:52:39 +0900739 [6] = &clk_mout_mpll.clk,
740 [7] = &clk_mout_epll.clk,
741 [8] = &clk_sclk_vpll.clk,
742};
743
744static struct clksrc_sources clkset_group = {
745 .sources = clkset_group_list,
746 .nr_sources = ARRAY_SIZE(clkset_group_list),
747};
748
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900749static struct clk *clkset_mout_g2d0_list[] = {
750 [0] = &clk_mout_mpll.clk,
751 [1] = &clk_sclk_apll.clk,
752};
753
754static struct clksrc_sources clkset_mout_g2d0 = {
755 .sources = clkset_mout_g2d0_list,
756 .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
757};
758
759static struct clksrc_clk clk_mout_g2d0 = {
760 .clk = {
761 .name = "mout_g2d0",
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900762 },
763 .sources = &clkset_mout_g2d0,
764 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
765};
766
767static struct clk *clkset_mout_g2d1_list[] = {
768 [0] = &clk_mout_epll.clk,
769 [1] = &clk_sclk_vpll.clk,
770};
771
772static struct clksrc_sources clkset_mout_g2d1 = {
773 .sources = clkset_mout_g2d1_list,
774 .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
775};
776
777static struct clksrc_clk clk_mout_g2d1 = {
778 .clk = {
779 .name = "mout_g2d1",
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900780 },
781 .sources = &clkset_mout_g2d1,
782 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
783};
784
785static struct clk *clkset_mout_g2d_list[] = {
786 [0] = &clk_mout_g2d0.clk,
787 [1] = &clk_mout_g2d1.clk,
788};
789
790static struct clksrc_sources clkset_mout_g2d = {
791 .sources = clkset_mout_g2d_list,
792 .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
793};
794
Kamil Debski0f75a962011-07-21 16:42:30 +0900795static struct clk *clkset_mout_mfc0_list[] = {
796 [0] = &clk_mout_mpll.clk,
797 [1] = &clk_sclk_apll.clk,
798};
799
800static struct clksrc_sources clkset_mout_mfc0 = {
801 .sources = clkset_mout_mfc0_list,
802 .nr_sources = ARRAY_SIZE(clkset_mout_mfc0_list),
803};
804
805static struct clksrc_clk clk_mout_mfc0 = {
806 .clk = {
807 .name = "mout_mfc0",
808 },
809 .sources = &clkset_mout_mfc0,
810 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 0, .size = 1 },
811};
812
813static struct clk *clkset_mout_mfc1_list[] = {
814 [0] = &clk_mout_epll.clk,
815 [1] = &clk_sclk_vpll.clk,
816};
817
818static struct clksrc_sources clkset_mout_mfc1 = {
819 .sources = clkset_mout_mfc1_list,
820 .nr_sources = ARRAY_SIZE(clkset_mout_mfc1_list),
821};
822
823static struct clksrc_clk clk_mout_mfc1 = {
824 .clk = {
825 .name = "mout_mfc1",
826 },
827 .sources = &clkset_mout_mfc1,
828 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 4, .size = 1 },
829};
830
831static struct clk *clkset_mout_mfc_list[] = {
832 [0] = &clk_mout_mfc0.clk,
833 [1] = &clk_mout_mfc1.clk,
834};
835
836static struct clksrc_sources clkset_mout_mfc = {
837 .sources = clkset_mout_mfc_list,
838 .nr_sources = ARRAY_SIZE(clkset_mout_mfc_list),
839};
840
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +0900841static struct clk *clkset_sclk_dac_list[] = {
842 [0] = &clk_sclk_vpll.clk,
843 [1] = &clk_sclk_hdmiphy,
844};
845
846static struct clksrc_sources clkset_sclk_dac = {
847 .sources = clkset_sclk_dac_list,
848 .nr_sources = ARRAY_SIZE(clkset_sclk_dac_list),
849};
850
851static struct clksrc_clk clk_sclk_dac = {
852 .clk = {
853 .name = "sclk_dac",
854 .enable = exynos4_clksrc_mask_tv_ctrl,
855 .ctrlbit = (1 << 8),
856 },
857 .sources = &clkset_sclk_dac,
858 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 8, .size = 1 },
859};
860
861static struct clksrc_clk clk_sclk_pixel = {
862 .clk = {
863 .name = "sclk_pixel",
864 .parent = &clk_sclk_vpll.clk,
865 },
866 .reg_div = { .reg = S5P_CLKDIV_TV, .shift = 0, .size = 4 },
867};
868
869static struct clk *clkset_sclk_hdmi_list[] = {
870 [0] = &clk_sclk_pixel.clk,
871 [1] = &clk_sclk_hdmiphy,
872};
873
874static struct clksrc_sources clkset_sclk_hdmi = {
875 .sources = clkset_sclk_hdmi_list,
876 .nr_sources = ARRAY_SIZE(clkset_sclk_hdmi_list),
877};
878
879static struct clksrc_clk clk_sclk_hdmi = {
880 .clk = {
881 .name = "sclk_hdmi",
882 .enable = exynos4_clksrc_mask_tv_ctrl,
883 .ctrlbit = (1 << 0),
884 },
885 .sources = &clkset_sclk_hdmi,
886 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 0, .size = 1 },
887};
888
889static struct clk *clkset_sclk_mixer_list[] = {
890 [0] = &clk_sclk_dac.clk,
891 [1] = &clk_sclk_hdmi.clk,
892};
893
894static struct clksrc_sources clkset_sclk_mixer = {
895 .sources = clkset_sclk_mixer_list,
896 .nr_sources = ARRAY_SIZE(clkset_sclk_mixer_list),
897};
898
899static struct clksrc_clk clk_sclk_mixer = {
900 .clk = {
901 .name = "sclk_mixer",
902 .enable = exynos4_clksrc_mask_tv_ctrl,
903 .ctrlbit = (1 << 4),
904 },
905 .sources = &clkset_sclk_mixer,
906 .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 4, .size = 1 },
907};
908
909static struct clksrc_clk *sclk_tv[] = {
910 &clk_sclk_dac,
911 &clk_sclk_pixel,
912 &clk_sclk_hdmi,
913 &clk_sclk_mixer,
914};
915
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900916static struct clksrc_clk clk_dout_mmc0 = {
917 .clk = {
918 .name = "dout_mmc0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900919 },
920 .sources = &clkset_group,
921 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
922 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
923};
924
925static struct clksrc_clk clk_dout_mmc1 = {
926 .clk = {
927 .name = "dout_mmc1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900928 },
929 .sources = &clkset_group,
930 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
931 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
932};
933
934static struct clksrc_clk clk_dout_mmc2 = {
935 .clk = {
936 .name = "dout_mmc2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900937 },
938 .sources = &clkset_group,
939 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
940 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
941};
942
943static struct clksrc_clk clk_dout_mmc3 = {
944 .clk = {
945 .name = "dout_mmc3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900946 },
947 .sources = &clkset_group,
948 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
949 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
950};
951
952static struct clksrc_clk clk_dout_mmc4 = {
953 .clk = {
954 .name = "dout_mmc4",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900955 },
956 .sources = &clkset_group,
957 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
958 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
959};
960
Changhwan Younc8bef142010-07-27 17:52:39 +0900961static struct clksrc_clk clksrcs[] = {
962 {
963 .clk = {
964 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900965 .devname = "s5pv210-uart.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900966 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900967 .ctrlbit = (1 << 0),
Changhwan Younc8bef142010-07-27 17:52:39 +0900968 },
969 .sources = &clkset_group,
970 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
971 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
972 }, {
973 .clk = {
974 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900975 .devname = "s5pv210-uart.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900976 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900977 .ctrlbit = (1 << 4),
Changhwan Younc8bef142010-07-27 17:52:39 +0900978 },
979 .sources = &clkset_group,
980 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
981 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
982 }, {
983 .clk = {
984 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900985 .devname = "s5pv210-uart.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900986 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900987 .ctrlbit = (1 << 8),
Changhwan Younc8bef142010-07-27 17:52:39 +0900988 },
989 .sources = &clkset_group,
990 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
991 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
992 }, {
993 .clk = {
994 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900995 .devname = "s5pv210-uart.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900996 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900997 .ctrlbit = (1 << 12),
Changhwan Younc8bef142010-07-27 17:52:39 +0900998 },
999 .sources = &clkset_group,
1000 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
1001 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
1002 }, {
1003 .clk = {
1004 .name = "sclk_pwm",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001005 .enable = exynos4_clksrc_mask_peril0_ctrl,
Changhwan Younc8bef142010-07-27 17:52:39 +09001006 .ctrlbit = (1 << 24),
1007 },
1008 .sources = &clkset_group,
1009 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
1010 .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001011 }, {
1012 .clk = {
Jongpill Lee33f469d2010-08-18 22:54:48 +09001013 .name = "sclk_csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001014 .devname = "s5p-mipi-csis.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001015 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001016 .ctrlbit = (1 << 24),
1017 },
1018 .sources = &clkset_group,
1019 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
1020 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
1021 }, {
1022 .clk = {
1023 .name = "sclk_csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001024 .devname = "s5p-mipi-csis.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001025 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001026 .ctrlbit = (1 << 28),
1027 },
1028 .sources = &clkset_group,
1029 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
1030 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
1031 }, {
1032 .clk = {
Sylwester Nawrocki00aaad22011-09-27 07:00:59 +09001033 .name = "sclk_cam0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001034 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001035 .ctrlbit = (1 << 16),
1036 },
1037 .sources = &clkset_group,
1038 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
1039 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
1040 }, {
1041 .clk = {
Sylwester Nawrocki00aaad22011-09-27 07:00:59 +09001042 .name = "sclk_cam1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001043 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001044 .ctrlbit = (1 << 20),
1045 },
1046 .sources = &clkset_group,
1047 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
1048 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
1049 }, {
1050 .clk = {
1051 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001052 .devname = "exynos4-fimc.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001053 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001054 .ctrlbit = (1 << 0),
1055 },
1056 .sources = &clkset_group,
1057 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
1058 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
1059 }, {
1060 .clk = {
1061 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001062 .devname = "exynos4-fimc.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001063 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001064 .ctrlbit = (1 << 4),
1065 },
1066 .sources = &clkset_group,
1067 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
1068 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
1069 }, {
1070 .clk = {
1071 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001072 .devname = "exynos4-fimc.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001073 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001074 .ctrlbit = (1 << 8),
1075 },
1076 .sources = &clkset_group,
1077 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
1078 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
1079 }, {
1080 .clk = {
1081 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001082 .devname = "exynos4-fimc.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001083 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001084 .ctrlbit = (1 << 12),
1085 },
1086 .sources = &clkset_group,
1087 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
1088 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
1089 }, {
1090 .clk = {
1091 .name = "sclk_fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +09001092 .devname = "exynos4-fb.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001093 .enable = exynos4_clksrc_mask_lcd0_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001094 .ctrlbit = (1 << 0),
1095 },
1096 .sources = &clkset_group,
1097 .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
1098 .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
1099 }, {
1100 .clk = {
1101 .name = "sclk_fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +09001102 .devname = "exynos4-fb.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001103 .enable = exynos4_clksrc_mask_lcd1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001104 .ctrlbit = (1 << 0),
1105 },
1106 .sources = &clkset_group,
1107 .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
1108 .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
1109 }, {
1110 .clk = {
1111 .name = "sclk_sata",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001112 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001113 .ctrlbit = (1 << 24),
1114 },
1115 .sources = &clkset_mout_corebus,
1116 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
1117 .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
1118 }, {
1119 .clk = {
1120 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001121 .devname = "s3c64xx-spi.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001122 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001123 .ctrlbit = (1 << 16),
1124 },
1125 .sources = &clkset_group,
1126 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
1127 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 },
1128 }, {
1129 .clk = {
1130 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001131 .devname = "s3c64xx-spi.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001132 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001133 .ctrlbit = (1 << 20),
1134 },
1135 .sources = &clkset_group,
1136 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
1137 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 },
1138 }, {
1139 .clk = {
1140 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001141 .devname = "s3c64xx-spi.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001142 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001143 .ctrlbit = (1 << 24),
1144 },
1145 .sources = &clkset_group,
1146 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
1147 .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 },
1148 }, {
1149 .clk = {
1150 .name = "sclk_fimg2d",
Jongpill Lee33f469d2010-08-18 22:54:48 +09001151 },
1152 .sources = &clkset_mout_g2d,
1153 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
1154 .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
1155 }, {
1156 .clk = {
Kamil Debski0f75a962011-07-21 16:42:30 +09001157 .name = "sclk_mfc",
1158 .devname = "s5p-mfc",
1159 },
1160 .sources = &clkset_mout_mfc,
1161 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 8, .size = 1 },
1162 .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 },
1163 }, {
1164 .clk = {
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001165 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001166 .devname = "s3c-sdhci.0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001167 .parent = &clk_dout_mmc0.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001168 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001169 .ctrlbit = (1 << 0),
1170 },
1171 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
1172 }, {
1173 .clk = {
1174 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001175 .devname = "s3c-sdhci.1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001176 .parent = &clk_dout_mmc1.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001177 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001178 .ctrlbit = (1 << 4),
1179 },
1180 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
1181 }, {
1182 .clk = {
1183 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001184 .devname = "s3c-sdhci.2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001185 .parent = &clk_dout_mmc2.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001186 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001187 .ctrlbit = (1 << 8),
1188 },
1189 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
1190 }, {
1191 .clk = {
1192 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001193 .devname = "s3c-sdhci.3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001194 .parent = &clk_dout_mmc3.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001195 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001196 .ctrlbit = (1 << 12),
1197 },
1198 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
1199 }, {
1200 .clk = {
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001201 .name = "sclk_dwmmc",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001202 .parent = &clk_dout_mmc4.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001203 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001204 .ctrlbit = (1 << 16),
1205 },
1206 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
1207 }
Changhwan Younc8bef142010-07-27 17:52:39 +09001208};
1209
1210/* Clock initialization code */
1211static struct clksrc_clk *sysclks[] = {
1212 &clk_mout_apll,
Jongpill Lee3ff31022010-08-18 22:20:31 +09001213 &clk_sclk_apll,
Changhwan Younc8bef142010-07-27 17:52:39 +09001214 &clk_mout_epll,
1215 &clk_mout_mpll,
1216 &clk_moutcore,
1217 &clk_coreclk,
1218 &clk_armclk,
1219 &clk_aclk_corem0,
1220 &clk_aclk_cores,
1221 &clk_aclk_corem1,
1222 &clk_periphclk,
Changhwan Younc8bef142010-07-27 17:52:39 +09001223 &clk_mout_corebus,
1224 &clk_sclk_dmc,
1225 &clk_aclk_cored,
1226 &clk_aclk_corep,
1227 &clk_aclk_acp,
1228 &clk_pclk_acp,
1229 &clk_vpllsrc,
1230 &clk_sclk_vpll,
1231 &clk_aclk_200,
1232 &clk_aclk_100,
1233 &clk_aclk_160,
1234 &clk_aclk_133,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001235 &clk_dout_mmc0,
1236 &clk_dout_mmc1,
1237 &clk_dout_mmc2,
1238 &clk_dout_mmc3,
1239 &clk_dout_mmc4,
Kamil Debski0f75a962011-07-21 16:42:30 +09001240 &clk_mout_mfc0,
1241 &clk_mout_mfc1,
Changhwan Younc8bef142010-07-27 17:52:39 +09001242};
1243
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001244static int xtal_rate;
1245
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001246static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001247{
1248 return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
1249}
1250
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001251static struct clk_ops exynos4_fout_apll_ops = {
1252 .get_rate = exynos4_fout_apll_get_rate,
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001253};
1254
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +09001255static u32 vpll_div[][8] = {
1256 { 54000000, 3, 53, 3, 1024, 0, 17, 0 },
1257 { 108000000, 3, 53, 2, 1024, 0, 17, 0 },
1258};
1259
1260static unsigned long exynos4_vpll_get_rate(struct clk *clk)
1261{
1262 return clk->rate;
1263}
1264
1265static int exynos4_vpll_set_rate(struct clk *clk, unsigned long rate)
1266{
1267 unsigned int vpll_con0, vpll_con1 = 0;
1268 unsigned int i;
1269
1270 /* Return if nothing changed */
1271 if (clk->rate == rate)
1272 return 0;
1273
1274 vpll_con0 = __raw_readl(S5P_VPLL_CON0);
1275 vpll_con0 &= ~(0x1 << 27 | \
1276 PLL90XX_MDIV_MASK << PLL46XX_MDIV_SHIFT | \
1277 PLL90XX_PDIV_MASK << PLL46XX_PDIV_SHIFT | \
1278 PLL90XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
1279
1280 vpll_con1 = __raw_readl(S5P_VPLL_CON1);
1281 vpll_con1 &= ~(PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT | \
1282 PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT | \
1283 PLL4650C_KDIV_MASK << PLL46XX_KDIV_SHIFT);
1284
1285 for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
1286 if (vpll_div[i][0] == rate) {
1287 vpll_con0 |= vpll_div[i][1] << PLL46XX_PDIV_SHIFT;
1288 vpll_con0 |= vpll_div[i][2] << PLL46XX_MDIV_SHIFT;
1289 vpll_con0 |= vpll_div[i][3] << PLL46XX_SDIV_SHIFT;
1290 vpll_con1 |= vpll_div[i][4] << PLL46XX_KDIV_SHIFT;
1291 vpll_con1 |= vpll_div[i][5] << PLL46XX_MFR_SHIFT;
1292 vpll_con1 |= vpll_div[i][6] << PLL46XX_MRR_SHIFT;
1293 vpll_con0 |= vpll_div[i][7] << 27;
1294 break;
1295 }
1296 }
1297
1298 if (i == ARRAY_SIZE(vpll_div)) {
1299 printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
1300 __func__);
1301 return -EINVAL;
1302 }
1303
1304 __raw_writel(vpll_con0, S5P_VPLL_CON0);
1305 __raw_writel(vpll_con1, S5P_VPLL_CON1);
1306
1307 /* Wait for VPLL lock */
1308 while (!(__raw_readl(S5P_VPLL_CON0) & (1 << PLL46XX_LOCKED_SHIFT)))
1309 continue;
1310
1311 clk->rate = rate;
1312 return 0;
1313}
1314
1315static struct clk_ops exynos4_vpll_ops = {
1316 .get_rate = exynos4_vpll_get_rate,
1317 .set_rate = exynos4_vpll_set_rate,
1318};
1319
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001320void __init_or_cpufreq exynos4_setup_clocks(void)
Changhwan Younc8bef142010-07-27 17:52:39 +09001321{
1322 struct clk *xtal_clk;
1323 unsigned long apll;
1324 unsigned long mpll;
1325 unsigned long epll;
1326 unsigned long vpll;
1327 unsigned long vpllsrc;
1328 unsigned long xtal;
1329 unsigned long armclk;
Changhwan Younc8bef142010-07-27 17:52:39 +09001330 unsigned long sclk_dmc;
Jongpill Lee228ef982010-08-18 22:24:53 +09001331 unsigned long aclk_200;
1332 unsigned long aclk_100;
1333 unsigned long aclk_160;
1334 unsigned long aclk_133;
Changhwan Younc8bef142010-07-27 17:52:39 +09001335 unsigned int ptr;
1336
1337 printk(KERN_DEBUG "%s: registering clocks\n", __func__);
1338
1339 xtal_clk = clk_get(NULL, "xtal");
1340 BUG_ON(IS_ERR(xtal_clk));
1341
1342 xtal = clk_get_rate(xtal_clk);
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001343
1344 xtal_rate = xtal;
1345
Changhwan Younc8bef142010-07-27 17:52:39 +09001346 clk_put(xtal_clk);
1347
1348 printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
1349
1350 apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
1351 mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
1352 epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
Jongpill Lee4d235f72010-08-18 22:13:49 +09001353 __raw_readl(S5P_EPLL_CON1), pll_4600);
Changhwan Younc8bef142010-07-27 17:52:39 +09001354
1355 vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
1356 vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
Jonghwan Choi6861a192011-08-23 16:27:17 +09001357 __raw_readl(S5P_VPLL_CON1), pll_4650c);
Changhwan Younc8bef142010-07-27 17:52:39 +09001358
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001359 clk_fout_apll.ops = &exynos4_fout_apll_ops;
Changhwan Younc8bef142010-07-27 17:52:39 +09001360 clk_fout_mpll.rate = mpll;
1361 clk_fout_epll.rate = epll;
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +09001362 clk_fout_vpll.ops = &exynos4_vpll_ops;
Changhwan Younc8bef142010-07-27 17:52:39 +09001363 clk_fout_vpll.rate = vpll;
1364
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001365 printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
Changhwan Younc8bef142010-07-27 17:52:39 +09001366 apll, mpll, epll, vpll);
1367
1368 armclk = clk_get_rate(&clk_armclk.clk);
Changhwan Younc8bef142010-07-27 17:52:39 +09001369 sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
Changhwan Younc8bef142010-07-27 17:52:39 +09001370
Jongpill Lee228ef982010-08-18 22:24:53 +09001371 aclk_200 = clk_get_rate(&clk_aclk_200.clk);
1372 aclk_100 = clk_get_rate(&clk_aclk_100.clk);
1373 aclk_160 = clk_get_rate(&clk_aclk_160.clk);
1374 aclk_133 = clk_get_rate(&clk_aclk_133.clk);
1375
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001376 printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
Jongpill Lee228ef982010-08-18 22:24:53 +09001377 "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
1378 armclk, sclk_dmc, aclk_200,
1379 aclk_100, aclk_160, aclk_133);
Changhwan Younc8bef142010-07-27 17:52:39 +09001380
1381 clk_f.rate = armclk;
1382 clk_h.rate = sclk_dmc;
Jongpill Lee228ef982010-08-18 22:24:53 +09001383 clk_p.rate = aclk_100;
Changhwan Younc8bef142010-07-27 17:52:39 +09001384
1385 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
1386 s3c_set_clksrc(&clksrcs[ptr], true);
1387}
1388
1389static struct clk *clks[] __initdata = {
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +09001390 &clk_sclk_hdmi27m,
1391 &clk_sclk_hdmiphy,
1392 &clk_sclk_usbphy0,
1393 &clk_sclk_usbphy1,
Changhwan Younc8bef142010-07-27 17:52:39 +09001394};
1395
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001396void __init exynos4_register_clocks(void)
Changhwan Younc8bef142010-07-27 17:52:39 +09001397{
Changhwan Younc8bef142010-07-27 17:52:39 +09001398 int ptr;
1399
Kukjin Kim957c4612011-01-04 17:58:22 +09001400 s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
Changhwan Younc8bef142010-07-27 17:52:39 +09001401
1402 for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
1403 s3c_register_clksrc(sysclks[ptr], 1);
1404
Tomasz Stanislawskifbf05562011-09-19 16:44:42 +09001405 for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
1406 s3c_register_clksrc(sclk_tv[ptr], 1);
1407
Changhwan Younc8bef142010-07-27 17:52:39 +09001408 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
1409 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
1410
Kukjin Kim957c4612011-01-04 17:58:22 +09001411 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
1412 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
Changhwan Younc8bef142010-07-27 17:52:39 +09001413
Boojin Kimbf856fb2011-09-02 09:44:36 +09001414 s3c24xx_register_clock(&dummy_apb_pclk);
1415
Changhwan Younc8bef142010-07-27 17:52:39 +09001416 s3c_pwmclk_init();
1417}