On 10/26, Viresh Kumar wrote:
If the regulators aren't set explicitly by the platform, the OPP core assumes that the platform doesn't have any regulator and uses the clk-only callback.
If the platform failed to register a regulator with the core, then this can turn out to be a dangerous assumption as the OPP core will try to change clk without changing regulators.
Handle that properly by making sure that the DT didn't had any entries
s/had/have/
for supply voltages as well.
diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c index 3298fac01bb0..34cd48dfe89e 100644 --- a/drivers/base/power/opp/core.c +++ b/drivers/base/power/opp/core.c @@ -734,7 +734,17 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq) /* Only frequency scaling */ if (!regulators) {
rcu_read_unlock();
/*
* DT contained supply ratings? Consider platform failed to set
* regulators.
*/
if (unlikely(opp->supplies[0].u_volt)) {
rcu_read_unlock();
dev_err(dev, "%s: Regulator not registered with OPP core\n",
__func__);
return -EINVAL;
}
Don't we need an rcu_read_unlock() here as well?
return _generic_set_opp_clk_only(dev, clk, old_freq, freq);
}