aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Abraham <thomas.ab@samsung.com>2010-05-16 20:38:50 -0400
committerBen Dooks <ben-linux@fluff.org>2010-05-16 21:37:37 -0400
commitf44cf78b6b475116a4d3c98576f8697dd4ca7e79 (patch)
treefc1cb821372cff55883d4e7a373d5b32e87ac662
parent58772cd34479ca50e90eea25288d2021dd2e6ff6 (diff)
ARM: S5PV210: Remove usage of clk_p66 and add clk_pclk_psys clock
The clk_p83 clock, which is the PCLK clock for PSYS domain, is of type 'struct clk' whereas on S5PV210, this clock is suitable to be of type clksrc_clk clock (since it has a clock divider). So this patch replaces the 'struct clk' type clock to 'struct clksrc_clk' type clock for the PCLK PSYS clock. This patch modifies the following. 1. Removes definitions and usage of 'clk_p66' clock. 2. Adds 'clk_pclk_psys' clock which is of type 'struct clksrc_clk'. 3. Replaces all usage of clk_p66 with clk_pclk_psys clock. 4. Adds clk_pclk_psys into list of clocks to be registered. 5. Removes the sys_clks array since it is no longer required. Also the registration of clocks in sys_clks is also removed. 6. Remove the 'GET_DIV' as it is no longer required. Signed-off-by: Thomas Abraham <thomas.ab@samsung.com> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
-rw-r--r--arch/arm/mach-s5pv210/clock.c66
1 files changed, 30 insertions, 36 deletions
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c
index b46d9ec69eb8..315955da0d06 100644
--- a/arch/arm/mach-s5pv210/clock.c
+++ b/arch/arm/mach-s5pv210/clock.c
@@ -144,6 +144,15 @@ static struct clksrc_clk clk_hclk_psys = {
144 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 24, .size = 4 }, 144 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 24, .size = 4 },
145}; 145};
146 146
147static struct clksrc_clk clk_pclk_psys = {
148 .clk = {
149 .name = "pclk_psys",
150 .id = -1,
151 .parent = &clk_hclk_psys.clk,
152 },
153 .reg_div = { .reg = S5P_CLK_DIV0, .shift = 28, .size = 3 },
154};
155
147static int s5pv210_clk_ip0_ctrl(struct clk *clk, int enable) 156static int s5pv210_clk_ip0_ctrl(struct clk *clk, int enable)
148{ 157{
149 return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable); 158 return s5p_gatectrl(S5P_CLKGATE_IP0, clk, enable);
@@ -164,15 +173,6 @@ static int s5pv210_clk_ip3_ctrl(struct clk *clk, int enable)
164 return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable); 173 return s5p_gatectrl(S5P_CLKGATE_IP3, clk, enable);
165} 174}
166 175
167static struct clk clk_p66 = {
168 .name = "pclk66",
169 .id = -1,
170};
171
172static struct clk *sys_clks[] = {
173 &clk_p66
174};
175
176static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk) 176static unsigned long s5pv210_clk_imem_get_rate(struct clk *clk)
177{ 177{
178 return clk_get_rate(clk->parent) / 2; 178 return clk_get_rate(clk->parent) / 2;
@@ -240,73 +240,73 @@ static struct clk init_clocks_disable[] = {
240 }, { 240 }, {
241 .name = "systimer", 241 .name = "systimer",
242 .id = -1, 242 .id = -1,
243 .parent = &clk_p66, 243 .parent = &clk_pclk_psys.clk,
244 .enable = s5pv210_clk_ip3_ctrl, 244 .enable = s5pv210_clk_ip3_ctrl,
245 .ctrlbit = (1<<16), 245 .ctrlbit = (1<<16),
246 }, { 246 }, {
247 .name = "watchdog", 247 .name = "watchdog",
248 .id = -1, 248 .id = -1,
249 .parent = &clk_p66, 249 .parent = &clk_pclk_psys.clk,
250 .enable = s5pv210_clk_ip3_ctrl, 250 .enable = s5pv210_clk_ip3_ctrl,
251 .ctrlbit = (1<<22), 251 .ctrlbit = (1<<22),
252 }, { 252 }, {
253 .name = "rtc", 253 .name = "rtc",
254 .id = -1, 254 .id = -1,
255 .parent = &clk_p66, 255 .parent = &clk_pclk_psys.clk,
256 .enable = s5pv210_clk_ip3_ctrl, 256 .enable = s5pv210_clk_ip3_ctrl,
257 .ctrlbit = (1<<15), 257 .ctrlbit = (1<<15),
258 }, { 258 }, {
259 .name = "i2c", 259 .name = "i2c",
260 .id = 0, 260 .id = 0,
261 .parent = &clk_p66, 261 .parent = &clk_pclk_psys.clk,
262 .enable = s5pv210_clk_ip3_ctrl, 262 .enable = s5pv210_clk_ip3_ctrl,
263 .ctrlbit = (1<<7), 263 .ctrlbit = (1<<7),
264 }, { 264 }, {
265 .name = "i2c", 265 .name = "i2c",
266 .id = 1, 266 .id = 1,
267 .parent = &clk_p66, 267 .parent = &clk_pclk_psys.clk,
268 .enable = s5pv210_clk_ip3_ctrl, 268 .enable = s5pv210_clk_ip3_ctrl,
269 .ctrlbit = (1<<8), 269 .ctrlbit = (1<<8),
270 }, { 270 }, {
271 .name = "i2c", 271 .name = "i2c",
272 .id = 2, 272 .id = 2,
273 .parent = &clk_p66, 273 .parent = &clk_pclk_psys.clk,
274 .enable = s5pv210_clk_ip3_ctrl, 274 .enable = s5pv210_clk_ip3_ctrl,
275 .ctrlbit = (1<<9), 275 .ctrlbit = (1<<9),
276 }, { 276 }, {
277 .name = "spi", 277 .name = "spi",
278 .id = 0, 278 .id = 0,
279 .parent = &clk_p66, 279 .parent = &clk_pclk_psys.clk,
280 .enable = s5pv210_clk_ip3_ctrl, 280 .enable = s5pv210_clk_ip3_ctrl,
281 .ctrlbit = (1<<12), 281 .ctrlbit = (1<<12),
282 }, { 282 }, {
283 .name = "spi", 283 .name = "spi",
284 .id = 1, 284 .id = 1,
285 .parent = &clk_p66, 285 .parent = &clk_pclk_psys.clk,
286 .enable = s5pv210_clk_ip3_ctrl, 286 .enable = s5pv210_clk_ip3_ctrl,
287 .ctrlbit = (1<<13), 287 .ctrlbit = (1<<13),
288 }, { 288 }, {
289 .name = "spi", 289 .name = "spi",
290 .id = 2, 290 .id = 2,
291 .parent = &clk_p66, 291 .parent = &clk_pclk_psys.clk,
292 .enable = s5pv210_clk_ip3_ctrl, 292 .enable = s5pv210_clk_ip3_ctrl,
293 .ctrlbit = (1<<14), 293 .ctrlbit = (1<<14),
294 }, { 294 }, {
295 .name = "timers", 295 .name = "timers",
296 .id = -1, 296 .id = -1,
297 .parent = &clk_p66, 297 .parent = &clk_pclk_psys.clk,
298 .enable = s5pv210_clk_ip3_ctrl, 298 .enable = s5pv210_clk_ip3_ctrl,
299 .ctrlbit = (1<<23), 299 .ctrlbit = (1<<23),
300 }, { 300 }, {
301 .name = "adc", 301 .name = "adc",
302 .id = -1, 302 .id = -1,
303 .parent = &clk_p66, 303 .parent = &clk_pclk_psys.clk,
304 .enable = s5pv210_clk_ip3_ctrl, 304 .enable = s5pv210_clk_ip3_ctrl,
305 .ctrlbit = (1<<24), 305 .ctrlbit = (1<<24),
306 }, { 306 }, {
307 .name = "keypad", 307 .name = "keypad",
308 .id = -1, 308 .id = -1,
309 .parent = &clk_p66, 309 .parent = &clk_pclk_psys.clk,
310 .enable = s5pv210_clk_ip3_ctrl, 310 .enable = s5pv210_clk_ip3_ctrl,
311 .ctrlbit = (1<<21), 311 .ctrlbit = (1<<21),
312 }, { 312 }, {
@@ -341,25 +341,25 @@ static struct clk init_clocks[] = {
341 }, { 341 }, {
342 .name = "uart", 342 .name = "uart",
343 .id = 0, 343 .id = 0,
344 .parent = &clk_p66, 344 .parent = &clk_pclk_psys.clk,
345 .enable = s5pv210_clk_ip3_ctrl, 345 .enable = s5pv210_clk_ip3_ctrl,
346 .ctrlbit = (1<<7), 346 .ctrlbit = (1<<7),
347 }, { 347 }, {
348 .name = "uart", 348 .name = "uart",
349 .id = 1, 349 .id = 1,
350 .parent = &clk_p66, 350 .parent = &clk_pclk_psys.clk,
351 .enable = s5pv210_clk_ip3_ctrl, 351 .enable = s5pv210_clk_ip3_ctrl,
352 .ctrlbit = (1<<8), 352 .ctrlbit = (1<<8),
353 }, { 353 }, {
354 .name = "uart", 354 .name = "uart",
355 .id = 2, 355 .id = 2,
356 .parent = &clk_p66, 356 .parent = &clk_pclk_psys.clk,
357 .enable = s5pv210_clk_ip3_ctrl, 357 .enable = s5pv210_clk_ip3_ctrl,
358 .ctrlbit = (1<<9), 358 .ctrlbit = (1<<9),
359 }, { 359 }, {
360 .name = "uart", 360 .name = "uart",
361 .id = 3, 361 .id = 3,
362 .parent = &clk_p66, 362 .parent = &clk_pclk_psys.clk,
363 .enable = s5pv210_clk_ip3_ctrl, 363 .enable = s5pv210_clk_ip3_ctrl,
364 .ctrlbit = (1<<10), 364 .ctrlbit = (1<<10),
365 }, 365 },
@@ -401,10 +401,9 @@ static struct clksrc_clk *sysclks[] = {
401 &clk_hclk_psys, 401 &clk_hclk_psys,
402 &clk_pclk_msys, 402 &clk_pclk_msys,
403 &clk_pclk_dsys, 403 &clk_pclk_dsys,
404 &clk_pclk_psys,
404}; 405};
405 406
406#define GET_DIV(clk, field) ((((clk) & field##_MASK) >> field##_SHIFT) + 1)
407
408void __init_or_cpufreq s5pv210_setup_clocks(void) 407void __init_or_cpufreq s5pv210_setup_clocks(void)
409{ 408{
410 struct clk *xtal_clk; 409 struct clk *xtal_clk;
@@ -415,7 +414,7 @@ void __init_or_cpufreq s5pv210_setup_clocks(void)
415 unsigned long hclk_psys; 414 unsigned long hclk_psys;
416 unsigned long pclk_msys; 415 unsigned long pclk_msys;
417 unsigned long pclk_dsys; 416 unsigned long pclk_dsys;
418 unsigned long pclk66; 417 unsigned long pclk_psys;
419 unsigned long apll; 418 unsigned long apll;
420 unsigned long mpll; 419 unsigned long mpll;
421 unsigned long epll; 420 unsigned long epll;
@@ -455,17 +454,16 @@ void __init_or_cpufreq s5pv210_setup_clocks(void)
455 hclk_psys = clk_get_rate(&clk_hclk_psys.clk); 454 hclk_psys = clk_get_rate(&clk_hclk_psys.clk);
456 pclk_msys = clk_get_rate(&clk_pclk_msys.clk); 455 pclk_msys = clk_get_rate(&clk_pclk_msys.clk);
457 pclk_dsys = clk_get_rate(&clk_pclk_dsys.clk); 456 pclk_dsys = clk_get_rate(&clk_pclk_dsys.clk);
458 pclk66 = hclk_psys / GET_DIV(clkdiv0, S5P_CLKDIV0_PCLK66); 457 pclk_psys = clk_get_rate(&clk_pclk_psys.clk);
459 458
460 printk(KERN_INFO "S5PV210: ARMCLK=%ld, HCLKM=%ld, HCLKD=%ld\n" 459 printk(KERN_INFO "S5PV210: ARMCLK=%ld, HCLKM=%ld, HCLKD=%ld\n"
461 "HCLKP=%ld, PCLKM=%ld, PCLKD=%ld, PCLKP=%ld\n", 460 "HCLKP=%ld, PCLKM=%ld, PCLKD=%ld, PCLKP=%ld\n",
462 armclk, hclk_msys, hclk_dsys, hclk_psys, 461 armclk, hclk_msys, hclk_dsys, hclk_psys,
463 pclk_msys, pclk_dsys, pclk66); 462 pclk_msys, pclk_dsys, pclk_psys);
464 463
465 clk_f.rate = armclk; 464 clk_f.rate = armclk;
466 clk_h.rate = hclk_psys; 465 clk_h.rate = hclk_psys;
467 clk_p.rate = pclk66; 466 clk_p.rate = pclk_psys;
468 clk_p66.rate = pclk66;
469 467
470 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++) 468 for (ptr = 0; ptr < ARRAY_SIZE(clksrcs); ptr++)
471 s3c_set_clksrc(&clksrcs[ptr], true); 469 s3c_set_clksrc(&clksrcs[ptr], true);
@@ -490,10 +488,6 @@ void __init s5pv210_register_clocks(void)
490 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs)); 488 s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
491 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks)); 489 s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
492 490
493 ret = s3c24xx_register_clocks(sys_clks, ARRAY_SIZE(sys_clks));
494 if (ret > 0)
495 printk(KERN_ERR "Failed to register system clocks\n");
496
497 clkp = init_clocks_disable; 491 clkp = init_clocks_disable;
498 for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) { 492 for (ptr = 0; ptr < ARRAY_SIZE(init_clocks_disable); ptr++, clkp++) {
499 ret = s3c24xx_register_clock(clkp); 493 ret = s3c24xx_register_clock(clkp);