lkml.org 
[lkml]   [2012]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/8] i2c: i2c-bfin-twi: Stop receiving operation immediately in last rx interrupt.
    Date
    From: Sonic Zhang <sonic.zhang@analog.com>

    Also wake up waiting process when transfer completes.

    Signed-off-by: Sonic Zhang <sonic.zhang@analog.com>

    git-svn-id: svn://localhost/svn/linux-kernel/trunk@9105 526b6c2d-f592-4532-a319-5dd88ccb003d
    ---
    drivers/i2c/busses/i2c-bfin-twi.c | 43 ++++++++++++++++++++----------------
    1 files changed, 24 insertions(+), 19 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
    index e6dd3c9..376e331 100644
    --- a/drivers/i2c/busses/i2c-bfin-twi.c
    +++ b/drivers/i2c/busses/i2c-bfin-twi.c
    @@ -130,21 +130,25 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
    }
    iface->transPtr++;
    iface->readNum--;
    - } else if (iface->manual_stop) {
    - /* Avoid possible bus stall -
    - * Flush FIFO before issuing the STOP condition
    - */
    - read_RCV_DATA16(iface);
    - write_MASTER_CTL(iface,
    - read_MASTER_CTL(iface) | STOP);
    - } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
    - iface->cur_msg + 1 < iface->msg_num) {
    - if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD)
    - write_MASTER_CTL(iface,
    - read_MASTER_CTL(iface) | RSTART | MDIR);
    - else
    + }
    +
    + if (iface->readNum == 0) {
    + if (iface->manual_stop) {
    + /* Avoid possible bus stall -
    + * Flush FIFO before issuing the STOP condition
    + */
    + read_RCV_DATA16(iface);
    write_MASTER_CTL(iface,
    - (read_MASTER_CTL(iface) | RSTART) & ~MDIR);
    + read_MASTER_CTL(iface) | STOP);
    + } else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
    + iface->cur_msg + 1 < iface->msg_num) {
    + if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD)
    + write_MASTER_CTL(iface,
    + read_MASTER_CTL(iface) | RSTART | MDIR);
    + else
    + write_MASTER_CTL(iface,
    + (read_MASTER_CTL(iface) | RSTART) & ~MDIR);
    + }
    }
    }
    if (twi_int_status & MERR) {
    @@ -245,12 +249,13 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
    }
    }

    - if (iface->pmsg[iface->cur_msg].len <= 255)
    - write_MASTER_CTL(iface,
    + if (iface->pmsg[iface->cur_msg].len <= 255) {
    + write_MASTER_CTL(iface,
    (read_MASTER_CTL(iface) &
    (~(0xff << 6))) |
    - (iface->pmsg[iface->cur_msg].len << 6));
    - else {
    + (iface->pmsg[iface->cur_msg].len << 6));
    + iface->manual_stop = 0;
    + } else {
    write_MASTER_CTL(iface,
    (read_MASTER_CTL(iface) |
    (0xff << 6)));
    @@ -264,8 +269,8 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
    write_INT_MASK(iface, 0);
    write_MASTER_CTL(iface, 0);
    }
    + complete(&iface->complete);
    }
    - complete(&iface->complete);
    }

    /* Interrupt handler */
    --
    1.7.0.4



    \
     
     \ /
      Last update: 2012-05-16 10:41    [W:0.052 / U:61.600 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site