| From e324ce61ef483dd26d03502d35666ad48a2e1b33 Mon Sep 17 00:00:00 2001 |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Date: Mon, 24 Dec 2012 09:32:46 -0800 |
| Subject: Input: gpio_keys - defer probing if GPIO probing is deferred |
| |
| From: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| |
| commit e324ce61ef483dd26d03502d35666ad48a2e1b33 upstream. |
| |
| 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). |
| |
| Reported-by: Gabor Juhos <juhosg@openwrt.org> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/input/keyboard/gpio_keys.c | 13 ++++++++++++- |
| 1 file changed, 12 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/input/keyboard/gpio_keys.c |
| +++ b/drivers/input/keyboard/gpio_keys.c |
| @@ -587,6 +587,7 @@ gpio_keys_get_devtree_pdata(struct devic |
| |
| i = 0; |
| for_each_child_of_node(node, pp) { |
| + int gpio; |
| enum of_gpio_flags flags; |
| |
| if (!of_find_property(pp, "gpios", NULL)) { |
| @@ -595,9 +596,19 @@ gpio_keys_get_devtree_pdata(struct devic |
| 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)) { |