Skip to content

Commit

Permalink
Input: gpio_keys - defer probing if GPIO probing is deferred
Browse files Browse the repository at this point in the history
If of_get_gpio_flags() returns an error (as in case when GPIO probe is
deferred) the driver would attempt to claim invalid GPIO. It should
propagate the error code up the stack instead so that the probe either
fails or will be retried later (in case of -EPROBE_DEFER).

Cc: stable@vger.kernel.org
Reported-by: Gabor Juhos <juhosg@openwrt.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Dmitry Torokhov committed Dec 24, 2012
1 parent d46329a commit e324ce6
Showing 1 changed file with 12 additions and 1 deletion.
13 changes: 12 additions & 1 deletion drivers/input/keyboard/gpio_keys.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,7 @@ gpio_keys_get_devtree_pdata(struct device *dev)

i = 0;
for_each_child_of_node(node, pp) {
int gpio;
enum of_gpio_flags flags;

if (!of_find_property(pp, "gpios", NULL)) {
Expand All @@ -610,9 +611,19 @@ gpio_keys_get_devtree_pdata(struct device *dev)
continue;
}

gpio = of_get_gpio_flags(pp, 0, &flags);
if (gpio < 0) {
error = gpio;
if (error != -EPROBE_DEFER)
dev_err(dev,
"Failed to get gpio flags, error: %d\n",
error);
goto err_free_pdata;
}

button = &pdata->buttons[i++];

button->gpio = of_get_gpio_flags(pp, 0, &flags);
button->gpio = gpio;
button->active_low = flags & OF_GPIO_ACTIVE_LOW;

if (of_property_read_u32(pp, "linux,code", &button->code)) {
Expand Down

0 comments on commit e324ce6

Please sign in to comment.