LGTM On Wed, 2018-02-14 at 09:29 -0600, Ben Gardner wrote: > One I2C bus on my Atom E3845 board has been broken since 4.9. > It has two devices, both declared by ACPI and with built-in drivers. > > There are two back-to-back transactions originating from the kernel, > one > targeting each device. The first transaction works, the second one > locks > up the I2C controller. The controller never recovers. > > These kernel logs show up whenever an I2C transaction is attempted > after > this failure. > i2c-designware-pci 0000:00:18.3: timeout in disabling adapter > i2c-designware-pci 0000:00:18.3: timeout waiting for bus ready > > Waiting for the I2C controller status to indicate that it is enabled > before programming it fixes the issue. > > I have tested this patch on 4.14 and 4.15. > > Fixes: commit 2702ea7dbec5 ("i2c: designware: wait for disable/enable > only if necessary") > Cc: linux-stable <stable@xxxxxxxxxxxxxxx> #4.13+ > Cc: José Roberto de Souza <jose.souza@xxxxxxxxx> Reviewed-by: José Roberto de Souza <jose.souza@xxxxxxxxx> > Signed-off-by: Ben Gardner <gardner.ben@xxxxxxxxx> > --- > drivers/i2c/busses/i2c-designware-master.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/i2c/busses/i2c-designware-master.c > b/drivers/i2c/busses/i2c-designware-master.c > index ae69188..55926ef 100644 > --- a/drivers/i2c/busses/i2c-designware-master.c > +++ b/drivers/i2c/busses/i2c-designware-master.c > @@ -209,7 +209,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev > *dev) > i2c_dw_disable_int(dev); > > /* Enable the adapter */ > - __i2c_dw_enable(dev, true); > + __i2c_dw_enable_and_wait(dev, true); > > /* Clear and enable interrupts */ > dw_readl(dev, DW_IC_CLR_INTR);