All points of failure in the code of i2c_fsl_probe() happen after the allocation of i2c_fsl, so all of them have to perform necessary cleanup setups in case of failure. Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- drivers/i2c/busses/i2c-imx.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 714e83c..4cd03e1 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -539,8 +539,10 @@ static int __init i2c_fsl_probe(struct device_d *pdev) #ifdef CONFIG_COMMON_CLK i2c_fsl->clk = clk_get(pdev, NULL); - if (IS_ERR(i2c_fsl->clk)) - return PTR_ERR(i2c_fsl->clk); + if (IS_ERR(i2c_fsl->clk)) { + ret = PTR_ERR(i2c_fsl->clk); + goto fail; + } #endif /* Setup i2c_fsl driver structure */ i2c_fsl->adapter.master_xfer = i2c_fsl_xfer; @@ -548,8 +550,10 @@ static int __init i2c_fsl_probe(struct device_d *pdev) i2c_fsl->adapter.dev.parent = pdev; i2c_fsl->adapter.dev.device_node = pdev->device_node; i2c_fsl->base = dev_request_mem_region(pdev, 0); - if (IS_ERR(i2c_fsl->base)) - return PTR_ERR(i2c_fsl->base); + if (IS_ERR(i2c_fsl->base)) { + ret = PTR_ERR(i2c_fsl->base); + goto fail; + } i2c_fsl->dfsrr = -1; -- 2.1.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox