]> Pileus Git - ~andy/linux/commitdiff
PM / devfreq: Add sysfs node to expose available frequencies
authorNishanth Menon <nm@ti.com>
Fri, 26 Oct 2012 00:48:59 +0000 (19:48 -0500)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Tue, 20 Nov 2012 06:59:32 +0000 (15:59 +0900)
devfreq governors such as ondemand are controlled by a min and
max frequency, while governors like userspace governor allow us
to set a specific frequency.
However, for the same specific device, depending on the SoC, the
available frequencies can vary.

So expose the available frequencies as a snapshot over sysfs to
allow informed decisions.

This was inspired by cpufreq framework's equivalent for similar
usage sysfs node: scaling_available_frequencies.

Cc: Rajagopal Venkat <rajagopal.venkat@linaro.org>
Cc: MyungJoo Ham <myungjoo.ham@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Kevin Hilman <khilman@ti.com>
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Documentation/ABI/testing/sysfs-class-devfreq
drivers/devfreq/devfreq.c

index e6cf08e6734d4b727055022077afd2c7ece03d84..e672ccb02e7fb180f1871ed6a932adb87fbb3716 100644 (file)
@@ -51,3 +51,12 @@ Description:
                The /sys/class/devfreq/.../userspace/set_freq shows and
                sets the requested frequency for the devfreq object if
                userspace governor is in effect.
+
+What:          /sys/class/devfreq/.../available_frequencies
+Date:          October 2012
+Contact:       Nishanth Menon <nm@ti.com>
+Description:
+               The /sys/class/devfreq/.../available_frequencies shows
+               the available frequencies of the corresponding devfreq object.
+               This is a snapshot of available frequencies and not limited
+               by the min/max frequency restrictions.
index 789af4ff5c9ccdb38edbe89dc1e03c9b8152cfaf..c44e562bdfe08ffa2f084aab0570d162f285a924 100644 (file)
@@ -570,9 +570,41 @@ static ssize_t show_max_freq(struct device *dev, struct device_attribute *attr,
        return sprintf(buf, "%lu\n", to_devfreq(dev)->max_freq);
 }
 
+static ssize_t show_available_freqs(struct device *d,
+                                   struct device_attribute *attr,
+                                   char *buf)
+{
+       struct devfreq *df = to_devfreq(d);
+       struct device *dev = df->dev.parent;
+       struct opp *opp;
+       ssize_t count = 0;
+       unsigned long freq = 0;
+
+       rcu_read_lock();
+       do {
+               opp = opp_find_freq_ceil(dev, &freq);
+               if (IS_ERR(opp))
+                       break;
+
+               count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
+                                  "%lu ", freq);
+               freq++;
+       } while (1);
+       rcu_read_unlock();
+
+       /* Truncate the trailing space */
+       if (count)
+               count--;
+
+       count += sprintf(&buf[count], "\n");
+
+       return count;
+}
+
 static struct device_attribute devfreq_attrs[] = {
        __ATTR(governor, S_IRUGO, show_governor, NULL),
        __ATTR(cur_freq, S_IRUGO, show_freq, NULL),
+       __ATTR(available_frequencies, S_IRUGO, show_available_freqs, NULL),
        __ATTR(target_freq, S_IRUGO, show_target_freq, NULL),
        __ATTR(polling_interval, S_IRUGO | S_IWUSR, show_polling_interval,
               store_polling_interval),