summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-02 22:02:29 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-02 22:02:29 -0700
commitf9aee28de6ea082f5ea588ea9865320cd905f65f (patch)
tree7306e5267f41f7e18d0dbfbef630a9fbc5b23fef
parent44f5f07cfca714fa0d1b68a8f3d0f87d80a62074 (diff)
parenta95247f5dbc3abcc30d7d9e9ef68939e77b571d8 (diff)
Merge "drivers: cpuidle: Minimize round off errors in wake up time"
-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);
}