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);}