From: Marek Vasut Date: Wed, 4 Sep 2024 22:34:20 +0000 (+0200) Subject: clk: renesas: Fix missing unbind on driver look up failure X-Git-Url: http://git.dujemihanovic.xyz/html/%7B%7B%20%28.OutputFormats.Get?a=commitdiff_plain;h=c78a81396a0d7f42168a6bb7192af1545143be9b;p=u-boot.git 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 --- 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);