On Tue, 2 Jul 2024 at 07:15, Viresh Kumar viresh.kumar@linaro.org wrote:
On 01-07-24, 17:17, Viresh Kumar wrote:
What about this patch instead ?
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 5f4598246a87..2086292f8355 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -1091,7 +1091,8 @@ static int _set_required_opps(struct device *dev, struct opp_table *opp_table, if (devs[index]) { required_opp = opp ? opp->required_opps[index] : NULL;
ret = dev_pm_opp_set_opp(devs[index], required_opp);
/* Set required OPPs forcefully */
ret = dev_pm_opp_set_opp_forced(devs[index], required_opp, true);
Maybe better to do just this instead:
diff --git a/drivers/opp/core.c b/drivers/opp/core.c index 5f4598246a87..9484acbeaa66 100644 --- a/drivers/opp/core.c +++ b/drivers/opp/core.c @@ -1386,7 +1386,12 @@ int dev_pm_opp_set_opp(struct device *dev, struct dev_pm_opp *opp) return PTR_ERR(opp_table); }
ret = _set_opp(dev, opp_table, opp, NULL, false);
/*
* For a genpd's OPP table, we always want to set the OPP (and
* performance level) and let the genpd core take care of aggregating
* the votes. Set `forced` to true for a genpd here.
*/
ret = _set_opp(dev, opp_table, opp, NULL, opp_table->is_genpd); dev_pm_opp_put_opp_table(opp_table);
I think this should work, but in this case we seem to need a similar thing for dev_pm_opp_set_rate().
Another option is to let _set_opp() check "opp_table->is_genpd" and enforce the opp to be set in that case. Whatever you prefer, I can re-spin the patch.
Kind regards Uffe