Commit e963408e authored by Russell King's avatar Russell King
Browse files

drivers/amba: fix reset control error handling



With commit 79bdcb20 ("ARM: 8906/1: drivers/amba: add reset control
to amba bus probe") it is possible for the the amba bus driver to defer
probing the device for its IDs because the reset driver may be probed
later.

However when a subsequent probe occurs, the call to request_resource()
in the driver returns -EBUSY as the driver has not released the resource
from the initial probe attempt - or cleaned up any of the preceding
actions.

Fix this both for the deferred probe case as well as a failure to get
the reset.

Fixes: 79bdcb20 ("ARM: 8906/1: drivers/amba: add reset control to amba bus probe")
Reported-by: default avatarDinh Nguyen <dinguyen@kernel.org>
Tested-by: default avatarDinh Nguyen <dinguyen@kernel.org>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 79bdcb20
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -409,9 +409,11 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
		 */
		rstc = of_reset_control_array_get_optional_shared(dev->dev.of_node);
		if (IS_ERR(rstc)) {
			if (PTR_ERR(rstc) != -EPROBE_DEFER)
				dev_err(&dev->dev, "Can't get amba reset!\n");
			return PTR_ERR(rstc);
			ret = PTR_ERR(rstc);
			if (ret != -EPROBE_DEFER)
				dev_err(&dev->dev, "can't get reset: %d\n",
					ret);
			goto err_reset;
		}
		reset_control_deassert(rstc);
		reset_control_put(rstc);
@@ -472,6 +474,12 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
	release_resource(&dev->res);
 err_out:
	return ret;

 err_reset:
	amba_put_disable_pclk(dev);
	iounmap(tmp);
	dev_pm_domain_detach(&dev->dev, true);
	goto err_release;
}

/*