/* Shift conversion between clock shifted nano seconds and
         * ntp shifted nano seconds. */
        int     ntp_error_shift;
+       /* NTP adjusted clock multiplier */
+       u32     mult;
 };
 
 struct timekeeper timekeeper;
        /* Do the ns -> cycle conversion first, using original mult */
        tmp = NTP_INTERVAL_LENGTH;
        tmp <<= clock->shift;
-       tmp += clock->mult_orig/2;
-       do_div(tmp, clock->mult_orig);
+       tmp += clock->mult/2;
+       do_div(tmp, clock->mult);
        if (tmp == 0)
                tmp = 1;
 
        /* Go back from cycles -> shifted ns */
        timekeeper.xtime_interval = (u64) interval * clock->mult;
        timekeeper.raw_interval =
-               ((u64) interval * clock->mult_orig) >> clock->shift;
+               ((u64) interval * clock->mult) >> clock->shift;
 
        timekeeper.xtime_nsec = 0;
        timekeeper.shift = clock->shift;
 
        timekeeper.ntp_error = 0;
        timekeeper.ntp_error_shift = NTP_SCALE_SHIFT - clock->shift;
+
+       /*
+        * The timekeeper keeps its own mult values for the currently
+        * active clocksource. These value will be adjusted via NTP
+        * to counteract clock drifting.
+        */
+       timekeeper.mult = clock->mult;
 }
 
 /*
        cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
        clock->cycle_last = cycle_now;
 
-       nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
+       nsec = clocksource_cyc2ns(cycle_delta, timekeeper.mult,
+                                 timekeeper.shift);
 
        /* If arch requires, add in gettimeoffset() */
        nsec += arch_gettimeoffset();
 
        timespec_add_ns(&xtime, nsec);
 
-       nsec = clocksource_cyc2ns(cycle_delta, clock->mult_orig, clock->shift);
+       nsec = clocksource_cyc2ns(cycle_delta, clock->mult, clock->shift);
        timespec_add_ns(&raw_time, nsec);
 }
 
                cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
 
                /* convert to nanoseconds: */
-               nsecs = clocksource_cyc2ns(cycle_delta, clock->mult,
-                                          clock->shift);
+               nsecs = clocksource_cyc2ns(cycle_delta, timekeeper.mult,
+                                          timekeeper.shift);
 
                /* If arch requires, add in gettimeoffset() */
                nsecs += arch_gettimeoffset();
                cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
 
                /* convert to nanoseconds: */
-               nsecs += clocksource_cyc2ns(cycle_delta, clock->mult,
-                                           clock->shift);
+               nsecs += clocksource_cyc2ns(cycle_delta, timekeeper.mult,
+                                           timekeeper.shift);
 
        } while (read_seqretry(&xtime_lock, seq));
        /*
                cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
 
                /* convert to nanoseconds: */
-               nsecs = clocksource_cyc2ns(cycle_delta, clock->mult,
-                                          clock->shift);
+               nsecs = clocksource_cyc2ns(cycle_delta, timekeeper.mult,
+                                          timekeeper.shift);
 
        } while (read_seqretry(&xtime_lock, seq));
 
 
        if (new->enable && !new->enable(new))
                return;
-       /*
-        * The frequency may have changed while the clocksource
-        * was disabled. If so the code in ->enable() must update
-        * the mult value to reflect the new frequency. Make sure
-        * mult_orig follows this change.
-        */
-       new->mult_orig = new->mult;
 
        old = timekeeper.clock;
        timekeeper_setup_internals(new);
 
-       /*
-        * Save mult_orig in mult so that the value can be restored
-        * regardless if ->enable() updates the value of mult or not.
-        */
-       old->mult = old->mult_orig;
        if (old->disable)
                old->disable(old);
 
                cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
 
                /* convert to nanoseconds: */
-               nsecs = clocksource_cyc2ns(cycle_delta, clock->mult_orig,
+               nsecs = clocksource_cyc2ns(cycle_delta, clock->mult,
                                           clock->shift);
 
                *ts = raw_time;
        clock = clocksource_default_clock();
        if (clock->enable)
                clock->enable(clock);
-       /* set mult_orig on enable */
-       clock->mult_orig = clock->mult;
-
        timekeeper_setup_internals(clock);
 
        xtime.tv_sec = sec;
        } else
                return;
 
-       timekeeper.clock->mult += adj;
+       timekeeper.mult += adj;
        timekeeper.xtime_interval += interval;
        timekeeper.xtime_nsec -= offset;
        timekeeper.ntp_error -= (interval - offset) <<
        timekeeper.ntp_error += timekeeper.xtime_nsec <<
                                timekeeper.ntp_error_shift;
 
-       nsecs = clocksource_cyc2ns(offset, clock->mult, clock->shift);
+       nsecs = clocksource_cyc2ns(offset, timekeeper.mult, timekeeper.shift);
        update_xtime_cache(nsecs);
 
        /* check to see if there is a new clocksource to use */