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

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
...@@ -449,18 +449,20 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) ...@@ -449,18 +449,20 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
ret = clk_prepare_enable(i2c_dev->bus_clk); ret = clk_prepare_enable(i2c_dev->bus_clk);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Couldn't prepare clock"); dev_err(&pdev->dev, "Couldn't prepare clock");
return ret; goto err_put_exclusive_rate;
} }
i2c_dev->irq = platform_get_irq(pdev, 0); i2c_dev->irq = platform_get_irq(pdev, 0);
if (i2c_dev->irq < 0) if (i2c_dev->irq < 0) {
return i2c_dev->irq; ret = i2c_dev->irq;
goto err_disable_unprepare_clk;
}
ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED, ret = request_irq(i2c_dev->irq, bcm2835_i2c_isr, IRQF_SHARED,
dev_name(&pdev->dev), i2c_dev); dev_name(&pdev->dev), i2c_dev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Could not request IRQ\n"); dev_err(&pdev->dev, "Could not request IRQ\n");
return -ENODEV; goto err_disable_unprepare_clk;
} }
adap = &i2c_dev->adapter; adap = &i2c_dev->adapter;
...@@ -478,7 +480,16 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) ...@@ -478,7 +480,16 @@ static int bcm2835_i2c_probe(struct platform_device *pdev)
ret = i2c_add_adapter(adap); ret = i2c_add_adapter(adap);
if (ret) if (ret)
goto err_free_irq;
return 0;
err_free_irq:
free_irq(i2c_dev->irq, i2c_dev); 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; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment