diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-omap.c | 12 |
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 | ||
189 | static void omap_i2c_idle(struct omap_i2c_dev *dev) | 189 | static 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); |