summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYaxiong Tian <tianyaxiong@kylinos.cn>2026-04-30 11:20:35 +0800
committerChanwoo Choi <cw00.choi@samsung.com>2026-05-10 21:53:44 +0900
commitc096be11c2a9d4acca8e75f1f8edeb744aceb521 (patch)
tree7625af5f20f69e8b5816dd984f7da851bcbc36ff
parent218ef5b3447402a549d8a25e28ae6de73e27ac04 (diff)
downloadlinux-next-c096be11c2a9d4acca8e75f1f8edeb744aceb521.tar.gz
linux-next-c096be11c2a9d4acca8e75f1f8edeb744aceb521.zip
PM / devfreq: Fix governor_store() failing when device has no current governor
Since devfreq_remove_governor() may clear the device's current governor in certain situations, while governors actually exist independently of the device, directly returning EINVAL in this case is inaccurate. To fix this issue, remove this check and add relevant logic for when df->governor is NULL. Fixes: 483d557ee9a3 ("PM / devfreq: Clean up the devfreq instance name in sysfs attr") Co-developed-by: Choi Chanwoo <cwchoi00@gmail.com> Signed-off-by: Yaxiong Tian <tianyaxiong@kylinos.cn> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> Link: https://lore.kernel.org/all/20260430032035.75496-1-tianyaxiong@kylinos.cn/
-rw-r--r--drivers/devfreq/devfreq.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
index e5d3f9cf94dc..f08fc6966eae 100644
--- a/drivers/devfreq/devfreq.c
+++ b/drivers/devfreq/devfreq.c
@@ -1390,9 +1390,6 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
char str_governor[DEVFREQ_NAME_LEN + 1];
const struct devfreq_governor *governor, *prev_governor;
- if (!df->governor)
- return -EINVAL;
-
ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor);
if (ret != 1)
return -EINVAL;
@@ -1403,6 +1400,9 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
ret = PTR_ERR(governor);
goto out;
}
+ if (!df->governor)
+ goto start_new_governor;
+
if (df->governor == governor) {
ret = 0;
goto out;
@@ -1423,6 +1423,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
goto out;
}
+start_new_governor:
/*
* Start the new governor and create the specific sysfs files
* which depend on the new governor.
@@ -1436,6 +1437,9 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
/* Restore previous governor */
df->governor = prev_governor;
+ if (!df->governor)
+ goto out;
+
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
if (ret) {
dev_err(dev,