aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/devfreq/devfreq.c
diff options
context:
space:
mode:
authorChanwoo Choi <cw00.choi@samsung.com>2017-01-31 01:38:16 -0500
committerMyungJoo Ham <myungjoo.ham@samsung.com>2017-01-31 01:46:49 -0500
commitbcf23c79c4e46130701370af4383b61a3cba755c (patch)
treeca478a869ccc775a9215bb406b67bc81cd42c770 /drivers/devfreq/devfreq.c
parentb0d75c08092f870825fbb766ac191faedd248918 (diff)
PM / devfreq: Fix available_governor sysfs
The devfreq using passive governor is not able to change the governor. So, the user can not change the governor through 'available_governor' sysfs entry. Also, the devfreq which don't use the passive governor is not able to change to 'passive' governor on the fly. Fixes: 996133119f57 ("PM / devfreq: Add new passive governor") Cc: stable@vger.kernel.org Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Diffstat (limited to 'drivers/devfreq/devfreq.c')
-rw-r--r--drivers/devfreq/devfreq.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 8e5938c9c7d6..ade279d29f1e 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -940,6 +940,9 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
940 if (df->governor == governor) { 940 if (df->governor == governor) {
941 ret = 0; 941 ret = 0;
942 goto out; 942 goto out;
943 } else if (df->governor->immutable || governor->immutable) {
944 ret = -EINVAL;
945 goto out;
943 } 946 }
944 947
945 if (df->governor) { 948 if (df->governor) {
@@ -969,13 +972,33 @@ static ssize_t available_governors_show(struct device *d,
969 struct device_attribute *attr, 972 struct device_attribute *attr,
970 char *buf) 973 char *buf)
971{ 974{
972 struct devfreq_governor *tmp_governor; 975 struct devfreq *df = to_devfreq(d);
973 ssize_t count = 0; 976 ssize_t count = 0;
974 977
975 mutex_lock(&devfreq_list_lock); 978 mutex_lock(&devfreq_list_lock);
976 list_for_each_entry(tmp_governor, &devfreq_governor_list, node) 979
977 count += scnprintf(&buf[count], (PAGE_SIZE - count - 2), 980 /*
978 "%s ", tmp_governor->name); 981 * The devfreq with immutable governor (e.g., passive) shows
982 * only own governor.
983 */
984 if (df->governor->immutable) {
985 count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
986 "%s ", df->governor_name);
987 /*
988 * The devfreq device shows the registered governor except for
989 * immutable governors such as passive governor .
990 */
991 } else {
992 struct devfreq_governor *governor;
993
994 list_for_each_entry(governor, &devfreq_governor_list, node) {
995 if (governor->immutable)
996 continue;
997 count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
998 "%s ", governor->name);
999 }
1000 }
1001
979 mutex_unlock(&devfreq_list_lock); 1002 mutex_unlock(&devfreq_list_lock);
980 1003
981 /* Truncate the trailing space */ 1004 /* Truncate the trailing space */