From: Christian Eggers <[email protected]>

commit 61e6fe59ede155881a622f5901551b1cc8748f6a upstream.

If arbitration is lost, the master automatically changes to slave mode.
I2SR_IBB may or may not be reset by hardware. Raising a STOP condition
by resetting I2CR_MSTA has no effect and will not clear I2SR_IBB.

So calling i2c_imx_bus_busy() is not required and would busy-wait until
timeout.

Signed-off-by: Christian Eggers <[email protected]>
Tested (not extensively) on Vybrid VF500 (Toradex VF50):
Tested-by: Krzysztof Kozlowski <[email protected]>
Acked-by: Oleksij Rempel <[email protected]>
Cc: [email protected] # Requires trivial backporting, simple remove
                           # the 3rd argument from the calls to
                           # i2c_imx_bus_busy().
Signed-off-by: Wolfram Sang <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

---
 drivers/i2c/busses/i2c-imx.c |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -567,6 +567,8 @@ static void i2c_imx_stop(struct imx_i2c_
                /* Stop I2C transaction */
                dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__);
                temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+               if (!(temp & I2CR_MSTA))
+                       i2c_imx->stopped = 1;
                temp &= ~(I2CR_MSTA | I2CR_MTX);
                if (i2c_imx->dma)
                        temp &= ~I2CR_DMAEN;
@@ -732,9 +734,12 @@ static int i2c_imx_dma_read(struct imx_i
                 */
                dev_dbg(dev, "<%s> clear MSTA\n", __func__);
                temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+               if (!(temp & I2CR_MSTA))
+                       i2c_imx->stopped = 1;
                temp &= ~(I2CR_MSTA | I2CR_MTX);
                imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
-               i2c_imx_bus_busy(i2c_imx, 0);
+               if (!i2c_imx->stopped)
+                       i2c_imx_bus_busy(i2c_imx, 0);
        } else {
                /*
                 * For i2c master receiver repeat restart operation like:
@@ -857,9 +862,12 @@ static int i2c_imx_read(struct imx_i2c_s
                                dev_dbg(&i2c_imx->adapter.dev,
                                        "<%s> clear MSTA\n", __func__);
                                temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
+                               if (!(temp & I2CR_MSTA))
+                                       i2c_imx->stopped =  1;
                                temp &= ~(I2CR_MSTA | I2CR_MTX);
                                imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
-                               i2c_imx_bus_busy(i2c_imx, 0);
+                               if (!i2c_imx->stopped)
+                                       i2c_imx_bus_busy(i2c_imx, 0);
                        } else {
                                /*
                                 * For i2c master receiver repeat restart 
operation like:


Reply via email to