#include "pseries.h"
 
 struct cpuidle_driver pseries_idle_driver = {
-       .name =         "pseries_idle",
-       .owner =        THIS_MODULE,
+       .name             = "pseries_idle",
+       .owner            = THIS_MODULE,
+       .en_core_tk_irqen = 1,
 };
 
 #define MAX_IDLE_STATE_COUNT   2
 static struct cpuidle_device __percpu *pseries_cpuidle_devices;
 static struct cpuidle_state *cpuidle_state_table;
 
-static inline void idle_loop_prolog(unsigned long *in_purr, ktime_t *kt_before)
+static inline void idle_loop_prolog(unsigned long *in_purr)
 {
-
-       *kt_before = ktime_get();
        *in_purr = mfspr(SPRN_PURR);
        /*
         * Indicate to the HV that we are idle. Now would be
        get_lppaca()->idle = 1;
 }
 
-static inline  s64 idle_loop_epilog(unsigned long in_purr, ktime_t kt_before)
+static inline void idle_loop_epilog(unsigned long in_purr)
 {
        get_lppaca()->wait_state_cycles += mfspr(SPRN_PURR) - in_purr;
        get_lppaca()->idle = 0;
-
-       return ktime_to_us(ktime_sub(ktime_get(), kt_before));
 }
 
 static int snooze_loop(struct cpuidle_device *dev,
                        int index)
 {
        unsigned long in_purr;
-       ktime_t kt_before;
        int cpu = dev->cpu;
 
-       idle_loop_prolog(&in_purr, &kt_before);
+       idle_loop_prolog(&in_purr);
        local_irq_enable();
        set_thread_flag(TIF_POLLING_NRFLAG);
 
        clear_thread_flag(TIF_POLLING_NRFLAG);
        smp_mb();
 
-       dev->last_residency =
-               (int)idle_loop_epilog(in_purr, kt_before);
+       idle_loop_epilog(in_purr);
+
        return index;
 }
 
                                int index)
 {
        unsigned long in_purr;
-       ktime_t kt_before;
 
-       idle_loop_prolog(&in_purr, &kt_before);
+       idle_loop_prolog(&in_purr);
        get_lppaca()->donate_dedicated_cpu = 1;
 
        ppc64_runlatch_off();
        check_and_cede_processor();
 
        get_lppaca()->donate_dedicated_cpu = 0;
-       dev->last_residency =
-               (int)idle_loop_epilog(in_purr, kt_before);
+
+       idle_loop_epilog(in_purr);
+
        return index;
 }
 
                        int index)
 {
        unsigned long in_purr;
-       ktime_t kt_before;
 
-       idle_loop_prolog(&in_purr, &kt_before);
+       idle_loop_prolog(&in_purr);
 
        /*
         * Yield the processor to the hypervisor.  We return if
         */
        check_and_cede_processor();
 
-       dev->last_residency =
-               (int)idle_loop_epilog(in_purr, kt_before);
+       idle_loop_epilog(in_purr);
+
        return index;
 }