]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
I2c: Fix the i2c Bus Recovery issue.
authorNava kishore Manne <nava.manne@xilinx.com>
Fri, 24 Feb 2017 09:34:30 +0000 (15:04 +0530)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 24 Feb 2017 10:06:13 +0000 (11:06 +0100)
Once i2c bus SCL/SDA are stuck low during the transfer,
Then only we need to call the i2c_recover_bus()
instead of calling for all error cases.

This patch fix this issue

Signed-off-by: Nava kishore Manne <navam@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/i2c/busses/i2c-cadence.c

index f8e88e70e1ba911ed5fa51ea17ccdb09257b309c..21b2441c192d19d1a4b4defef78a0eb653d75153 100644 (file)
@@ -571,8 +571,6 @@ static void cdns_i2c_master_reset(struct i2c_adapter *adap)
        /* Clear the status register */
        regval = cdns_i2c_readreg(CDNS_I2C_SR_OFFSET);
        cdns_i2c_writereg(regval, CDNS_I2C_SR_OFFSET);
-
-       i2c_recover_bus(adap);
 }
 
 static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,
@@ -608,6 +606,7 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,
        /* Wait for the signal of completion */
        time_left = wait_for_completion_timeout(&id->xfer_done, adap->timeout);
        if (time_left == 0) {
+               i2c_recover_bus(adap);
                cdns_i2c_master_reset(adap);
                dev_err(id->adap.dev.parent,
                                "timeout waiting on completion\n");