Commit e324ce61 authored by Dmitry Torokhov's avatar Dmitry Torokhov

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: default avatarGabor Juhos <juhosg@openwrt.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent d46329a7
...@@ -602,6 +602,7 @@ gpio_keys_get_devtree_pdata(struct device *dev) ...@@ -602,6 +602,7 @@ gpio_keys_get_devtree_pdata(struct device *dev)
i = 0; i = 0;
for_each_child_of_node(node, pp) { for_each_child_of_node(node, pp) {
int gpio;
enum of_gpio_flags flags; enum of_gpio_flags flags;
if (!of_find_property(pp, "gpios", NULL)) { if (!of_find_property(pp, "gpios", NULL)) {
...@@ -610,9 +611,19 @@ gpio_keys_get_devtree_pdata(struct device *dev) ...@@ -610,9 +611,19 @@ gpio_keys_get_devtree_pdata(struct device *dev)
continue; 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 = &pdata->buttons[i++];
button->gpio = of_get_gpio_flags(pp, 0, &flags); button->gpio = gpio;
button->active_low = flags & OF_GPIO_ACTIVE_LOW; button->active_low = flags & OF_GPIO_ACTIVE_LOW;
if (of_property_read_u32(pp, "linux,code", &button->code)) { if (of_property_read_u32(pp, "linux,code", &button->code)) {
......
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