"HU TAO-TGHK48" <taohu@xxxxxxxxxxxx> writes: > I think we also need extra patch for fixing stability issue. > > Sometimes after back from retention/off mode, OMAP3430 I2C controller > stops working even all register settings are restored. > > OMAP3430 TRM says: "During active mode (I2Ci.I2C_CON[15] I2C_EN bit is > set to 1), make no changes to the I2Ci.I2C_SCLL and I2Ci.I2C_SCLH > registers. > Changes may result in unpredictable behavior." > > diff --git a/drivers/i2c/busses/i2c-omap.c > b/drivers/i2c/busses/i2c-omap.c index 5ce055c..b084209 100644 > --- a/drivers/i2c/busses/i2c-omap.c > +++ b/drivers/i2c/busses/i2c-omap.c > @@ -238,12 +238,14 @@ static void omap_i2c_unidle(struct omap_i2c_dev > *dev) > clk_enable(dev->iclk); > clk_enable(dev->fclk); > if (cpu_is_omap34xx()) { > + 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); > } > dev->idle = 0; > omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); Shouldn't you do a read-modify-write of I2C_CON_REG here? Otherwise, you're loosing any of the other settings in I2C_CON_REG. Not being an expert in the I2C hardware, I'm not sure if it matters, but this doesn't seem quite right due to possible side effects. Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html