FAILED: patch "[PATCH] i2c: imx: Check for I2SR_IAL after every byte" failed to apply to 4.9-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 1de67a3dee7a279ebe4d892b359fe3696938ec15 Mon Sep 17 00:00:00 2001
From: Christian Eggers <[email protected]>
Date: Fri, 9 Oct 2020 13:03:19 +0200
Subject: [PATCH] i2c: imx: Check for I2SR_IAL after every byte
Arbitration Lost (IAL) can happen after every single byte transfer. If arbitration is lost, the I2C hardware will autonomously switch from master mode to slave. If a transfer is not aborted in this state, consecutive transfers will not be executed by the hardware and will timeout.
Tested (not extensively) on Vybrid VF500 (Toradex VF50):
drivers/i2c/busses/i2c-imx.c +10 -0
@@ -490,6 +490,16 @@ static int i2c_imx_trx_complete(struct imx_i2c_struct *i2c_imx, bool atomic)dev_dbg (&i2c_imx->adapter.dev,"<%s> Timeout\n" , __func__);return -ETIMEDOUT ; } + +/* check for arbitration lost */ +if (i2c_imx->i2csr &I2SR_IAL ) { +dev_dbg (&i2c_imx->adapter.dev,"<%s> Arbitration lost\n" , __func__); +i2c_imx_clear_irq (i2c_imx,I2SR_IAL ); + + i2c_imx->i2csr =0 ; +return -EAGAIN ; + } +dev_dbg (&i2c_imx->adapter.dev,"<%s> TRX complete\n" , __func__); i2c_imx->i2csr =0 ;return 0 ;