extern int clocksource_register(struct clocksource*);
-extern void clocksource_unregister(struct clocksource*);
+extern int clocksource_unregister(struct clocksource*);
 extern void clocksource_touch_watchdog(void);
 extern struct clocksource* clocksource_get_next(void);
 extern void clocksource_change_rating(struct clocksource *cs, int rating);
 
 
 static void clocksource_dequeue_watchdog(struct clocksource *cs)
 {
-       struct clocksource *tmp;
        unsigned long flags;
 
        spin_lock_irqsave(&watchdog_lock, flags);
-       if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) {
-               /* cs is a watched clocksource. */
-               list_del_init(&cs->wd_list);
-       } else if (cs == watchdog) {
-               /* Reset watchdog cycles */
-               clocksource_reset_watchdog();
-               /* Current watchdog is removed. Find an alternative. */
-               watchdog = NULL;
-               list_for_each_entry(tmp, &clocksource_list, list) {
-                       if (tmp == cs || tmp->flags & CLOCK_SOURCE_MUST_VERIFY)
-                               continue;
-                       if (!watchdog || tmp->rating > watchdog->rating)
-                               watchdog = tmp;
+       if (cs != watchdog) {
+               if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) {
+                       /* cs is a watched clocksource. */
+                       list_del_init(&cs->wd_list);
+                       /* Check if the watchdog timer needs to be stopped. */
+                       clocksource_stop_watchdog();
                }
        }
-       cs->flags &= ~CLOCK_SOURCE_WATCHDOG;
-       /* Check if the watchdog timer needs to be stopped. */
-       clocksource_stop_watchdog();
        spin_unlock_irqrestore(&watchdog_lock, flags);
 }
 
  * clocksource_unregister - remove a registered clocksource
  * @cs:        clocksource to be unregistered
  */
-void clocksource_unregister(struct clocksource *cs)
+int clocksource_unregister(struct clocksource *cs)
 {
+       int ret = 0;
+
        mutex_lock(&clocksource_mutex);
-       clocksource_dequeue_watchdog(cs);
-       list_del(&cs->list);
-       clocksource_select();
+       if (!list_empty(&cs->list))
+               ret = clocksource_unbind(cs);
        mutex_unlock(&clocksource_mutex);
+       return ret;
 }
 EXPORT_SYMBOL(clocksource_unregister);