Commit 8521ce52 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files
Pull an operating performance points (OPP) framework fix for 5.12
from Viresh Kumar:

"Single patch to fix an issue where a frequency update may get
 skipped."

* 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm:
  opp: Don't skip freq update for different frequency
parents 992b9ff1 de04241a
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -998,14 +998,15 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table,
	old_opp = opp_table->current_opp;

	/* Return early if nothing to do */
	if (opp_table->enabled && old_opp == opp) {
	if (old_opp == opp && opp_table->current_rate == freq &&
	    opp_table->enabled) {
		dev_dbg(dev, "%s: OPPs are same, nothing to do\n", __func__);
		return 0;
	}

	dev_dbg(dev, "%s: switching OPP: Freq %lu -> %lu Hz, Level %u -> %u, Bw %u -> %u\n",
		__func__, old_opp->rate, freq, old_opp->level, opp->level,
		old_opp->bandwidth ? old_opp->bandwidth[0].peak : 0,
		__func__, opp_table->current_rate, freq, old_opp->level,
		opp->level, old_opp->bandwidth ? old_opp->bandwidth[0].peak : 0,
		opp->bandwidth ? opp->bandwidth[0].peak : 0);

	scaling_down = _opp_compare_key(old_opp, opp);
@@ -1061,6 +1062,7 @@ static int _set_opp(struct device *dev, struct opp_table *opp_table,
	/* Make sure current_opp doesn't get freed */
	dev_pm_opp_get(opp);
	opp_table->current_opp = opp;
	opp_table->current_rate = freq;

	return ret;
}
+2 −0
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ enum opp_table_access {
 * @clock_latency_ns_max: Max clock latency in nanoseconds.
 * @parsed_static_opps: Count of devices for which OPPs are initialized from DT.
 * @shared_opp: OPP is shared between multiple devices.
 * @current_rate: Currently configured frequency.
 * @current_opp: Currently configured OPP for the table.
 * @suspend_opp: Pointer to OPP to be used during device suspend.
 * @genpd_virt_dev_lock: Mutex protecting the genpd virtual device pointers.
@@ -184,6 +185,7 @@ struct opp_table {

	unsigned int parsed_static_opps;
	enum opp_table_access shared_opp;
	unsigned long current_rate;
	struct dev_pm_opp *current_opp;
	struct dev_pm_opp *suspend_opp;