blob: 2a037cc221d070f9a18ad9854f538310291430f0 [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>
Jonghwan Choiacd35612011-08-24 21:52:45 +090016#include <linux/syscore_ops.h>
Changhwan Younc8bef142010-07-27 17:52:39 +090017
18#include <plat/cpu-freq.h>
19#include <plat/clock.h>
20#include <plat/cpu.h>
21#include <plat/pll.h>
22#include <plat/s5p-clock.h>
23#include <plat/clock-clksrc.h>
Kukjin Kim2bc02c02011-08-24 17:25:09 +090024#include <plat/exynos4.h>
Jonghwan Choiacd35612011-08-24 21:52:45 +090025#include <plat/pm.h>
Changhwan Younc8bef142010-07-27 17:52:39 +090026
27#include <mach/map.h>
28#include <mach/regs-clock.h>
KyongHo Chob0b6ff02011-03-07 09:10:24 +090029#include <mach/sysmmu.h>
Kukjin Kim2bc02c02011-08-24 17:25:09 +090030#include <mach/exynos4-clock.h>
Changhwan Younc8bef142010-07-27 17:52:39 +090031
Jonghwan Choiacd35612011-08-24 21:52:45 +090032static struct sleep_save exynos4_clock_save[] = {
33 SAVE_ITEM(S5P_CLKDIV_LEFTBUS),
34 SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS),
35 SAVE_ITEM(S5P_CLKDIV_RIGHTBUS),
36 SAVE_ITEM(S5P_CLKGATE_IP_RIGHTBUS),
37 SAVE_ITEM(S5P_CLKSRC_TOP0),
38 SAVE_ITEM(S5P_CLKSRC_TOP1),
39 SAVE_ITEM(S5P_CLKSRC_CAM),
40 SAVE_ITEM(S5P_CLKSRC_TV),
41 SAVE_ITEM(S5P_CLKSRC_MFC),
42 SAVE_ITEM(S5P_CLKSRC_G3D),
43 SAVE_ITEM(S5P_CLKSRC_LCD0),
44 SAVE_ITEM(S5P_CLKSRC_MAUDIO),
45 SAVE_ITEM(S5P_CLKSRC_FSYS),
46 SAVE_ITEM(S5P_CLKSRC_PERIL0),
47 SAVE_ITEM(S5P_CLKSRC_PERIL1),
48 SAVE_ITEM(S5P_CLKDIV_CAM),
49 SAVE_ITEM(S5P_CLKDIV_TV),
50 SAVE_ITEM(S5P_CLKDIV_MFC),
51 SAVE_ITEM(S5P_CLKDIV_G3D),
52 SAVE_ITEM(S5P_CLKDIV_LCD0),
53 SAVE_ITEM(S5P_CLKDIV_MAUDIO),
54 SAVE_ITEM(S5P_CLKDIV_FSYS0),
55 SAVE_ITEM(S5P_CLKDIV_FSYS1),
56 SAVE_ITEM(S5P_CLKDIV_FSYS2),
57 SAVE_ITEM(S5P_CLKDIV_FSYS3),
58 SAVE_ITEM(S5P_CLKDIV_PERIL0),
59 SAVE_ITEM(S5P_CLKDIV_PERIL1),
60 SAVE_ITEM(S5P_CLKDIV_PERIL2),
61 SAVE_ITEM(S5P_CLKDIV_PERIL3),
62 SAVE_ITEM(S5P_CLKDIV_PERIL4),
63 SAVE_ITEM(S5P_CLKDIV_PERIL5),
64 SAVE_ITEM(S5P_CLKDIV_TOP),
65 SAVE_ITEM(S5P_CLKSRC_MASK_TOP),
66 SAVE_ITEM(S5P_CLKSRC_MASK_CAM),
67 SAVE_ITEM(S5P_CLKSRC_MASK_TV),
68 SAVE_ITEM(S5P_CLKSRC_MASK_LCD0),
69 SAVE_ITEM(S5P_CLKSRC_MASK_MAUDIO),
70 SAVE_ITEM(S5P_CLKSRC_MASK_FSYS),
71 SAVE_ITEM(S5P_CLKSRC_MASK_PERIL0),
72 SAVE_ITEM(S5P_CLKSRC_MASK_PERIL1),
73 SAVE_ITEM(S5P_CLKDIV2_RATIO),
74 SAVE_ITEM(S5P_CLKGATE_SCLKCAM),
75 SAVE_ITEM(S5P_CLKGATE_IP_CAM),
76 SAVE_ITEM(S5P_CLKGATE_IP_TV),
77 SAVE_ITEM(S5P_CLKGATE_IP_MFC),
78 SAVE_ITEM(S5P_CLKGATE_IP_G3D),
79 SAVE_ITEM(S5P_CLKGATE_IP_LCD0),
80 SAVE_ITEM(S5P_CLKGATE_IP_FSYS),
81 SAVE_ITEM(S5P_CLKGATE_IP_GPS),
82 SAVE_ITEM(S5P_CLKGATE_IP_PERIL),
83 SAVE_ITEM(S5P_CLKGATE_BLOCK),
84 SAVE_ITEM(S5P_CLKSRC_MASK_DMC),
85 SAVE_ITEM(S5P_CLKSRC_DMC),
86 SAVE_ITEM(S5P_CLKDIV_DMC0),
87 SAVE_ITEM(S5P_CLKDIV_DMC1),
88 SAVE_ITEM(S5P_CLKGATE_IP_DMC),
89 SAVE_ITEM(S5P_CLKSRC_CPU),
90 SAVE_ITEM(S5P_CLKDIV_CPU),
91 SAVE_ITEM(S5P_CLKDIV_CPU + 0x4),
92 SAVE_ITEM(S5P_CLKGATE_SCLKCPU),
93 SAVE_ITEM(S5P_CLKGATE_IP_CPU),
94};
95
Kukjin Kim2bc02c02011-08-24 17:25:09 +090096struct clk clk_sclk_hdmi27m = {
Changhwan Younc8bef142010-07-27 17:52:39 +090097 .name = "sclk_hdmi27m",
Changhwan Younc8bef142010-07-27 17:52:39 +090098 .rate = 27000000,
99};
100
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900101struct clk clk_sclk_hdmiphy = {
Jongpill Leeb99380e2010-08-18 22:16:45 +0900102 .name = "sclk_hdmiphy",
Jongpill Leeb99380e2010-08-18 22:16:45 +0900103};
104
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900105struct clk clk_sclk_usbphy0 = {
Jongpill Leeb99380e2010-08-18 22:16:45 +0900106 .name = "sclk_usbphy0",
Jongpill Leeb99380e2010-08-18 22:16:45 +0900107 .rate = 27000000,
108};
109
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900110struct clk clk_sclk_usbphy1 = {
Jongpill Leeb99380e2010-08-18 22:16:45 +0900111 .name = "sclk_usbphy1",
Jongpill Leeb99380e2010-08-18 22:16:45 +0900112};
113
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900114static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
Jongpill Lee37e01722010-08-18 22:33:43 +0900115{
116 return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
117}
118
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900119static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +0900120{
121 return s5p_gatectrl(S5P_CLKSRC_MASK_CAM, clk, enable);
122}
123
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900124static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +0900125{
126 return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
127}
128
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900129int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900130{
131 return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
132}
133
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900134static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900135{
136 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL0, clk, enable);
137}
138
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900139static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
Jongpill Lee33f469d2010-08-18 22:54:48 +0900140{
141 return s5p_gatectrl(S5P_CLKSRC_MASK_PERIL1, clk, enable);
142}
143
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900144static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
145{
146 return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
147}
148
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900149static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900150{
151 return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
152}
153
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900154static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
155{
156 return s5p_gatectrl(S5P_CLKGATE_IP_TV, clk, enable);
157}
158
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900159static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900160{
161 return s5p_gatectrl(S5P_CLKGATE_IP_IMAGE, clk, enable);
162}
163
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900164static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900165{
166 return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
167}
168
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900169int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900170{
171 return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
172}
173
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900174int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900175{
176 return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
177}
178
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900179static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
Jongpill Lee5a847b42010-08-27 16:50:47 +0900180{
181 return s5p_gatectrl(S5P_CLKGATE_IP_PERIL, clk, enable);
182}
183
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900184static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
Jongpill Lee82260bf2010-08-18 22:49:24 +0900185{
186 return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
187}
188
Changhwan Younc8bef142010-07-27 17:52:39 +0900189/* Core list of CMU_CPU side */
190
191static struct clksrc_clk clk_mout_apll = {
192 .clk = {
193 .name = "mout_apll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900194 },
195 .sources = &clk_src_apll,
196 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
Jongpill Lee3ff31022010-08-18 22:20:31 +0900197};
198
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900199struct clksrc_clk clk_sclk_apll = {
Jongpill Lee3ff31022010-08-18 22:20:31 +0900200 .clk = {
201 .name = "sclk_apll",
Jongpill Lee3ff31022010-08-18 22:20:31 +0900202 .parent = &clk_mout_apll.clk,
203 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900204 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
205};
206
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900207struct clksrc_clk clk_mout_epll = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900208 .clk = {
209 .name = "mout_epll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900210 },
211 .sources = &clk_src_epll,
212 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
213};
214
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900215struct clksrc_clk clk_mout_mpll = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900216 .clk = {
217 .name = "mout_mpll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900218 },
219 .sources = &clk_src_mpll,
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900220
221 /* reg_src will be added in each SoCs' clock */
Changhwan Younc8bef142010-07-27 17:52:39 +0900222};
223
224static struct clk *clkset_moutcore_list[] = {
Jaecheol Lee8f3b9cf2010-09-18 10:50:46 +0900225 [0] = &clk_mout_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900226 [1] = &clk_mout_mpll.clk,
227};
228
229static struct clksrc_sources clkset_moutcore = {
230 .sources = clkset_moutcore_list,
231 .nr_sources = ARRAY_SIZE(clkset_moutcore_list),
232};
233
234static struct clksrc_clk clk_moutcore = {
235 .clk = {
236 .name = "moutcore",
Changhwan Younc8bef142010-07-27 17:52:39 +0900237 },
238 .sources = &clkset_moutcore,
239 .reg_src = { .reg = S5P_CLKSRC_CPU, .shift = 16, .size = 1 },
240};
241
242static struct clksrc_clk clk_coreclk = {
243 .clk = {
244 .name = "core_clk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900245 .parent = &clk_moutcore.clk,
246 },
247 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 0, .size = 3 },
248};
249
250static struct clksrc_clk clk_armclk = {
251 .clk = {
252 .name = "armclk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900253 .parent = &clk_coreclk.clk,
254 },
255};
256
257static struct clksrc_clk clk_aclk_corem0 = {
258 .clk = {
259 .name = "aclk_corem0",
Changhwan Younc8bef142010-07-27 17:52:39 +0900260 .parent = &clk_coreclk.clk,
261 },
262 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
263};
264
265static struct clksrc_clk clk_aclk_cores = {
266 .clk = {
267 .name = "aclk_cores",
Changhwan Younc8bef142010-07-27 17:52:39 +0900268 .parent = &clk_coreclk.clk,
269 },
270 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 4, .size = 3 },
271};
272
273static struct clksrc_clk clk_aclk_corem1 = {
274 .clk = {
275 .name = "aclk_corem1",
Changhwan Younc8bef142010-07-27 17:52:39 +0900276 .parent = &clk_coreclk.clk,
277 },
278 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 8, .size = 3 },
279};
280
281static struct clksrc_clk clk_periphclk = {
282 .clk = {
283 .name = "periphclk",
Changhwan Younc8bef142010-07-27 17:52:39 +0900284 .parent = &clk_coreclk.clk,
285 },
286 .reg_div = { .reg = S5P_CLKDIV_CPU, .shift = 12, .size = 3 },
287};
288
Changhwan Younc8bef142010-07-27 17:52:39 +0900289/* Core list of CMU_CORE side */
290
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900291struct clk *clkset_corebus_list[] = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900292 [0] = &clk_mout_mpll.clk,
Jongpill Lee3ff31022010-08-18 22:20:31 +0900293 [1] = &clk_sclk_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900294};
295
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900296struct clksrc_sources clkset_mout_corebus = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900297 .sources = clkset_corebus_list,
298 .nr_sources = ARRAY_SIZE(clkset_corebus_list),
299};
300
301static struct clksrc_clk clk_mout_corebus = {
302 .clk = {
303 .name = "mout_corebus",
Changhwan Younc8bef142010-07-27 17:52:39 +0900304 },
305 .sources = &clkset_mout_corebus,
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900306 .reg_src = { .reg = S5P_CLKSRC_DMC, .shift = 4, .size = 1 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900307};
308
309static struct clksrc_clk clk_sclk_dmc = {
310 .clk = {
311 .name = "sclk_dmc",
Changhwan Younc8bef142010-07-27 17:52:39 +0900312 .parent = &clk_mout_corebus.clk,
313 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900314 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 12, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900315};
316
317static struct clksrc_clk clk_aclk_cored = {
318 .clk = {
319 .name = "aclk_cored",
Changhwan Younc8bef142010-07-27 17:52:39 +0900320 .parent = &clk_sclk_dmc.clk,
321 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900322 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 16, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900323};
324
325static struct clksrc_clk clk_aclk_corep = {
326 .clk = {
327 .name = "aclk_corep",
Changhwan Younc8bef142010-07-27 17:52:39 +0900328 .parent = &clk_aclk_cored.clk,
329 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900330 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 20, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900331};
332
333static struct clksrc_clk clk_aclk_acp = {
334 .clk = {
335 .name = "aclk_acp",
Changhwan Younc8bef142010-07-27 17:52:39 +0900336 .parent = &clk_mout_corebus.clk,
337 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900338 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 0, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900339};
340
341static struct clksrc_clk clk_pclk_acp = {
342 .clk = {
343 .name = "pclk_acp",
Changhwan Younc8bef142010-07-27 17:52:39 +0900344 .parent = &clk_aclk_acp.clk,
345 },
Sunyoung Kang7af36b92010-09-18 10:59:31 +0900346 .reg_div = { .reg = S5P_CLKDIV_DMC0, .shift = 4, .size = 3 },
Changhwan Younc8bef142010-07-27 17:52:39 +0900347};
348
349/* Core list of CMU_TOP side */
350
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900351struct clk *clkset_aclk_top_list[] = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900352 [0] = &clk_mout_mpll.clk,
Jongpill Lee3ff31022010-08-18 22:20:31 +0900353 [1] = &clk_sclk_apll.clk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900354};
355
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900356struct clksrc_sources clkset_aclk = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900357 .sources = clkset_aclk_top_list,
358 .nr_sources = ARRAY_SIZE(clkset_aclk_top_list),
359};
360
361static struct clksrc_clk clk_aclk_200 = {
362 .clk = {
363 .name = "aclk_200",
Changhwan Younc8bef142010-07-27 17:52:39 +0900364 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900365 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900366 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 12, .size = 1 },
367 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 0, .size = 3 },
368};
369
Changhwan Younc8bef142010-07-27 17:52:39 +0900370static struct clksrc_clk clk_aclk_100 = {
371 .clk = {
372 .name = "aclk_100",
Changhwan Younc8bef142010-07-27 17:52:39 +0900373 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900374 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900375 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 16, .size = 1 },
376 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 4, .size = 4 },
377};
378
Changhwan Younc8bef142010-07-27 17:52:39 +0900379static struct clksrc_clk clk_aclk_160 = {
380 .clk = {
381 .name = "aclk_160",
Changhwan Younc8bef142010-07-27 17:52:39 +0900382 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900383 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900384 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 20, .size = 1 },
385 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
386};
387
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900388struct clksrc_clk clk_aclk_133 = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900389 .clk = {
390 .name = "aclk_133",
Changhwan Younc8bef142010-07-27 17:52:39 +0900391 },
Kukjin Kim9e235522010-08-18 22:06:02 +0900392 .sources = &clkset_aclk,
Changhwan Younc8bef142010-07-27 17:52:39 +0900393 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 24, .size = 1 },
394 .reg_div = { .reg = S5P_CLKDIV_TOP, .shift = 12, .size = 3 },
395};
396
397static struct clk *clkset_vpllsrc_list[] = {
398 [0] = &clk_fin_vpll,
399 [1] = &clk_sclk_hdmi27m,
400};
401
402static struct clksrc_sources clkset_vpllsrc = {
403 .sources = clkset_vpllsrc_list,
404 .nr_sources = ARRAY_SIZE(clkset_vpllsrc_list),
405};
406
407static struct clksrc_clk clk_vpllsrc = {
408 .clk = {
409 .name = "vpll_src",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900410 .enable = exynos4_clksrc_mask_top_ctrl,
Jongpill Lee37e01722010-08-18 22:33:43 +0900411 .ctrlbit = (1 << 0),
Changhwan Younc8bef142010-07-27 17:52:39 +0900412 },
413 .sources = &clkset_vpllsrc,
414 .reg_src = { .reg = S5P_CLKSRC_TOP1, .shift = 0, .size = 1 },
415};
416
417static struct clk *clkset_sclk_vpll_list[] = {
418 [0] = &clk_vpllsrc.clk,
419 [1] = &clk_fout_vpll,
420};
421
422static struct clksrc_sources clkset_sclk_vpll = {
423 .sources = clkset_sclk_vpll_list,
424 .nr_sources = ARRAY_SIZE(clkset_sclk_vpll_list),
425};
426
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900427struct clksrc_clk clk_sclk_vpll = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900428 .clk = {
429 .name = "sclk_vpll",
Changhwan Younc8bef142010-07-27 17:52:39 +0900430 },
431 .sources = &clkset_sclk_vpll,
432 .reg_src = { .reg = S5P_CLKSRC_TOP0, .shift = 8, .size = 1 },
433};
434
Kukjin Kim957c4612011-01-04 17:58:22 +0900435static struct clk init_clocks_off[] = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900436 {
437 .name = "timers",
Changhwan Younc8bef142010-07-27 17:52:39 +0900438 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900439 .enable = exynos4_clk_ip_peril_ctrl,
Changhwan Younc8bef142010-07-27 17:52:39 +0900440 .ctrlbit = (1<<24),
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900441 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900442 .name = "csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900443 .devname = "s5p-mipi-csis.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900444 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900445 .ctrlbit = (1 << 4),
446 }, {
447 .name = "csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900448 .devname = "s5p-mipi-csis.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900449 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900450 .ctrlbit = (1 << 5),
451 }, {
452 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900453 .devname = "exynos4-fimc.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900454 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900455 .ctrlbit = (1 << 0),
456 }, {
457 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900458 .devname = "exynos4-fimc.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900459 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900460 .ctrlbit = (1 << 1),
461 }, {
462 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900463 .devname = "exynos4-fimc.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900464 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900465 .ctrlbit = (1 << 2),
466 }, {
467 .name = "fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900468 .devname = "exynos4-fimc.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900469 .enable = exynos4_clk_ip_cam_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900470 .ctrlbit = (1 << 3),
471 }, {
472 .name = "fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +0900473 .devname = "exynos4-fb.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900474 .enable = exynos4_clk_ip_lcd0_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900475 .ctrlbit = (1 << 0),
476 }, {
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900477 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900478 .devname = "s3c-sdhci.0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900479 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900480 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900481 .ctrlbit = (1 << 5),
482 }, {
483 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900484 .devname = "s3c-sdhci.1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900485 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900486 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900487 .ctrlbit = (1 << 6),
488 }, {
489 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900490 .devname = "s3c-sdhci.2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900491 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900492 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900493 .ctrlbit = (1 << 7),
494 }, {
495 .name = "hsmmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900496 .devname = "s3c-sdhci.3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900497 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900498 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900499 .ctrlbit = (1 << 8),
500 }, {
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900501 .name = "dwmmc",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900502 .parent = &clk_aclk_133.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900503 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900504 .ctrlbit = (1 << 9),
Jongpill Lee82260bf2010-08-18 22:49:24 +0900505 }, {
Jassi Brar3055c6d2010-12-21 09:54:35 +0900506 .name = "pdma",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900507 .devname = "s3c-pl330.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900508 .enable = exynos4_clk_ip_fsys_ctrl,
Jassi Brar3055c6d2010-12-21 09:54:35 +0900509 .ctrlbit = (1 << 0),
510 }, {
511 .name = "pdma",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900512 .devname = "s3c-pl330.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900513 .enable = exynos4_clk_ip_fsys_ctrl,
Jassi Brar3055c6d2010-12-21 09:54:35 +0900514 .ctrlbit = (1 << 1),
515 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900516 .name = "adc",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900517 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900518 .ctrlbit = (1 << 15),
519 }, {
Naveen Krishna Chf9d7bcb2011-02-22 17:13:42 +0900520 .name = "keypad",
Naveen Krishna Chf9d7bcb2011-02-22 17:13:42 +0900521 .enable = exynos4_clk_ip_perir_ctrl,
522 .ctrlbit = (1 << 16),
523 }, {
Changhwan Youncdff6e62010-09-20 15:25:51 +0900524 .name = "rtc",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900525 .enable = exynos4_clk_ip_perir_ctrl,
Changhwan Youncdff6e62010-09-20 15:25:51 +0900526 .ctrlbit = (1 << 15),
527 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900528 .name = "watchdog",
Inderpal Singhf5fb4a22011-03-08 07:13:45 +0900529 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900530 .enable = exynos4_clk_ip_perir_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900531 .ctrlbit = (1 << 14),
532 }, {
533 .name = "usbhost",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900534 .enable = exynos4_clk_ip_fsys_ctrl ,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900535 .ctrlbit = (1 << 12),
536 }, {
537 .name = "otg",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900538 .enable = exynos4_clk_ip_fsys_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900539 .ctrlbit = (1 << 13),
540 }, {
541 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900542 .devname = "s3c64xx-spi.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900543 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900544 .ctrlbit = (1 << 16),
545 }, {
546 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900547 .devname = "s3c64xx-spi.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900548 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900549 .ctrlbit = (1 << 17),
550 }, {
551 .name = "spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900552 .devname = "s3c64xx-spi.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900553 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900554 .ctrlbit = (1 << 18),
555 }, {
Jassi Brar2d270432010-12-21 09:57:03 +0900556 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900557 .devname = "samsung-i2s.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900558 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900559 .ctrlbit = (1 << 19),
560 }, {
561 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900562 .devname = "samsung-i2s.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900563 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900564 .ctrlbit = (1 << 20),
565 }, {
566 .name = "iis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900567 .devname = "samsung-i2s.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900568 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Brar2d270432010-12-21 09:57:03 +0900569 .ctrlbit = (1 << 21),
570 }, {
Jassi Braraa227552010-12-21 09:54:57 +0900571 .name = "ac97",
Jonghwan Choiaf8a9f62011-08-12 18:15:42 +0900572 .devname = "samsung-ac97",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900573 .enable = exynos4_clk_ip_peril_ctrl,
Jassi Braraa227552010-12-21 09:54:57 +0900574 .ctrlbit = (1 << 27),
575 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900576 .name = "fimg2d",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900577 .enable = exynos4_clk_ip_image_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900578 .ctrlbit = (1 << 0),
579 }, {
Kamil Debski0f75a962011-07-21 16:42:30 +0900580 .name = "mfc",
581 .devname = "s5p-mfc",
582 .enable = exynos4_clk_ip_mfc_ctrl,
583 .ctrlbit = (1 << 0),
584 }, {
Jongpill Lee82260bf2010-08-18 22:49:24 +0900585 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900586 .devname = "s3c2440-i2c.0",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900587 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900588 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900589 .ctrlbit = (1 << 6),
590 }, {
591 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900592 .devname = "s3c2440-i2c.1",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900593 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900594 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900595 .ctrlbit = (1 << 7),
596 }, {
597 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900598 .devname = "s3c2440-i2c.2",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900599 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900600 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900601 .ctrlbit = (1 << 8),
602 }, {
603 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900604 .devname = "s3c2440-i2c.3",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900605 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900606 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900607 .ctrlbit = (1 << 9),
608 }, {
609 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900610 .devname = "s3c2440-i2c.4",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900611 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900612 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900613 .ctrlbit = (1 << 10),
614 }, {
615 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900616 .devname = "s3c2440-i2c.5",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900617 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900618 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900619 .ctrlbit = (1 << 11),
620 }, {
621 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900622 .devname = "s3c2440-i2c.6",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900623 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900624 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900625 .ctrlbit = (1 << 12),
626 }, {
627 .name = "i2c",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900628 .devname = "s3c2440-i2c.7",
Jongpill Lee82260bf2010-08-18 22:49:24 +0900629 .parent = &clk_aclk_100.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900630 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee82260bf2010-08-18 22:49:24 +0900631 .ctrlbit = (1 << 13),
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900632 }, {
633 .name = "SYSMMU_MDMA",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900634 .enable = exynos4_clk_ip_image_ctrl,
635 .ctrlbit = (1 << 5),
636 }, {
637 .name = "SYSMMU_FIMC0",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900638 .enable = exynos4_clk_ip_cam_ctrl,
639 .ctrlbit = (1 << 7),
640 }, {
641 .name = "SYSMMU_FIMC1",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900642 .enable = exynos4_clk_ip_cam_ctrl,
643 .ctrlbit = (1 << 8),
644 }, {
645 .name = "SYSMMU_FIMC2",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900646 .enable = exynos4_clk_ip_cam_ctrl,
647 .ctrlbit = (1 << 9),
648 }, {
649 .name = "SYSMMU_FIMC3",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900650 .enable = exynos4_clk_ip_cam_ctrl,
651 .ctrlbit = (1 << 10),
652 }, {
653 .name = "SYSMMU_JPEG",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900654 .enable = exynos4_clk_ip_cam_ctrl,
655 .ctrlbit = (1 << 11),
656 }, {
657 .name = "SYSMMU_FIMD0",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900658 .enable = exynos4_clk_ip_lcd0_ctrl,
659 .ctrlbit = (1 << 4),
660 }, {
661 .name = "SYSMMU_FIMD1",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900662 .enable = exynos4_clk_ip_lcd1_ctrl,
663 .ctrlbit = (1 << 4),
664 }, {
665 .name = "SYSMMU_PCIe",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900666 .enable = exynos4_clk_ip_fsys_ctrl,
667 .ctrlbit = (1 << 18),
668 }, {
669 .name = "SYSMMU_G2D",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900670 .enable = exynos4_clk_ip_image_ctrl,
671 .ctrlbit = (1 << 3),
672 }, {
673 .name = "SYSMMU_ROTATOR",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900674 .enable = exynos4_clk_ip_image_ctrl,
675 .ctrlbit = (1 << 4),
676 }, {
677 .name = "SYSMMU_TV",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900678 .enable = exynos4_clk_ip_tv_ctrl,
679 .ctrlbit = (1 << 4),
680 }, {
681 .name = "SYSMMU_MFC_L",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900682 .enable = exynos4_clk_ip_mfc_ctrl,
683 .ctrlbit = (1 << 1),
684 }, {
685 .name = "SYSMMU_MFC_R",
KyongHo Chob0b6ff02011-03-07 09:10:24 +0900686 .enable = exynos4_clk_ip_mfc_ctrl,
687 .ctrlbit = (1 << 2),
688 }
Changhwan Younc8bef142010-07-27 17:52:39 +0900689};
690
691static struct clk init_clocks[] = {
Jongpill Lee5a847b42010-08-27 16:50:47 +0900692 {
693 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900694 .devname = "s5pv210-uart.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900695 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900696 .ctrlbit = (1 << 0),
697 }, {
698 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900699 .devname = "s5pv210-uart.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900700 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900701 .ctrlbit = (1 << 1),
702 }, {
703 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900704 .devname = "s5pv210-uart.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900705 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900706 .ctrlbit = (1 << 2),
707 }, {
708 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900709 .devname = "s5pv210-uart.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900710 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900711 .ctrlbit = (1 << 3),
712 }, {
713 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900714 .devname = "s5pv210-uart.4",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900715 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900716 .ctrlbit = (1 << 4),
717 }, {
718 .name = "uart",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900719 .devname = "s5pv210-uart.5",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900720 .enable = exynos4_clk_ip_peril_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900721 .ctrlbit = (1 << 5),
722 }
Changhwan Younc8bef142010-07-27 17:52:39 +0900723};
724
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900725struct clk *clkset_group_list[] = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900726 [0] = &clk_ext_xtal_mux,
727 [1] = &clk_xusbxti,
728 [2] = &clk_sclk_hdmi27m,
Jongpill Leeb99380e2010-08-18 22:16:45 +0900729 [3] = &clk_sclk_usbphy0,
730 [4] = &clk_sclk_usbphy1,
731 [5] = &clk_sclk_hdmiphy,
Changhwan Younc8bef142010-07-27 17:52:39 +0900732 [6] = &clk_mout_mpll.clk,
733 [7] = &clk_mout_epll.clk,
734 [8] = &clk_sclk_vpll.clk,
735};
736
Kukjin Kim2bc02c02011-08-24 17:25:09 +0900737struct clksrc_sources clkset_group = {
Changhwan Younc8bef142010-07-27 17:52:39 +0900738 .sources = clkset_group_list,
739 .nr_sources = ARRAY_SIZE(clkset_group_list),
740};
741
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900742static struct clk *clkset_mout_g2d0_list[] = {
743 [0] = &clk_mout_mpll.clk,
744 [1] = &clk_sclk_apll.clk,
745};
746
747static struct clksrc_sources clkset_mout_g2d0 = {
748 .sources = clkset_mout_g2d0_list,
749 .nr_sources = ARRAY_SIZE(clkset_mout_g2d0_list),
750};
751
752static struct clksrc_clk clk_mout_g2d0 = {
753 .clk = {
754 .name = "mout_g2d0",
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900755 },
756 .sources = &clkset_mout_g2d0,
757 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 0, .size = 1 },
758};
759
760static struct clk *clkset_mout_g2d1_list[] = {
761 [0] = &clk_mout_epll.clk,
762 [1] = &clk_sclk_vpll.clk,
763};
764
765static struct clksrc_sources clkset_mout_g2d1 = {
766 .sources = clkset_mout_g2d1_list,
767 .nr_sources = ARRAY_SIZE(clkset_mout_g2d1_list),
768};
769
770static struct clksrc_clk clk_mout_g2d1 = {
771 .clk = {
772 .name = "mout_g2d1",
Jongpill Lee06cba8d2010-08-18 22:51:23 +0900773 },
774 .sources = &clkset_mout_g2d1,
775 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 4, .size = 1 },
776};
777
778static struct clk *clkset_mout_g2d_list[] = {
779 [0] = &clk_mout_g2d0.clk,
780 [1] = &clk_mout_g2d1.clk,
781};
782
783static struct clksrc_sources clkset_mout_g2d = {
784 .sources = clkset_mout_g2d_list,
785 .nr_sources = ARRAY_SIZE(clkset_mout_g2d_list),
786};
787
Kamil Debski0f75a962011-07-21 16:42:30 +0900788static struct clk *clkset_mout_mfc0_list[] = {
789 [0] = &clk_mout_mpll.clk,
790 [1] = &clk_sclk_apll.clk,
791};
792
793static struct clksrc_sources clkset_mout_mfc0 = {
794 .sources = clkset_mout_mfc0_list,
795 .nr_sources = ARRAY_SIZE(clkset_mout_mfc0_list),
796};
797
798static struct clksrc_clk clk_mout_mfc0 = {
799 .clk = {
800 .name = "mout_mfc0",
801 },
802 .sources = &clkset_mout_mfc0,
803 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 0, .size = 1 },
804};
805
806static struct clk *clkset_mout_mfc1_list[] = {
807 [0] = &clk_mout_epll.clk,
808 [1] = &clk_sclk_vpll.clk,
809};
810
811static struct clksrc_sources clkset_mout_mfc1 = {
812 .sources = clkset_mout_mfc1_list,
813 .nr_sources = ARRAY_SIZE(clkset_mout_mfc1_list),
814};
815
816static struct clksrc_clk clk_mout_mfc1 = {
817 .clk = {
818 .name = "mout_mfc1",
819 },
820 .sources = &clkset_mout_mfc1,
821 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 4, .size = 1 },
822};
823
824static struct clk *clkset_mout_mfc_list[] = {
825 [0] = &clk_mout_mfc0.clk,
826 [1] = &clk_mout_mfc1.clk,
827};
828
829static struct clksrc_sources clkset_mout_mfc = {
830 .sources = clkset_mout_mfc_list,
831 .nr_sources = ARRAY_SIZE(clkset_mout_mfc_list),
832};
833
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900834static struct clksrc_clk clk_dout_mmc0 = {
835 .clk = {
836 .name = "dout_mmc0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900837 },
838 .sources = &clkset_group,
839 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 0, .size = 4 },
840 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 0, .size = 4 },
841};
842
843static struct clksrc_clk clk_dout_mmc1 = {
844 .clk = {
845 .name = "dout_mmc1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900846 },
847 .sources = &clkset_group,
848 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 4, .size = 4 },
849 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 16, .size = 4 },
850};
851
852static struct clksrc_clk clk_dout_mmc2 = {
853 .clk = {
854 .name = "dout_mmc2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900855 },
856 .sources = &clkset_group,
857 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 8, .size = 4 },
858 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 0, .size = 4 },
859};
860
861static struct clksrc_clk clk_dout_mmc3 = {
862 .clk = {
863 .name = "dout_mmc3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900864 },
865 .sources = &clkset_group,
866 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 12, .size = 4 },
867 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 16, .size = 4 },
868};
869
870static struct clksrc_clk clk_dout_mmc4 = {
871 .clk = {
872 .name = "dout_mmc4",
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900873 },
874 .sources = &clkset_group,
875 .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 16, .size = 4 },
876 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 0, .size = 4 },
877};
878
Changhwan Younc8bef142010-07-27 17:52:39 +0900879static struct clksrc_clk clksrcs[] = {
880 {
881 .clk = {
882 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900883 .devname = "s5pv210-uart.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900884 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee5a847b42010-08-27 16:50:47 +0900885 .ctrlbit = (1 << 0),
Changhwan Younc8bef142010-07-27 17:52:39 +0900886 },
887 .sources = &clkset_group,
888 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 0, .size = 4 },
889 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 0, .size = 4 },
890 }, {
891 .clk = {
892 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900893 .devname = "s5pv210-uart.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900894 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900895 .ctrlbit = (1 << 4),
Changhwan Younc8bef142010-07-27 17:52:39 +0900896 },
897 .sources = &clkset_group,
898 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 4, .size = 4 },
899 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 4, .size = 4 },
900 }, {
901 .clk = {
902 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900903 .devname = "s5pv210-uart.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900904 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900905 .ctrlbit = (1 << 8),
Changhwan Younc8bef142010-07-27 17:52:39 +0900906 },
907 .sources = &clkset_group,
908 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 8, .size = 4 },
909 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 8, .size = 4 },
910 }, {
911 .clk = {
912 .name = "uclk1",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900913 .devname = "s5pv210-uart.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900914 .enable = exynos4_clksrc_mask_peril0_ctrl,
Jongpill Lee3297c2e2010-08-27 17:53:26 +0900915 .ctrlbit = (1 << 12),
Changhwan Younc8bef142010-07-27 17:52:39 +0900916 },
917 .sources = &clkset_group,
918 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 12, .size = 4 },
919 .reg_div = { .reg = S5P_CLKDIV_PERIL0, .shift = 12, .size = 4 },
920 }, {
921 .clk = {
922 .name = "sclk_pwm",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900923 .enable = exynos4_clksrc_mask_peril0_ctrl,
Changhwan Younc8bef142010-07-27 17:52:39 +0900924 .ctrlbit = (1 << 24),
925 },
926 .sources = &clkset_group,
927 .reg_src = { .reg = S5P_CLKSRC_PERIL0, .shift = 24, .size = 4 },
928 .reg_div = { .reg = S5P_CLKDIV_PERIL3, .shift = 0, .size = 4 },
Jongpill Lee340ea1e2010-08-18 22:39:26 +0900929 }, {
930 .clk = {
Jongpill Lee33f469d2010-08-18 22:54:48 +0900931 .name = "sclk_csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900932 .devname = "s5p-mipi-csis.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900933 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900934 .ctrlbit = (1 << 24),
935 },
936 .sources = &clkset_group,
937 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 24, .size = 4 },
938 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 24, .size = 4 },
939 }, {
940 .clk = {
941 .name = "sclk_csis",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900942 .devname = "s5p-mipi-csis.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900943 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900944 .ctrlbit = (1 << 28),
945 },
946 .sources = &clkset_group,
947 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 28, .size = 4 },
948 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
949 }, {
950 .clk = {
951 .name = "sclk_cam",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900952 .devname = "exynos4-fimc.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900953 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900954 .ctrlbit = (1 << 16),
955 },
956 .sources = &clkset_group,
957 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 16, .size = 4 },
958 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
959 }, {
960 .clk = {
961 .name = "sclk_cam",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900962 .devname = "exynos4-fimc.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900963 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900964 .ctrlbit = (1 << 20),
965 },
966 .sources = &clkset_group,
967 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 20, .size = 4 },
968 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 20, .size = 4 },
969 }, {
970 .clk = {
971 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900972 .devname = "exynos4-fimc.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900973 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900974 .ctrlbit = (1 << 0),
975 },
976 .sources = &clkset_group,
977 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 0, .size = 4 },
978 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 0, .size = 4 },
979 }, {
980 .clk = {
981 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900982 .devname = "exynos4-fimc.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900983 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900984 .ctrlbit = (1 << 4),
985 },
986 .sources = &clkset_group,
987 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 4, .size = 4 },
988 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 4, .size = 4 },
989 }, {
990 .clk = {
991 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +0900992 .devname = "exynos4-fimc.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +0900993 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +0900994 .ctrlbit = (1 << 8),
995 },
996 .sources = &clkset_group,
997 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 8, .size = 4 },
998 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 8, .size = 4 },
999 }, {
1000 .clk = {
1001 .name = "sclk_fimc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001002 .devname = "exynos4-fimc.3",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001003 .enable = exynos4_clksrc_mask_cam_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001004 .ctrlbit = (1 << 12),
1005 },
1006 .sources = &clkset_group,
1007 .reg_src = { .reg = S5P_CLKSRC_CAM, .shift = 12, .size = 4 },
1008 .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 12, .size = 4 },
1009 }, {
1010 .clk = {
1011 .name = "sclk_fimd",
Jingoo Han268a7ef2011-07-21 15:42:38 +09001012 .devname = "exynos4-fb.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001013 .enable = exynos4_clksrc_mask_lcd0_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001014 .ctrlbit = (1 << 0),
1015 },
1016 .sources = &clkset_group,
1017 .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
1018 .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
1019 }, {
1020 .clk = {
Jongpill Lee33f469d2010-08-18 22:54:48 +09001021 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001022 .devname = "s3c64xx-spi.0",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001023 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001024 .ctrlbit = (1 << 16),
1025 },
1026 .sources = &clkset_group,
1027 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 16, .size = 4 },
1028 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 0, .size = 4 },
1029 }, {
1030 .clk = {
1031 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001032 .devname = "s3c64xx-spi.1",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001033 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001034 .ctrlbit = (1 << 20),
1035 },
1036 .sources = &clkset_group,
1037 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 20, .size = 4 },
1038 .reg_div = { .reg = S5P_CLKDIV_PERIL1, .shift = 16, .size = 4 },
1039 }, {
1040 .clk = {
1041 .name = "sclk_spi",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001042 .devname = "s3c64xx-spi.2",
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001043 .enable = exynos4_clksrc_mask_peril1_ctrl,
Jongpill Lee33f469d2010-08-18 22:54:48 +09001044 .ctrlbit = (1 << 24),
1045 },
1046 .sources = &clkset_group,
1047 .reg_src = { .reg = S5P_CLKSRC_PERIL1, .shift = 24, .size = 4 },
1048 .reg_div = { .reg = S5P_CLKDIV_PERIL2, .shift = 0, .size = 4 },
1049 }, {
1050 .clk = {
1051 .name = "sclk_fimg2d",
Jongpill Lee33f469d2010-08-18 22:54:48 +09001052 },
1053 .sources = &clkset_mout_g2d,
1054 .reg_src = { .reg = S5P_CLKSRC_IMAGE, .shift = 8, .size = 1 },
1055 .reg_div = { .reg = S5P_CLKDIV_IMAGE, .shift = 0, .size = 4 },
1056 }, {
1057 .clk = {
Kamil Debski0f75a962011-07-21 16:42:30 +09001058 .name = "sclk_mfc",
1059 .devname = "s5p-mfc",
1060 },
1061 .sources = &clkset_mout_mfc,
1062 .reg_src = { .reg = S5P_CLKSRC_MFC, .shift = 8, .size = 1 },
1063 .reg_div = { .reg = S5P_CLKDIV_MFC, .shift = 0, .size = 4 },
1064 }, {
1065 .clk = {
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001066 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001067 .devname = "s3c-sdhci.0",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001068 .parent = &clk_dout_mmc0.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001069 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001070 .ctrlbit = (1 << 0),
1071 },
1072 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 8, .size = 8 },
1073 }, {
1074 .clk = {
1075 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001076 .devname = "s3c-sdhci.1",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001077 .parent = &clk_dout_mmc1.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001078 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001079 .ctrlbit = (1 << 4),
1080 },
1081 .reg_div = { .reg = S5P_CLKDIV_FSYS1, .shift = 24, .size = 8 },
1082 }, {
1083 .clk = {
1084 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001085 .devname = "s3c-sdhci.2",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001086 .parent = &clk_dout_mmc2.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001087 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001088 .ctrlbit = (1 << 8),
1089 },
1090 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 8, .size = 8 },
1091 }, {
1092 .clk = {
1093 .name = "sclk_mmc",
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001094 .devname = "s3c-sdhci.3",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001095 .parent = &clk_dout_mmc3.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001096 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001097 .ctrlbit = (1 << 12),
1098 },
1099 .reg_div = { .reg = S5P_CLKDIV_FSYS2, .shift = 24, .size = 8 },
1100 }, {
1101 .clk = {
Thomas Abrahambadc4f22011-06-14 19:12:27 +09001102 .name = "sclk_dwmmc",
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001103 .parent = &clk_dout_mmc4.clk,
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001104 .enable = exynos4_clksrc_mask_fsys_ctrl,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001105 .ctrlbit = (1 << 16),
1106 },
1107 .reg_div = { .reg = S5P_CLKDIV_FSYS3, .shift = 8, .size = 8 },
1108 }
Changhwan Younc8bef142010-07-27 17:52:39 +09001109};
1110
1111/* Clock initialization code */
1112static struct clksrc_clk *sysclks[] = {
1113 &clk_mout_apll,
Jongpill Lee3ff31022010-08-18 22:20:31 +09001114 &clk_sclk_apll,
Changhwan Younc8bef142010-07-27 17:52:39 +09001115 &clk_mout_epll,
1116 &clk_mout_mpll,
1117 &clk_moutcore,
1118 &clk_coreclk,
1119 &clk_armclk,
1120 &clk_aclk_corem0,
1121 &clk_aclk_cores,
1122 &clk_aclk_corem1,
1123 &clk_periphclk,
Changhwan Younc8bef142010-07-27 17:52:39 +09001124 &clk_mout_corebus,
1125 &clk_sclk_dmc,
1126 &clk_aclk_cored,
1127 &clk_aclk_corep,
1128 &clk_aclk_acp,
1129 &clk_pclk_acp,
1130 &clk_vpllsrc,
1131 &clk_sclk_vpll,
1132 &clk_aclk_200,
1133 &clk_aclk_100,
1134 &clk_aclk_160,
1135 &clk_aclk_133,
Jongpill Lee340ea1e2010-08-18 22:39:26 +09001136 &clk_dout_mmc0,
1137 &clk_dout_mmc1,
1138 &clk_dout_mmc2,
1139 &clk_dout_mmc3,
1140 &clk_dout_mmc4,
Kamil Debski0f75a962011-07-21 16:42:30 +09001141 &clk_mout_mfc0,
1142 &clk_mout_mfc1,
Changhwan Younc8bef142010-07-27 17:52:39 +09001143};
1144
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001145static int xtal_rate;
1146
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001147static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001148{
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001149 if (soc_is_exynos4210())
1150 return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0),
1151 pll_4508);
Changhwan Younb88b1cc2011-10-04 17:08:56 +09001152 else if (soc_is_exynos4212() || soc_is_exynos4412())
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001153 return s5p_get_pll35xx(xtal_rate, __raw_readl(S5P_APLL_CON0));
1154 else
1155 return 0;
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001156}
1157
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001158static struct clk_ops exynos4_fout_apll_ops = {
1159 .get_rate = exynos4_fout_apll_get_rate,
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001160};
1161
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001162void __init_or_cpufreq exynos4_setup_clocks(void)
Changhwan Younc8bef142010-07-27 17:52:39 +09001163{
1164 struct clk *xtal_clk;
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001165 unsigned long apll = 0;
1166 unsigned long mpll = 0;
1167 unsigned long epll = 0;
1168 unsigned long vpll = 0;
Changhwan Younc8bef142010-07-27 17:52:39 +09001169 unsigned long vpllsrc;
1170 unsigned long xtal;
1171 unsigned long armclk;
Changhwan Younc8bef142010-07-27 17:52:39 +09001172 unsigned long sclk_dmc;
Jongpill Lee228ef982010-08-18 22:24:53 +09001173 unsigned long aclk_200;
1174 unsigned long aclk_100;
1175 unsigned long aclk_160;
1176 unsigned long aclk_133;
Changhwan Younc8bef142010-07-27 17:52:39 +09001177 unsigned int ptr;
1178
1179 printk(KERN_DEBUG "%s: registering clocks\n", __func__);
1180
1181 xtal_clk = clk_get(NULL, "xtal");
1182 BUG_ON(IS_ERR(xtal_clk));
1183
1184 xtal = clk_get_rate(xtal_clk);
Jaecheol Lee877d1b52010-12-23 14:25:31 +09001185
1186 xtal_rate = xtal;
1187
Changhwan Younc8bef142010-07-27 17:52:39 +09001188 clk_put(xtal_clk);
1189
1190 printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
1191
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001192 if (soc_is_exynos4210()) {
1193 apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0),
1194 pll_4508);
1195 mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0),
1196 pll_4508);
1197 epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
1198 __raw_readl(S5P_EPLL_CON1), pll_4600);
Changhwan Younc8bef142010-07-27 17:52:39 +09001199
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001200 vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
1201 vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
1202 __raw_readl(S5P_VPLL_CON1), pll_4650c);
Changhwan Younb88b1cc2011-10-04 17:08:56 +09001203 } else if (soc_is_exynos4212() || soc_is_exynos4412()) {
Kukjin Kim2bc02c02011-08-24 17:25:09 +09001204 apll = s5p_get_pll35xx(xtal, __raw_readl(S5P_APLL_CON0));
1205 mpll = s5p_get_pll35xx(xtal, __raw_readl(S5P_MPLL_CON0));
1206 epll = s5p_get_pll36xx(xtal, __raw_readl(S5P_EPLL_CON0),
1207 __raw_readl(S5P_EPLL_CON1));
1208
1209 vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
1210 vpll = s5p_get_pll36xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
1211 __raw_readl(S5P_VPLL_CON1));
1212 } else {
1213 /* nothing */
1214 }
Changhwan Younc8bef142010-07-27 17:52:39 +09001215
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001216 clk_fout_apll.ops = &exynos4_fout_apll_ops;
Changhwan Younc8bef142010-07-27 17:52:39 +09001217 clk_fout_mpll.rate = mpll;
1218 clk_fout_epll.rate = epll;
1219 clk_fout_vpll.rate = vpll;
1220
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001221 printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
Changhwan Younc8bef142010-07-27 17:52:39 +09001222 apll, mpll, epll, vpll);
1223
1224 armclk = clk_get_rate(&clk_armclk.clk);
Changhwan Younc8bef142010-07-27 17:52:39 +09001225 sclk_dmc = clk_get_rate(&clk_sclk_dmc.clk);
Changhwan Younc8bef142010-07-27 17:52:39 +09001226
Jongpill Lee228ef982010-08-18 22:24:53 +09001227 aclk_200 = clk_get_rate(&clk_aclk_200.clk);
1228 aclk_100 = clk_get_rate(&clk_aclk_100.clk);
1229 aclk_160 = clk_get_rate(&clk_aclk_160.clk);
1230 aclk_133 = clk_get_rate(&clk_aclk_133.clk);
1231
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001232 printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
Jongpill Lee228ef982010-08-18 22:24:53 +09001233 "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
1234 armclk, sclk_dmc, aclk_200,
1235 aclk_100, aclk_160, aclk_133);
Changhwan Younc8bef142010-07-27 17:52:39 +09001236
1237 clk_f.rate = armclk;
1238 clk_h.rate = sclk_dmc;
Jongpill Lee228ef982010-08-18 22:24:53 +09001239 clk_p.rate = aclk_100;
Changhwan Younc8bef142010-07-27 17:52:39 +09001240
1241 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
1242 s3c_set_clksrc(&clksrcs[ptr], true);
1243}
1244
1245static struct clk *clks[] __initdata = {
1246 /* Nothing here yet */
1247};
1248
Jonghwan Choiacd35612011-08-24 21:52:45 +09001249#ifdef CONFIG_PM_SLEEP
1250static int exynos4_clock_suspend(void)
1251{
1252 s3c_pm_do_save(exynos4_clock_save, ARRAY_SIZE(exynos4_clock_save));
1253 return 0;
1254}
1255
1256static void exynos4_clock_resume(void)
1257{
1258 s3c_pm_do_restore_core(exynos4_clock_save, ARRAY_SIZE(exynos4_clock_save));
1259}
1260
1261#else
1262#define exynos4_clock_suspend NULL
1263#define exynos4_clock_resume NULL
1264#endif
1265
1266struct syscore_ops exynos4_clock_syscore_ops = {
1267 .suspend = exynos4_clock_suspend,
1268 .resume = exynos4_clock_resume,
1269};
1270
Kukjin Kimb3ed3a12011-02-14 16:08:04 +09001271void __init exynos4_register_clocks(void)
Changhwan Younc8bef142010-07-27 17:52:39 +09001272{
Changhwan Younc8bef142010-07-27 17:52:39 +09001273 int ptr;
1274
Kukjin Kim957c4612011-01-04 17:58:22 +09001275 s3c24xx_register_clocks(clks, ARRAY_SIZE(clks));
Changhwan Younc8bef142010-07-27 17:52:39 +09001276
1277 for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
1278 s3c_register_clksrc(sysclks[ptr], 1);
1279
1280 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
1281 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
1282
Kukjin Kim957c4612011-01-04 17:58:22 +09001283 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
1284 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
Changhwan Younc8bef142010-07-27 17:52:39 +09001285
Jonghwan Choiacd35612011-08-24 21:52:45 +09001286 register_syscore_ops(&exynos4_clock_syscore_ops);
Changhwan Younc8bef142010-07-27 17:52:39 +09001287 s3c_pwmclk_init();
1288}