rx_limit = dev->rx_fifo_depth - dw_readl(dev, DW_IC_RXFLR);
 
                while (buf_len > 0 && tx_limit > 0 && rx_limit > 0) {
+                       u32 cmd = 0;
+
+                       /*
+                        * If IC_EMPTYFIFO_HOLD_MASTER_EN is set we must
+                        * manually set the stop bit. However, it cannot be
+                        * detected from the registers so we set it always
+                        * when writing/reading the last byte.
+                        */
+                       if (dev->msg_write_idx == dev->msgs_num - 1 &&
+                           buf_len == 1)
+                               cmd |= BIT(9);
+
                        if (msgs[dev->msg_write_idx].flags & I2C_M_RD) {
-                               dw_writel(dev, 0x100, DW_IC_DATA_CMD);
+                               dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD);
                                rx_limit--;
                        } else
-                               dw_writel(dev, *buf++, DW_IC_DATA_CMD);
+                               dw_writel(dev, cmd | *buf++, DW_IC_DATA_CMD);
                        tx_limit--; buf_len--;
                }