]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
ARM: shmobile: rcar-gen2: Increase refcount for new reference
authorLiang He <windhl@126.com>
Fri, 1 Jul 2022 12:18:04 +0000 (20:18 +0800)
committerStefan Bader <stefan.bader@canonical.com>
Mon, 17 Oct 2022 09:55:56 +0000 (11:55 +0200)
BugLink: https://bugs.launchpad.net/bugs/1990162
[ Upstream commit 75a185fb92e58ccd3670258d8d3b826bd2fa6d29 ]

In rcar_gen2_regulator_quirk(), for_each_matching_node_and_match() will
automatically increase and decrease the refcount.  However, we should
call of_node_get() for the new reference created in 'quirk->np'.
Besides, we also should call of_node_put() before the 'quirk' being
freed.

Signed-off-by: Liang He <windhl@126.com>
Link: https://lore.kernel.org/r/20220701121804.234223-1-windhl@126.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c

index 09ef73b99dd86a851a98bc7c75c433821c5b5bf1..ba44cec5e59ac3d3e17a3da4f094c67a8b96d987 100644 (file)
@@ -125,6 +125,7 @@ remove:
 
        list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
                list_del(&pos->list);
+               of_node_put(pos->np);
                kfree(pos);
        }
 
@@ -174,11 +175,12 @@ static int __init rcar_gen2_regulator_quirk(void)
                memcpy(&quirk->i2c_msg, id->data, sizeof(quirk->i2c_msg));
 
                quirk->id = id;
-               quirk->np = np;
+               quirk->np = of_node_get(np);
                quirk->i2c_msg.addr = addr;
 
                ret = of_irq_parse_one(np, 0, argsa);
                if (ret) {      /* Skip invalid entry and continue */
+                       of_node_put(np);
                        kfree(quirk);
                        continue;
                }
@@ -225,6 +227,7 @@ err_free:
 err_mem:
        list_for_each_entry_safe(pos, tmp, &quirk_list, list) {
                list_del(&pos->list);
+               of_node_put(pos->np);
                kfree(pos);
        }