]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
gpio: of: Fix hard-assigned valid_mask for OF case
authorStephen Boyd <swboyd@chromium.org>
Wed, 31 Jul 2019 22:28:26 +0000 (00:28 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 1 Aug 2019 08:04:16 +0000 (10:04 +0200)
The recent refactoring to break out OF code to its own file
contained a bug letting the need_valid_mask
be overridden by the need of the device tree range check,
and if there were no ranges, but device tree was active
and the reserved GPIO used in another way, things likely
crash.

Cc: Mark Brown <broonie@kernel.org>
Cc: Bjorn Andersson <bjorn.andersson@linaro.org>
Cc: Stephen Boyd <swboyd@chromium.org>
Fixes: f626d6dfb709 ("gpio: of: Break out OF-only code")
Reported-by: Mark Brown <broonie@kernel.org>
Suggested-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib-of.h
drivers/gpio/gpiolib.c

index b10d04dd9296f09cefe1e898398f399014d580b0..e39b4290b80cd1f56e3d6e83e8dfb567d1ca2fe1 100644 (file)
@@ -87,7 +87,7 @@ static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
  * @dev: the device for the GPIO provider
  * @return: true if the valid mask needs to be set
  */
-bool of_gpio_need_valid_mask(struct gpio_chip *gc)
+bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
 {
        int size;
        struct device_node *np = gc->of_node;
index 34954921d96e4ecb491151983150a603b861554b..454d1658ee2d45fb4b8125131b2859e37b4344f3 100644 (file)
@@ -16,7 +16,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
 int of_gpiochip_add(struct gpio_chip *gc);
 void of_gpiochip_remove(struct gpio_chip *gc);
 int of_gpio_get_count(struct device *dev, const char *con_id);
-bool of_gpio_need_valid_mask(struct gpio_chip *gc);
+bool of_gpio_need_valid_mask(const struct gpio_chip *gc);
 #else
 static inline struct gpio_desc *of_find_gpio(struct device *dev,
                                             const char *con_id,
@@ -36,7 +36,7 @@ static inline int of_gpio_get_count(struct device *dev, const char *con_id)
 {
        return 0;
 }
-static inline bool of_gpio_need_valid_mask(struct gpio_chip *gc)
+static inline bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
 {
        return false;
 }
index f83870a18ae78640146d18d376e47d98d840f843..20f13129cdaa72c586b086a9beae65224daafdf4 100644 (file)
@@ -363,8 +363,8 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *chip)
 
 static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
 {
-       if (IS_ENABLED(CONFIG_OF_GPIO))
-               gc->need_valid_mask = of_gpio_need_valid_mask(gc);
+       if (of_gpio_need_valid_mask(gc))
+               gc->need_valid_mask = true;
        if (!gc->need_valid_mask)
                return 0;