summaryrefslogtreecommitdiff
path: root/drivers/devfreq
diff options
context:
space:
mode:
authorArto Merilainen <amerilainen@nvidia.com>2014-07-07 15:50:21 +0300
committerMandar Padmawar <mpadmawar@nvidia.com>2014-07-10 05:32:41 -0700
commit179f834be18b91906a9f96b12e6653aa626ec80d (patch)
treef8f737b719890c4033c8e87b7b462cdb082703bc /drivers/devfreq
parent2f60e0c1b62133be4302128632839b0fb68e85ad (diff)
devfreq: Account only powered time in trans_stat
This patch modifies devfreq to account only the time a device is powered in trans_stat. In addition, this patch also fixes a race in trans_stat maintenance in cases where the node is readed at the same time the transition table is being updated by frequency re-estimation. Change-Id: I6e4341317b6dda88d69028c9f67785400e5a7a65 Signed-off-by: Arto Merilainen <amerilainen@nvidia.com> Reviewed-on: http://git-master/r/435174 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com> Reviewed-by: Prajakta Gudadhe <pgudadhe@nvidia.com> Reviewed-by: Samuel Russell <samuelr@nvidia.com> Tested-by: Samuel Russell <samuelr@nvidia.com> Reviewed-by: Ilan Aelion <iaelion@nvidia.com>
Diffstat (limited to 'drivers/devfreq')
-rw-r--r--drivers/devfreq/devfreq.c20
1 files changed, 19 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, " ");