powerpc/time: Use clocksource_register_hz
authorAnton Blanchard <anton@samba.org>
Wed, 23 Nov 2011 20:07:19 +0000 (20:07 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 25 Nov 2011 03:09:59 +0000 (14:09 +1100)
Use clocksource_register_hz which calculates the shift/mult
factors for us. Also remove the shift = 22 assumption in
vsyscall_update - thanks to Paul Mackerras and John Stultz for
catching that.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/time.c

index fae3094..d204b72 100644 (file)
@@ -86,8 +86,6 @@ static struct clocksource clocksource_rtc = {
        .rating       = 400,
        .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
        .mask         = CLOCKSOURCE_MASK(64),
-       .shift        = 22,
-       .mult         = 0,      /* To be filled in */
        .read         = rtc_read,
 };
 
@@ -97,8 +95,6 @@ static struct clocksource clocksource_timebase = {
        .rating       = 400,
        .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
        .mask         = CLOCKSOURCE_MASK(64),
-       .shift        = 22,
-       .mult         = 0,      /* To be filled in */
        .read         = timebase_read,
 };
 
@@ -822,9 +818,8 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
        ++vdso_data->tb_update_count;
        smp_mb();
 
-       /* XXX this assumes clock->shift == 22 */
-       /* 4611686018 ~= 2^(20+64-22) / 1e9 */
-       new_tb_to_xs = (u64) mult * 4611686018ULL;
+       /* 19342813113834067 ~= 2^(20+64) / 1e9 */
+       new_tb_to_xs = (u64) mult * (19342813113834067ULL >> clock->shift);
        new_stamp_xsec = (u64) wall_time->tv_nsec * XSEC_PER_SEC;
        do_div(new_stamp_xsec, 1000000000);
        new_stamp_xsec += (u64) wall_time->tv_sec * XSEC_PER_SEC;
@@ -875,9 +870,7 @@ static void __init clocksource_init(void)
        else
                clock = &clocksource_timebase;
 
-       clock->mult = clocksource_hz2mult(tb_ticks_per_sec, clock->shift);
-
-       if (clocksource_register(clock)) {
+       if (clocksource_register_hz(clock, tb_ticks_per_sec)) {
                printk(KERN_ERR "clocksource: %s is already registered\n",
                       clock->name);
                return;