|
@@ -181,22 +181,26 @@ static void omap_i2c_unidle(struct omap_i2c_dev *dev)
|
|
if (dev->iclk != NULL)
|
|
if (dev->iclk != NULL)
|
|
clk_enable(dev->iclk);
|
|
clk_enable(dev->iclk);
|
|
clk_enable(dev->fclk);
|
|
clk_enable(dev->fclk);
|
|
|
|
+ dev->idle = 0;
|
|
if (dev->iestate)
|
|
if (dev->iestate)
|
|
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
|
|
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
|
|
- dev->idle = 0;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
static void omap_i2c_idle(struct omap_i2c_dev *dev)
|
|
static void omap_i2c_idle(struct omap_i2c_dev *dev)
|
|
{
|
|
{
|
|
u16 iv;
|
|
u16 iv;
|
|
|
|
|
|
- dev->idle = 1;
|
|
|
|
dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
|
|
dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
|
|
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
|
|
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
|
|
- if (dev->rev1)
|
|
|
|
|
|
+ if (dev->rev1) {
|
|
iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
|
|
iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
|
|
- else
|
|
|
|
|
|
+ } else {
|
|
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate);
|
|
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate);
|
|
|
|
+
|
|
|
|
+ /* Flush posted write before the dev->idle store occurs */
|
|
|
|
+ omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
|
|
|
|
+ }
|
|
|
|
+ dev->idle = 1;
|
|
clk_disable(dev->fclk);
|
|
clk_disable(dev->fclk);
|
|
if (dev->iclk != NULL)
|
|
if (dev->iclk != NULL)
|
|
clk_disable(dev->iclk);
|
|
clk_disable(dev->iclk);
|