PM / devfreq: Add clearing transitions stats
authorKamil Konieczny <k.konieczny@samsung.com>
Thu, 5 Dec 2019 14:55:26 +0000 (15:55 +0100)
committerChanwoo Choi <cw00.choi@samsung.com>
Mon, 30 Dec 2019 00:59:05 +0000 (09:59 +0900)
Add clearing transition table and time in states devfreq statistics
by writing 0 (zero) to trans_stat file in devfreq sysfs. An example use
is like following:

echo 0 > /sys/class/devfreq/devfreqX/trans_stat

Signed-off-by: Kamil Konieczny <k.konieczny@samsung.com>
[cw00.choi: Edit return value if entering the wrong value for reset
 and use arrary3_size() to get the size of 3-dimensional array]
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Documentation/ABI/testing/sysfs-class-devfreq
drivers/devfreq/devfreq.c

index 75897e2..9758eb8 100644 (file)
@@ -55,12 +55,15 @@ What:               /sys/class/devfreq/.../trans_stat
 Date:          October 2012
 Contact:       MyungJoo Ham <myungjoo.ham@samsung.com>
 Description:
-               This ABI shows the statistics of devfreq behavior on a
-               specific device. It shows the time spent in each state and
-               the number of transitions between states.
+               This ABI shows or clears the statistics of devfreq behavior
+               on a specific device. It shows the time spent in each state
+               and the number of transitions between states.
                In order to activate this ABI, the devfreq target device
                driver should provide the list of available frequencies
-               with its profile.
+               with its profile. If need to reset the statistics of devfreq
+               behavior on a specific device, enter 0(zero) to 'trans_stat'
+               as following:
+                       echo 0 > /sys/class/devfreq/.../trans_stat
 
 What:          /sys/class/devfreq/.../userspace/set_freq
 Date:          September 2011
index 554d155..af5bd52 100644 (file)
@@ -1597,7 +1597,34 @@ static ssize_t trans_stat_show(struct device *dev,
                                        devfreq->total_trans);
        return len;
 }
-static DEVICE_ATTR_RO(trans_stat);
+
+static ssize_t trans_stat_store(struct device *dev,
+                               struct device_attribute *attr,
+                               const char *buf, size_t count)
+{
+       struct devfreq *df = to_devfreq(dev);
+       int err, value;
+
+       if (df->profile->max_state == 0)
+               return count;
+
+       err = kstrtoint(buf, 10, &value);
+       if (err || value != 0)
+               return -EINVAL;
+
+       mutex_lock(&df->lock);
+       memset(df->time_in_state, 0, (df->profile->max_state *
+                                       sizeof(*df->time_in_state)));
+       memset(df->trans_table, 0, array3_size(sizeof(unsigned int),
+                                       df->profile->max_state,
+                                       df->profile->max_state));
+       df->total_trans = 0;
+       df->last_stat_updated = get_jiffies_64();
+       mutex_unlock(&df->lock);
+
+       return count;
+}
+static DEVICE_ATTR_RW(trans_stat);
 
 static struct attribute *devfreq_attrs[] = {
        &dev_attr_name.attr,