--- /dev/null
+From fba4adbbf670577e605f9ad306629db6031cd48b Mon Sep 17 00:00:00 2001
+From: Ben Gardner <gardner.ben@gmail.com>
+Date: Wed, 14 Feb 2018 09:29:52 -0600
+Subject: i2c: designware: must wait for enable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ben Gardner <gardner.ben@gmail.com>
+
+commit fba4adbbf670577e605f9ad306629db6031cd48b upstream.
+
+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@vger.kernel.org> #4.13+
+Signed-off-by: Ben Gardner <gardner.ben@gmail.com>
+Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Reviewed-by: José Roberto de Souza <jose.souza@intel.com>
+Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
+Signed-off-by: Ben Gardner <gardner.ben@gmail.com>
+[Jarkko: Backported to v4.9..v4.12 before i2c-designware-core.c was renamed to i2c-designware-master.c]
+Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/i2c/busses/i2c-designware-core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/i2c/busses/i2c-designware-core.c
++++ b/drivers/i2c/busses/i2c-designware-core.c
+@@ -507,7 +507,7 @@ static void i2c_dw_xfer_init(struct dw_i
+ 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);