lkml.org 
[lkml]   [2012]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 2/8] i2c: i2c-bfin-twi: Stop receiving operation immediately in last rx interrupt.
    From
    PING

    On Wed, May 16, 2012 at 3:20 PM, <sonic.zhang@analog.com> wrote:
    > 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
    >
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at  http://vger.kernel.org/majordomo-info.html
    > Please read the FAQ at  http://www.tux.org/lkml/
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2012-05-24 12:02    [W:0.053 / U:121.260 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site