gpio-button-hotplug: handle EPROBE_DEFER and other errors
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 26 Jul 2015 15:52:17 +0000 (15:52 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 26 Jul 2015 15:52:17 +0000 (15:52 +0000)
of_get_gpio_flags() could return an error like EPROBE_DEFER which was
not handled before. This patch takes the code from gpio_keys_polled.c
for error handling and also improves some other unrelated small parts.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
SVN-Revision: 46502

package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c

index c997e35803a23f9aa3cb4d56778fc6eb0866b150..029a388d0e8e5ea17697d217067f9a3ed07c95ff 100644 (file)
@@ -101,8 +101,8 @@ static struct bh_map button_map[] = {
 
 /* -------------------------------------------------------------------------*/
 
-static int bh_event_add_var(struct bh_event *event, int argv,
-               const char *format, ...)
+static __printf(3, 4)
+int bh_event_add_var(struct bh_event *event, int argv, const char *format, ...)
 {
        static char buf[128];
        char *s;
@@ -117,8 +117,7 @@ static int bh_event_add_var(struct bh_event *event, int argv,
        va_end(args);
 
        if (len >= sizeof(buf)) {
-               BH_ERR("buffer size too small\n");
-               WARN_ON(1);
+               WARN(1, "buffer size too small");
                return -ENOMEM;
        }
 
@@ -384,7 +383,18 @@ gpio_keys_get_devtree_pdata(struct device *dev)
                button = &pdata->buttons[i++];
 
                button->gpio = of_get_gpio_flags(pp, 0, &flags);
-               button->active_low = flags & OF_GPIO_ACTIVE_LOW;
+               if (button->gpio < 0) {
+                       error = button->gpio;
+                       if (error != -ENOENT) {
+                               if (error != -EPROBE_DEFER)
+                                       dev_err(dev,
+                                               "Failed to get gpio flags, error: %d\n",
+                                               error);
+                               return ERR_PTR(error);
+                       }
+               } else {
+                       button->active_low = flags & OF_GPIO_ACTIVE_LOW;
+               }
 
                if (of_property_read_u32(pp, "linux,code", &button->code)) {
                        dev_err(dev, "Button without keycode: 0x%x\n",