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

Commit 3743de67 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "PM/devfreq: Do not switch governors from sysfs when device is suspended"

parents 6f6c0683 9c41437c
Loading
Loading
Loading
Loading
+36 −14
Original line number Diff line number Diff line
@@ -542,7 +542,7 @@ static void devfreq_dev_release(struct device *dev)
		devfreq->profile->exit(devfreq->dev.parent);

	mutex_destroy(&devfreq->lock);
	mutex_destroy(&devfreq->sysfs_lock);
	mutex_destroy(&devfreq->event_lock);
	kfree(devfreq);
}

@@ -585,7 +585,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
	}

	mutex_init(&devfreq->lock);
	mutex_init(&devfreq->sysfs_lock);
	mutex_init(&devfreq->event_lock);
	mutex_lock(&devfreq->lock);
	devfreq->dev.parent = dev;
	devfreq->dev.class = devfreq_class;
@@ -596,6 +596,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
	devfreq->last_status.current_frequency = profile->initial_freq;
	devfreq->data = data;
	devfreq->nb.notifier_call = devfreq_notifier_call;
	devfreq->dev_suspended = false;

	if (!devfreq->profile->max_state && !devfreq->profile->freq_table) {
		mutex_unlock(&devfreq->lock);
@@ -817,14 +818,23 @@ EXPORT_SYMBOL(devm_devfreq_remove_device);
 */
int devfreq_suspend_device(struct devfreq *devfreq)
{
	int ret;

	if (!devfreq)
		return -EINVAL;

	if (!devfreq->governor)
	mutex_lock(&devfreq->event_lock);
	if (!devfreq->governor || devfreq->dev_suspended) {
		mutex_unlock(&devfreq->event_lock);
		return 0;
	}

	return devfreq->governor->event_handler(devfreq,
	ret = devfreq->governor->event_handler(devfreq,
				DEVFREQ_GOV_SUSPEND, NULL);
	if (!ret)
		devfreq->dev_suspended = true;
	mutex_unlock(&devfreq->event_lock);
	return ret;
}
EXPORT_SYMBOL(devfreq_suspend_device);

@@ -838,14 +848,22 @@ EXPORT_SYMBOL(devfreq_suspend_device);
 */
int devfreq_resume_device(struct devfreq *devfreq)
{
	int ret;
	if (!devfreq)
		return -EINVAL;

	if (!devfreq->governor)
	mutex_lock(&devfreq->event_lock);
	if (!devfreq->governor) {
		mutex_unlock(&devfreq->event_lock);
		return 0;
	}

	return devfreq->governor->event_handler(devfreq,
	ret = devfreq->governor->event_handler(devfreq,
				DEVFREQ_GOV_RESUME, NULL);
	if (!ret)
		devfreq->dev_suspended = false;
	mutex_unlock(&devfreq->event_lock);
	return ret;
}
EXPORT_SYMBOL(devfreq_resume_device);

@@ -1005,7 +1023,11 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
		goto out;
	}

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	if (df->dev_suspended) {
		ret = -EINVAL;
		goto gov_stop_out;
	}
	if (df->governor) {
		ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL);
		if (ret) {
@@ -1031,7 +1053,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
	}

gov_stop_out:
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
out:
	mutex_unlock(&devfreq_list_lock);

@@ -1126,10 +1148,10 @@ static ssize_t polling_interval_store(struct device *dev,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	df->governor->event_handler(df, DEVFREQ_GOV_INTERVAL, &value);
	ret = count;
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);

	return ret;
}
@@ -1147,7 +1169,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	mutex_lock(&df->lock);
	max = df->max_freq;
	if (value && max && value > max) {
@@ -1160,7 +1182,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
	ret = count;
unlock:
	mutex_unlock(&df->lock);
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
	return ret;
}

@@ -1184,7 +1206,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
	if (ret != 1)
		return -EINVAL;

	mutex_lock(&df->sysfs_lock);
	mutex_lock(&df->event_lock);
	mutex_lock(&df->lock);
	min = df->min_freq;
	if (value && min && value < min) {
@@ -1197,7 +1219,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
	ret = count;
unlock:
	mutex_unlock(&df->lock);
	mutex_unlock(&df->sysfs_lock);
	mutex_unlock(&df->event_lock);
	return ret;
}
static DEVICE_ATTR_RW(min_freq);
+1 −1
Original line number Diff line number Diff line
@@ -315,7 +315,7 @@ static int devfreq_memlat_get_freq(struct devfreq *df,
	return 0;
}

gov_attr(ratio_ceil, 1U, 10000U);
gov_attr(ratio_ceil, 1U, 20000U);
gov_attr(stall_floor, 0U, 100U);

static struct attribute *memlat_dev_attr[] = {
+2 −1
Original line number Diff line number Diff line
@@ -57,7 +57,8 @@ static int devfreq_simple_ondemand_func(struct devfreq *df,
		    stat->total_time * dfso_upthreshold)
			*freq = max;
		else if (stat->busy_time * 100 <
		    stat->total_time * dfso_downdifferential)
			 stat->total_time *
			 (dfso_upthreshold - dfso_downdifferential))
			*freq = min;
		else
			*freq = df->previous_freq;
+2 −1
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ struct devfreq {
	struct list_head node;

	struct mutex lock;
	struct mutex sysfs_lock;
	struct mutex event_lock;
	struct device dev;
	struct devfreq_dev_profile *profile;
	const struct devfreq_governor *governor;
@@ -175,6 +175,7 @@ struct devfreq {
	unsigned long last_stat_updated;

	struct srcu_notifier_head transition_notifier_list;
	bool dev_suspended;
};

struct devfreq_freqs {