Hi, Wolfram, From: Haibo Chen <haibo.chen@xxxxxxxxxxxxx> Sent: Wednesday, September 03, 2014 1:52 PM + 0800 > To: wsa@xxxxxxxxxxxxx > Cc: Duan Fugang-B38611; linux-i2c@xxxxxxxxxxxxxxx > Subject: [PATCH v2] 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> > Acked-by: Fugang Duan <B38611@xxxxxxxxxxxxx> > --- > Changes for V2: > -Use 'EAGAIN' instead of 'EIO' for arbitration lost -Modify the comment > style > > 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..ceff87c 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 -EAGAIN; > + } > + > if (for_busy && (temp & I2SR_IBB)) > break; > if (!for_busy && !(temp & I2SR_IBB)) > -- > 1.9.1 > > -- Can you apply the patch or other comments ? Thanks, Haibo -- 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