diff options
author | Chanwoo Choi <cw00.choi@samsung.com> | 2017-01-31 01:38:16 -0500 |
---|---|---|
committer | MyungJoo Ham <myungjoo.ham@samsung.com> | 2017-01-31 01:46:49 -0500 |
commit | bcf23c79c4e46130701370af4383b61a3cba755c (patch) | |
tree | ca478a869ccc775a9215bb406b67bc81cd42c770 /drivers/devfreq/devfreq.c | |
parent | b0d75c08092f870825fbb766ac191faedd248918 (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.c | 31 |
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 */ |