diff options
author | Ben Dooks <ben-linux@fluff.org> | 2006-03-20 12:10:04 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-03-21 17:06:02 -0500 |
commit | 8e40a2f91c6e73726a75381e4438478eb5964cb7 (patch) | |
tree | b0b66666c84151a2c382e189e2fbcc619d1edfb0 /arch/arm/mach-s3c2410/clock.c | |
parent | 766636cc3630ae3b9827e7b4b1f566572963f1ef (diff) |
[ARM] 3330/1: S3C24XX - move UPLL to main clock
Patch from Ben Dooks
Move the UPLL clock registration to the central
clock file, and add an enable method
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-s3c2410/clock.c')
-rw-r--r-- | arch/arm/mach-s3c2410/clock.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/arch/arm/mach-s3c2410/clock.c b/arch/arm/mach-s3c2410/clock.c index 08489efdaf06..aaada9e3d67f 100644 --- a/arch/arm/mach-s3c2410/clock.c +++ b/arch/arm/mach-s3c2410/clock.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/ioport.h> | 38 | #include <linux/ioport.h> |
39 | #include <linux/clk.h> | 39 | #include <linux/clk.h> |
40 | #include <linux/mutex.h> | 40 | #include <linux/mutex.h> |
41 | #include <linux/delay.h> | ||
41 | 42 | ||
42 | #include <asm/hardware.h> | 43 | #include <asm/hardware.h> |
43 | #include <asm/irq.h> | 44 | #include <asm/irq.h> |
@@ -200,6 +201,28 @@ EXPORT_SYMBOL(clk_round_rate); | |||
200 | EXPORT_SYMBOL(clk_set_rate); | 201 | EXPORT_SYMBOL(clk_set_rate); |
201 | EXPORT_SYMBOL(clk_get_parent); | 202 | EXPORT_SYMBOL(clk_get_parent); |
202 | 203 | ||
204 | /* base clock enable */ | ||
205 | |||
206 | static int s3c24xx_upll_enable(struct clk *clk, int enable) | ||
207 | { | ||
208 | unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); | ||
209 | unsigned long orig = clkslow; | ||
210 | |||
211 | if (enable) | ||
212 | clkslow &= ~S3C2410_CLKSLOW_UCLK_OFF; | ||
213 | else | ||
214 | clkslow |= S3C2410_CLKSLOW_UCLK_OFF; | ||
215 | |||
216 | __raw_writel(clkslow, S3C2410_CLKSLOW); | ||
217 | |||
218 | /* if we started the UPLL, then allow to settle */ | ||
219 | |||
220 | if (enable && !(orig & S3C2410_CLKSLOW_UCLK_OFF)) | ||
221 | udelay(200); | ||
222 | |||
223 | return 0; | ||
224 | } | ||
225 | |||
203 | /* base clocks */ | 226 | /* base clocks */ |
204 | 227 | ||
205 | static struct clk clk_xtal = { | 228 | static struct clk clk_xtal = { |
@@ -210,6 +233,14 @@ static struct clk clk_xtal = { | |||
210 | .ctrlbit = 0, | 233 | .ctrlbit = 0, |
211 | }; | 234 | }; |
212 | 235 | ||
236 | static struct clk clk_upll = { | ||
237 | .name = "upll", | ||
238 | .id = -1, | ||
239 | .parent = NULL, | ||
240 | .enable = s3c24xx_upll_enable, | ||
241 | .ctrlbit = 0, | ||
242 | }; | ||
243 | |||
213 | static struct clk clk_f = { | 244 | static struct clk clk_f = { |
214 | .name = "fclk", | 245 | .name = "fclk", |
215 | .id = -1, | 246 | .id = -1, |
@@ -262,7 +293,7 @@ struct clk s3c24xx_uclk = { | |||
262 | }; | 293 | }; |
263 | 294 | ||
264 | 295 | ||
265 | /* clock definitions */ | 296 | /* standard clock definitions */ |
266 | 297 | ||
267 | static struct clk init_clocks[] = { | 298 | static struct clk init_clocks[] = { |
268 | { | 299 | { |
@@ -396,6 +427,7 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, | |||
396 | unsigned long hclk, | 427 | unsigned long hclk, |
397 | unsigned long pclk) | 428 | unsigned long pclk) |
398 | { | 429 | { |
430 | unsigned long upllcon = __raw_readl(S3C2410_UPLLCON); | ||
399 | unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); | 431 | unsigned long clkslow = __raw_readl(S3C2410_CLKSLOW); |
400 | struct clk *clkp = init_clocks; | 432 | struct clk *clkp = init_clocks; |
401 | int ptr; | 433 | int ptr; |
@@ -406,6 +438,7 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, | |||
406 | /* initialise the main system clocks */ | 438 | /* initialise the main system clocks */ |
407 | 439 | ||
408 | clk_xtal.rate = xtal; | 440 | clk_xtal.rate = xtal; |
441 | clk_upll.rate = s3c2410_get_pll(upllcon, xtal); | ||
409 | 442 | ||
410 | clk_h.rate = hclk; | 443 | clk_h.rate = hclk; |
411 | clk_p.rate = pclk; | 444 | clk_p.rate = pclk; |
@@ -439,6 +472,9 @@ int __init s3c24xx_setup_clocks(unsigned long xtal, | |||
439 | if (s3c24xx_register_clock(&clk_xtal) < 0) | 472 | if (s3c24xx_register_clock(&clk_xtal) < 0) |
440 | printk(KERN_ERR "failed to register master xtal\n"); | 473 | printk(KERN_ERR "failed to register master xtal\n"); |
441 | 474 | ||
475 | if (s3c24xx_register_clock(&clk_upll) < 0) | ||
476 | printk(KERN_ERR "failed to register upll clock\n"); | ||
477 | |||
442 | if (s3c24xx_register_clock(&clk_f) < 0) | 478 | if (s3c24xx_register_clock(&clk_f) < 0) |
443 | printk(KERN_ERR "failed to register cpu fclk\n"); | 479 | printk(KERN_ERR "failed to register cpu fclk\n"); |
444 | 480 | ||