From 16fef1decdbb12fe6a27862b36b3952c5372a940 Mon Sep 17 00:00:00 2001 From: Shinya Kuribayashi Date: Fri, 6 Nov 2009 21:51:18 +0900 Subject: [PATCH] --- yaml --- r: 173863 b: refs/heads/master c: 8f588e40c788e63756ca1028c253f9f663d7d1c5 h: refs/heads/master i: 173861: 06020e91ab7da8d0fe62f945ed985fa86fae1353 173859: effbcf43eb2bb67fe8a391a971a735d324abb070 173855: fd0b4c86320e1de38fe76c861e219f123467c533 v: v3 --- [refs] | 2 +- trunk/drivers/i2c/busses/i2c-designware.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index faea3f37eb26..4d5decf52ae8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 69151e532c97f983b498ea03e20b1598a5487318 +refs/heads/master: 8f588e40c788e63756ca1028c253f9f663d7d1c5 diff --git a/trunk/drivers/i2c/busses/i2c-designware.c b/trunk/drivers/i2c/busses/i2c-designware.c index 6acbe846e9c6..cb83671ff5fc 100644 --- a/trunk/drivers/i2c/busses/i2c-designware.c +++ b/trunk/drivers/i2c/busses/i2c-designware.c @@ -380,14 +380,18 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) * reprogram the target address in the i2c * adapter when we are done with this transfer */ - if (msgs[dev->msg_write_idx].addr != addr) - return; + if (msgs[dev->msg_write_idx].addr != addr) { + dev_err(dev->dev, + "%s: invalid target address\n", __func__); + dev->msg_err = -EINVAL; + break; + } if (msgs[dev->msg_write_idx].len == 0) { dev_err(dev->dev, "%s: invalid message length\n", __func__); dev->msg_err = -EINVAL; - return; + break; } if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) { @@ -426,6 +430,9 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev) if (dev->msg_write_idx == dev->msgs_num) intr_mask &= ~DW_IC_INTR_TX_EMPTY; + if (dev->msg_err) + intr_mask = 0; + writel(intr_mask, dev->base + DW_IC_INTR_MASK); } @@ -628,7 +635,7 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id) * the current transmit status. */ - if (stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) + if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err) complete(&dev->cmd_complete); return IRQ_HANDLED;