diff options
author | Kevin Hilman <khilman@mvista.com> | 2006-09-21 19:58:57 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-09-28 15:59:25 -0400 |
commit | 84904d0ead0a8c419abd45c7b2ac8d76d50a0d48 (patch) | |
tree | f0744701f7eb7efad9adc63e2e7113a141de8fec /arch/arm/mach-ixp4xx/common.c | |
parent | 746140c71d537560bbd22c1b148fb21031c30e71 (diff) |
[ARM] 3856/1: Add clocksource for Intel IXP4xx platforms
Enables the ixp4xx platforms to use Generic time-of-day.
Signed-off-by: Kevin Hilman <khilman@mvista.com>
Acked-by: John Stultz <johnstul@us.ibm.com>
Signed-off-by: Deepak Saxena <dsaxena@plexity.net>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-ixp4xx/common.c')
-rw-r--r-- | arch/arm/mach-ixp4xx/common.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 7c25dbd5a181..35dd8b3824b0 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/bitops.h> | 26 | #include <linux/bitops.h> |
27 | #include <linux/time.h> | 27 | #include <linux/time.h> |
28 | #include <linux/timex.h> | 28 | #include <linux/timex.h> |
29 | #include <linux/clocksource.h> | ||
29 | 30 | ||
30 | #include <asm/hardware.h> | 31 | #include <asm/hardware.h> |
31 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
@@ -255,16 +256,6 @@ static unsigned volatile last_jiffy_time; | |||
255 | 256 | ||
256 | #define CLOCK_TICKS_PER_USEC ((CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC) | 257 | #define CLOCK_TICKS_PER_USEC ((CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC) |
257 | 258 | ||
258 | /* IRQs are disabled before entering here from do_gettimeofday() */ | ||
259 | static unsigned long ixp4xx_gettimeoffset(void) | ||
260 | { | ||
261 | u32 elapsed; | ||
262 | |||
263 | elapsed = *IXP4XX_OSTS - last_jiffy_time; | ||
264 | |||
265 | return elapsed / CLOCK_TICKS_PER_USEC; | ||
266 | } | ||
267 | |||
268 | static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 259 | static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
269 | { | 260 | { |
270 | write_seqlock(&xtime_lock); | 261 | write_seqlock(&xtime_lock); |
@@ -309,7 +300,6 @@ static void __init ixp4xx_timer_init(void) | |||
309 | 300 | ||
310 | struct sys_timer ixp4xx_timer = { | 301 | struct sys_timer ixp4xx_timer = { |
311 | .init = ixp4xx_timer_init, | 302 | .init = ixp4xx_timer_init, |
312 | .offset = ixp4xx_gettimeoffset, | ||
313 | }; | 303 | }; |
314 | 304 | ||
315 | static struct resource ixp46x_i2c_resources[] = { | 305 | static struct resource ixp46x_i2c_resources[] = { |
@@ -365,3 +355,29 @@ void __init ixp4xx_sys_init(void) | |||
365 | ixp4xx_exp_bus_size >> 20); | 355 | ixp4xx_exp_bus_size >> 20); |
366 | } | 356 | } |
367 | 357 | ||
358 | cycle_t ixp4xx_get_cycles(void) | ||
359 | { | ||
360 | return *IXP4XX_OSTS; | ||
361 | } | ||
362 | |||
363 | static struct clocksource clocksource_ixp4xx = { | ||
364 | .name = "OSTS", | ||
365 | .rating = 200, | ||
366 | .read = ixp4xx_get_cycles, | ||
367 | .mask = CLOCKSOURCE_MASK(32), | ||
368 | .shift = 20, | ||
369 | .is_continuous = 1, | ||
370 | }; | ||
371 | |||
372 | unsigned long ixp4xx_timer_freq = FREQ; | ||
373 | static int __init ixp4xx_clocksource_init(void) | ||
374 | { | ||
375 | clocksource_ixp4xx.mult = | ||
376 | clocksource_hz2mult(ixp4xx_timer_freq, | ||
377 | clocksource_ixp4xx.shift); | ||
378 | clocksource_register(&clocksource_ixp4xx); | ||
379 | |||
380 | return 0; | ||
381 | } | ||
382 | |||
383 | device_initcall(ixp4xx_clocksource_init); | ||