Staging: android: timed_gpio: Request gpios.
authorArve Hjønnevåg <arve@android.com>
Thu, 7 Jan 2010 01:17:33 +0000 (17:17 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 30 Nov 2011 11:40:05 +0000 (20:40 +0900)
Signed-off-by: Arve Hjønnevåg <arve@android.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/android/timed_gpio.c

index 3bfe6e0e5a75aff6ec391bca64b34cabc3d81085..a64481c3e86d02ed02d094235f7e510b3e0df058 100644 (file)
@@ -107,10 +107,17 @@ static int timed_gpio_probe(struct platform_device *pdev)
                gpio_dat->dev.name = cur_gpio->name;
                gpio_dat->dev.get_time = gpio_get_time;
                gpio_dat->dev.enable = gpio_enable;
-               ret = timed_output_dev_register(&gpio_dat->dev);
+               ret = gpio_request(cur_gpio->gpio, cur_gpio->name);
+               if (ret >= 0) {
+                       ret = timed_output_dev_register(&gpio_dat->dev);
+                       if (ret < 0)
+                               gpio_free(cur_gpio->gpio);
+               }
                if (ret < 0) {
-                       for (j = 0; j < i; j++)
+                       for (j = 0; j < i; j++) {
                                timed_output_dev_unregister(&gpio_data[i].dev);
+                               gpio_free(gpio_data[i].gpio);
+                       }
                        kfree(gpio_data);
                        return ret;
                }
@@ -132,8 +139,10 @@ static int timed_gpio_remove(struct platform_device *pdev)
        struct timed_gpio_data *gpio_data = platform_get_drvdata(pdev);
        int i;
 
-       for (i = 0; i < pdata->num_gpios; i++)
+       for (i = 0; i < pdata->num_gpios; i++) {
                timed_output_dev_unregister(&gpio_data[i].dev);
+               gpio_free(gpio_data[i].gpio);
+       }
 
        kfree(gpio_data);