On Mon, 23 Apr 2018, Ben Gardner wrote: > > Can you add printks in dw_readl/dw_writel and maybe a few extra printks > > in their callers to see what accesses are being made, and share the > > resulting trace? > > Sure. The log is below. I filtered out the logs from other buses and > removed repetitive messages. Thank you. As I understand from the trace, everything up until the disable-and-poll sequence is working as intended, and then the IC_ENABLE_STATUS register seems "stuck" for no apparent reason. I wonder if simply reading it once after enabling (and discarding the retrieved value) is enough to avoid the stuck state, can you please check that? I'm pasting a patch below. If that works, that would be my preference to moving forward with this issue. If not, or the idea is objectionable, then we could keep polling-after-enable but limit it to IP rev. 1.1.5 and newer. Alexander diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c index fd36c39ddf4e..1bc358766957 100644 --- a/drivers/i2c/busses/i2c-designware-master.c +++ b/drivers/i2c/busses/i2c-designware-master.c @@ -209,7 +209,8 @@ 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); + dw_readl(dev, DW_IC_ENABLE_STATUS); /* Clear and enable interrupts */ dw_readl(dev, DW_IC_CLR_INTR);