> @@ -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 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev