From c78a81396a0d7f42168a6bb7192af1545143be9b Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Thu, 5 Sep 2024 00:34:20 +0200 Subject: [PATCH] clk: renesas: Fix missing unbind on driver look up failure In case lists_driver_lookup_name("rst_gen3") fails, the clk_gen3 driver has to be unbound before erroring out. Reorder the function such that both clk_gen3 and rst_gen3 drivers are looked up first, if either look up fails then the function errors out right away. Second, the clk_gen3 is bound, if binding fails, the function still errors out right away because there is nothing to undo after either lists_driver_lookup_name() call. Finally, rst_gen3 is bound and if this binding fails, then that is the only place where clk_gen3 has to be unbound before erroring out. Signed-off-by: Marek Vasut --- drivers/clk/renesas/clk-rcar-gen3.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/clk/renesas/clk-rcar-gen3.c b/drivers/clk/renesas/clk-rcar-gen3.c index 4f1dfbc174..aa38c0f7dd 100644 --- a/drivers/clk/renesas/clk-rcar-gen3.c +++ b/drivers/clk/renesas/clk-rcar-gen3.c @@ -579,23 +579,24 @@ int gen3_cpg_bind(struct udevice *parent) struct cpg_mssr_info *info = (struct cpg_mssr_info *)dev_get_driver_data(parent); struct udevice *cdev, *rdev; - struct driver *drv; + struct driver *cdrv, *rdrv; int ret; - drv = lists_driver_lookup_name("clk_gen3"); - if (!drv) + cdrv = lists_driver_lookup_name("clk_gen3"); + if (!cdrv) return -ENOENT; - ret = device_bind_with_driver_data(parent, drv, "clk_gen3", (ulong)info, + + rdrv = lists_driver_lookup_name("rst_gen3"); + if (!rdrv) + return -ENOENT; + + ret = device_bind_with_driver_data(parent, cdrv, "clk_gen3", (ulong)info, dev_ofnode(parent), &cdev); if (ret) return ret; - drv = lists_driver_lookup_name("rst_gen3"); - if (!drv) - return -ENOENT; - - ret = device_bind_with_driver_data(parent, drv, "rst_gen3", (ulong)cdev, + ret = device_bind_with_driver_data(parent, rdrv, "rst_gen3", (ulong)cdev, dev_ofnode(parent), &rdev); if (ret) device_unbind(cdev); -- 2.39.5