Input: gpio_keys - verify that supplied GPIO numbers are valid
authorAnti Sullin <anti.sullin@artecdesign.ee>
Wed, 26 Sep 2007 04:01:03 +0000 (00:01 -0400)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 26 Sep 2007 04:01:03 +0000 (00:01 -0400)
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>
drivers/input/keyboard/gpio_keys.c

index 7392122..b3069bc 100644 (file)
@@ -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;