|
@@ -269,47 +269,6 @@ static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg)
|
|
|
(i2c_dev->regs[reg] << i2c_dev->reg_shift));
|
|
|
}
|
|
|
|
|
|
-static void omap_i2c_unidle(struct omap_i2c_dev *dev)
|
|
|
-{
|
|
|
- if (dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) {
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, dev->pscstate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, dev->scllstate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, dev->sclhstate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, dev->bufstate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, dev->syscstate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate);
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Don't write to this register if the IE state is 0 as it can
|
|
|
- * cause deadlock.
|
|
|
- */
|
|
|
- if (dev->iestate)
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
|
|
|
-}
|
|
|
-
|
|
|
-static void omap_i2c_idle(struct omap_i2c_dev *dev)
|
|
|
-{
|
|
|
- u16 iv;
|
|
|
-
|
|
|
- dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
|
|
|
- if (dev->dtrev == OMAP_I2C_IP_VERSION_2)
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_IP_V2_IRQENABLE_CLR, 1);
|
|
|
- else
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
|
|
|
-
|
|
|
- if (dev->rev < OMAP_I2C_OMAP1_REV_2) {
|
|
|
- iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
|
|
|
- } else {
|
|
|
- omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate);
|
|
|
-
|
|
|
- /* Flush posted write */
|
|
|
- omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static int omap_i2c_init(struct omap_i2c_dev *dev)
|
|
|
{
|
|
|
u16 psc = 0, scll = 0, sclh = 0, buf = 0;
|
|
@@ -1163,8 +1122,22 @@ static int omap_i2c_runtime_suspend(struct device *dev)
|
|
|
{
|
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
|
struct omap_i2c_dev *_dev = platform_get_drvdata(pdev);
|
|
|
+ u16 iv;
|
|
|
+
|
|
|
+ _dev->iestate = omap_i2c_read_reg(_dev, OMAP_I2C_IE_REG);
|
|
|
+ if (_dev->dtrev == OMAP_I2C_IP_VERSION_2)
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_IP_V2_IRQENABLE_CLR, 1);
|
|
|
+ else
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_IE_REG, 0);
|
|
|
+
|
|
|
+ if (_dev->rev < OMAP_I2C_OMAP1_REV_2) {
|
|
|
+ iv = omap_i2c_read_reg(_dev, OMAP_I2C_IV_REG); /* Read clears */
|
|
|
+ } else {
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_STAT_REG, _dev->iestate);
|
|
|
|
|
|
- omap_i2c_idle(_dev);
|
|
|
+ /* Flush posted write */
|
|
|
+ omap_i2c_read_reg(_dev, OMAP_I2C_STAT_REG);
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -1174,7 +1147,23 @@ static int omap_i2c_runtime_resume(struct device *dev)
|
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
|
struct omap_i2c_dev *_dev = platform_get_drvdata(pdev);
|
|
|
|
|
|
- omap_i2c_unidle(_dev);
|
|
|
+ if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) {
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, 0);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_PSC_REG, _dev->pscstate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_SCLL_REG, _dev->scllstate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_SCLH_REG, _dev->sclhstate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_BUF_REG, _dev->bufstate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_SYSC_REG, _dev->syscstate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_WE_REG, _dev->westate);
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Don't write to this register if the IE state is 0 as it can
|
|
|
+ * cause deadlock.
|
|
|
+ */
|
|
|
+ if (_dev->iestate)
|
|
|
+ omap_i2c_write_reg(_dev, OMAP_I2C_IE_REG, _dev->iestate);
|
|
|
|
|
|
return 0;
|
|
|
}
|