aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnti Sullin <anti.sullin@artecdesign.ee>2007-09-26 00:01:03 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2007-09-26 00:01:03 -0400
commit006df3024431a50262d4a2898d25924f84fb697a (patch)
tree556a42e2e3bc47e947e509fff0ae6613db531628
parentInput: usbtouchscreen - support DMC devices with empty EEPROM (diff)
downloadlinux-dev-006df3024431a50262d4a2898d25924f84fb697a.tar.xz
linux-dev-006df3024431a50262d4a2898d25924f84fb697a.zip
Input: gpio_keys - verify that supplied GPIO numbers are valid
As David Brownell pointed out, gpio_keys driver does not check return code of gpio_to_irq(). This patch adds the gpio_to_irq return code check to gpio_keys and moves the IRQ edge type setting to request_irq flags to avoid changing the irq type before we have confirmed we can use it. Signed-off-by: Anti Sullin <anti.sullin@artecdesign.ee> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r--drivers/input/keyboard/gpio_keys.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 739212252b09..b3069bc00f03 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -78,12 +78,24 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
int irq = gpio_to_irq(button->gpio);
unsigned int type = button->type ?: EV_KEY;
- set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
- error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM,
- button->desc ? button->desc : "gpio_keys",
- pdev);
+ if (irq < 0) {
+ error = irq;
+ printk(KERN_ERR
+ "gpio-keys: "
+ "Unable to get irq number for GPIO %d,"
+ "error %d\n",
+ button->gpio, error);
+ goto fail;
+ }
+
+ error = request_irq(irq, gpio_keys_isr,
+ IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
+ IRQF_TRIGGER_FALLING,
+ button->desc ? button->desc : "gpio_keys",
+ pdev);
if (error) {
- printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n",
+ printk(KERN_ERR
+ "gpio-keys: Unable to claim irq %d; error %d\n",
irq, error);
goto fail;
}
@@ -93,16 +105,19 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
error = input_register_device(input);
if (error) {
- printk(KERN_ERR "Unable to register gpio-keys input device\n");
+ printk(KERN_ERR
+ "gpio-keys: Unable to register input device, "
+ "error: %d\n", error);
goto fail;
}
return 0;
fail:
- for (i = i - 1; i >= 0; i--)
+ while (--i >= 0)
free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
+ platform_set_drvdata(pdev, NULL);
input_free_device(input);
return error;