void __i2c_dw_disable(struct dw_i2c_dev *dev)
 {
+       struct i2c_timings *t = &dev->timings;
        unsigned int raw_intr_stats;
        unsigned int enable;
        int timeout = 100;
 
        abort_needed = raw_intr_stats & DW_IC_INTR_MST_ON_HOLD;
        if (abort_needed) {
+               if (!(enable & DW_IC_ENABLE_ENABLE)) {
+                       regmap_write(dev->map, DW_IC_ENABLE, DW_IC_ENABLE_ENABLE);
+                       /*
+                        * Wait 10 times the signaling period of the highest I2C
+                        * transfer supported by the driver (for 400KHz this is
+                        * 25us) to ensure the I2C ENABLE bit is already set
+                        * as described in the DesignWare I2C databook.
+                        */
+                       fsleep(DIV_ROUND_CLOSEST_ULL(10 * MICRO, t->bus_freq_hz));
+                       /* Set ENABLE bit before setting ABORT */
+                       enable |= DW_IC_ENABLE_ENABLE;
+               }
+
                regmap_write(dev->map, DW_IC_ENABLE, enable | DW_IC_ENABLE_ABORT);
                ret = regmap_read_poll_timeout(dev->map, DW_IC_ENABLE, enable,
                                               !(enable & DW_IC_ENABLE_ABORT), 10,
 
        __i2c_dw_write_intr_mask(dev, DW_IC_INTR_MASTER_MASK);
 }
 
+/*
+ * This function waits for the controller to be idle before disabling I2C
+ * When the controller is not in the IDLE state, the MST_ACTIVITY bit
+ * (IC_STATUS[5]) is set.
+ *
+ * Values:
+ * 0x1 (ACTIVE): Controller not idle
+ * 0x0 (IDLE): Controller is idle
+ *
+ * The function is called after completing the current transfer.
+ *
+ * Returns:
+ * False when the controller is in the IDLE state.
+ * True when the controller is in the ACTIVE state.
+ */
+static bool i2c_dw_is_controller_active(struct dw_i2c_dev *dev)
+{
+       u32 status;
+
+       regmap_read(dev->map, DW_IC_STATUS, &status);
+       if (!(status & DW_IC_STATUS_MASTER_ACTIVITY))
+               return false;
+
+       return regmap_read_poll_timeout(dev->map, DW_IC_STATUS, status,
+                                      !(status & DW_IC_STATUS_MASTER_ACTIVITY),
+                                      1100, 20000) != 0;
+}
+
 static int i2c_dw_check_stopbit(struct dw_i2c_dev *dev)
 {
        u32 val;
                goto done;
        }
 
+       /*
+        * This happens rarely (~1:500) and is hard to reproduce. Debug trace
+        * showed that IC_STATUS had value of 0x23 when STOP_DET occurred,
+        * if disable IC_ENABLE.ENABLE immediately that can result in
+        * IC_RAW_INTR_STAT.MASTER_ON_HOLD holding SCL low. Check if
+        * controller is still ACTIVE before disabling I2C.
+        */
+       if (i2c_dw_is_controller_active(dev))
+               dev_err(dev->dev, "controller active\n");
+
        /*
         * We must disable the adapter before returning and signaling the end
         * of the current transfer. Otherwise the hardware might continue