powerpc/time: Remove unnecessary sanity check of decrementer expiration
[deliverable/linux.git] / arch / powerpc / kernel / time.c
index 522bb1dfc3538ddc7b08ec3986393577edc5e9e8..2eaaa242c2e6a19b70ea24d46d4847703b71ffd1 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,
 };
 
@@ -112,8 +108,6 @@ static void decrementer_set_mode(enum clock_event_mode mode,
 static struct clock_event_device decrementer_clockevent = {
        .name           = "decrementer",
        .rating         = 200,
-       .shift          = 0,    /* To be filled in */
-       .mult           = 0,    /* To be filled in */
        .irq            = 0,
        .set_next_event = decrementer_set_next_event,
        .set_mode       = decrementer_set_mode,
@@ -578,7 +572,6 @@ void timer_interrupt(struct pt_regs * regs)
        struct pt_regs *old_regs;
        struct decrementer_clock *decrementer =  &__get_cpu_var(decrementers);
        struct clock_event_device *evt = &decrementer->event;
-       u64 now;
 
        /* Ensure a positive value is written to the decrementer, or else
         * some CPUs will continue to take decrementer exceptions.
@@ -613,16 +606,9 @@ void timer_interrupt(struct pt_regs * regs)
                get_lppaca()->int_dword.fields.decr_int = 0;
 #endif
 
-       now = get_tb_or_rtc();
-       if (now >= decrementer->next_tb) {
-               decrementer->next_tb = ~(u64)0;
-               if (evt->event_handler)
-                       evt->event_handler(evt);
-       } else {
-               now = decrementer->next_tb - now;
-               if (now <= DECREMENTER_MAX)
-                       set_dec((int)now);
-       }
+       decrementer->next_tb = ~(u64)0;
+       if (evt->event_handler)
+               evt->event_handler(evt);
 
 #ifdef CONFIG_PPC_ISERIES
        if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
@@ -824,9 +810,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;
@@ -877,9 +862,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;
@@ -889,6 +872,15 @@ static void __init clocksource_init(void)
               clock->name, clock->mult, clock->shift);
 }
 
+void decrementer_check_overflow(void)
+{
+       u64 now = get_tb_or_rtc();
+       struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
+
+       if (now >= decrementer->next_tb)
+               set_dec(1);
+}
+
 static int decrementer_set_next_event(unsigned long evt,
                                      struct clock_event_device *dev)
 {
@@ -904,31 +896,6 @@ static void decrementer_set_mode(enum clock_event_mode mode,
                decrementer_set_next_event(DECREMENTER_MAX, dev);
 }
 
-static inline uint64_t div_sc64(unsigned long ticks, unsigned long nsec,
-                               int shift)
-{
-       uint64_t tmp = ((uint64_t)ticks) << shift;
-
-       do_div(tmp, nsec);
-       return tmp;
-}
-
-static void __init setup_clockevent_multiplier(unsigned long hz)
-{
-       u64 mult, shift = 32;
-
-       while (1) {
-               mult = div_sc64(hz, NSEC_PER_SEC, shift);
-               if (mult && (mult >> 32UL) == 0UL)
-                       break;
-
-               shift--;
-       }
-
-       decrementer_clockevent.shift = shift;
-       decrementer_clockevent.mult = mult;
-}
-
 static void register_decrementer_clockevent(int cpu)
 {
        struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
@@ -946,7 +913,8 @@ static void __init init_decrementer_clockevent(void)
 {
        int cpu = smp_processor_id();
 
-       setup_clockevent_multiplier(ppc_tb_freq);
+       clockevents_calc_mult_shift(&decrementer_clockevent, ppc_tb_freq, 4);
+
        decrementer_clockevent.max_delta_ns =
                clockevent_delta2ns(DECREMENTER_MAX, &decrementer_clockevent);
        decrementer_clockevent.min_delta_ns =
This page took 0.045395 seconds and 5 git commands to generate.