Input: gpio_keys - consolidate key destructor code
Dmitry Torokhov [Mon, 19 Mar 2012 06:36:30 +0000 (23:36 -0700)]
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
(cherry picked from commit a16ca23935afc0d72215b139720bd07df3162a9f)

Change-Id: I90ae154a3b124fad0e9320ac5d9d8083175461b5
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/92320
Reviewed-by: Automatic_Commit_Validation_User

drivers/input/keyboard/gpio_keys.c

index 1c387b8..432a1c9 100644 (file)
@@ -197,7 +197,7 @@ static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata,
  * @type: button type (%EV_KEY, %EV_SW)
  *
  * This function parses stringified bitmap from @buf and disables/enables
- * GPIO buttons accordinly. Returns 0 on success and negative error
+ * GPIO buttons accordingly. Returns 0 on success and negative error
  * on failure.
  */
 static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata,
@@ -553,6 +553,15 @@ static int gpio_keys_get_devtree_pdata(struct device *dev,
 
 #endif
 
+static void gpio_remove_key(struct gpio_button_data *bdata)
+{
+       free_irq(gpio_to_irq(bdata->button->gpio), bdata);
+       if (bdata->timer_debounce)
+               del_timer_sync(&bdata->timer);
+       cancel_work_sync(&bdata->work);
+       gpio_free(bdata->button->gpio);
+}
+
 static int __devinit gpio_keys_probe(struct platform_device *pdev)
 {
        const struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
@@ -642,13 +651,8 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
  fail3:
        sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group);
  fail2:
-       while (--i >= 0) {
-               free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->data[i]);
-               if (ddata->data[i].timer_debounce)
-                       del_timer_sync(&ddata->data[i].timer);
-               cancel_work_sync(&ddata->data[i].work);
-               gpio_free(pdata->buttons[i].gpio);
-       }
+       while (--i >= 0)
+               gpio_remove_key(&ddata->data[i]);
 
        platform_set_drvdata(pdev, NULL);
  fail1:
@@ -671,14 +675,8 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
 
        device_init_wakeup(&pdev->dev, 0);
 
-       for (i = 0; i < ddata->n_buttons; i++) {
-               int irq = gpio_to_irq(ddata->data[i].button->gpio);
-               free_irq(irq, &ddata->data[i]);
-               if (ddata->data[i].timer_debounce)
-                       del_timer_sync(&ddata->data[i].timer);
-               cancel_work_sync(&ddata->data[i].work);
-               gpio_free(ddata->data[i].button->gpio);
-       }
+       for (i = 0; i < ddata->n_buttons; i++)
+               gpio_remove_key(&ddata->data[i]);
 
        input_unregister_device(input);