.read = dummy_clock_read,
  };
  
 +/*
 + * Boot time initialization which allows local_clock() to be utilized
 + * during early boot when clocksources are not available. local_clock()
 + * returns nanoseconds already so no conversion is required, hence mult=1
 + * and shift=0. When the first proper clocksource is installed then
 + * the fast time keepers are updated with the correct values.
 + */
 +#define FAST_TK_INIT                                          \
 +      {                                                       \
 +              .clock          = &dummy_clock,                 \
 +              .mask           = CLOCKSOURCE_MASK(64),         \
 +              .mult           = 1,                            \
 +              .shift          = 0,                            \
 +      }
 +
  static struct tk_fast tk_fast_mono ____cacheline_aligned = {
-       .seq     = SEQCNT_RAW_SPINLOCK_ZERO(tk_fast_mono.seq, &timekeeper_lock),
+       .seq     = SEQCNT_LATCH_ZERO(tk_fast_mono.seq),
 -      .base[0] = { .clock = &dummy_clock, },
 -      .base[1] = { .clock = &dummy_clock, },
 +      .base[0] = FAST_TK_INIT,
 +      .base[1] = FAST_TK_INIT,
  };
  
  static struct tk_fast tk_fast_raw  ____cacheline_aligned = {
-       .seq     = SEQCNT_RAW_SPINLOCK_ZERO(tk_fast_raw.seq, &timekeeper_lock),
+       .seq     = SEQCNT_LATCH_ZERO(tk_fast_raw.seq),
 -      .base[0] = { .clock = &dummy_clock, },
 -      .base[1] = { .clock = &dummy_clock, },
 +      .base[0] = FAST_TK_INIT,
 +      .base[1] = FAST_TK_INIT,
  };
  
 -/* flag for if timekeeping is suspended */
 -int __read_mostly timekeeping_suspended;
 -
  static inline void tk_normalize_xtime(struct timekeeper *tk)
  {
        while (tk->tkr_mono.xtime_nsec >= ((u64)NSEC_PER_SEC << tk->tkr_mono.shift)) {
        do {
                seq = raw_read_seqcount_latch(&tkf->seq);
                tkr = tkf->base + (seq & 0x01);
 -              now = ktime_to_ns(tkr->base_real);
 +              basem = ktime_to_ns(tkr->base);
 +              baser = ktime_to_ns(tkr->base_real);
  
 -              now += timekeeping_delta_to_ns(tkr,
 -                              clocksource_delta(
 -                                      tk_clock_read(tkr),
 -                                      tkr->cycle_last,
 -                                      tkr->mask));
 +              delta = timekeeping_delta_to_ns(tkr,
 +                              clocksource_delta(tk_clock_read(tkr),
 +                              tkr->cycle_last, tkr->mask));
-       } while (read_seqcount_retry(&tkf->seq, seq));
+       } while (read_seqcount_latch_retry(&tkf->seq, seq));
  
 -      return now;
 +      if (mono)
 +              *mono = basem + delta;
 +      return baser + delta;
  }
  
  /**