Message ID | 1432818224-17070-8-git-send-email-vaibhav.hiremath@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Vaibhav Hiremath <vaibhav.hiremath@linaro.org> writes: > In case of timeout during msg xfer assert reset to > i2c controller for both interrupt and PIO mode of operation. > > Signed-off-by: Jett.Zhou <jtzhou@marvell.com> > [vaibhav.hiremath@linaro.org: Split & merge patches into logical changes > and update the Changelog] > Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org> > > Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org> I have the same comment as before. I don't like a reset in the transfer path, especially in normal busy phases for slow I2C devices. A quirk as before. Cheers. -- Robert
On Saturday 30 May 2015 02:43 AM, Robert Jarzmik wrote: > Vaibhav Hiremath <vaibhav.hiremath@linaro.org> writes: > >> In case of timeout during msg xfer assert reset to >> i2c controller for both interrupt and PIO mode of operation. >> >> Signed-off-by: Jett.Zhou <jtzhou@marvell.com> >> [vaibhav.hiremath@linaro.org: Split & merge patches into logical changes >> and update the Changelog] >> Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org> >> >> Signed-off-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org> > I have the same comment as before. > I don't like a reset in the transfer path, especially in normal busy phases for > slow I2C devices. A quirk as before. > Note that this assertion of reset in in case of timeout error. Timeout error may be due to various reasons, and this is recovery mechanism. Thanks, Vaibhav
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 2777d5c..3c6ebb5 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c @@ -197,6 +197,8 @@ struct pxa_i2c { */ #define I2C_PXA_SLAVE_ADDR 0x1 +static void i2c_pxa_reset(struct pxa_i2c *i2c); + #ifdef DEBUG struct bits { @@ -846,6 +848,9 @@ out: ret = I2C_RETRY; } + if (ret < 0) + i2c_pxa_reset(i2c); + return ret; } @@ -912,6 +917,9 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) } out: + if (ret < 0) + i2c_pxa_reset(i2c); + return ret; }