"HU TAO-TGHK48" <[email protected]> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to