diff mbox series

i2c: mediatek: Fix an error handling path in mtk_i2c_probe()

Message ID 8001bcdbee9f8afc85118c99b8166eb6473dcba5.1653222111.git.christophe.jaillet@wanadoo.fr (mailing list archive)
State New, archived
Headers show
Series i2c: mediatek: Fix an error handling path in mtk_i2c_probe() | expand

Commit Message

Christophe JAILLET May 22, 2022, 12:22 p.m. UTC
The clsk are prepared, enabled, then disabled. So if an error occurs after
the disable step, they are still prepared.

Add an error handling path to unprepare the clks in such a case, as already
done in the .remove function.

Fixes: 8b4fc246c3ff ("i2c: mediatek: Optimize master_xfer() and avoid circular locking")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
 drivers/i2c/busses/i2c-mt65xx.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Comments

AngeloGioacchino Del Regno May 23, 2022, 8:41 a.m. UTC | #1
Il 22/05/22 14:22, Christophe JAILLET ha scritto:
> The clsk are prepared, enabled, then disabled. So if an error occurs after
> the disable step, they are still prepared.
> 
> Add an error handling path to unprepare the clks in such a case, as already
> done in the .remove function.
> 
> Fixes: 8b4fc246c3ff ("i2c: mediatek: Optimize master_xfer() and avoid circular locking")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

Thanks!

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Qii Wang May 26, 2022, 11:31 a.m. UTC | #2
On Sun, 2022-05-22 at 14:22 +0200, Christophe JAILLET wrote:
> The clsk are prepared, enabled, then disabled. So if an error occurs
> after
> the disable step, they are still prepared.
> 
> Add an error handling path to unprepare the clks in such a case, as
> already
> done in the .remove function.
> 
> Fixes: 8b4fc246c3ff ("i2c: mediatek: Optimize master_xfer() and avoid
> circular locking")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

Reviewed-by: Qii Wang <qii.wang@mediatek.com>

> ---
>  drivers/i2c/busses/i2c-mt65xx.c | 9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
>
Wolfram Sang June 14, 2022, 8:12 p.m. UTC | #3
On Sun, May 22, 2022 at 02:22:07PM +0200, Christophe JAILLET wrote:
> The clsk are prepared, enabled, then disabled. So if an error occurs after
> the disable step, they are still prepared.
> 
> Add an error handling path to unprepare the clks in such a case, as already
> done in the .remove function.
> 
> Fixes: 8b4fc246c3ff ("i2c: mediatek: Optimize master_xfer() and avoid circular locking")
> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>

Applied to for-current, thanks!
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-mt65xx.c b/drivers/i2c/busses/i2c-mt65xx.c
index bdecb78bfc26..8e6985354fd5 100644
--- a/drivers/i2c/busses/i2c-mt65xx.c
+++ b/drivers/i2c/busses/i2c-mt65xx.c
@@ -1420,17 +1420,22 @@  static int mtk_i2c_probe(struct platform_device *pdev)
 	if (ret < 0) {
 		dev_err(&pdev->dev,
 			"Request I2C IRQ %d fail\n", irq);
-		return ret;
+		goto err_bulk_unprepare;
 	}
 
 	i2c_set_adapdata(&i2c->adap, i2c);
 	ret = i2c_add_adapter(&i2c->adap);
 	if (ret)
-		return ret;
+		goto err_bulk_unprepare;
 
 	platform_set_drvdata(pdev, i2c);
 
 	return 0;
+
+err_bulk_unprepare:
+	clk_bulk_unprepare(I2C_MT65XX_CLK_MAX, i2c->clocks);
+
+	return ret;
 }
 
 static int mtk_i2c_remove(struct platform_device *pdev)