mtd: rawnand: loongson1: Fix inconsistent refcounting in ls1x_nand_chip_init()
authorKeguang Zhang <keguang.zhang@gmail.com>
Thu, 8 May 2025 03:28:42 +0000 (11:28 +0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 12 May 2025 14:28:21 +0000 (16:28 +0200)
As reported by Dan,
commit d2d10ede04b1 ("mtd: rawnand: Add Loongson-1 NAND Controller
Driver"), leads to the following Smatch static checker warning:

drivers/mtd/nand/raw/loongson1-nand-controller.c:730 ls1x_nand_chip_init()
warn: inconsistent refcounting 'chip_np->kobj.kref.refcount.refs.counter':

Fix this issue by calling of_node_put() immediately after using chip_np.
In addition, remove all unnecessary of_node_put(chip_np) calls.

Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Closes: https://lore.kernel.org/all/aBR535RZZT-sa6QZ@stanley.mountain/
Fixes: d2d10ede04b1 ("mtd: rawnand: Add Loongson-1 NAND Controller Driver")
Signed-off-by: Keguang Zhang <keguang.zhang@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/raw/loongson1-nand-controller.c

index 8754bb4..ef8e4f9 100644 (file)
@@ -703,27 +703,25 @@ static int ls1x_nand_chip_init(struct ls1x_nand_host *host)
        if (!chip_np)
                return dev_err_probe(dev, -ENODEV, "failed to get child node for NAND chip\n");
 
-       chip->controller = &host->controller;
-       chip->options = NAND_NO_SUBPAGE_WRITE | NAND_USES_DMA | NAND_BROKEN_XD;
-       chip->buf_align = 16;
-       nand_set_controller_data(chip, host);
        nand_set_flash_node(chip, chip_np);
+       of_node_put(chip_np);
        if (!mtd->name)
                return dev_err_probe(dev, -EINVAL, "Missing MTD label\n");
 
+       nand_set_controller_data(chip, host);
+       chip->controller = &host->controller;
+       chip->options = NAND_NO_SUBPAGE_WRITE | NAND_USES_DMA | NAND_BROKEN_XD;
+       chip->buf_align = 16;
        mtd->dev.parent = dev;
        mtd->owner = THIS_MODULE;
 
        ret = nand_scan(chip, 1);
-       if (ret) {
-               of_node_put(chip_np);
+       if (ret)
                return dev_err_probe(dev, ret, "failed to scan NAND chip\n");
-       }
 
        ret = mtd_device_register(mtd, NULL, 0);
        if (ret) {
                nand_cleanup(chip);
-               of_node_put(chip_np);
                return dev_err_probe(dev, ret, "failed to register MTD device\n");
        }