[PATCH 2/2] clocksource/drivers/renesas-ostm: Add RZ/G2L OSTM support

Biju Das biju.das.jz at bp.renesas.com
Wed Nov 10 03:37:05 PST 2021


Hi Philipp and Geert,

Thanks for the feedback.

> Subject: Re: [PATCH 2/2] clocksource/drivers/renesas-ostm: Add RZ/G2L OSTM
> support
> 
> Hi Geert, Biju,
> 
> On Wed, 2021-11-10 at 11:27 +0100, Geert Uytterhoeven wrote:
> > Hi Biju,
> >
> > On Wed, Nov 10, 2021 at 9:32 AM Biju Das <biju.das.jz at bp.renesas.com>
> wrote:
> > > RZ/G2L SoC has Generic Timer Module(a.k.a OSTM) which needs to
> > > deassert the reset line before accessing any registers.
> > >
> > > This patch adds an entry point for RZ/G2L so that we can deassert
> > > the reset line in probe callback.
> > >
> > > Signed-off-by: Biju Das <biju.das.jz at bp.renesas.com>
> > > Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj at bp.renesas.com>
> >
> > Thanks for your patch!
> >
> > > --- a/drivers/clocksource/renesas-ostm.c
> > > +++ b/drivers/clocksource/renesas-ostm.c
> > > @@ -209,3 +211,39 @@ static int __init ostm_init(struct device_node
> > > *np)
> > >  }
> > >
> > >  TIMER_OF_DECLARE(ostm, "renesas,ostm", ostm_init);
> >
> > Background: this driver uses TIMER_OF_DECLARE() because the OSTM is
> > the system timer on RZ/A SoCs, which do not have the ARM architectured
> > timer.  RZ/G2L does have the ARM architectured timer.
> 
> Thanks.
> 
> > > +
> > > +#ifdef CONFIG_ARCH_R9A07G044
> > > +static int __init ostm_probe(struct platform_device *pdev) {
> > > +       struct device *dev = &pdev->dev;
> > > +       struct reset_control *rstc;
> > > +       int ret;
> > > +
> > > +       rstc = devm_reset_control_get_exclusive(dev, NULL);
> > > +       if (IS_ERR(rstc))
> > > +               return dev_err_probe(dev, PTR_ERR(rstc), "failed to
> > > + get reset");
> > > +
> > > +       reset_control_deassert(rstc);
> > > +
> > > +       ret = ostm_init(dev->of_node);
> > > +       if (ret) {
> > > +               reset_control_assert(rstc);
> > > +               return ret;
> > > +       }
> > > +
> > > +       return 0;
> > > +}
> > > +
> > > +static const struct of_device_id ostm_of_table[] = {
> > > +       { .compatible = "renesas,rzg2l-ostm", },
> >
> > I believe the OSTM block on RZ/G2L is identical to the one on RZ/A,
> > and the requirement to deassert its module reset is an SoC integration
> > feature on RZ/G2L.  Hence the driver should match on "renesas,ostm"
> > for both?
> 
> If that is the case, the reset could be made required for
>   compatible = "renesas,r9a07g044-ostm", "renesas,ostm"; in the .yaml
> file.
> 
> > So my suggestion would be to include the reset handling in ostm_init()
> > instead, but make it optional, and error out in case of -EPROBE_DEFER.
> >
> > In case initialization from TIMER_OF_DECLARE() failed, the platform
> > driver can kick in later and retry.
> >
> > However, it seems __of_reset_control_get() ignores all errors,
> > including -EPROBE_DEFER, if optional is true, so this won't work?
> >
> > Philipp: is that correct? If yes, ostm_init() has to check the
> > presence of a resets property to see if the reset is optional or
> required.
> 
> No, __of_reset_control_get() should only replace its -ENOENT return value
> due to errors from of_property_match_string() and
> of_parse_phandle_with_args() with NULL. Anything else I'd consider a bug.
> 
> Specifically, -EPROBE_DEFER is still returned if no existing rcdev is
> found matching the successful "resets" phandle lookup. So
> 
> 	rstc = devm_reset_control_get_optional_exclusive(dev, NULL);

In this case, How do we get dev here from device_node, as device is not available at this point?

Regards,
Biju

> 	if (IS_ERR(rstc))
> 		return dev_err_probe(dev, PTR_ERR(rstc), "failed to get
> reset");
> 
> 	reset_control_deassert(rstc);
> 
> added to ostm_init() should work. Note that platform_probe() will throw an
> additional warning if -EPROBE_DEFER is returned from non-hotpluggable
> drivers (and turn it into -ENXIO).
> 
> regards
> Philipp


More information about the linux-arm-kernel mailing list