[PATCH v3 03/20] drivers: reset: Handle gracefully NULL pointers

Simon Glass sjg at chromium.org
Thu May 6 17:06:49 CEST 2021


Hi Kishon,

On Thu, 6 May 2021 at 07:09, Kishon Vijay Abraham I <kishon at ti.com> wrote:
>
> Hi Simon,
>
> On 06/05/21 5:07 am, Simon Glass wrote:
> > Hi Kishon,
> >
> > On Tue, 4 May 2021 at 21:25, Kishon Vijay Abraham I <kishon at ti.com> wrote:
> >>
> >> Hi Simon,
> >>
> >> On 04/05/21 10:28 pm, Simon Glass wrote:
> >>> Hi Kishon,
> >>>
> >>> On Tue, 4 May 2021 at 04:42, Kishon Vijay Abraham I <kishon at ti.com> wrote:
> >>>>
> >>>> The reset framework provides devm_reset_control_get_optional()
> >>>> which can return NULL (not an error case). So all the other reset_ops
> >>>> should handle NULL gracefully. Prepare the way for a managed reset
> >>>> API by handling NULL pointers without crashing nor failing.
> >>>>
> >>>> Signed-off-by: Vignesh Raghavendra <vigneshr at ti.com>
> >>>> Signed-off-by: Kishon Vijay Abraham I <kishon at ti.com>
> >>>> ---
> >>>>  drivers/reset/reset-uclass.c | 35 ++++++++++++++++++++++++++++++-----
> >>>>  1 file changed, 30 insertions(+), 5 deletions(-)
> >>>
> >>> I am still not a fan of this. There is no way to know whether the
> >>> reset API call actually did anything. Normally we return -EINVAL or
> >>> something like that when the value is invalid (e.g. see GPIO uclass).
> >>
> >> The reset modification is more in-line with how clk uclass is designed.
> >>
> >> There every API first checks if the clock is valid and returns 0 (will
> >> be the case for optional clocks)
> >>        if (!clk_valid(clk))
> >>                 return 0;
> >>
> >> If you don't prefer this approach, I'll drop this patch and handle it
> >> appropriately in the client driver (serdes driver). Please let me know.
> >
> > Yes I see that with clk. IMO the return code is incorrect there also,
> > since it should be -ENOENT or something like that, to indicate that
> > there is actually no clock.
> >
> > The clk.h header gives no indication that it accepts a NULL clock. So
> > here is what I think:
> >
> > 1. Update clk_valid() to require clk to be a valid pointer, so it is
> > considered invalid only if clk-dev.
>
> So for API's like clk_enable(), clk_disable(), should it return 0 or
> -ENOENT; i.e if clk is valid and clk->dev is NULL?
> >
> > 2. Update the reset 'managed API' to return an empty reset record
> > instead of NULL.
>
> Okay, something like below?
>
> --- a/drivers/reset/reset-uclass.c
> +++ b/drivers/reset/reset-uclass.c
> @@ -326,9 +326,6 @@ struct reset_ctl
> *devm_reset_control_get_optional(struct udevice *dev,
>  {
>         struct reset_ctl *r = devm_reset_control_get(dev, id);
>
> -       if (IS_ERR(r))
> -               return NULL;
> -
>         return r;
>  }
>
> The only thing to note here is _get_optional() is a wrapper to _get()
> with no modification.

OK.

> >
> > 3. Your problem goes away, and (I think) we are still compatible with
> > the linux API.
> >
> >>
> >>>
> >>> The function you mention says:  * Returns a struct reset_ctl or a
> >>> dummy reset controller if it failed.
> >>>
> >>> But it does not appear to do that?
> >>
> >> Right, looks like it's incorrect from when the patch was actually
> >> introduced. It was returning "NULL" for optional resets.
> >>
> >> commit 139e4a1cbe60de96d4febbc6db5882929801ca46
> >> Author: Jean-Jacques Hiblot <jjhiblot at ti.com>
> >> Date:   Wed Sep 9 15:37:03 2020 +0530
> >>
> >>     drivers: reset: Add a managed API to get reset controllers from the DT
> >
> > OK. So what should it be?
>
> I meant the comment in header is incorrect since it was returning NULL
> if it failed.

OK, well then you could add a patch for it. The problem with a pointer
value is that you cannot both communicate an error and return a valid
pointer.

Regards,
Simon


More information about the U-Boot mailing list