On Sat, Apr 28, 2018 at 8:56 AM, Alexander Monakov <amonakov@xxxxxxxxx> wrote: > Not all revisions of DW I2C controller implement the enable status register. > On platforms where that's the case (e.g. BG2CD and SPEAr ARM SoCs), waiting > for enable will time out as reading the unimplemented register yields zero. > > It was observed that reading the IC_ENABLE_STATUS register once suffices to > avoid getting it stuck on Bay Trail hardware, so replace polling with one > dummy read of the register. > > Cc: Ben Gardner <gardner.ben@xxxxxxxxx> > Cc: Jarkko Nikula <jarkko.nikula@xxxxxxxxxxxxxxx> > Cc: Wolfram Sang <wsa@xxxxxxxxxxxxx> > Fixes: fba4adbbf670 ("i2c: designware: must wait for enable") > Tested-by: Ben Gardner <gardner.ben@xxxxxxxxx> > Signed-off-by: Alexander Monakov <amonakov@xxxxxxxxx> > --- > drivers/i2c/busses/i2c-designware-master.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c > index fd36c39ddf4e..0cdba29ae0a9 100644 > --- a/drivers/i2c/busses/i2c-designware-master.c > +++ b/drivers/i2c/busses/i2c-designware-master.c > @@ -209,7 +209,10 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) > i2c_dw_disable_int(dev); > > /* Enable the adapter */ > - __i2c_dw_enable_and_wait(dev, true); > + __i2c_dw_enable(dev, true); > + > + /* Dummy read to avoid the register getting stuck on Bay Trail */ > + dw_readl(dev, DW_IC_ENABLE_STATUS); > > /* Clear and enable interrupts */ > dw_readl(dev, DW_IC_CLR_INTR); > -- Tested-by: Ben Gardner <gardner.ben@xxxxxxxxx> Thanks.