diff options
-rw-r--r-- | drivers/devfreq/devfreq.c | 20 | ||||
-rw-r--r-- | include/linux/devfreq.h | 1 |
2 files changed, 20 insertions, 1 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 177b5fd51aba..bf5477cfe259 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -111,6 +111,9 @@ static int devfreq_update_status(struct devfreq *devfreq, unsigned long freq) int lev, prev_lev; unsigned long cur_time; + if (devfreq->suspended) + return 0; + lev = devfreq_get_freq_level(devfreq, freq); if (lev < 0) return lev; @@ -558,6 +561,12 @@ int devfreq_suspend_device(struct devfreq *devfreq) if (!devfreq) return -EINVAL; + /* Last update before suspend */ + mutex_lock(&devfreq->lock); + devfreq_update_status(devfreq, devfreq->previous_freq); + devfreq->suspended = true; + mutex_unlock(&devfreq->lock); + if (!devfreq->governor) return 0; @@ -575,6 +584,12 @@ int devfreq_resume_device(struct devfreq *devfreq) if (!devfreq) return -EINVAL; + /* Update the timestamp before resuming */ + mutex_lock(&devfreq->lock); + devfreq->last_stat_updated = jiffies; + devfreq->suspended = false; + mutex_unlock(&devfreq->lock); + if (!devfreq->governor) return 0; @@ -941,9 +956,11 @@ static ssize_t show_trans_table(struct device *dev, struct device_attribute *att int prev_freq_level; unsigned long prev_freq; + mutex_lock(&devfreq->lock); err = devfreq_update_status(devfreq, devfreq->previous_freq); if (err) return 0; + mutex_unlock(&devfreq->lock); /* round the current frequency */ prev_freq_level = devfreq_get_freq_level(devfreq, @@ -963,7 +980,8 @@ static ssize_t show_trans_table(struct device *dev, struct device_attribute *att len += sprintf(buf + len, " time(ms)\n"); for (i = 0; i < max_state; i++) { - if (devfreq->profile->freq_table[i] == prev_freq) { + if (devfreq->profile->freq_table[i] == prev_freq && + !devfreq->suspended) { len += sprintf(buf + len, "*"); } else { len += sprintf(buf + len, " "); diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index 83cd456573fc..1f2e3651f734 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -177,6 +177,7 @@ struct devfreq { unsigned int *trans_table; unsigned long *time_in_state; unsigned long last_stat_updated; + bool suspended; }; #if defined(CONFIG_PM_DEVFREQ) |