From 2a129147e977d850977b4c02726b67443cedf62e Mon Sep 17 00:00:00 2001 From: Teresa Remmet Date: Tue, 19 May 2026 08:51:23 +0200 Subject: [PATCH 1/2] i2c: imx: Fix ABBA deadlock again We see deadlock issues with clock prepare mutex in imx i2c driver . I our case this came up with a clock output of a rtc connected to i2c bus. This issue has already been fixed upstream by: (d9a22d713acb) i2c: imx: avoid taking clk_prepare mutex in PM callbacks But was reintroduced by a wrongly resolved merge conflict with this commit: (66c0769b6ca8) MLK-11403: I2C: imx: restore pin setting for i2c So again we keep the i2c clock prepared and only enable and disable it for a transfer. Link: https://github.com/nxp-imx/linux-imx/pull/21 Signed-off-by: Teresa Remmet Signed-off-by: Christian Hemp --- drivers/i2c/busses/i2c-imx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 8d036133dcb853..08ab33ebb83e21 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -1783,7 +1783,7 @@ static int i2c_imx_runtime_suspend(struct device *dev) { struct imx_i2c_struct *i2c_imx = dev_get_drvdata(dev); - clk_disable_unprepare(i2c_imx->clk); + clk_disable(i2c_imx->clk); pinctrl_pm_select_sleep_state(dev); return 0; @@ -1795,7 +1795,7 @@ static int i2c_imx_runtime_resume(struct device *dev) int ret; pinctrl_pm_select_default_state(dev); - ret = clk_prepare_enable(i2c_imx->clk); + ret = clk_enable(i2c_imx->clk); if (ret) dev_err(dev, "can't enable I2C clock, ret=%d\n", ret); From d26ead284c7113e578ae6425347b38486b675aef Mon Sep 17 00:00:00 2001 From: Teresa Remmet Date: Tue, 19 May 2026 08:51:24 +0200 Subject: [PATCH 2/2] i2c: imx: Remove clk_get_rate for each transfer again clk_get_rate() keeps the clk prepare lock which can lead into a deadlock. It was removed upstream with this commit: (90ad2cbe88c2) i2c: imx: use clk notifier for rate changes But it has been readded again with: (0e94d44f4403) MLK-20368 i2c-imx: Coverity: fix divide by zero warning The commit message does not explain why it was re added. It is not needed as the clk notifier is used. Removed it again. Link: https://github.com/nxp-imx/linux-imx/pull/21 Signed-off-by: Teresa Remmet Signed-off-by: Christian Hemp --- drivers/i2c/busses/i2c-imx.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 08ab33ebb83e21..cfb2d281ee8365 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c @@ -701,10 +701,6 @@ static int i2c_imx_start(struct imx_i2c_struct *i2c_imx, bool atomic) unsigned int temp = 0; int result; - result = i2c_imx_set_clk(i2c_imx, clk_get_rate(i2c_imx->clk)); - if (result) - return result; - imx_i2c_write_reg(i2c_imx->ifdr, i2c_imx, IMX_I2C_IFDR); /* Enable I2C controller */ imx_i2c_write_reg(i2c_imx->hwdata->i2sr_clr_opcode, i2c_imx, IMX_I2C_I2SR);