lkml.org 
[lkml]   [2012]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 09/17] i2c: omap: ack IRQ in parts
    Date
    According to flow diagrams on OMAP TRMs,
    we should ACK the IRQ as they happen.

    Signed-off-by: Felipe Balbi <balbi@ti.com>
    ---
    drivers/i2c/busses/i2c-omap.c | 28 ++++++++++++++++------------
    1 file changed, 16 insertions(+), 12 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
    index a035d16..83ae06a 100644
    --- a/drivers/i2c/busses/i2c-omap.c
    +++ b/drivers/i2c/busses/i2c-omap.c
    @@ -894,21 +894,19 @@ omap_i2c_isr(int this_irq, void *dev_id)
    }

    complete:
    - /*
    - * Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
    - * acked after the data operation is complete.
    - * Ref: TRM SWPU114Q Figure 18-31
    - */
    - omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat &
    - ~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
    - OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
    -
    - if (stat & OMAP_I2C_STAT_NACK)
    + if (stat & OMAP_I2C_STAT_NACK) {
    err |= OMAP_I2C_STAT_NACK;
    + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
    + omap_i2c_complete_cmd(dev, err);
    + return IRQ_HANDLED;
    + }

    if (stat & OMAP_I2C_STAT_AL) {
    dev_err(dev->dev, "Arbitration lost\n");
    err |= OMAP_I2C_STAT_AL;
    + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
    + omap_i2c_complete_cmd(dev, err);
    + return IRQ_HANDLED;
    }

    /*
    @@ -989,12 +987,18 @@ complete:

    if (stat & OMAP_I2C_STAT_ROVR) {
    dev_err(dev->dev, "Receive overrun\n");
    - dev->cmd_err |= OMAP_I2C_STAT_ROVR;
    + err |= OMAP_I2C_STAT_ROVR;
    + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_ROVR);
    + omap_i2c_complete_cmd(dev, err);
    + return IRQ_HANDLED;
    }

    if (stat & OMAP_I2C_STAT_XUDF) {
    dev_err(dev->dev, "Transmit underflow\n");
    - dev->cmd_err |= OMAP_I2C_STAT_XUDF;
    + err |= OMAP_I2C_STAT_XUDF;
    + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XUDF);
    + omap_i2c_complete_cmd(dev, err);
    + return IRQ_HANDLED;
    }
    } while (stat);

    --
    1.7.10.4


    \
     
     \ /
      Last update: 2012-06-14 20:21    [W:5.056 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site