mtd: hyperbus: hbmc-am654: fix an OF node reference leak
authorJoe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
Fri, 6 Dec 2024 13:38:09 +0000 (22:38 +0900)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Tue, 24 Dec 2024 12:49:54 +0000 (13:49 +0100)
In am654_hbmc_platform_driver, .remove() and the error path of .probe()
do not decrement the refcount of an OF node obtained by
  of_get_next_child(). Fix this by adding of_node_put() calls.

Fixes: aca31ce96814 ("mtd: hyperbus: hbmc-am654: Fix direct mapping setup flash access")
Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/hyperbus/hbmc-am654.c

index 217f4e69233fbfd31ed995a868c11ce2686e29af..edad2ab0f2fa9601b24a7d3a17c3a2eace9a458e 100644 (file)
@@ -174,26 +174,30 @@ static int am654_hbmc_probe(struct platform_device *pdev)
        priv->hbdev.np = of_get_next_child(np, NULL);
        ret = of_address_to_resource(priv->hbdev.np, 0, &res);
        if (ret)
-               return ret;
+               goto put_node;
 
        if (of_property_read_bool(dev->of_node, "mux-controls")) {
                struct mux_control *control = devm_mux_control_get(dev, NULL);
 
-               if (IS_ERR(control))
-                       return PTR_ERR(control);
+               if (IS_ERR(control)) {
+                       ret = PTR_ERR(control);
+                       goto put_node;
+               }
 
                ret = mux_control_select(control, 1);
                if (ret) {
                        dev_err(dev, "Failed to select HBMC mux\n");
-                       return ret;
+                       goto put_node;
                }
                priv->mux_ctrl = control;
        }
 
        priv->hbdev.map.size = resource_size(&res);
        priv->hbdev.map.virt = devm_ioremap_resource(dev, &res);
-       if (IS_ERR(priv->hbdev.map.virt))
-               return PTR_ERR(priv->hbdev.map.virt);
+       if (IS_ERR(priv->hbdev.map.virt)) {
+               ret = PTR_ERR(priv->hbdev.map.virt);
+               goto disable_mux;
+       }
 
        priv->ctlr.dev = dev;
        priv->ctlr.ops = &am654_hbmc_ops;
@@ -226,6 +230,8 @@ release_dma:
 disable_mux:
        if (priv->mux_ctrl)
                mux_control_deselect(priv->mux_ctrl);
+put_node:
+       of_node_put(priv->hbdev.np);
        return ret;
 }
 
@@ -241,6 +247,7 @@ static void am654_hbmc_remove(struct platform_device *pdev)
 
        if (dev_priv->rx_chan)
                dma_release_channel(dev_priv->rx_chan);
+       of_node_put(priv->hbdev.np);
 }
 
 static const struct of_device_id am654_hbmc_dt_ids[] = {