summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/cpuidle/lpm-levels.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c
index 64c4bf8f58a8..ce67145bb142 100644
--- a/drivers/cpuidle/lpm-levels.c
+++ b/drivers/cpuidle/lpm-levels.c
@@ -1123,6 +1123,8 @@ static int cluster_configure(struct lpm_cluster *cluster, int idx,
struct cpumask nextcpu, *cpumask;
uint64_t us;
uint32_t pred_us;
+ uint64_t sec;
+ uint64_t nsec;
us = get_cluster_sleep_time(cluster, &nextcpu,
from_idle, &pred_us);
@@ -1134,11 +1136,20 @@ static int cluster_configure(struct lpm_cluster *cluster, int idx,
goto failed_set_mode;
}
- us = (us + 1) * 1000;
clear_predict_history();
clear_cl_predict_history();
- do_div(us, NSEC_PER_SEC/SCLK_HZ);
+ us = us + 1;
+ sec = us;
+ do_div(sec, USEC_PER_SEC);
+ nsec = us - sec * USEC_PER_SEC;
+
+ sec = sec * SCLK_HZ;
+ if (nsec > 0) {
+ nsec = nsec * NSEC_PER_USEC;
+ do_div(nsec, NSEC_PER_SEC/SCLK_HZ);
+ }
+ us = sec + nsec;
msm_mpm_enter_sleep(us, from_idle, cpumask);
}