gpiolib: Introduce gpio_device_get() and gpio_device_put()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 28 Dec 2022 09:20:43 +0000 (11:20 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 30 Jan 2023 14:55:29 +0000 (15:55 +0100)
Introduce gpio_device_get() and gpio_device_put() helpers
and convert existing users.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-cdev.c
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.h

index e878e3f22b0e48e989c88d291f6f8de39980ba1a..0a33971c964c5768555ffce3b4d6eb60e797aae3 100644 (file)
@@ -321,7 +321,7 @@ static void linehandle_free(struct linehandle_state *lh)
                if (lh->descs[i])
                        gpiod_free(lh->descs[i]);
        kfree(lh->label);
-       put_device(&lh->gdev->dev);
+       gpio_device_put(lh->gdev);
        kfree(lh);
 }
 
@@ -363,8 +363,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
        lh = kzalloc(sizeof(*lh), GFP_KERNEL);
        if (!lh)
                return -ENOMEM;
-       lh->gdev = gdev;
-       get_device(&gdev->dev);
+       lh->gdev = gpio_device_get(gdev);
 
        if (handlereq.consumer_label[0] != '\0') {
                /* label is only initialized if consumer_label is set */
@@ -1576,7 +1575,7 @@ static void linereq_free(struct linereq *lr)
        }
        kfifo_free(&lr->events);
        kfree(lr->label);
-       put_device(&lr->gdev->dev);
+       gpio_device_put(lr->gdev);
        kfree(lr);
 }
 
@@ -1646,8 +1645,7 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)
        if (!lr)
                return -ENOMEM;
 
-       lr->gdev = gdev;
-       get_device(&gdev->dev);
+       lr->gdev = gpio_device_get(gdev);
 
        for (i = 0; i < ulr.num_lines; i++) {
                lr->lines[i].req = lr;
@@ -1916,7 +1914,7 @@ static void lineevent_free(struct lineevent_state *le)
        if (le->desc)
                gpiod_free(le->desc);
        kfree(le->label);
-       put_device(&le->gdev->dev);
+       gpio_device_put(le->gdev);
        kfree(le);
 }
 
@@ -2094,8 +2092,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
        le = kzalloc(sizeof(*le), GFP_KERNEL);
        if (!le)
                return -ENOMEM;
-       le->gdev = gdev;
-       get_device(&gdev->dev);
+       le->gdev = gpio_device_get(gdev);
 
        if (eventreq.consumer_label[0] != '\0') {
                /* label is only initialized if consumer_label is set */
@@ -2671,7 +2668,7 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)
 
        init_waitqueue_head(&cdev->wait);
        INIT_KFIFO(cdev->events);
-       cdev->gdev = gdev;
+       cdev->gdev = gpio_device_get(gdev);
 
        cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
        ret = blocking_notifier_chain_register(&gdev->notifier,
@@ -2679,7 +2676,6 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)
        if (ret)
                goto out_free_bitmap;
 
-       get_device(&gdev->dev);
        file->private_data = cdev;
 
        ret = nonseekable_open(inode, file);
@@ -2694,6 +2690,7 @@ out_unregister_notifier:
        blocking_notifier_chain_unregister(&gdev->notifier,
                                           &cdev->lineinfo_changed_nb);
 out_free_bitmap:
+       gpio_device_put(gdev);
        bitmap_free(cdev->watched_lines);
 out_free_cdev:
        kfree(cdev);
@@ -2716,7 +2713,7 @@ static int gpio_chrdev_release(struct inode *inode, struct file *file)
        bitmap_free(cdev->watched_lines);
        blocking_notifier_chain_unregister(&gdev->notifier,
                                           &cdev->lineinfo_changed_nb);
-       put_device(&gdev->dev);
+       gpio_device_put(gdev);
        kfree(cdev);
 
        return 0;
index 54baf074a8307d3a4af2b872d73838af118dced8..ebc2da15ae4ea4b25283c9e91a8d59e2cacea863 100644 (file)
@@ -882,7 +882,7 @@ err_free_gpiochip_mask:
        gpiochip_free_valid_mask(gc);
        if (gdev->dev.release) {
                /* release() has been registered by gpiochip_setup_dev() */
-               put_device(&gdev->dev);
+               gpio_device_put(gdev);
                goto err_print_message;
        }
 err_remove_from_list:
@@ -972,7 +972,7 @@ void gpiochip_remove(struct gpio_chip *gc)
         */
        gcdev_unregister(gdev);
        up_write(&gdev->sem);
-       put_device(&gdev->dev);
+       gpio_device_put(gdev);
 }
 EXPORT_SYMBOL_GPL(gpiochip_remove);
 
@@ -2057,17 +2057,15 @@ static int validate_desc(const struct gpio_desc *desc, const char *func)
 int gpiod_request(struct gpio_desc *desc, const char *label)
 {
        int ret = -EPROBE_DEFER;
-       struct gpio_device *gdev;
 
        VALIDATE_DESC(desc);
-       gdev = desc->gdev;
 
-       if (try_module_get(gdev->owner)) {
+       if (try_module_get(desc->gdev->owner)) {
                ret = gpiod_request_commit(desc, label);
                if (ret)
-                       module_put(gdev->owner);
+                       module_put(desc->gdev->owner);
                else
-                       get_device(&gdev->dev);
+                       gpio_device_get(desc->gdev);
        }
 
        if (ret)
@@ -2128,7 +2126,7 @@ void gpiod_free(struct gpio_desc *desc)
 {
        if (desc && desc->gdev && gpiod_free_commit(desc)) {
                module_put(desc->gdev->owner);
-               put_device(&desc->gdev->dev);
+               gpio_device_put(desc->gdev);
        } else {
                WARN_ON(extra_checks);
        }
index b3c2db6eba80cbb05f1490b476b0e7f761fa070a..cca81375f127c1bb70810344741ca217ca215385 100644 (file)
@@ -82,6 +82,16 @@ static inline struct gpio_device *to_gpio_device(struct device *dev)
        return container_of(dev, struct gpio_device, dev);
 }
 
+static inline struct gpio_device *gpio_device_get(struct gpio_device *gdev)
+{
+       return to_gpio_device(get_device(&gdev->dev));
+}
+
+static inline void gpio_device_put(struct gpio_device *gdev)
+{
+       put_device(&gdev->dev);
+}
+
 /* gpio suffixes used for ACPI and device tree lookup */
 static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" };