gpio: reference count the gpio device for each desc
authorLinus Walleij <linus.walleij@linaro.org>
Thu, 11 Feb 2016 09:28:44 +0000 (10:28 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 11 Feb 2016 19:29:46 +0000 (20:29 +0100)
Every time a descriptor is retrieved from the gpiolib, we issue
module_get() to reference count the module supplying the GPIOs.
We also need to call device_get() and device_put() as we also
reference the backing gpio_device when doing this.

Since the sysfs GPIO interface is using gpiod_get() this will
also reference count the sysfs requests until all GPIOs are
unexported.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpiolib.c

index 0738f9a5163326053f22e00ac5ffb4c53c76f301..646dea4f96ffbd374638da3d6e28fdd37f317f7f 100644 (file)
@@ -1205,6 +1205,8 @@ int gpiod_request(struct gpio_desc *desc, const char *label)
                status = __gpiod_request(desc, label);
                if (status < 0)
                        module_put(gdev->owner);
+               else
+                       get_device(&gdev->dev);
        }
 
        if (status)
@@ -1248,10 +1250,12 @@ static bool __gpiod_free(struct gpio_desc *desc)
 
 void gpiod_free(struct gpio_desc *desc)
 {
-       if (desc && __gpiod_free(desc))
+       if (desc && desc->gdev && __gpiod_free(desc)) {
                module_put(desc->gdev->owner);
-       else
+               put_device(&desc->gdev->dev);
+       } else {
                WARN_ON(extra_checks);
+       }
 }
 
 /**