Re: [bug report] iio: fetch and enable regulators unconditionally

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Oct 14, 2016 at 1:17 PM, Crt Mori <cmo@xxxxxxxxxxx> wrote:
> On 14 October 2016 at 11:01, Lars-Peter Clausen <lars@xxxxxxxxxx> wrote:
>> On 10/13/2016 10:25 AM, Crt Mori wrote:
>>> Hello Dan,
>>>
>>> On 12 October 2016 at 08:07, Dan Carpenter <dan.carpenter@xxxxxxxxxx> wrote:
>>>> Hello Crt Mori,
>>>>
>>>> The patch 67516074884b: "iio: fetch and enable regulators
>>>> unconditionally" from Sep 5, 2016, leads to the following static
>>>> checker warning:
>>>>
>>>>         drivers/iio/pressure/ms5611_core.c:419 ms5611_init()
>>>>         error: 'st->vdd' dereferencing possible ERR_PTR()
>>>>
>>>> drivers/iio/pressure/ms5611_core.c
>>>>    388  static int ms5611_init(struct iio_dev *indio_dev)
>>>>    389  {
>>>>    390          int ret;
>>>>    391          struct ms5611_state *st = iio_priv(indio_dev);
>>>>    392
>>>>    393          /* Enable attached regulator if any. */
>>>>    394          st->vdd = devm_regulator_get(indio_dev->dev.parent, "vdd");
>>>>    395          if (!IS_ERR(st->vdd)) {
>>>>    396                  ret = regulator_enable(st->vdd);
>>>>    397                  if (ret) {
>>>>    398                          dev_err(indio_dev->dev.parent,
>>>>    399                                  "failed to enable Vdd supply: %d\n", ret);
>>>>    400                          return ret;
>>>>    401                  }
>>>>    402          } else {
>>>>    403                  ret = PTR_ERR(st->vdd);
>>>>    404                  if (ret != -ENODEV)
>>>>    405                          return ret;
>>>>
>>>> You probably want to update this chunk as well?  Otherwise static
>>>> checkers think we're dereferencing -ENODEV.
>>>
>>> Can you explain a bit more why they would think of it like that and
>>> what would better proposal be like?
>>>
>>> ret is a return value and it is st->vdd pointer is checked for error
>>> before we deduct error information out, so I do not see where
>>> dereferencing takes part?
>>
>> The thing is, if PTR_ERR(st->vdd) is -ENODEV, we do not return an error and
>> just continue in the probe function. And then if one of the cleanup
>> functions is called st->vdd is passed to regulator_disable() which will
>> crash if it is passed -ENODEV instead of a valid pointer.
>>
>> I think the ENODEV check should be dropped and the whole thing should be
>> turned into
>>
>> if (IS_ERR(st->vdd))
>>         retrurn PTR_ERR(st->vdd))
>>
>> ret = regulator_enable()

Agree.

>> ...
>>
>> This is the behavior that we expect for normal supply regulators.
> This would then make us completely dependent on this behaviour:
>     If the device tree or board file does not define suitable regulators for
>     the component, it will be substituted by a dummy regulator, or, if
>     regulators are disabled altogether, by stubs.
>
> which I read as that it will not return ENODEV anyway, so we are safe
> to assume something else went wrong whenever error is returned?
> I have added Linus Wallerij to the discussion as might also be valid
> for his solution?

Just handle it the most straight forward way:

        data->vdd = devm_regulator_get(dev, "vdd");
        if (IS_ERR(data->vdd))
                return PTR_ERR(data->vdd);

        ret = regulator_enable(data->vdd);
        if (ret) {
                dev_warn(dev,
                         "Failed to enable specified Vdd supply\n");
                return ret;
        }

The same in reverse order mutatis mutandis for
taking it down.

- If there is a regulator, it will be handled
- If there are dummies, they will be used yielding NO-OPs
- If regulators are compiled out it will be a static inline NO-OP

Everything else is the errorpath and you should just
return with an error.

If the regulator is optional  - i.e. if the *hardware* regulator is
optional, i.e. if it is optional to supply power on that line at
all - that is another thing. We don't do "software optional" which
is a common misconception around regulators. If it is *really*
hardware-optional to supply this voltage, then use
regulator_get_optional() and ONLY in that case you may get
a -ENODEV back, that you need to handle.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux