diff --git a/kernel/clockevent.c b/kernel/clockevent.c
index 2ba32ee40af1846f5fab172cf3935e350616239d..a1f147558e828457d4b41792b5f1d9bc17b91c28 100644
--- a/kernel/clockevent.c
+++ b/kernel/clockevent.c
@@ -15,6 +15,7 @@
 #include <kernel/clockevent.h>
 #include <kernel/export.h>
 #include <kernel/tick.h>
+#include <kernel/sched.h>
 #include <errno.h>
 
 
@@ -242,9 +243,16 @@ void clockevents_register_device(struct clock_event_device *dev)
 	spin_lock(&clockevents_spinlock);
 	list_add_tail(&dev->node, &clockevent_devices);
 
-	arch_local_irq_disable();
+	/* this should be safe without disabling interrupts, if not,
+	 * we need a different strategy to calibrate the tick period of the
+	 * device...
+	 *
+	 * XXX need long-time run-time testing for verifcation
+	 */
+
+	sched_disable();
 	tick_check_device(dev);
-	arch_local_irq_enable();
+	sched_enable();
 
 	spin_unlock(&clockevents_spinlock);
 }
@@ -266,9 +274,16 @@ int clockevents_offer_device(void)
 		if (dev->state != CLOCK_EVT_STATE_UNUSED)
 			continue;
 
-		arch_local_irq_disable();
+		/* this should be save without disabling interrupts, if not,
+		 * we need a different strategy to calibrate the tick period of
+		 * the device...
+		 *
+		 * XXX need long-time run-time testing for verifcation
+		 */
+
+		sched_disable();
 		tick_check_device(dev);
-		arch_local_irq_enable();
+		sched_enable();
 
 		return 0;
 	}