|
@@ -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);
|