diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2014-04-16 11:47:52 +0530 |
---|---|---|
committer | Seema Khowala <seemaj@nvidia.com> | 2014-04-23 14:05:10 -0700 |
commit | c24a1ec7773dc55c309b846589cbaff955780005 (patch) | |
tree | cf4e7df20faf74e86b3e3d038bb67492e6209944 /drivers/input | |
parent | 98b3df4596794c109ae6534b7f1933a6127be178 (diff) |
input: gpio-keys: add support for reading irq from DT node for interrupt key
GPIO keys driver support the interrupt only keys. Add support for
reading irq number for interrupt keys from DT node.
Change-Id: I9d355923b8f9b388ecd2f71275c213aa0d7c88b9
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/396849
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/keyboard/gpio_keys.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index 282880dc8fb3..edac00b51372 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -28,6 +28,7 @@ #include <linux/gpio_keys.h> #include <linux/workqueue.h> #include <linux/gpio.h> +#include <linux/of_irq.h> #include <linux/of_platform.h> #include <linux/of_gpio.h> #include <linux/spinlock.h> @@ -619,15 +620,28 @@ gpio_keys_get_devtree_pdata(struct device *dev) i = 0; for_each_child_of_node(node, pp) { - int gpio; + int gpio = -1; + unsigned int irq = 0; enum of_gpio_flags flags; + bool gpio_props = false; + bool irq_prop = false; - if (!of_find_property(pp, "gpios", NULL)) { + if (of_find_property(pp, "gpios", NULL)) + gpio_props = true; + + irq = irq_of_parse_and_map(pp, 0); + if (irq > 0) + irq_prop = true; + + if (!gpio_props && !irq_prop) { + dev_warn(dev, "Found button without gpios/irq\n"); pdata->nbuttons--; - dev_warn(dev, "Found button without gpios\n"); continue; } + if (!gpio_props) + goto gpio_get; + gpio = of_get_gpio_flags(pp, 0, &flags); if (gpio < 0) { error = gpio; @@ -638,9 +652,11 @@ gpio_keys_get_devtree_pdata(struct device *dev) goto err_free_pdata; } +gpio_get: button = &pdata->buttons[i++]; button->gpio = gpio; + button->irq = irq; button->active_low = flags & OF_GPIO_ACTIVE_LOW; if (of_property_read_u32(pp, "linux,code", &button->code)) { |