Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 502361d6 authored by Saravana Kannan's avatar Saravana Kannan Committed by Jonathan Avila
Browse files

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.

Change-Id: I7cf1e6ceb63d27ce08b2d17b97a9844d257464ce
Signed-off-by: default avatarSaravana Kannan <skannan@codeaurora.org>
[use strlcpy instead]
Signed-off-by: default avatarJonathan Avila <avilaj@codeaurora.org>
parent edbd7843
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -920,7 +920,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)
@@ -948,12 +948,21 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
			goto out;
		}
	}
	prev_gov = df->governor;
	df->governor = governor;
	strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN);
	strlcpy(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);
		}
	}
out:
	mutex_unlock(&devfreq_list_lock);