[Patch v2 1/2] 5200/mpc: improve i2c bus error recovery
Joakim Tjernlund
joakim.tjernlund at transmode.se
Fri Feb 19 00:23:57 EST 2010
> @@ -93,20 +94,23 @@ static irqreturn_t mpc_i2c_isr(int irq,
> /* Sometimes 9th clock pulse isn't generated, and slave doesn't release
> * the bus, because it wants to send ACK.
> * Following sequence of enabling/disabling and sending start/stop generates
> - * the pulse, so it's all OK.
> + * the 9 pulses, so it's all OK.
> */
> static void mpc_i2c_fixup(struct mpc_i2c *i2c)
> {
> - writeccr(i2c, 0);
> - udelay(30);
> - writeccr(i2c, CCR_MEN);
> - udelay(30);
> - writeccr(i2c, CCR_MSTA | CCR_MTX);
> - udelay(30);
> - writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN);
> - udelay(30);
> - writeccr(i2c, CCR_MEN);
> - udelay(30);
> + int k;
> + u32 delay_val = 1000000 / i2c->real_clk + 1;
> +
> + if (delay_val < 2)
> + delay_val = 2;
> +
> + for (k = 9; k; k--) {
> + writeccr(i2c, 0);
> + writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN);
> + udelay(delay_val);
> + writeccr(i2c, CCR_MEN);
> + udelay(delay_val << 1);
> + }
> }
I am curious, didn't old method work with by just wrapping
a for(k=9; k; k--) around it? How did the wave form look?
Jocke
More information about the Linuxppc-dev
mailing list