mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 14:13:16 +00:00
213b728276
Pick accepted patches from upstream Linux tree instead of having to maintain our slightly different downstream patches. Import pending patch fixing I2C on MT7981 by making sure all clocks are enabled before accessing I2C registers. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
49 lines
1.5 KiB
Diff
49 lines
1.5 KiB
Diff
From 6f3a5814c7aaea4176e0ac8b1ec6dc0a65aa2808 Mon Sep 17 00:00:00 2001
|
|
From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
|
|
Date: Sun, 22 May 2022 14:22:07 +0200
|
|
Subject: [PATCH 09/16] i2c: mediatek: Fix an error handling path in
|
|
mtk_i2c_probe()
|
|
|
|
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: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
|
Reviewed-by: Qii Wang <qii.wang@mediatek.com>
|
|
Signed-off-by: Wolfram Sang <wsa@kernel.org>
|
|
---
|
|
drivers/i2c/busses/i2c-mt65xx.c | 9 +++++++--
|
|
1 file changed, 7 insertions(+), 2 deletions(-)
|
|
|
|
--- 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
|
|
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)
|