]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpio: regmap: Allow ngpio to be read from the property
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 13 Feb 2025 19:48:50 +0000 (21:48 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 21 Feb 2025 08:42:45 +0000 (09:42 +0100)
GPIOLIB supports the case when number of supported GPIOs can be read
from the device property. Enable this for drivers that are using
GPIO regmap layer.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Michael Walle <mwalle@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Reviewed-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Link: https://lore.kernel.org/r/20250213195621.3133406-6-andriy.shevchenko@linux.intel.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-regmap.c
include/linux/gpio/regmap.h

index 41ee576e7cd09dc502be2250227f48f8165c1c41..856f8569566e0daa52dadc087ab68bf3beff6034 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/gpio/driver.h>
 #include <linux/gpio/regmap.h>
 
+#include "gpiolib.h"
+
 struct gpio_regmap {
        struct device *parent;
        struct regmap *regmap;
@@ -210,9 +212,6 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
        if (!config->parent)
                return ERR_PTR(-EINVAL);
 
-       if (!config->ngpio)
-               return ERR_PTR(-EINVAL);
-
        /* we need at least one */
        if (!config->reg_dat_base && !config->reg_set_base)
                return ERR_PTR(-EINVAL);
@@ -243,7 +242,6 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
        chip->parent = config->parent;
        chip->fwnode = config->fwnode;
        chip->base = -1;
-       chip->ngpio = config->ngpio;
        chip->names = config->names;
        chip->label = config->label ?: dev_name(config->parent);
        chip->can_sleep = regmap_might_sleep(config->regmap);
@@ -262,6 +260,13 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
                chip->direction_output = gpio_regmap_direction_output;
        }
 
+       chip->ngpio = config->ngpio;
+       if (!chip->ngpio) {
+               ret = gpiochip_get_ngpios(chip, chip->parent);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
        /* if not set, assume there is only one register */
        gpio->ngpio_per_reg = config->ngpio_per_reg;
        if (!gpio->ngpio_per_reg)
index b9240e4156cc82190c3093b6ad3207fa8f6be219..c722c67668c6e557114bc8df9d7cfae0ca8e64bb 100644 (file)
@@ -21,7 +21,7 @@ struct regmap;
  *                     If not given, the fwnode of the parent is used.
  * @label:             (Optional) Descriptive name for GPIO controller.
  *                     If not given, the name of the device is used.
- * @ngpio:             Number of GPIOs
+ * @ngpio:             (Optional) Number of GPIOs
  * @names:             (Optional) Array of names for gpios
  * @reg_dat_base:      (Optional) (in) register base address
  * @reg_set_base:      (Optional) set register base address