#include <linux/kthread.h>
 
 #include "tick-internal.h"
+#include "timekeeping_internal.h"
 
 void timecounter_init(struct timecounter *tc,
                      const struct cyclecounter *cc,
 static void clocksource_watchdog(unsigned long data)
 {
        struct clocksource *cs;
-       cycle_t csnow, wdnow;
+       cycle_t csnow, wdnow, delta;
        int64_t wd_nsec, cs_nsec;
        int next_cpu, reset_pending;
 
                        continue;
                }
 
-               wd_nsec = clocksource_cyc2ns((wdnow - cs->wd_last) & watchdog->mask,
-                                            watchdog->mult, watchdog->shift);
+               delta = clocksource_delta(wdnow, cs->wd_last, watchdog->mask);
+               wd_nsec = clocksource_cyc2ns(delta, watchdog->mult,
+                                            watchdog->shift);
 
-               cs_nsec = clocksource_cyc2ns((csnow - cs->cs_last) &
-                                            cs->mask, cs->mult, cs->shift);
+               delta = clocksource_delta(csnow, cs->cs_last, cs->mask);
+               cs_nsec = clocksource_cyc2ns(delta, cs->mult, cs->shift);
                cs->cs_last = csnow;
                cs->wd_last = wdnow;
 
 
 
 static inline s64 timekeeping_get_ns(struct timekeeper *tk)
 {
-       cycle_t cycle_now, cycle_delta;
+       cycle_t cycle_now, delta;
        struct clocksource *clock;
        s64 nsec;
 
        cycle_now = clock->read(clock);
 
        /* calculate the delta since the last update_wall_time: */
-       cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+       delta = clocksource_delta(cycle_now, clock->cycle_last, clock->mask);
 
-       nsec = cycle_delta * tk->mult + tk->xtime_nsec;
+       nsec = delta * tk->mult + tk->xtime_nsec;
        nsec >>= tk->shift;
 
        /* If arch requires, add in get_arch_timeoffset() */
 
 static inline s64 timekeeping_get_ns_raw(struct timekeeper *tk)
 {
-       cycle_t cycle_now, cycle_delta;
+       cycle_t cycle_now, delta;
        struct clocksource *clock;
        s64 nsec;
 
        cycle_now = clock->read(clock);
 
        /* calculate the delta since the last update_wall_time: */
-       cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+       delta = clocksource_delta(cycle_now, clock->cycle_last, clock->mask);
 
        /* convert delta to nanoseconds. */
-       nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
+       nsec = clocksource_cyc2ns(delta, clock->mult, clock->shift);
 
        /* If arch requires, add in get_arch_timeoffset() */
        return nsec + arch_gettimeoffset();
  */
 static void timekeeping_forward_now(struct timekeeper *tk)
 {
-       cycle_t cycle_now, cycle_delta;
+       cycle_t cycle_now, delta;
        struct clocksource *clock;
        s64 nsec;
 
        clock = tk->clock;
        cycle_now = clock->read(clock);
-       cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+       delta = clocksource_delta(cycle_now, clock->cycle_last, clock->mask);
        tk->cycle_last = clock->cycle_last = cycle_now;
 
-       tk->xtime_nsec += cycle_delta * tk->mult;
+       tk->xtime_nsec += delta * tk->mult;
 
        /* If arch requires, add in get_arch_timeoffset() */
        tk->xtime_nsec += (u64)arch_gettimeoffset() << tk->shift;
 
        tk_normalize_xtime(tk);
 
-       nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
+       nsec = clocksource_cyc2ns(delta, clock->mult, clock->shift);
        timespec64_add_ns(&tk->raw_time, nsec);
 }
 
                u32 shift = clock->shift;
                s64 nsec = 0;
 
-               cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
+               cycle_delta = clocksource_delta(cycle_now, clock->cycle_last,
+                                               clock->mask);
 
                /*
                 * "cycle_delta * mutl" may cause 64 bits overflow, if the
 #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
        offset = real_tk->cycle_interval;
 #else
-       offset = (clock->read(clock) - clock->cycle_last) & clock->mask;
+       offset = clocksource_delta(clock->read(clock), clock->cycle_last,
+                                  clock->mask);
 #endif
 
        /* Check if there's really nothing to do */