Index: linux-2.6.15.4/arch/arm/mach-iop3xx/common.c =================================================================== --- linux-2.6.15.4.orig/arch/arm/mach-iop3xx/common.c +++ linux-2.6.15.4/arch/arm/mach-iop3xx/common.c @@ -42,17 +42,20 @@ void ep80219_power_off(void) /* Send the Address byte w/ the start condition */ *IOP321_IDBR1 = 0x60; *IOP321_ICR1 = 0xE9; - mdelay(1); + // Flow control for slow PIC device on EP80219 + mdelay(2); /* Send the START_MSG byte w/ no start or stop condition */ *IOP321_IDBR1 = 0x0F; *IOP321_ICR1 = 0xE8; - mdelay(1); + // Flow control for slow PIC device on EP80219 + mdelay(2); /* Send the SHUTDOWN_COMPLETE Message ID byte w/ no start or stop condition */ *IOP321_IDBR1 = 0x03; *IOP321_ICR1 = 0xE8; - mdelay(1); + // Flow control for slow PIC device on EP80219 + mdelay(2); /* Send an ignored byte w/ stop condition */ *IOP321_IDBR1 = 0x00; Index: linux-2.6.15.4/drivers/i2c/busses/i2c-iop3xx.c =================================================================== --- linux-2.6.15.4.orig/drivers/i2c/busses/i2c-iop3xx.c +++ linux-2.6.15.4/drivers/i2c/busses/i2c-iop3xx.c @@ -14,10 +14,10 @@ * And which acknowledged Kyösti Mälkki , * Frodo Looijaard , Martin Bailey * - * Major cleanup by Deepak Saxena , 01/2005: + * Major cleanup by Deepak Saxena , 12/2004: * * - Use driver model to pass per-chip info instead of hardcoding and #ifdefs - * - Use ioremap/__raw_readl/__raw_writel instead of direct dereference + * - Use __ioremap/__raw_readl/__raw_writel instead of direct dereference * - Make it work with IXP46x chips * - Cleanup function names, coding style, etc * @@ -314,8 +314,11 @@ iop3xx_i2c_writebytes(struct i2c_adapter int ii; int rc = 0; - for (ii = 0; rc == 0 && ii != count; ++ii) + for (ii = 0; rc == 0 && ii != count; ++ii) { + // Flow control for slow PIC device on EP80219 + mdelay(2); rc = iop3xx_i2c_write_byte(iop3xx_adap, buf[ii], ii==count-1); + } return rc; } @@ -326,9 +329,11 @@ iop3xx_i2c_readbytes(struct i2c_adapter int ii; int rc = 0; - for (ii = 0; rc == 0 && ii != count; ++ii) + for (ii = 0; rc == 0 && ii != count; ++ii) { + // Flow control for slow PIC device on EP80219 + mdelay(2); rc = iop3xx_i2c_read_byte(iop3xx_adap, &buf[ii], ii==count-1); - + } return rc; }