Commit 49281a22 authored by Stephen Boyd's avatar Stephen Boyd Committed by Linus Walleij

gpio: of: Fix hard-assigned valid_mask for OF case

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: f626d6df ("gpio: of: Break out OF-only code")
Reported-by: default avatarMark Brown <broonie@kernel.org>
Suggested-by: default avatarStephen Boyd <swboyd@chromium.org>
Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 2838bf94
...@@ -87,7 +87,7 @@ static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip, ...@@ -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 * @dev: the device for the GPIO provider
* @return: true if the valid mask needs to be set * @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; int size;
struct device_node *np = gc->of_node; struct device_node *np = gc->of_node;
......
...@@ -16,7 +16,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, ...@@ -16,7 +16,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
int of_gpiochip_add(struct gpio_chip *gc); int of_gpiochip_add(struct gpio_chip *gc);
void of_gpiochip_remove(struct gpio_chip *gc); void of_gpiochip_remove(struct gpio_chip *gc);
int of_gpio_get_count(struct device *dev, const char *con_id); 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 #else
static inline struct gpio_desc *of_find_gpio(struct device *dev, static inline struct gpio_desc *of_find_gpio(struct device *dev,
const char *con_id, const char *con_id,
...@@ -36,7 +36,7 @@ static inline int of_gpio_get_count(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; 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; return false;
} }
......
...@@ -363,8 +363,8 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *chip) ...@@ -363,8 +363,8 @@ static unsigned long *gpiochip_allocate_mask(struct gpio_chip *chip)
static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) static int gpiochip_alloc_valid_mask(struct gpio_chip *gc)
{ {
if (IS_ENABLED(CONFIG_OF_GPIO)) if (of_gpio_need_valid_mask(gc))
gc->need_valid_mask = of_gpio_need_valid_mask(gc); gc->need_valid_mask = true;
if (!gc->need_valid_mask) if (!gc->need_valid_mask)
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment