[PATCH] uml: timer initialization cleanup
[linux-2.6-microblaze.git] / arch / um / kernel / time_kern.c
index d7e044b..8e56c58 100644 (file)
@@ -84,29 +84,6 @@ void timer_irq(union uml_pt_regs *regs)
        }
 }
 
-
-void time_init_kern(void)
-{
-       long long nsecs;
-
-       nsecs = os_nsecs();
-       set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
-                               -nsecs % BILLION);
-}
-
-void do_boot_timer_handler(struct sigcontext * sc)
-{
-       unsigned long flags;
-       struct pt_regs regs;
-
-       CHOOSE_MODE((void) (UPT_SC(&regs.regs) = sc),
-                   (void) (regs.regs.skas.is_user = 0));
-
-       write_seqlock_irqsave(&xtime_lock, flags);
-       do_timer(&regs);
-       write_sequnlock_irqrestore(&xtime_lock, flags);
-}
-
 static DEFINE_SPINLOCK(timer_spinlock);
 
 static unsigned long long local_offset = 0;
@@ -142,6 +119,32 @@ irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs)
        return IRQ_HANDLED;
 }
 
+static void register_timer(void)
+{
+       int err;
+
+       err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL);
+       if(err != 0)
+               printk(KERN_ERR "timer_init : request_irq failed - "
+                      "errno = %d\n", -err);
+
+       timer_irq_inited = 1;
+
+       user_time_init();
+}
+
+extern void (*late_time_init)(void);
+
+void time_init(void)
+{
+       long long nsecs;
+
+       nsecs = os_nsecs();
+       set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
+                               -nsecs % BILLION);
+       late_time_init = register_timer;
+}
+
 void do_gettimeofday(struct timeval *tv)
 {
        unsigned long long nsecs = get_time();
@@ -189,18 +192,3 @@ void timer_handler(int sig, union uml_pt_regs *regs)
        if(current_thread->cpu == 0)
                timer_irq(regs);
 }
-
-int __init timer_init(void)
-{
-       int err;
-
-       user_time_init();
-       err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL);
-       if(err != 0)
-               printk(KERN_ERR "timer_init : request_irq failed - "
-                      "errno = %d\n", -err);
-       timer_irq_inited = 1;
-       return(0);
-}
-
-arch_initcall(timer_init);