diff options
author | Arto Merilainen <amerilainen@nvidia.com> | 2014-07-07 15:50:21 +0300 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-07-10 05:32:41 -0700 |
commit | 179f834be18b91906a9f96b12e6653aa626ec80d (patch) | |
tree | f8f737b719890c4033c8e87b7b462cdb082703bc /drivers/devfreq | |
parent | 2f60e0c1b62133be4302128632839b0fb68e85ad (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.c | 20 |
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, " "); |