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 3/8] i2c: i2c-bfin-twi: Break dead waiting loop if i2c device misbehaves.
    Date
    From: Sonic Zhang <sonic.zhang@analog.com>

    Some fault i2c device may hold the sda/scl line and cause i2c driver
    wait in the BUS busy loop. This patch breaks this potential dead
    loop.

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

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

    diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
    index 376e331..4abaf59 100644
    --- a/drivers/i2c/busses/i2c-bfin-twi.c
    +++ b/drivers/i2c/busses/i2c-bfin-twi.c
    @@ -294,6 +294,8 @@ static irqreturn_t bfin_twi_interrupt_entry(int irq, void *dev_id)
    return IRQ_HANDLED;
    }

    +#define BFIN_TWI_BUSY_TIMEOUT 1000
    +
    /*
    * One i2c master transfer
    */
    @@ -303,12 +305,16 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap,
    struct bfin_twi_iface *iface = adap->algo_data;
    struct i2c_msg *pmsg;
    int rc = 0;
    + unsigned int busy_timeout = BFIN_TWI_BUSY_TIMEOUT;

    if (!(read_CONTROL(iface) & TWI_ENA))
    return -ENXIO;

    - while (read_MASTER_STAT(iface) & BUSBUSY)
    + while (read_MASTER_STAT(iface) & BUSBUSY) {
    + if (--busy_timeout == 0)
    + return -EBUSY;
    yield();
    + }

    iface->pmsg = msgs;
    iface->msg_num = num;
    @@ -403,12 +409,16 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr,
    {
    struct bfin_twi_iface *iface = adap->algo_data;
    int rc = 0;
    + unsigned int busy_timeout = BFIN_TWI_BUSY_TIMEOUT;

    if (!(read_CONTROL(iface) & TWI_ENA))
    return -ENXIO;

    - while (read_MASTER_STAT(iface) & BUSBUSY)
    + while (read_MASTER_STAT(iface) & BUSBUSY) {
    + if (--busy_timeout == 0)
    + return -EBUSY;
    yield();
    + }

    iface->writeNum = 0;
    iface->readNum = 0;
    --
    1.7.0.4



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