aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-sa1100/time.c
diff options
context:
space:
mode:
authorRussell King <rmk@dyn-67.arm.linux.org.uk>2007-11-12 16:55:12 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2008-01-26 09:40:57 -0500
commitd142b6e77d394a4fcc0a42381b03852bd9c4e263 (patch)
treef3d2be80d681dd16abcd9bfea0895149bc867877 /arch/arm/mach-sa1100/time.c
parent9b73e76f3cf63379dcf45fcd4f112f5812418d0a (diff)
[ARM] sa1100: add clock source support
Add generic clock source support for SA11x0 platforms. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-sa1100/time.c')
-rw-r--r--arch/arm/mach-sa1100/time.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c
index fdf7b016e7ad..72984354a247 100644
--- a/arch/arm/mach-sa1100/time.c
+++ b/arch/arm/mach-sa1100/time.c
@@ -14,6 +14,7 @@
14#include <linux/irq.h> 14#include <linux/irq.h>
15#include <linux/timex.h> 15#include <linux/timex.h>
16#include <linux/signal.h> 16#include <linux/signal.h>
17#include <linux/clocksource.h>
17 18
18#include <asm/mach/time.h> 19#include <asm/mach/time.h>
19#include <asm/hardware.h> 20#include <asm/hardware.h>
@@ -35,23 +36,6 @@ static int sa1100_set_rtc(void)
35 return 0; 36 return 0;
36} 37}
37 38
38/* IRQs are disabled before entering here from do_gettimeofday() */
39static unsigned long sa1100_gettimeoffset (void)
40{
41 unsigned long ticks_to_match, elapsed, usec;
42
43 /* Get ticks before next timer match */
44 ticks_to_match = OSMR0 - OSCR;
45
46 /* We need elapsed ticks since last match */
47 elapsed = LATCH - ticks_to_match;
48
49 /* Now convert them to usec */
50 usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
51
52 return usec;
53}
54
55#ifdef CONFIG_NO_IDLE_HZ 39#ifdef CONFIG_NO_IDLE_HZ
56static unsigned long initial_match; 40static unsigned long initial_match;
57static int match_posponed; 41static int match_posponed;
@@ -96,6 +80,20 @@ static struct irqaction sa1100_timer_irq = {
96 .handler = sa1100_timer_interrupt, 80 .handler = sa1100_timer_interrupt,
97}; 81};
98 82
83static cycle_t sa1100_read_oscr(void)
84{
85 return OSCR;
86}
87
88static struct clocksource cksrc_sa1100_oscr = {
89 .name = "oscr",
90 .rating = 200,
91 .read = sa1100_read_oscr,
92 .mask = CLOCKSOURCE_MASK(32),
93 .shift = 20,
94 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
95};
96
99static void __init sa1100_timer_init(void) 97static void __init sa1100_timer_init(void)
100{ 98{
101 unsigned long flags; 99 unsigned long flags;
@@ -109,6 +107,11 @@ static void __init sa1100_timer_init(void)
109 OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */ 107 OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */
110 OSMR0 = OSCR + LATCH; /* set initial match */ 108 OSMR0 = OSCR + LATCH; /* set initial match */
111 local_irq_restore(flags); 109 local_irq_restore(flags);
110
111 cksrc_sa1100_oscr.mult =
112 clocksource_hz2mult(CLOCK_TICK_RATE, cksrc_sa1100_oscr.shift);
113
114 clocksource_register(&cksrc_sa1100_oscr);
112} 115}
113 116
114#ifdef CONFIG_NO_IDLE_HZ 117#ifdef CONFIG_NO_IDLE_HZ
@@ -182,7 +185,6 @@ struct sys_timer sa1100_timer = {
182 .init = sa1100_timer_init, 185 .init = sa1100_timer_init,
183 .suspend = sa1100_timer_suspend, 186 .suspend = sa1100_timer_suspend,
184 .resume = sa1100_timer_resume, 187 .resume = sa1100_timer_resume,
185 .offset = sa1100_gettimeoffset,
186#ifdef CONFIG_NO_IDLE_HZ 188#ifdef CONFIG_NO_IDLE_HZ
187 .dyn_tick = &sa1100_dyn_tick, 189 .dyn_tick = &sa1100_dyn_tick,
188#endif 190#endif