diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-02 22:02:29 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-02 22:02:29 -0700 |
| commit | f9aee28de6ea082f5ea588ea9865320cd905f65f (patch) | |
| tree | 7306e5267f41f7e18d0dbfbef630a9fbc5b23fef | |
| parent | 44f5f07cfca714fa0d1b68a8f3d0f87d80a62074 (diff) | |
| parent | a95247f5dbc3abcc30d7d9e9ef68939e77b571d8 (diff) | |
Merge "drivers: cpuidle: Minimize round off errors in wake up time"
| -rw-r--r-- | drivers/cpuidle/lpm-levels.c | 15 |
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); } |
