Merge branch 'next' into for-linus
[pandora-kernel.git] / drivers / input / keyboard / gpio_keys.c
index ec96b36..05f3f43 100644 (file)
@@ -36,9 +36,10 @@ struct gpio_keys_drvdata {
        struct gpio_button_data data[0];
 };
 
-static void gpio_keys_report_event(struct gpio_keys_button *button,
-                                  struct input_dev *input)
+static void gpio_keys_report_event(struct gpio_button_data *bdata)
 {
+       struct gpio_keys_button *button = bdata->button;
+       struct input_dev *input = bdata->input;
        unsigned int type = button->type ?: EV_KEY;
        int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low;
 
@@ -50,34 +51,23 @@ static void gpio_check_button(unsigned long _data)
 {
        struct gpio_button_data *data = (struct gpio_button_data *)_data;
 
-       gpio_keys_report_event(data->button, data->input);
+       gpio_keys_report_event(data);
 }
 
 static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
 {
-       struct platform_device *pdev = dev_id;
-       struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
-       struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
-       int i;
+       struct gpio_button_data *bdata = dev_id;
+       struct gpio_keys_button *button = bdata->button;
 
-       for (i = 0; i < pdata->nbuttons; i++) {
-               struct gpio_keys_button *button = &pdata->buttons[i];
+       BUG_ON(irq != gpio_to_irq(button->gpio));
 
-               if (irq == gpio_to_irq(button->gpio)) {
-                       struct gpio_button_data *bdata = &ddata->data[i];
-
-                       if (button->debounce_interval)
-                               mod_timer(&bdata->timer,
-                                         jiffies +
-                                         msecs_to_jiffies(button->debounce_interval));
-                       else
-                               gpio_keys_report_event(button, bdata->input);
-
-                       return IRQ_HANDLED;
-               }
-       }
+       if (button->debounce_interval)
+               mod_timer(&bdata->timer,
+                       jiffies + msecs_to_jiffies(button->debounce_interval));
+       else
+               gpio_keys_report_event(bdata);
 
-       return IRQ_NONE;
+       return IRQ_HANDLED;
 }
 
 static int __devinit gpio_keys_probe(struct platform_device *pdev)
@@ -151,7 +141,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
                                    IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
                                        IRQF_TRIGGER_FALLING,
                                    button->desc ? button->desc : "gpio_keys",
-                                   pdev);
+                                   bdata);
                if (error) {
                        pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
                                irq, error);
@@ -178,7 +168,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
 
  fail2:
        while (--i >= 0) {
-               free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
+               free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]);
                if (pdata->buttons[i].debounce_interval)
                        del_timer_sync(&ddata->data[i].timer);
                gpio_free(pdata->buttons[i].gpio);
@@ -203,7 +193,7 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
 
        for (i = 0; i < pdata->nbuttons; i++) {
                int irq = gpio_to_irq(pdata->buttons[i].gpio);
-               free_irq(irq, pdev);
+               free_irq(irq, &ddata->data[i]);
                if (pdata->buttons[i].debounce_interval)
                        del_timer_sync(&ddata->data[i].timer);
                gpio_free(pdata->buttons[i].gpio);