summaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpiolib.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2016-02-11 10:28:44 +0100
committerLinus Walleij <linus.walleij@linaro.org>2016-02-11 20:29:46 +0100
commit33a68e86fd7741f782c71a0daa9111b352e94445 (patch)
tree96e6ee9894a0513d98e43300dd17bec0a45e36a4 /drivers/gpio/gpiolib.c
parentfdeb8e1547cb9dd39d5d7223b33f3565cf86c28e (diff)
downloadop-kernel-dev-33a68e86fd7741f782c71a0daa9111b352e94445.zip
op-kernel-dev-33a68e86fd7741f782c71a0daa9111b352e94445.tar.gz
gpio: reference count the gpio device for each desc
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>
Diffstat (limited to 'drivers/gpio/gpiolib.c')
-rw-r--r--drivers/gpio/gpiolib.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 0738f9a..646dea4 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -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);
+ }
}
/**
OpenPOWER on IntegriCloud