From 9abd38ea96868230e8a5462b5ed997d1cb150027 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Wed, 12 Sep 2012 16:28:11 +0530 Subject: [PATCH] --- yaml --- r: 333391 b: refs/heads/master c: b07be0f3b9e1bed6cbd29117d7f0519d114fbd82 h: refs/heads/master i: 333389: 47ab6635b72b7497c13cd084674bc64b220c656f 333387: 6dc841adbe2735e421471d773ddc5872fddf1897 333383: e9c95ac4a4f38d2722307b51935ad1e2df9441e2 333375: 5b0e89b09ae172b6c40374c98aab4b37e8e974e6 v: v3 --- [refs] | 2 +- trunk/drivers/i2c/busses/i2c-omap.c | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 029c05779512..2d045dc8460b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dd74548ddece4b9d68e5528287a272fa552c81d0 +refs/heads/master: b07be0f3b9e1bed6cbd29117d7f0519d114fbd82 diff --git a/trunk/drivers/i2c/busses/i2c-omap.c b/trunk/drivers/i2c/busses/i2c-omap.c index f33bc5a55074..5d4bad44d370 100644 --- a/trunk/drivers/i2c/busses/i2c-omap.c +++ b/trunk/drivers/i2c/busses/i2c-omap.c @@ -775,6 +775,17 @@ static int errata_omap3_i462(struct omap_i2c_dev *dev) if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); + if (stat & OMAP_I2C_STAT_NACK) { + dev->cmd_err |= OMAP_I2C_STAT_NACK; + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); + } + + if (stat & OMAP_I2C_STAT_AL) { + dev_err(dev->dev, "Arbitration lost\n"); + dev->cmd_err |= OMAP_I2C_STAT_AL; + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); + } + return -EIO; } @@ -875,7 +886,6 @@ omap_i2c_isr(int this_irq, void *dev_id) goto out; } -complete: if (stat & OMAP_I2C_STAT_NACK) { err |= OMAP_I2C_STAT_NACK; omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); @@ -938,7 +948,7 @@ omap_i2c_isr(int this_irq, void *dev_id) ret = omap_i2c_transmit_data(dev, num_bytes, true); stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); if (ret < 0) - goto complete; + goto out; omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR); continue; @@ -954,7 +964,7 @@ omap_i2c_isr(int this_irq, void *dev_id) ret = omap_i2c_transmit_data(dev, num_bytes, false); stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); if (ret < 0) - goto complete; + goto out; omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); continue;