Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33a68e86 authored by Linus Walleij's avatar Linus Walleij
Browse files

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: default avatarLinus Walleij <linus.walleij@linaro.org>
parent fdeb8e15
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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,11 +1250,13 @@ 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);
	}
}

/**
 * gpiochip_is_requested - return string iff signal was requested