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.koniec...@partner.samsung.com>
>> --
>> 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

Reply via email to