lkml.org 
[lkml]   [2010]   [May]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] i2c-bfin-twi: handle faulty slave devices better
    Date
    From: Michael Hennerich <michael.hennerich@analog.com>

    Faulty slave devices might drive SDA low after a transfer finishes. So,
    when this scenario is detected, have the master generate up to 8 extra
    clocks until the SDA is properly released.

    Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
    Signed-off-by: Mike Frysinger <vapier@gentoo.org>
    ---
    Note: this requires the existing Blackfin TWI patches already sent out

    drivers/i2c/busses/i2c-bfin-twi.c | 22 ++++++++++++++++++++++
    1 files changed, 22 insertions(+), 0 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
    index fb26e5c..f9c05e1 100644
    --- a/drivers/i2c/busses/i2c-bfin-twi.c
    +++ b/drivers/i2c/busses/i2c-bfin-twi.c
    @@ -20,6 +20,7 @@
    #include <linux/completion.h>
    #include <linux/interrupt.h>
    #include <linux/platform_device.h>
    +#include <linux/delay.h>

    #include <asm/blackfin.h>
    #include <asm/portmux.h>
    @@ -159,6 +160,27 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
    if (mast_stat & BUFWRERR)
    dev_dbg(&iface->adap.dev, "Buffer Write Error\n");

    + /* Faulty salve devices, may drive SDA low after a transfer
    + * finishes. To release the bus this code generates up to 8
    + * extra clocks until SDA is released.
    + */
    +
    + if (read_MASTER_STAT(iface) & SDASEN) {
    + int cnt = 8;
    + do {
    + write_MASTER_CTL(iface, SCLOVR);
    + udelay(6);
    + write_MASTER_CTL(iface, 0);
    + udelay(6);
    + } while ((read_MASTER_STAT(iface) & SDASEN) && cnt--);
    +
    + write_MASTER_CTL(iface, SDAOVR | SCLOVR);
    + udelay(6);
    + write_MASTER_CTL(iface, SDAOVR);
    + udelay(6);
    + write_MASTER_CTL(iface, 0);
    + }
    +
    /* If it is a quick transfer, only address without data,
    * not an err, return 1.
    */
    --
    1.7.1


    \
     
     \ /
      Last update: 2010-05-09 13:05    [W:0.023 / U:33.224 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site