public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] Minor changes for i2c-imx driver
@ 2026-04-24 12:36 Daniel Scally
  2026-04-24 12:36 ` [PATCH v2 1/2] i2c: imx: Don't recover bus when arbitration lost Daniel Scally
  2026-04-24 12:36 ` [PATCH v2 2/2] i2c: imx: Retry failed transfers 3 times Daniel Scally
  0 siblings, 2 replies; 3+ messages in thread
From: Daniel Scally @ 2026-04-24 12:36 UTC (permalink / raw)
  To: Oleksij Rempel, Pengutronix Kernel Team, Andi Shyti, Frank Li,
	Sascha Hauer, Fabio Estevam, Gao Pan, Fugang Duan, Wolfram Sang
  Cc: linux-i2c, imx, linux-arm-kernel, Daniel Scally

Hello all

These small changes helped resolve issues we experienced using the
i2c-imx driver on a multi-master bus. The device was losing
arbitration which triggered the driver to attempt to recover the bus
rather than retry the transfer. The set stops the bus recovery
attempts on lost arbitration and instructs the driver to retry
transfers 3 times, which seems sufficient for our setup.

I had intended to make a larger change that added a new devicetree
property for i2c-controller.yaml that held the number of retries an
adapter should use, and then parse that to set adap->retries. I found
a relatively old discussion on the list though in which a similar
idea was discussed and rejected so I dropped that, but I thought I'd
mention it in case things had changed.

Thanks
Dan

Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
---
Changes in v2:
- Updated the commit message in v1, and added a Fixes tag.
- Link to v1: https://lore.kernel.org/r/20260311-i2c-imx-fixes-v1-0-e625034d8202@ideasonboard.com

---
Daniel Scally (2):
      i2c: imx: Don't recover bus when arbitration lost
      i2c: imx: Retry failed transfers 3 times

 drivers/i2c/busses/i2c-imx.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
---
base-commit: 4a181746639404023abfcb28eb6f6c66974be5a7
change-id: 20260311-i2c-imx-fixes-3e23164a8a8f

Best regards,
-- 
Daniel Scally <dan.scally@ideasonboard.com>



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 1/2] i2c: imx: Don't recover bus when arbitration lost
  2026-04-24 12:36 [PATCH v2 0/2] Minor changes for i2c-imx driver Daniel Scally
@ 2026-04-24 12:36 ` Daniel Scally
  2026-04-24 12:36 ` [PATCH v2 2/2] i2c: imx: Retry failed transfers 3 times Daniel Scally
  1 sibling, 0 replies; 3+ messages in thread
From: Daniel Scally @ 2026-04-24 12:36 UTC (permalink / raw)
  To: Oleksij Rempel, Pengutronix Kernel Team, Andi Shyti, Frank Li,
	Sascha Hauer, Fabio Estevam, Gao Pan, Fugang Duan, Wolfram Sang
  Cc: linux-i2c, imx, linux-arm-kernel, Daniel Scally

In i2c_imx_xfer_common(), the driver attempts bus recovery whenever
i2c_imx_start() fails. One of the failure modes for i2c_imx_start()
is an arbitration-lost signal which results when a second I2C master
on the bus tries to control the bus simultaneously, which is a normal
and expected behaviour.

Bus recovery is not the right response for this case. Add a check for
the -EAGAIN return code to avoid running the bus recovery.

Fixes: 1c4b6c3bcf30d ("i2c: imx: implement bus recovery")
Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
---
 drivers/i2c/busses/i2c-imx.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index a208fefd3c3b35672a00eda8448f24859aaa793a..b68a0f7105682006bbcfee52891c9a9c2d8c009e 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -1552,7 +1552,7 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
 
 	/* Start I2C transfer */
 	result = i2c_imx_start(i2c_imx, atomic);
-	if (result) {
+	if (result && result != -EAGAIN) {
 		/*
 		 * Bus recovery uses gpiod_get_value_cansleep() which is not
 		 * allowed within atomic context.

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] i2c: imx: Retry failed transfers 3 times
  2026-04-24 12:36 [PATCH v2 0/2] Minor changes for i2c-imx driver Daniel Scally
  2026-04-24 12:36 ` [PATCH v2 1/2] i2c: imx: Don't recover bus when arbitration lost Daniel Scally
@ 2026-04-24 12:36 ` Daniel Scally
  1 sibling, 0 replies; 3+ messages in thread
From: Daniel Scally @ 2026-04-24 12:36 UTC (permalink / raw)
  To: Oleksij Rempel, Pengutronix Kernel Team, Andi Shyti, Frank Li,
	Sascha Hauer, Fabio Estevam, Gao Pan, Fugang Duan, Wolfram Sang
  Cc: linux-i2c, imx, linux-arm-kernel, Daniel Scally

Set the retries member of the i2c_adapter to 3, which will cause the
i2c-core code to retry transfers that lose arbitration 3 times before
giving up.

Reviewed-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Daniel Scally <dan.scally@ideasonboard.com>
---
 drivers/i2c/busses/i2c-imx.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index b68a0f7105682006bbcfee52891c9a9c2d8c009e..e70e64cc633ff1e13dc61920c0c7960fb6a02622 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -1749,6 +1749,7 @@ static int i2c_imx_probe(struct platform_device *pdev)
 	i2c_imx->adapter.dev.parent	= &pdev->dev;
 	i2c_imx->adapter.nr		= pdev->id;
 	i2c_imx->adapter.dev.of_node	= pdev->dev.of_node;
+	i2c_imx->adapter.retries	= 3;
 	i2c_imx->base			= base;
 	ACPI_COMPANION_SET(&i2c_imx->adapter.dev, ACPI_COMPANION(&pdev->dev));
 

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-04-24 12:37 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-24 12:36 [PATCH v2 0/2] Minor changes for i2c-imx driver Daniel Scally
2026-04-24 12:36 ` [PATCH v2 1/2] i2c: imx: Don't recover bus when arbitration lost Daniel Scally
2026-04-24 12:36 ` [PATCH v2 2/2] i2c: imx: Retry failed transfers 3 times Daniel Scally

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox