[PATCH -next v2 RESEND] I2C: Fix return value check for devm_pinctrl_get()

Andi Shyti andi.shyti at kernel.org
Fri Aug 18 12:20:34 PDT 2023


Hi,

On Fri, Aug 18, 2023 at 06:42:11PM +0200, Linus Walleij wrote:
> On Fri, Aug 18, 2023 at 10:20 AM Russell King (Oracle)
> <linux at armlinux.org.uk> wrote:
> > On Fri, Aug 18, 2023 at 03:45:08PM +0800, Ruan Jinjie wrote:
> 
> > >       i2c_imx->pinctrl = devm_pinctrl_get(&pdev->dev);
> > > -     if (!i2c_imx->pinctrl || IS_ERR(i2c_imx->pinctrl)) {
> > > +     if (IS_ERR(i2c_imx->pinctrl)) {
> > >               dev_info(&pdev->dev, "can't get pinctrl, bus recovery not supported\n");
> > >               return PTR_ERR(i2c_imx->pinctrl);
> > >       }
> >
> > I haven't looked at the AT91 version, but... isn't the original code
> > entirely correct?
> >
> > If pinctrl is not available (thus devm_pinctrl_get() returns NULL) then
> > recovery can't work, because we can't switch the I2C pins between the
> > I2C controller and GPIO. So, isn't it quite correct to print
> > "can't get pinctrl, bus recovery not supported" because the I2C bus
> > can't be recovered without pinctrl?
> >
> > The PTR_ERR() is also fine - because if pinctrl is not present and
> > returns NULL, we'll end up returning zero, which is exactly what we
> > want.
> 
> Oh, you're probably absolutely right about that.
> 
> > The alternative would be to open code that, maybe with a more accurate
> > message:
> >
> >         if (!i2c_imx->pinctrl) {
> >                 dev_info(&pdev->dev, "pinctrl unavailable, bus recovery not supported\n");
> >                 return 0;
> >         }
> >         if (IS_ERR(i2c_imx->pinctrl) {
> >                 ...
> 
> This is a way better patch. It makes the implicit explicit.

we could also use

	if (IS_ERR_OR_NULL(i2c_imx->pinctrl))
		...

without changing any logic in the driver.

Andi



More information about the linux-arm-kernel mailing list