Patchwork [3.5.y.z,extended,stable] Patch "Input: gpio_keys - defer probing if GPIO probing is deferred" has been added to staging queue

login
register
mail settings
Submitter Herton Ronaldo Krzesinski
Date Jan. 15, 2013, 10:20 p.m.
Message ID <1358288421-30150-1-git-send-email-herton.krzesinski@canonical.com>
Download mbox | patch
Permalink /patch/212317/
State New
Headers show

Comments

Herton Ronaldo Krzesinski - Jan. 15, 2013, 10:20 p.m.
This is a note to let you know that I have just added a patch titled

    Input: gpio_keys - defer probing if GPIO probing is deferred

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Herton

------

From 2a56e89bf9c309f46acc482d30e9b655101a7bfa Mon Sep 17 00:00:00 2001
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: Mon, 24 Dec 2012 09:32:46 -0800
Subject: [PATCH] Input: gpio_keys - defer probing if GPIO probing is deferred

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>
[ herton: backport for 3.5:
  * adjust context, different error handling and return type in
    gpio_keys_get_devtree_pdata function
  * drop check for EPROBE_DEFER, of_get_gpio_flags doesn't return it on
    3.5. The patch just will return an error, no deferring is done. ]
Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
---
 drivers/input/keyboard/gpio_keys.c |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

--
1.7.9.5

Patch

diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 62bfce4..4f5cce8 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -548,6 +548,7 @@  static int gpio_keys_get_devtree_pdata(struct device *dev,
 	struct device_node *node, *pp;
 	int i;
 	struct gpio_keys_button *buttons;
+	int error = -ENODEV;
 	u32 reg;

 	node = dev->of_node;
@@ -574,6 +575,7 @@  static int gpio_keys_get_devtree_pdata(struct device *dev,
 	pp = NULL;
 	i = 0;
 	while ((pp = of_get_next_child(node, pp))) {
+		int gpio;
 		enum of_gpio_flags flags;

 		if (!of_find_property(pp, "gpios", NULL)) {
@@ -581,7 +583,17 @@  static int gpio_keys_get_devtree_pdata(struct device *dev,
 			dev_warn(dev, "Found button without gpios\n");
 			continue;
 		}
-		buttons[i].gpio = of_get_gpio_flags(pp, 0, &flags);
+
+		gpio = of_get_gpio_flags(pp, 0, &flags);
+		if (gpio < 0) {
+			error = gpio;
+			dev_err(dev,
+				"Failed to get gpio flags, error: %d\n",
+				error);
+			goto out_fail;
+		}
+
+		buttons[i].gpio = gpio;
 		buttons[i].active_low = flags & OF_GPIO_ACTIVE_LOW;

 		if (of_property_read_u32(pp, "linux,code", &reg)) {
@@ -613,7 +625,7 @@  static int gpio_keys_get_devtree_pdata(struct device *dev,

 out_fail:
 	kfree(buttons);
-	return -ENODEV;
+	return error;
 }

 static struct of_device_id gpio_keys_of_match[] = {