@@ -1,5 +1,5 @@
/*
- * Copyright 2006,2009 Freescale Semiconductor, Inc.
+ * Copyright 2006,2009,2011 Freescale Semiconductor, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -252,6 +252,26 @@ i2c_init(int speed, int slaveadd)
writeb(slaveadd << 1, &dev->adr);/* write slave address */
writeb(0x0, &dev->sr); /* clear status register */
writeb(I2C_CR_MEN, &dev->cr); /* start I2C controller */
+
+ /*
+ * Force I2C module to become bus master which can occure when
+ * a system reset does not cause all I2C devices to be reset.
+ */
+ udelay(5);
+ if (readb(&dev->sr) & I2C_SR_MBB) {
+ writeb(I2C_CR_MSTA, &dev->cr);
+ udelay(5);
+ writeb(I2C_CR_MEN | I2C_CR_MSTA, &dev->cr);
+ udelay(5);
+ readb(&dev->dr);
+ udelay(5);
+ writeb(I2C_CR_MEN, &dev->cr);
+ udelay(5);
+ if (readb(&dev->sr) & I2C_SR_MBB)
+ debug("I2C%d: Drive SCL failed\n", i + 1);
+ else
+ debug("I2C%d: Drive SCL succeed\n", i + 1);
+ }
}
#ifdef CONFIG_SYS_I2C_BOARD_LATE_INIT