]> git.baikalelectronics.ru Git - kernel.git/commitdiff
gpio: gpiolib-of: Fix refcount bugs in of_mm_gpiochip_add_data()
authorLiang He <windhl@126.com>
Mon, 11 Jul 2022 12:52:38 +0000 (20:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Aug 2022 09:17:57 +0000 (11:17 +0200)
[ Upstream commit 799cd7c0396fa092c4a7bcbf0eb315096ec6bd9d ]

We should use of_node_get() when a new reference of device_node
is created. It is noted that the old reference stored in
'mm_gc->gc.of_node' should also be decreased.

This patch is based on the fact that there is a call site in function
'qe_add_gpiochips()' of src file 'drivers\soc\fsl\qe\gpio.c'. In this
function, of_mm_gpiochip_add_data() is contained in an iteration of
for_each_compatible_node() which will automatically increase and
decrease the refcount. So we need additional of_node_get() for the
reference escape in of_mm_gpiochip_add_data().

Fixes: bfc6548d945f ("of/gpio: Kill of_gpio_chip and add members directly to gpio_chip")
Signed-off-by: Liang He <windhl@126.com>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpio/gpiolib-of.c

index b1dcd2dd52e6b2b2d79f4445d205bf7120767958..73807c897391c5524faed8e8d9cb2d98a731aa76 100644 (file)
@@ -734,7 +734,8 @@ int of_mm_gpiochip_add_data(struct device_node *np,
        if (mm_gc->save_regs)
                mm_gc->save_regs(mm_gc);
 
-       mm_gc->gc.of_node = np;
+       of_node_put(mm_gc->gc.of_node);
+       mm_gc->gc.of_node = of_node_get(np);
 
        ret = gpiochip_add_data(gc, data);
        if (ret)
@@ -742,6 +743,7 @@ int of_mm_gpiochip_add_data(struct device_node *np,
 
        return 0;
 err2:
+       of_node_put(np);
        iounmap(mm_gc->regs);
 err1:
        kfree(gc->label);