s390: Use direct ktime path for s390 clockevent device
[linux-2.6.git] / arch / s390 / kernel / time.c
index dff9330..c537164 100644 (file)
@@ -109,10 +109,14 @@ static void fixup_clock_comparator(unsigned long long delta)
        set_clock_comparator(S390_lowcore.clock_comparator);
 }
 
-static int s390_next_event(unsigned long delta,
+static int s390_next_ktime(ktime_t expires,
                           struct clock_event_device *evt)
 {
-       S390_lowcore.clock_comparator = get_clock() + delta;
+       s64 nsecs;
+
+       nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset()));
+       do_div(nsecs, 125);
+       S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9);
        set_clock_comparator(S390_lowcore.clock_comparator);
        return 0;
 }
@@ -137,14 +141,15 @@ void init_cpu_timer(void)
        cpu = smp_processor_id();
        cd = &per_cpu(comparators, cpu);
        cd->name                = "comparator";
-       cd->features            = CLOCK_EVT_FEAT_ONESHOT;
+       cd->features            = CLOCK_EVT_FEAT_ONESHOT |
+                                 CLOCK_EVT_FEAT_KTIME;
        cd->mult                = 16777;
        cd->shift               = 12;
        cd->min_delta_ns        = 1;
        cd->max_delta_ns        = LONG_MAX;
        cd->rating              = 400;
        cd->cpumask             = cpumask_of(cpu);
-       cd->set_next_event      = s390_next_event;
+       cd->set_next_ktime      = s390_next_ktime;
        cd->set_mode            = s390_set_mode;
 
        clockevents_register_device(cd);