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

Commit 00119d12 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "PM / devfreq: Add new flag to do simple clock scaling"

parents 66d9ea51 ed62d901
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ static int devfreq_simple_ondemand_func(struct devfreq *df,
	unsigned int dfso_downdifferential = DFSO_DOWNDIFFERENCTIAL;
	struct devfreq_simple_ondemand_data *data = df->data;
	unsigned long max = (df->max_freq) ? df->max_freq : UINT_MAX;
	unsigned long min = (df->min_freq) ? df->min_freq : 0;

	if (err)
		return err;
@@ -43,18 +44,30 @@ static int devfreq_simple_ondemand_func(struct devfreq *df,
	    dfso_upthreshold < dfso_downdifferential)
		return -EINVAL;

	/* Assume MAX if it is going to be divided by zero */
	if (stat.total_time == 0) {
		*freq = max;
		return 0;
	}

	/* Prevent overflow */
	if (stat.busy_time >= (1 << 24) || stat.total_time >= (1 << 24)) {
		stat.busy_time >>= 7;
		stat.total_time >>= 7;
	}

	if (data && data->simple_scaling) {
		if (stat.busy_time * 100 >
		    stat.total_time * dfso_upthreshold)
			*freq = max;
		else if (stat.busy_time * 100 <
		    stat.total_time * dfso_downdifferential)
			*freq = min;
		else
			*freq = df->previous_freq;
		return 0;
	}

	/* Assume MAX if it is going to be divided by zero */
	if (stat.total_time == 0) {
		*freq = max;
		return 0;
	}

	/* Set MAX if it's busy enough */
	if (stat.busy_time * 100 >
	    stat.total_time * dfso_upthreshold) {
+4 −0
Original line number Diff line number Diff line
@@ -228,6 +228,9 @@ extern int devfreq_unregister_opp_notifier(struct device *dev,
 *			the governor may consider slowing the frequency down.
 *			Specify 0 to use the default. Valid value = 0 to 100.
 *			downdifferential < upthreshold must hold.
 * @simple_scaling:	Setting this flag will scale the clocks up only if the
 *			load is above @upthreshold and will scale the clocks
 *			down only if the load is below @downdifferential.
 *
 * If the fed devfreq_simple_ondemand_data pointer is NULL to the governor,
 * the governor uses the default values.
@@ -235,6 +238,7 @@ extern int devfreq_unregister_opp_notifier(struct device *dev,
struct devfreq_simple_ondemand_data {
	unsigned int upthreshold;
	unsigned int downdifferential;
	unsigned int simple_scaling;
};
#endif