FROMLIST: 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.

Signed-off-by: Saravana Kannan <skannan@codeaurora.org>
Bug: 155527102
Link: https://lore.kernel.org/lkml/1477360800-11509-1-git-send-email-skannan@codeaurora.org/
Signed-off-by: Saravana Kannan <saravanak@google.com>
Change-Id: If853c7d03b6ce6767047f17d747f62d850a7b3b4
This commit is contained in:
Saravana Kannan 2016-10-24 16:35:05 -07:00 committed by Saravana Kannan
parent 12c94f71d4
commit a2038b4794

View file

@ -1048,7 +1048,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
struct devfreq *df = to_devfreq(dev);
int ret;
char str_governor[DEVFREQ_NAME_LEN + 1];
struct devfreq_governor *governor;
const struct devfreq_governor *governor, *prev_gov;
ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor);
if (ret != 1)
@ -1082,12 +1082,21 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
goto gov_stop_out;
}
}
prev_gov = df->governor;
df->governor = governor;
strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN);
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
if (ret)
if (ret) {
dev_warn(dev, "%s: Governor %s not started(%d)\n",
__func__, df->governor->name, ret);
if (prev_gov) {
df->governor = prev_gov;
strlcpy(df->governor_name, prev_gov->name,
DEVFREQ_NAME_LEN);
df->governor->event_handler(df, DEVFREQ_GOV_START,
NULL);
}
}
gov_stop_out:
mutex_unlock(&df->event_lock);