Skip to content

Commit

Permalink
gpio: fix deferred probe detection for legacy API
Browse files Browse the repository at this point in the history
Commit 14e85c0 ("gpio: remove gpio_descs global array") changed
gpio_to_desc()'s behavior to return NULL not only for GPIOs numbers
not in the valid range, but also for all GPIOs whose controller has not
been probed yet. Although this behavior is more correct (nothing hints
that these GPIO numbers will be populated later), this affects
gpio_request() and gpio_request_one() which call gpiod_request() with a
NULL descriptor, causing it to return -EINVAL instead of the expected
-EPROBE_DEFER for a non-probed GPIO.

gpiod_request() is only called with a descriptor obtained from
gpio_to_desc() from these two functions, so address the issue there.

Other ways to obtain GPIOs rely on well-defined mappings and can thus
return -EPROBE_DEFER only for relevant GPIOs, and are thus not affected
by this issue.

Reported-by: Geert Uytterhoeven <[email protected]>
Signed-off-by: Alexandre Courbot <[email protected]>
Tested-by: Geert Uytterhoeven <[email protected]>
Signed-off-by: Linus Walleij <[email protected]>
  • Loading branch information
Gnurou authored and linusw committed Dec 2, 2014
1 parent 834296a commit 0e9a5ed
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
12 changes: 11 additions & 1 deletion drivers/gpio/gpiolib-legacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)

desc = gpio_to_desc(gpio);

/* Compatibility: assume unavailable "valid" GPIOs will appear later */
if (!desc && gpio_is_valid(gpio))
return -EPROBE_DEFER;

err = gpiod_request(desc, label);
if (err)
return err;
Expand Down Expand Up @@ -62,7 +66,13 @@ EXPORT_SYMBOL_GPL(gpio_request_one);

int gpio_request(unsigned gpio, const char *label)
{
return gpiod_request(gpio_to_desc(gpio), label);
struct gpio_desc *desc = gpio_to_desc(gpio);

/* Compatibility: assume unavailable "valid" GPIOs will appear later */
if (!desc && gpio_is_valid(gpio))
return -EPROBE_DEFER;

return gpiod_request(desc, label);
}
EXPORT_SYMBOL_GPL(gpio_request);

Expand Down
4 changes: 3 additions & 1 deletion drivers/gpio/gpiolib.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ struct gpio_desc *gpio_to_desc(unsigned gpio)

spin_unlock_irqrestore(&gpio_lock, flags);

WARN(1, "invalid GPIO %d\n", gpio);
if (!gpio_is_valid(gpio))
WARN(1, "invalid GPIO %d\n", gpio);

return NULL;
}
EXPORT_SYMBOL_GPL(gpio_to_desc);
Expand Down

0 comments on commit 0e9a5ed

Please sign in to comment.