diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2015-07-26 15:52:17 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2015-07-26 15:52:17 +0000 |
commit | 886764657ad978194931e0bbc425d66f83f577da (patch) | |
tree | 48eef55838844899ffa5ec5ad74b14e7ccff9442 | |
parent | ab63719eb296569407c7f5d48207a55893261b9a (diff) | |
download | upstream-886764657ad978194931e0bbc425d66f83f577da.tar.gz upstream-886764657ad978194931e0bbc425d66f83f577da.tar.bz2 upstream-886764657ad978194931e0bbc425d66f83f577da.zip |
gpio-button-hotplug: handle EPROBE_DEFER and other errors
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
-rw-r--r-- | package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c index c997e35803..029a388d0e 100644 --- a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c +++ b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c @@ -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", |