From a2038b4794fe99dd786877b89c98b84d78650f69 Mon Sep 17 00:00:00 2001 From: Saravana Kannan Date: Mon, 24 Oct 2016 16:35:05 -0700 Subject: [PATCH] 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 Bug: 155527102 Link: https://lore.kernel.org/lkml/1477360800-11509-1-git-send-email-skannan@codeaurora.org/ Signed-off-by: Saravana Kannan Change-Id: If853c7d03b6ce6767047f17d747f62d850a7b3b4 --- drivers/devfreq/devfreq.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 16018e377e1e..d6a04e1f6e57 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -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);