aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-omap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/busses/i2c-omap.c')
-rw-r--r--drivers/i2c/busses/i2c-omap.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 17476ecd9782..5ca0e0010a0e 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -181,22 +181,26 @@ static void omap_i2c_unidle(struct omap_i2c_dev *dev)
181 if (dev->iclk != NULL) 181 if (dev->iclk != NULL)
182 clk_enable(dev->iclk); 182 clk_enable(dev->iclk);
183 clk_enable(dev->fclk); 183 clk_enable(dev->fclk);
184 dev->idle = 0;
184 if (dev->iestate) 185 if (dev->iestate)
185 omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); 186 omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
186 dev->idle = 0;
187} 187}
188 188
189static void omap_i2c_idle(struct omap_i2c_dev *dev) 189static void omap_i2c_idle(struct omap_i2c_dev *dev)
190{ 190{
191 u16 iv; 191 u16 iv;
192 192
193 dev->idle = 1;
194 dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); 193 dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
195 omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0); 194 omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
196 if (dev->rev1) 195 if (dev->rev1) {
197 iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */ 196 iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
198 else 197 } else {
199 omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate); 198 omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate);
199
200 /* Flush posted write before the dev->idle store occurs */
201 omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
202 }
203 dev->idle = 1;
200 clk_disable(dev->fclk); 204 clk_disable(dev->fclk);
201 if (dev->iclk != NULL) 205 if (dev->iclk != NULL)
202 clk_disable(dev->iclk); 206 clk_disable(dev->iclk);