return ret;
 }
 
+void xen_teardown_timer(int cpu)
+{
+       struct clock_event_device *evt;
+       BUG_ON(cpu == 0);
+       evt = &per_cpu(xen_clock_events, cpu).evt;
+
+       if (evt->irq >= 0) {
+               unbind_from_irqhandler(evt->irq, NULL);
+               evt->irq = -1;
+               kfree(per_cpu(xen_clock_events, cpu).name);
+               per_cpu(xen_clock_events, cpu).name = NULL;
+       }
+}
+
 void xen_setup_timer(int cpu)
 {
        char *name;
 
        evt = &per_cpu(xen_clock_events, cpu).evt;
        WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu);
+       if (evt->irq >= 0)
+               xen_teardown_timer(cpu);
 
        printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu);
 
        per_cpu(xen_clock_events, cpu).name = name;
 }
 
-void xen_teardown_timer(int cpu)
-{
-       struct clock_event_device *evt;
-       BUG_ON(cpu == 0);
-       evt = &per_cpu(xen_clock_events, cpu).evt;
-
-       if (evt->irq >= 0) {
-               unbind_from_irqhandler(evt->irq, NULL);
-               evt->irq = -1;
-               kfree(per_cpu(xen_clock_events, cpu).name);
-               per_cpu(xen_clock_events, cpu).name = NULL;
-       }
-}
 
 void xen_setup_cpu_clockevents(void)
 {