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

Anup Patel anup at brainfault.org
Tue Sep 28 21:16:55 PDT 2021


+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>

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