fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / arm / mach-clps711x / time.c
index 58da84e..428493d 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/timex.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/sched.h>
 
 #include <asm/hardware.h>
@@ -47,19 +48,21 @@ static unsigned long clps711x_gettimeoffset(void)
  * IRQ handler for the timer
  */
 static irqreturn_t
-p720t_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+p720t_timer_interrupt(int irq, void *dev_id)
 {
-       timer_tick(regs);
+       write_seqlock(&xtime_lock);
+       timer_tick();
+       write_sequnlock(&xtime_lock);
        return IRQ_HANDLED;
 }
 
 static struct irqaction clps711x_timer_irq = {
        .name           = "CLPS711x Timer Tick",
-       .flags          = SA_INTERRUPT,
-       .handler        = p720t_timer_interrupt
+       .flags          = IRQF_DISABLED | IRQF_TIMER,
+       .handler        = p720t_timer_interrupt,
 };
 
-void __init clps711x_init_time(void)
+static void __init clps711x_timer_init(void)
 {
        struct timespec tv;
        unsigned int syscon;
@@ -71,9 +74,13 @@ void __init clps711x_init_time(void)
        clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */
 
        setup_irq(IRQ_TC2OI, &clps711x_timer_irq);
-       gettimeoffset = clps711x_gettimeoffset;
 
        tv.tv_nsec = 0;
        tv.tv_sec = clps_readl(RTCDR);
        do_settimeofday(&tv);
 }
+
+struct sys_timer clps711x_timer = {
+       .init           = clps711x_timer_init,
+       .offset         = clps711x_gettimeoffset,
+};