Re: [PATCH] i2c-mpc: Wait for STOP to hit the bus
Wolfram Sang w.s...@pengutronix.de wrote on 2012/09/14 16:02:34: On Thu, Aug 30, 2012 at 12:40:04PM +0200, Joakim Tjernlund wrote: mpc_i2c_stop() only initiates STOP but does not wait for it to hit the I2C bus. This is a problem when using I2C devices which uses fairly long clock stretching just before STOP if you also have an i2c-mux which may switch to another bus before STOP has been processed. Signed-off-by: Joakim Tjernlund joakim.tjernl...@transmode.se Patch didn't apply, because it was a p0-patch. Checkpatch would have warned you. Bugger, it is my git config setting: [diff] noprefix = true I always forget to remove that one before generating patches, I will have to remove it. Fixed that and applied to -next, thanks! Thanks ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] i2c-mpc: Wait for STOP to hit the bus
On Thu, Aug 30, 2012 at 12:40:04PM +0200, Joakim Tjernlund wrote: mpc_i2c_stop() only initiates STOP but does not wait for it to hit the I2C bus. This is a problem when using I2C devices which uses fairly long clock stretching just before STOP if you also have an i2c-mux which may switch to another bus before STOP has been processed. Signed-off-by: Joakim Tjernlund joakim.tjernl...@transmode.se Patch didn't apply, because it was a p0-patch. Checkpatch would have warned you. Fixed that and applied to -next, thanks! -- Pengutronix e.K. | Wolfram Sang| Industrial Linux Solutions | http://www.pengutronix.de/ | signature.asc Description: Digital signature ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] i2c-mpc: Wait for STOP to hit the bus
Joakim Tjernlund/Transmode wrote on 2012/09/02 16:22:00: Tabi Timur-B04825 b04...@freescale.com wrote on 2012/09/02 04:48:01: On Thu, Aug 30, 2012 at 5:40 AM, Joakim Tjernlund joakim.tjernl...@transmode.se wrote: - mpc_i2c_stop(i2c); + mpc_i2c_stop(i2c); /* Initiate STOP */ + orig_jiffies = jiffies; + /* Wait until STOP is seen, allow up to 1 s */ + while (readb(i2c-base + MPC_I2C_SR) CSR_MBB) { + if (time_after(jiffies, orig_jiffies + HZ)) { + u8 status = readb(i2c-base + MPC_I2C_SR); + + dev_dbg(i2c-dev, timeout\n); + if ((status (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) { + writeb(status ~CSR_MAL, + i2c-base + MPC_I2C_SR); + mpc_i2c_fixup(i2c); + } + return -EIO; + } + cond_resched(); + } Shouldn't the while-loop be inside mpc_i2c_stop() itself? Possibly but I choosed to do it this way as there is a similar loop in the beginning of mpc_xfer(). I figured it has better visibility if it is in the same function. Jocke Ping? Anything holding this patch back? Jocke ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] i2c-mpc: Wait for STOP to hit the bus
Tabi Timur-B04825 b04...@freescale.com wrote on 2012/09/02 04:48:01: On Thu, Aug 30, 2012 at 5:40 AM, Joakim Tjernlund joakim.tjernl...@transmode.se wrote: - mpc_i2c_stop(i2c); + mpc_i2c_stop(i2c); /* Initiate STOP */ + orig_jiffies = jiffies; + /* Wait until STOP is seen, allow up to 1 s */ + while (readb(i2c-base + MPC_I2C_SR) CSR_MBB) { + if (time_after(jiffies, orig_jiffies + HZ)) { + u8 status = readb(i2c-base + MPC_I2C_SR); + + dev_dbg(i2c-dev, timeout\n); + if ((status (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) { + writeb(status ~CSR_MAL, + i2c-base + MPC_I2C_SR); + mpc_i2c_fixup(i2c); + } + return -EIO; + } + cond_resched(); + } Shouldn't the while-loop be inside mpc_i2c_stop() itself? Possibly but I choosed to do it this way as there is a similar loop in the beginning of mpc_xfer(). I figured it has better visibility if it is in the same function. Jocke ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
Re: [PATCH] i2c-mpc: Wait for STOP to hit the bus
On Thu, Aug 30, 2012 at 5:40 AM, Joakim Tjernlund joakim.tjernl...@transmode.se wrote: - mpc_i2c_stop(i2c); + mpc_i2c_stop(i2c); /* Initiate STOP */ + orig_jiffies = jiffies; + /* Wait until STOP is seen, allow up to 1 s */ + while (readb(i2c-base + MPC_I2C_SR) CSR_MBB) { + if (time_after(jiffies, orig_jiffies + HZ)) { + u8 status = readb(i2c-base + MPC_I2C_SR); + + dev_dbg(i2c-dev, timeout\n); + if ((status (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) { + writeb(status ~CSR_MAL, + i2c-base + MPC_I2C_SR); + mpc_i2c_fixup(i2c); + } + return -EIO; + } + cond_resched(); + } Shouldn't the while-loop be inside mpc_i2c_stop() itself? -- Timur Tabi Linux kernel developer at Freescale ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev
[PATCH] i2c-mpc: Wait for STOP to hit the bus
mpc_i2c_stop() only initiates STOP but does not wait for it to hit the I2C bus. This is a problem when using I2C devices which uses fairly long clock stretching just before STOP if you also have an i2c-mux which may switch to another bus before STOP has been processed. Signed-off-by: Joakim Tjernlund joakim.tjernl...@transmode.se --- drivers/i2c/busses/i2c-mpc.c | 18 +- 1 files changed, 17 insertions(+), 1 deletions(-) diff --git drivers/i2c/busses/i2c-mpc.c drivers/i2c/busses/i2c-mpc.c index 3d31879..c08f287 100644 --- drivers/i2c/busses/i2c-mpc.c +++ drivers/i2c/busses/i2c-mpc.c @@ -574,7 +574,23 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) mpc_write(i2c, pmsg-addr, pmsg-buf, pmsg-len, i); } } - mpc_i2c_stop(i2c); + mpc_i2c_stop(i2c); /* Initiate STOP */ + orig_jiffies = jiffies; + /* Wait until STOP is seen, allow up to 1 s */ + while (readb(i2c-base + MPC_I2C_SR) CSR_MBB) { + if (time_after(jiffies, orig_jiffies + HZ)) { + u8 status = readb(i2c-base + MPC_I2C_SR); + + dev_dbg(i2c-dev, timeout\n); + if ((status (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) { + writeb(status ~CSR_MAL, + i2c-base + MPC_I2C_SR); + mpc_i2c_fixup(i2c); + } + return -EIO; + } + cond_resched(); + } return (ret 0) ? ret : num; } -- 1.7.8.6 ___ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev