[PATCH v2 05/11] lib: utils/gpio: Use fdt_driver for initialization

Anup Patel anup at brainfault.org
Thu Nov 28 04:34:09 PST 2024


On Tue, Nov 12, 2024 at 3:33 AM Samuel Holland
<samuel.holland at sifive.com> wrote:
>
> FDT gpio drivers have an extra .xlate operation, so they need to embed
> the `struct fdt_driver` inside the subsystem-specific type. The gpio
> subsystem always initializes the driver for a specific DT node.
>
> Signed-off-by: Samuel Holland <samuel.holland at sifive.com>

LGTM.

Reviewed-by: Anup Patel <anup at brainfault.org>

Regards,
Anup

> ---
>
> Changes in v2:
>  - New patch for v2
>
>  include/sbi_utils/gpio/fdt_gpio.h      |  5 ++---
>  include/sbi_utils/gpio/gpio.h          |  2 +-
>  lib/utils/gpio/fdt_gpio.c              | 27 ++++----------------------
>  lib/utils/gpio/fdt_gpio_designware.c   | 10 ++++++----
>  lib/utils/gpio/fdt_gpio_drivers.carray |  4 +++-
>  lib/utils/gpio/fdt_gpio_sifive.c       | 10 ++++++----
>  lib/utils/gpio/fdt_gpio_starfive.c     | 10 ++++++----
>  7 files changed, 28 insertions(+), 40 deletions(-)
>
> diff --git a/include/sbi_utils/gpio/fdt_gpio.h b/include/sbi_utils/gpio/fdt_gpio.h
> index ab9304bf..fde667e0 100644
> --- a/include/sbi_utils/gpio/fdt_gpio.h
> +++ b/include/sbi_utils/gpio/fdt_gpio.h
> @@ -10,18 +10,17 @@
>  #ifndef __FDT_GPIO_H__
>  #define __FDT_GPIO_H__
>
> +#include <sbi_utils/fdt/fdt_driver.h>
>  #include <sbi_utils/gpio/gpio.h>
>
>  struct fdt_phandle_args;
>
>  /** FDT based GPIO driver */
>  struct fdt_gpio {
> -       const struct fdt_match *match_table;
> +       struct fdt_driver driver;
>         int (*xlate)(struct gpio_chip *chip,
>                      const struct fdt_phandle_args *pargs,
>                      struct gpio_pin *out_pin);
> -       int (*init)(const void *fdt, int nodeoff,
> -                   const struct fdt_match *match);
>  };
>
>  /** Get a GPIO pin using "gpios" DT property of client DT node */
> diff --git a/include/sbi_utils/gpio/gpio.h b/include/sbi_utils/gpio/gpio.h
> index 7a3d8bbe..7027fd19 100644
> --- a/include/sbi_utils/gpio/gpio.h
> +++ b/include/sbi_utils/gpio/gpio.h
> @@ -40,7 +40,7 @@ struct gpio_pin {
>  /** Representation of a GPIO chip */
>  struct gpio_chip {
>         /** Pointer to GPIO driver owning this GPIO chip */
> -       void *driver;
> +       const void *driver;
>         /** Uniquie ID of the GPIO chip assigned by the driver */
>         unsigned int id;
>         /** Number of GPIOs supported by the GPIO chip */
> diff --git a/lib/utils/gpio/fdt_gpio.c b/lib/utils/gpio/fdt_gpio.c
> index eac2b863..88ba282d 100644
> --- a/lib/utils/gpio/fdt_gpio.c
> +++ b/lib/utils/gpio/fdt_gpio.c
> @@ -13,34 +13,15 @@
>  #include <sbi_utils/gpio/fdt_gpio.h>
>
>  /* List of FDT gpio drivers generated at compile time */
> -extern struct fdt_gpio *const fdt_gpio_drivers[];
> +extern const struct fdt_driver *const fdt_gpio_drivers[];
>
>  static int fdt_gpio_init(const void *fdt, int nodeoff)
>  {
> -       int pos, rc;
> -       struct fdt_gpio *drv;
> -       const struct fdt_match *match;
> -
>         /* Check "gpio-controller" property */
> -       if (!fdt_getprop(fdt, nodeoff, "gpio-controller", &rc))
> +       if (!fdt_getprop(fdt, nodeoff, "gpio-controller", NULL))
>                 return SBI_EINVAL;
>
> -       /* Try all GPIO drivers one-by-one */
> -       for (pos = 0; fdt_gpio_drivers[pos]; pos++) {
> -               drv = fdt_gpio_drivers[pos];
> -
> -               match = fdt_match_node(fdt, nodeoff, drv->match_table);
> -               if (match && drv->init) {
> -                       rc = drv->init(fdt, nodeoff, match);
> -                       if (rc == SBI_ENODEV)
> -                               continue;
> -                       if (rc)
> -                               return rc;
> -                       return 0;
> -               }
> -       }
> -
> -       return SBI_ENOSYS;
> +       return fdt_driver_init_by_offset(fdt, nodeoff, fdt_gpio_drivers);
>  }
>
>  static int fdt_gpio_chip_find(const void *fdt, int nodeoff,
> @@ -71,7 +52,7 @@ int fdt_gpio_pin_get(const void *fdt, int nodeoff, int index,
>                      struct gpio_pin *out_pin)
>  {
>         int rc;
> -       struct fdt_gpio *drv;
> +       const struct fdt_gpio *drv;
>         struct gpio_chip *chip = NULL;
>         struct fdt_phandle_args pargs;
>
> diff --git a/lib/utils/gpio/fdt_gpio_designware.c b/lib/utils/gpio/fdt_gpio_designware.c
> index 26e0a7ce..8c19b4f1 100644
> --- a/lib/utils/gpio/fdt_gpio_designware.c
> +++ b/lib/utils/gpio/fdt_gpio_designware.c
> @@ -30,7 +30,7 @@ struct dw_gpio_chip {
>         struct gpio_chip chip;
>  };
>
> -extern struct fdt_gpio fdt_gpio_designware;
> +const struct fdt_gpio fdt_gpio_designware;
>
>  #define pin_to_chip(__p) container_of((__p)->chip, struct dw_gpio_chip, chip);
>
> @@ -132,8 +132,10 @@ static const struct fdt_match dw_gpio_match[] = {
>         { },
>  };
>
> -struct fdt_gpio fdt_gpio_designware = {
> -       .match_table = dw_gpio_match,
> +const struct fdt_gpio fdt_gpio_designware = {
> +       .driver = {
> +               .match_table = dw_gpio_match,
> +               .init = dw_gpio_init_bank,
> +       },
>         .xlate = fdt_gpio_simple_xlate,
> -       .init = dw_gpio_init_bank,
>  };
> diff --git a/lib/utils/gpio/fdt_gpio_drivers.carray b/lib/utils/gpio/fdt_gpio_drivers.carray
> index e863f1c5..7807777e 100644
> --- a/lib/utils/gpio/fdt_gpio_drivers.carray
> +++ b/lib/utils/gpio/fdt_gpio_drivers.carray
> @@ -1,3 +1,5 @@
>  HEADER: sbi_utils/gpio/fdt_gpio.h
> -TYPE: struct fdt_gpio
> +TYPE: const struct fdt_gpio
>  NAME: fdt_gpio_drivers
> +MEMBER-NAME: driver
> +MEMBER-TYPE: const struct fdt_driver
> diff --git a/lib/utils/gpio/fdt_gpio_sifive.c b/lib/utils/gpio/fdt_gpio_sifive.c
> index d96bf775..0ebc2a4f 100644
> --- a/lib/utils/gpio/fdt_gpio_sifive.c
> +++ b/lib/utils/gpio/fdt_gpio_sifive.c
> @@ -60,7 +60,7 @@ static void sifive_gpio_set(struct gpio_pin *gp, int value)
>         writel(v, (volatile void *)(chip->addr + SIFIVE_GPIO_OUTVAL));
>  }
>
> -extern struct fdt_gpio fdt_gpio_sifive;
> +const struct fdt_gpio fdt_gpio_sifive;
>
>  static int sifive_gpio_init(const void *fdt, int nodeoff,
>                             const struct fdt_match *match)
> @@ -99,8 +99,10 @@ static const struct fdt_match sifive_gpio_match[] = {
>         { },
>  };
>
> -struct fdt_gpio fdt_gpio_sifive = {
> -       .match_table = sifive_gpio_match,
> +const struct fdt_gpio fdt_gpio_sifive = {
> +       .driver = {
> +               .match_table = sifive_gpio_match,
> +               .init = sifive_gpio_init,
> +       },
>         .xlate = fdt_gpio_simple_xlate,
> -       .init = sifive_gpio_init,
>  };
> diff --git a/lib/utils/gpio/fdt_gpio_starfive.c b/lib/utils/gpio/fdt_gpio_starfive.c
> index 55752425..4d09b65c 100644
> --- a/lib/utils/gpio/fdt_gpio_starfive.c
> +++ b/lib/utils/gpio/fdt_gpio_starfive.c
> @@ -69,7 +69,7 @@ static void starfive_gpio_set(struct gpio_pin *gp, int value)
>         writel(val, (void *)(reg_addr + STARFIVE_GPIO_OUTVAL));
>  }
>
> -extern struct fdt_gpio fdt_gpio_starfive;
> +const struct fdt_gpio fdt_gpio_starfive;
>
>  static int starfive_gpio_init(const void *fdt, int nodeoff,
>                               const struct fdt_match *match)
> @@ -109,8 +109,10 @@ static const struct fdt_match starfive_gpio_match[] = {
>         { },
>  };
>
> -struct fdt_gpio fdt_gpio_starfive = {
> -       .match_table = starfive_gpio_match,
> +const struct fdt_gpio fdt_gpio_starfive = {
> +       .driver = {
> +               .match_table = starfive_gpio_match,
> +               .init = starfive_gpio_init,
> +       },
>         .xlate = fdt_gpio_simple_xlate,
> -       .init = starfive_gpio_init,
>  };
> --
> 2.45.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi



More information about the opensbi mailing list