Thread (4 messages) 4 messages, 1 author, 2017-01-18
STALE3474d
Revisions (2)
  1. v1 current
  2. v2 [diff vs current]

[PATCH 1/3] PM / devfreq: Fix available_governor sysfs

From: Chanwoo Choi <cw00.choi@samsung.com>
Date: 2017-01-18 06:56:58
Also in: lkml, stable
Subsystem: device frequency (devfreq), the rest · Maintainers: MyungJoo Ham, Kyungmin Park, Chanwoo Choi, Linus Torvalds

Possibly related (same subject, not in this thread)

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>
---
 drivers/devfreq/devfreq.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index 4bd7a8f71b07..a2c575a5a9ab 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -43,6 +43,11 @@
 static LIST_HEAD(devfreq_list);
 static DEFINE_MUTEX(devfreq_list_lock);
 
+static int is_passive_gov(const char *governor_name)
+{
+	return (!strncmp(governor_name, "passive", 7)) ? 1 : 0;
+}
+
 /**
  * find_device_devfreq() - find devfreq struct using device pointer
  * @dev:	device pointer used to lookup device devfreq.
@@ -933,6 +938,10 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
 	if (ret != 1)
 		return -EINVAL;
 
+	/* The passive devfreq is not able to change the governor. */
+	if (is_passive_gov(df->governor_name))
+		return 0;
+
 	mutex_lock(&devfreq_list_lock);
 	governor = find_devfreq_governor(str_governor);
 	if (IS_ERR(governor)) {
@@ -972,12 +981,35 @@ static ssize_t available_governors_show(struct device *d,
 					char *buf)
 {
 	struct devfreq_governor *tmp_governor;
+	struct devfreq *df = to_devfreq(d);
 	ssize_t count = 0;
 
 	mutex_lock(&devfreq_list_lock);
-	list_for_each_entry(tmp_governor, &devfreq_governor_list, node)
+
+	/*
+	 * The passive devfreq shows only passive governor.
+	 * The governor except for passive are not available
+	 * for passive devfreq device.
+	 */
+	if (is_passive_gov(df->governor_name)) {
+		count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
+				   "%s ", df->governor_name);
+		goto out;
+	}
+
+	/*
+	 * The devfreq device show the registered governor except for
+	 * 'passive' governor.
+	 */
+	list_for_each_entry(tmp_governor, &devfreq_governor_list, node) {
+		if (is_passive_gov(tmp_governor->name))
+			continue;
+
 		count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
 				   "%s ", tmp_governor->name);
+	}
+
+out:
 	mutex_unlock(&devfreq_list_lock);
 
 	/* Truncate the trailing space */
-- 
1.9.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help