On 16.07.2019 12:05, Viresh Kumar wrote: > On 15-07-19, 14:04, Kamil Konieczny wrote: >> Add enable regulators to dev_pm_opp_set_regulators() and disable >> regulators to dev_pm_opp_put_regulators(). This prepares for >> converting exynos-bus devfreq driver to use dev_pm_opp_set_rate(). >> >> Signed-off-by: Kamil Konieczny <k.konieczny@xxxxxxxxxxxxxxxxxxx> >> -- >> Changes in v2: >> >> - move regulator enable and disable into loop >> >> --- >> drivers/opp/core.c | 18 +++++++++++++++--- >> 1 file changed, 15 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/opp/core.c b/drivers/opp/core.c >> index 0e7703fe733f..069c5cf8827e 100644 >> --- a/drivers/opp/core.c >> +++ b/drivers/opp/core.c >> @@ -1570,6 +1570,10 @@ struct opp_table *dev_pm_opp_set_regulators(struct device *dev, >> goto free_regulators; >> } >> >> + ret = regulator_enable(reg); >> + if (ret < 0) >> + goto disable; > > The name of this label is logically incorrect because we won't disable > the regulator from there but put it. Over that, I would rather prefer > to remove the label and add regulator_put() here itself. I will change this and following according to your suggestions and will send v3. >> + >> opp_table->regulators[i] = reg; >> } >> >> @@ -1582,9 +1586,15 @@ struct opp_table *dev_pm_opp_set_regulators(struct device *dev, >> >> return opp_table; >> >> +disable: >> + regulator_put(reg); >> + --i; >> + >> free_regulators: >> - while (i != 0) >> - regulator_put(opp_table->regulators[--i]); >> + for (; i >= 0; --i) { >> + regulator_disable(opp_table->regulators[i]); >> + regulator_put(opp_table->regulators[i]); > > This is incorrect as this will now try to put/disable the regulator > which we failed to acquire. As --i happens only after the loop has run > once. You can rather do: > > while (i--) { > regulator_disable(opp_table->regulators[i]); > regulator_put(opp_table->regulators[i]); > } > > >> + } >> >> kfree(opp_table->regulators); >> opp_table->regulators = NULL; >> @@ -1610,8 +1620,10 @@ void dev_pm_opp_put_regulators(struct opp_table *opp_table) >> /* Make sure there are no concurrent readers while updating opp_table */ >> WARN_ON(!list_empty(&opp_table->opp_list)); >> >> - for (i = opp_table->regulator_count - 1; i >= 0; i--) >> + for (i = opp_table->regulator_count - 1; i >= 0; i--) { >> + regulator_disable(opp_table->regulators[i]); >> regulator_put(opp_table->regulators[i]); >> + } >> >> _free_set_opp_data(opp_table); >> >> -- >> 2.22.0 > -- Best regards, Kamil Konieczny Samsung R&D Institute Poland