[PATCH] lib: utils/reset: Add voltage level for gpio_reset

Xiang W wxjstz at 126.com
Sun Oct 24 10:10:07 PDT 2021


在 2021-10-24星期日的 17:53 +0100,Jessica Clarke写道:
> On 24 Oct 2021, at 17:46, Xiang W <wxjstz at 126.com> wrote:
> > 
> > The reset voltage may be different under different platforms, so
> > fdt
> > should describe the reset level.
> > 
> > Signed-off-by: Xiang W <wxjstz at 126.com>
> > ---
> > lib/utils/reset/fdt_reset_gpio.c | 13 ++++++++++---
> > 1 file changed, 10 insertions(+), 3 deletions(-)
> > 
> > diff --git a/lib/utils/reset/fdt_reset_gpio.c
> > b/lib/utils/reset/fdt_reset_gpio.c
> > index 4da1450..b834522 100644
> > --- a/lib/utils/reset/fdt_reset_gpio.c
> > +++ b/lib/utils/reset/fdt_reset_gpio.c
> > @@ -21,16 +21,19 @@
> > 
> > struct gpio_reset {
> >         struct gpio_pin pin;
> > +       u32 active_level;
> >         u32 active_delay;
> >         u32 inactive_delay;
> > };
> > 
> > static struct gpio_reset poweroff = {
> > +       .active_level = 1,
> >         .active_delay = 100,
> >         .inactive_delay = 100
> > };
> > 
> > static struct gpio_reset restart = {
> > +       .active_level = 1,
> >         .active_delay = 100,
> >         .inactive_delay = 100
> > };
> > @@ -68,15 +71,15 @@ static void gpio_system_reset(u32 type, u32
> > reason)
> > 
> >         if (reset) {
> >                 /* drive it active, also inactive->active edge */
> > -               gpio_direction_output(&reset->pin, 1);
> > +               gpio_direction_output(&reset->pin, reset-
> > >active_level);
> >                 sbi_timer_mdelay(reset->active_delay);
> > 
> >                 /* drive inactive, also active->inactive edge */
> > -               gpio_set(&reset->pin, 0);
> > +               gpio_set(&reset->pin, !reset->active_level);
> >                 sbi_timer_mdelay(reset->inactive_delay);
> > 
> >                 /* drive it active, also inactive->active edge */
> > -               gpio_set(&reset->pin, 1);
> > +               gpio_set(&reset->pin, reset->active_level);
> >         }
> >         /* hang !!! */
> >         sbi_hart_hang();
> > @@ -107,6 +110,10 @@ static int gpio_reset_init(void *fdt, int
> > nodeoff,
> >                         return rc;
> >         }
> > 
> > +       val = fdt_getprop(fdt, nodeoff, "active-level", &len);
> 
> This property is neither documented in the binding specification for
> gpio-restart nor is it checked by Linux.

This DT is only processed by opensbi, and linux should be reset through
the sbi interface, instead of controlling gpio to perform the reset by
itself.

Regards,
Xiang W

> 
> > +       if (len > 0)
> > +               reset->active_level = !!fdt32_to_cpu(*val);
> > +
> >         val = fdt_getprop(fdt, nodeoff, "active-delay-ms", &len);
> 
> In fact these are also wrong. The binding does not have a -ms suffix
> on
> the (in)active-delay property names.
> 
> Jess





More information about the opensbi mailing list