]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: grgpio: remove remove()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 15 Oct 2024 13:18:32 +0000 (15:18 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 22 Oct 2024 07:04:35 +0000 (09:04 +0200)
Use devres to automatically manage resources and remove the remove()
callback.

Link: https://lore.kernel.org/r/20241015131832.44678-4-brgl@bgdev.pl
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-grgpio.c

index aec96d47dd0c93541cecaf4bb3e6fbee45b067fd..7ffe59d845f04258392925c9e34f82ddbb462f33 100644 (file)
@@ -318,6 +318,13 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)
        raw_spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
 }
 
+static void grgpio_irq_domain_remove(void *data)
+{
+       struct irq_domain *domain = data;
+
+       irq_domain_remove(domain);
+}
+
 static const struct irq_domain_ops grgpio_irq_domain_ops = {
        .map    = grgpio_irq_map,
        .unmap  = grgpio_irq_unmap,
@@ -394,6 +401,11 @@ static int grgpio_probe(struct platform_device *ofdev)
                        return -EINVAL;
                }
 
+               err = devm_add_action_or_reset(dev, grgpio_irq_domain_remove,
+                                              priv->domain);
+               if (err)
+                       return err;
+
                for (i = 0; i < gc->ngpio; i++) {
                        struct grgpio_lirq *lirq;
                        int ret;
@@ -416,13 +428,9 @@ static int grgpio_probe(struct platform_device *ofdev)
                }
        }
 
-       platform_set_drvdata(ofdev, priv);
-
-       err = gpiochip_add_data(gc, priv);
+       err = devm_gpiochip_add_data(dev, gc, priv);
        if (err) {
                dev_err(dev, "Could not add gpiochip\n");
-               if (priv->domain)
-                       irq_domain_remove(priv->domain);
                return err;
        }
 
@@ -432,16 +440,6 @@ static int grgpio_probe(struct platform_device *ofdev)
        return 0;
 }
 
-static void grgpio_remove(struct platform_device *ofdev)
-{
-       struct grgpio_priv *priv = platform_get_drvdata(ofdev);
-
-       gpiochip_remove(&priv->gc);
-
-       if (priv->domain)
-               irq_domain_remove(priv->domain);
-}
-
 static const struct of_device_id grgpio_match[] = {
        {.name = "GAISLER_GPIO"},
        {.name = "01_01a"},
@@ -456,7 +454,6 @@ static struct platform_driver grgpio_driver = {
                .of_match_table = grgpio_match,
        },
        .probe = grgpio_probe,
-       .remove = grgpio_remove,
 };
 module_platform_driver(grgpio_driver);