summaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-designware-master.c
diff options
context:
space:
mode:
authorAlexander Monakov2018-04-28 15:56:06 +0200
committerWolfram Sang2018-05-10 12:30:20 +0200
commit06cb616b1bca7080824acfedb3d4c898e7a64836 (patch)
tree06acef331b438d39e151dd3b2ab909bbc5c0d690 /drivers/i2c/busses/i2c-designware-master.c
parentMerge tag 'at24-4.17-rc5-fixes-for-wolfram' of git://git.kernel.org/pub/scm/l... (diff)
downloadkernel-qcow2-linux-06cb616b1bca7080824acfedb3d4c898e7a64836.tar.gz
kernel-qcow2-linux-06cb616b1bca7080824acfedb3d4c898e7a64836.tar.xz
kernel-qcow2-linux-06cb616b1bca7080824acfedb3d4c898e7a64836.zip
i2c: designware: fix poll-after-enable regression
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. Fixes: fba4adbbf670 ("i2c: designware: must wait for enable") Signed-off-by: Alexander Monakov <amonakov@ispras.ru> Tested-by: Ben Gardner <gardner.ben@gmail.com> Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de> Cc: stable@kernel.org
Diffstat (limited to 'drivers/i2c/busses/i2c-designware-master.c')
-rw-r--r--drivers/i2c/busses/i2c-designware-master.c5
1 files changed, 4 insertions, 1 deletions
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);