|
@@ -940,6 +940,9 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
|
|
|
if (df->governor == governor) {
|
|
|
ret = 0;
|
|
|
goto out;
|
|
|
+ } else if (df->governor->immutable || governor->immutable) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
if (df->governor) {
|
|
@@ -969,13 +972,33 @@ static ssize_t available_governors_show(struct device *d,
|
|
|
struct device_attribute *attr,
|
|
|
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)
|
|
|
- count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
|
|
|
- "%s ", tmp_governor->name);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * The devfreq with immutable governor (e.g., passive) shows
|
|
|
+ * only own governor.
|
|
|
+ */
|
|
|
+ if (df->governor->immutable) {
|
|
|
+ count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
|
|
|
+ "%s ", df->governor_name);
|
|
|
+ /*
|
|
|
+ * The devfreq device shows the registered governor except for
|
|
|
+ * immutable governors such as passive governor .
|
|
|
+ */
|
|
|
+ } else {
|
|
|
+ struct devfreq_governor *governor;
|
|
|
+
|
|
|
+ list_for_each_entry(governor, &devfreq_governor_list, node) {
|
|
|
+ if (governor->immutable)
|
|
|
+ continue;
|
|
|
+ count += scnprintf(&buf[count], (PAGE_SIZE - count - 2),
|
|
|
+ "%s ", governor->name);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
mutex_unlock(&devfreq_list_lock);
|
|
|
|
|
|
/* Truncate the trailing space */
|