]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/timer.c
ARM: OMAP: Fix next_timer_interrupt() for hrtimer
[linux-2.6-omap-h63xx.git] / kernel / timer.c
index fe3a9a9f832849bddbb3bf1be92268af99287aa9..3fc403131adeb3746080c0db0cc0053e4f649cff 100644 (file)
@@ -488,10 +488,21 @@ unsigned long next_timer_interrupt(void)
        tvec_base_t *base;
        struct list_head *list;
        struct timer_list *nte;
-       unsigned long expires;
+       unsigned long expires, hr_expires = MAX_JIFFY_OFFSET;
+       ktime_t hr_delta;
        tvec_t *varray[4];
        int i, j;
 
+       hr_delta = hrtimer_get_next_event();
+       if (hr_delta.tv64 != KTIME_MAX) {
+               struct timespec tsdelta;
+               tsdelta = ktime_to_timespec(hr_delta);
+               hr_expires = timespec_to_jiffies(&tsdelta);
+               if (hr_expires < 3)
+                       return hr_expires + jiffies;
+       }
+       hr_expires += jiffies;
+
        base = &__get_cpu_var(tvec_bases);
        spin_lock(&base->t_base.lock);
        expires = base->timer_jiffies + (LONG_MAX >> 1);
@@ -542,6 +553,10 @@ found:
                }
        }
        spin_unlock(&base->t_base.lock);
+
+       if (time_before(hr_expires, expires))
+               return hr_expires;
+
        return expires;
 }
 #endif