Input: gpio_keys - defer probing if GPIO probing is deferred

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>

Changed files
+12 -1
drivers
input
keyboard
+12 -1
drivers/input/keyboard/gpio_keys.c
··· 602 602 603 603 i = 0; 604 604 for_each_child_of_node(node, pp) { 605 + int gpio; 605 606 enum of_gpio_flags flags; 606 607 607 608 if (!of_find_property(pp, "gpios", NULL)) { ··· 611 610 continue; 612 611 } 613 612 613 + gpio = of_get_gpio_flags(pp, 0, &flags); 614 + if (gpio < 0) { 615 + error = gpio; 616 + if (error != -EPROBE_DEFER) 617 + dev_err(dev, 618 + "Failed to get gpio flags, error: %d\n", 619 + error); 620 + goto err_free_pdata; 621 + } 622 + 614 623 button = &pdata->buttons[i++]; 615 624 616 - button->gpio = of_get_gpio_flags(pp, 0, &flags); 625 + button->gpio = gpio; 617 626 button->active_low = flags & OF_GPIO_ACTIVE_LOW; 618 627 619 628 if (of_property_read_u32(pp, "linux,code", &button->code)) {