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

Commit 113139c1 authored by Rama Aparna Mallavarapu's avatar Rama Aparna Mallavarapu
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>
Signed-off-by: default avatarRama Aparna Mallavarapu <aparnam@codeaurora.org>
parent 35904624
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -984,7 +984,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)
@@ -1013,12 +1013,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);