aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/i2c/busses/i2c-designware.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/i2c/busses/i2c-designware.c b/drivers/i2c/busses/i2c-designware.c
index 6acbe846e9c6..cb83671ff5fc 100644
--- a/drivers/i2c/busses/i2c-designware.c
+++ b/drivers/i2c/busses/i2c-designware.c
@@ -380,14 +380,18 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
380 * reprogram the target address in the i2c 380 * reprogram the target address in the i2c
381 * adapter when we are done with this transfer 381 * adapter when we are done with this transfer
382 */ 382 */
383 if (msgs[dev->msg_write_idx].addr != addr) 383 if (msgs[dev->msg_write_idx].addr != addr) {
384 return; 384 dev_err(dev->dev,
385 "%s: invalid target address\n", __func__);
386 dev->msg_err = -EINVAL;
387 break;
388 }
385 389
386 if (msgs[dev->msg_write_idx].len == 0) { 390 if (msgs[dev->msg_write_idx].len == 0) {
387 dev_err(dev->dev, 391 dev_err(dev->dev,
388 "%s: invalid message length\n", __func__); 392 "%s: invalid message length\n", __func__);
389 dev->msg_err = -EINVAL; 393 dev->msg_err = -EINVAL;
390 return; 394 break;
391 } 395 }
392 396
393 if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) { 397 if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) {
@@ -426,6 +430,9 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
426 if (dev->msg_write_idx == dev->msgs_num) 430 if (dev->msg_write_idx == dev->msgs_num)
427 intr_mask &= ~DW_IC_INTR_TX_EMPTY; 431 intr_mask &= ~DW_IC_INTR_TX_EMPTY;
428 432
433 if (dev->msg_err)
434 intr_mask = 0;
435
429 writel(intr_mask, dev->base + DW_IC_INTR_MASK); 436 writel(intr_mask, dev->base + DW_IC_INTR_MASK);
430} 437}
431 438
@@ -628,7 +635,7 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
628 * the current transmit status. 635 * the current transmit status.
629 */ 636 */
630 637
631 if (stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) 638 if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err)
632 complete(&dev->cmd_complete); 639 complete(&dev->cmd_complete);
633 640
634 return IRQ_HANDLED; 641 return IRQ_HANDLED;