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 <marek.vasut+renesas@mailbox.org>
This commit is contained in:
Marek Vasut 2024-09-05 00:34:20 +02:00
parent 8e5e64d55d
commit c78a81396a

View file

@ -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);