Commit bc658bef authored by Saravana Kannan's avatar Saravana Kannan Committed by MyungJoo Ham

PM / devfreq: Restart previous governor if new governor fails to start

If the new governor fails to start, switch back to old governor so that the
devfreq state is not left in some weird limbo.

[Myungjoo: assume fatal on revert failure and set df->governor to NULL]
Signed-off-by: default avatarSibi Sankar <sibis@codeaurora.org>
Signed-off-by: default avatarSaravana Kannan <skannan@codeaurora.org>
Reviewed-by: default avatarChanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: default avatarMyungJoo Ham <myungjoo.ham@samsung.com>
parent 1d1397c3
...@@ -1124,7 +1124,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, ...@@ -1124,7 +1124,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
struct devfreq *df = to_devfreq(dev); struct devfreq *df = to_devfreq(dev);
int ret; int ret;
char str_governor[DEVFREQ_NAME_LEN + 1]; char str_governor[DEVFREQ_NAME_LEN + 1];
struct devfreq_governor *governor; const struct devfreq_governor *governor, *prev_governor;
ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor); ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor);
if (ret != 1) if (ret != 1)
...@@ -1153,12 +1153,24 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, ...@@ -1153,12 +1153,24 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
goto out; goto out;
} }
} }
prev_governor = df->governor;
df->governor = governor; df->governor = governor;
strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN); strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN);
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL); ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
if (ret) if (ret) {
dev_warn(dev, "%s: Governor %s not started(%d)\n", dev_warn(dev, "%s: Governor %s not started(%d)\n",
__func__, df->governor->name, ret); __func__, df->governor->name, ret);
df->governor = prev_governor;
strncpy(df->governor_name, prev_governor->name,
DEVFREQ_NAME_LEN);
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
if (ret) {
dev_err(dev,
"%s: reverting to Governor %s failed (%d)\n",
__func__, df->governor_name, ret);
df->governor = NULL;
}
}
out: out:
mutex_unlock(&devfreq_list_lock); mutex_unlock(&devfreq_list_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment