diff options
| author | Bartosz Golaszewski <bartosz.golaszewski@linaro.org> | 2023-09-27 17:29:23 +0300 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-01-26 02:35:39 +0300 |
| commit | ba3f1a346bf10264f8c0b4a4e2f62f214286dad9 (patch) | |
| tree | 5850d5568931e70a6f78aca55997e0f525a64c3e /include/linux | |
| parent | 799233ad1eb8666a83179ef9ebe77a3e37c931bb (diff) | |
| download | linux-ba3f1a346bf10264f8c0b4a4e2f62f214286dad9.tar.xz | |
gpiolib: provide gpio_device_find()
[ Upstream commit cfe102f63308c8c8e01199a682868a64b83f653e ]
gpiochip_find() is wrong and its kernel doc is misleading as the
function doesn't return a reference to the gpio_chip but just a raw
pointer. The chip itself is not guaranteed to stay alive, in fact it can
be deleted at any point. Also: other than GPIO drivers themselves,
nobody else has any business accessing gpio_chip structs.
Provide a new gpio_device_find() function that returns a real reference
to the opaque gpio_device structure that is guaranteed to stay alive for
as long as there are active users of it.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Stable-dep-of: 48e1b4d369cf ("gpiolib: remove the GPIO device from the list when it's unregistered")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/gpio/driver.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 64c214317a83..d6e38a500833 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h @@ -607,6 +607,9 @@ extern int devm_gpiochip_add_data_with_key(struct device *dev, struct gpio_chip extern struct gpio_chip *gpiochip_find(void *data, int (*match)(struct gpio_chip *gc, void *data)); +struct gpio_device *gpio_device_find(void *data, + int (*match)(struct gpio_chip *gc, void *data)); + struct gpio_device *gpio_device_get(struct gpio_device *gdev); void gpio_device_put(struct gpio_device *gdev); |
