static void genpd_update_accounting(struct generic_pm_domain *genpd)
 {
-       ktime_t delta, now;
+       u64 delta, now;
 
-       now = ktime_get();
-       delta = ktime_sub(now, genpd->accounting_time);
+       now = ktime_get_mono_fast_ns();
+       if (now <= genpd->accounting_time)
+               return;
+
+       delta = now - genpd->accounting_time;
 
        /*
         * If genpd->status is active, it means we are just
         * out of off and so update the idle time and vice
         * versa.
         */
-       if (genpd->status == GENPD_STATE_ON) {
-               int state_idx = genpd->state_idx;
-
-               genpd->states[state_idx].idle_time =
-                       ktime_add(genpd->states[state_idx].idle_time, delta);
-       } else {
-               genpd->on_time = ktime_add(genpd->on_time, delta);
-       }
+       if (genpd->status == GENPD_STATE_ON)
+               genpd->states[genpd->state_idx].idle_time += delta;
+       else
+               genpd->on_time += delta;
 
        genpd->accounting_time = now;
 }
        genpd->max_off_time_changed = true;
        genpd->provider = NULL;
        genpd->has_provider = false;
-       genpd->accounting_time = ktime_get();
+       genpd->accounting_time = ktime_get_mono_fast_ns();
        genpd->domain.ops.runtime_suspend = genpd_runtime_suspend;
        genpd->domain.ops.runtime_resume = genpd_runtime_resume;
        genpd->domain.ops.prepare = genpd_prepare;
 static int idle_states_show(struct seq_file *s, void *data)
 {
        struct generic_pm_domain *genpd = s->private;
+       u64 now, delta, idle_time = 0;
        unsigned int i;
        int ret = 0;
 
        seq_puts(s, "State          Time Spent(ms) Usage          Rejected\n");
 
        for (i = 0; i < genpd->state_count; i++) {
-               ktime_t delta = 0;
-               s64 msecs;
+               idle_time += genpd->states[i].idle_time;
 
-               if ((genpd->status == GENPD_STATE_OFF) &&
-                               (genpd->state_idx == i))
-                       delta = ktime_sub(ktime_get(), genpd->accounting_time);
+               if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) {
+                       now = ktime_get_mono_fast_ns();
+                       if (now > genpd->accounting_time) {
+                               delta = now - genpd->accounting_time;
+                               idle_time += delta;
+                       }
+               }
 
-               msecs = ktime_to_ms(
-                       ktime_add(genpd->states[i].idle_time, delta));
-               seq_printf(s, "S%-13i %-14lld %-14llu %llu\n", i, msecs,
-                             genpd->states[i].usage, genpd->states[i].rejected);
+               do_div(idle_time, NSEC_PER_MSEC);
+               seq_printf(s, "S%-13i %-14llu %-14llu %llu\n", i, idle_time,
+                          genpd->states[i].usage, genpd->states[i].rejected);
        }
 
        genpd_unlock(genpd);
 static int active_time_show(struct seq_file *s, void *data)
 {
        struct generic_pm_domain *genpd = s->private;
-       ktime_t delta = 0;
+       u64 now, on_time, delta = 0;
        int ret = 0;
 
        ret = genpd_lock_interruptible(genpd);
        if (ret)
                return -ERESTARTSYS;
 
-       if (genpd->status == GENPD_STATE_ON)
-               delta = ktime_sub(ktime_get(), genpd->accounting_time);
+       if (genpd->status == GENPD_STATE_ON) {
+               now = ktime_get_mono_fast_ns();
+               if (now > genpd->accounting_time)
+                       delta = now - genpd->accounting_time;
+       }
 
-       seq_printf(s, "%lld ms\n", ktime_to_ms(
-                               ktime_add(genpd->on_time, delta)));
+       on_time = genpd->on_time + delta;
+       do_div(on_time, NSEC_PER_MSEC);
+       seq_printf(s, "%llu ms\n", on_time);
 
        genpd_unlock(genpd);
        return ret;
 static int total_idle_time_show(struct seq_file *s, void *data)
 {
        struct generic_pm_domain *genpd = s->private;
-       ktime_t delta = 0, total = 0;
+       u64 now, delta, total = 0;
        unsigned int i;
        int ret = 0;
 
                return -ERESTARTSYS;
 
        for (i = 0; i < genpd->state_count; i++) {
+               total += genpd->states[i].idle_time;
 
-               if ((genpd->status == GENPD_STATE_OFF) &&
-                               (genpd->state_idx == i))
-                       delta = ktime_sub(ktime_get(), genpd->accounting_time);
-
-               total = ktime_add(total, genpd->states[i].idle_time);
+               if (genpd->status == GENPD_STATE_OFF && genpd->state_idx == i) {
+                       now = ktime_get_mono_fast_ns();
+                       if (now > genpd->accounting_time) {
+                               delta = now - genpd->accounting_time;
+                               total += delta;
+                       }
+               }
        }
-       total = ktime_add(total, delta);
 
-       seq_printf(s, "%lld ms\n", ktime_to_ms(total));
+       do_div(total, NSEC_PER_MSEC);
+       seq_printf(s, "%llu ms\n", total);
 
        genpd_unlock(genpd);
        return ret;