[PATCH 1/1] lib: utils: identify supported GPIO reset methods

Anup Patel anup at brainfault.org
Thu Sep 30 21:58:32 PDT 2021


On Wed, Sep 29, 2021 at 9:46 AM Anup Patel <anup at brainfault.org> wrote:
>
> +Nikita
>
> On Tue, Sep 28, 2021 at 5:13 PM Heinrich Schuchardt
> <heinrich.schuchardt at canonical.com> wrote:
> >
> > The GPIO reset driver supports reset and poweroff. But not all boards
> > support both. gpio_system_reset_check() must detect this situation.
> >
> > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
>
> Looks good to me.
>
> Reviewed-by: Anup Patel <anup.patel at wdc.com>

Applied this patch to the riscv/opensbi repo.

Thanks,
Anup

>
> I had mentioned on the PMIC reset series that we need to improve
> the sbi_system.h device registration such that reset drivers can
> register a reset device for a range of reset types. This will allow
> separate reset drivers (e.g. PMIC+GPIO) for SiFive Unmatched.
> Also, reset_check() callback will not be required anymore.
>
> Regards,
> Anup
>
> > ---
> >  lib/utils/reset/fdt_reset_gpio.c | 44 +++++++++++++++-----------------
> >  1 file changed, 21 insertions(+), 23 deletions(-)
> >
> > diff --git a/lib/utils/reset/fdt_reset_gpio.c b/lib/utils/reset/fdt_reset_gpio.c
> > index 30127f5..77e4d0e 100644
> > --- a/lib/utils/reset/fdt_reset_gpio.c
> > +++ b/lib/utils/reset/fdt_reset_gpio.c
> > @@ -35,21 +35,9 @@ static struct gpio_reset restart = {
> >         .inactive_delay = 100
> >  };
> >
> > -static int gpio_system_reset_check(u32 type, u32 reason)
> > -{
> > -       switch (type) {
> > -       case SBI_SRST_RESET_TYPE_SHUTDOWN:
> > -       case SBI_SRST_RESET_TYPE_COLD_REBOOT:
> > -       case SBI_SRST_RESET_TYPE_WARM_REBOOT:
> > -               return 1;
> > -       }
> > -
> > -       return 0;
> > -}
> > -
> > -static void gpio_system_reset(u32 type, u32 reason)
> > +static struct gpio_reset *gpio_get_reset_settings(u32 type)
> >  {
> > -       struct gpio_reset *reset = NULL;
> > +       struct gpio_reset *reset;
> >
> >         switch (type) {
> >         case SBI_SRST_RESET_TYPE_SHUTDOWN:
> > @@ -59,14 +47,26 @@ static void gpio_system_reset(u32 type, u32 reason)
> >         case SBI_SRST_RESET_TYPE_WARM_REBOOT:
> >                 reset = &restart;
> >                 break;
> > +       default:
> > +               reset = NULL;
> >         }
> >
> > -       if (reset) {
> > -               if (!reset->pin.chip) {
> > -                       sbi_printf("%s: gpio pin not available\n", __func__);
> > -                       goto skip_reset;
> > -               }
> > +       if (reset && !reset->pin.chip)
> > +               reset = NULL;
> > +
> > +       return reset;
> > +}
> > +
> > +static int gpio_system_reset_check(u32 type, u32 reason)
> > +{
> > +       return !!gpio_get_reset_settings(type);
> > +}
> > +
> > +static void gpio_system_reset(u32 type, u32 reason)
> > +{
> > +       struct gpio_reset *reset = gpio_get_reset_settings(type);
> >
> > +       if (reset) {
> >                 /* drive it active, also inactive->active edge */
> >                 gpio_direction_output(&reset->pin, 1);
> >                 sbi_timer_mdelay(reset->active_delay);
> > @@ -77,11 +77,9 @@ static void gpio_system_reset(u32 type, u32 reason)
> >
> >                 /* drive it active, also inactive->active edge */
> >                 gpio_set(&reset->pin, 1);
> > -
> > -skip_reset:
> > -               /* hang !!! */
> > -               sbi_hart_hang();
> >         }
> > +       /* hang !!! */
> > +       sbi_hart_hang();
> >  }
> >
> >  static struct sbi_system_reset_device gpio_reset = {
> > --
> > 2.32.0
> >
> >
> > --
> > opensbi mailing list
> > opensbi at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list