From: Haibo Chen <haibo.chen@xxxxxxxxxxxxx> Sent: Monday, September 01, 2014 4:59 PM >To: wsa@xxxxxxxxxxxxx >Cc: linux-i2c@xxxxxxxxxxxxxxx; Duan Fugang-B38611 >Subject: [PATCH] i2c: imx: Add arbitration lost check > >According to the i.mx spec, for multimaster mode, if I2C is enabled when >the bus is busy and asserts start, hardware inhibits the transmission, >clears MSTA without signaling a stop, generate an interrupt, and set >I2C_I2SR[IAL] to indicate a failed attempt to engage the bus, which means >arbitration lost. In this case, we should first test I2C_I2SR[IAL], and >clear this bit if it is set, and then I2C controller default to slave >receive mode. > >This patch check the IAL bit every time before an I2c transmission. >if IAL is set, clear it and make I2C controller to default mode. > >Signed-off-by: Haibo Chen <haibo.chen@xxxxxxxxxxxxx> >--- > drivers/i2c/busses/i2c-imx.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > >diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c >index 613069b..144b620 100644 >--- a/drivers/i2c/busses/i2c-imx.c >+++ b/drivers/i2c/busses/i2c-imx.c >@@ -268,6 +268,14 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct >*i2c_imx, int for_busy) > > while (1) { > temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR); >+ >+ /** check for arbitration lost **/ >+ if (temp & I2SR_IAL) { >+ temp &= ~I2SR_IAL; >+ imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2SR); >+ return -EIO; >+ } >+ > if (for_busy && (temp & I2SR_IBB)) > break; > if (!for_busy && !(temp & I2SR_IBB)) >-- >1.9.1 Acked-by: Fugang Duan <B38611@xxxxxxxxxxxxx> Thanks, Andy -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html