Commit b205f585 authored by Christophe JAILLET's avatar Christophe JAILLET Committed by Wolfram Sang
Browse files

i2c: bcm2835: Fix the error handling in 'bcm2835_i2c_probe()'



Some resource should be released if an error occurs in
'bcm2835_i2c_probe()'.
Add an error handling path and the needed 'clk_disable_unprepare()' and
'clk_rate_exclusive_put()' calls.

While at it, rework the bottom of the function to use this newly added
error handling path and have an explicit and more standard "return 0;" at
the end of the normal path.

Fixes: bebff81f ("i2c: bcm2835: Model Divider in CCF")
Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
[wsa: rebased]
Signed-off-by: default avatarWolfram Sang <wsa@kernel.org>
parent 951285e5
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -449,18 +449,20 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
	ret = clk_prepare_enable(i2c_dev->bus_clk);
	if (ret) {
		dev_err(&pdev->dev, "Couldn't prepare clock");
		return ret;
		goto err_put_exclusive_rate;
	}

	i2c_dev->irq = platform_get_irq(pdev, 0);
	if (i2c_dev->irq < 0)
		return i2c_dev->irq;
	if (i2c_dev->irq < 0) {
		ret = i2c_dev->irq;
		goto err_disable_unprepare_clk;
	}

	ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED,
			  dev_name(&pdev->dev), i2c_dev);
	if (ret) {
		dev_err(&pdev->dev, "Could not request IRQ\n");
		return -ENODEV;
		goto err_disable_unprepare_clk;
	}

	adap = &i2c_dev->adapter;
@@ -478,7 +480,16 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)

	ret = i2c_add_adapter(adap);
	if (ret)
		goto err_free_irq;

	return 0;

err_free_irq:
	free_irq(i2c_dev->irq, i2c_dev);
err_disable_unprepare_clk:
	clk_disable_unprepare(i2c_dev->bus_clk);
err_put_exclusive_rate:
	clk_rate_exclusive_put(i2c_dev->bus_clk);

	return ret;
}