Changeset 4388

Show
Ignore:
Timestamp:
05/05/07 17:38:06 (1 year ago)
Author:
khali
Message:

i2c-algo-bit: Always send a stop condition before leaving. This is a
backport from Linux 2.6.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • i2c/trunk/CHANGES

    r4302 r4388  
    99 
    1010SVN HEAD 
     11  i2c-algo-bit: Always send a stop condition before leaving (2.6 backport) 
    1112 
    1213 
  • i2c/trunk/kernel/i2c-algo-bit.c

    r4246 r4388  
    316316        for (i=0;i<=retries;i++) { 
    317317                ret = i2c_outb(i2c_adap,addr); 
    318                 if (ret==1
    319                         break; /* success! */ 
     318                if (ret == 1 || i == retries
     319                        break; 
    320320                i2c_stop(adap); 
    321321                udelay(5/*adap->udelay*/); 
    322                 if (i==retries)  /* no success */ 
    323                         break; 
    324322                i2c_start(adap); 
    325323                udelay(adap->udelay); 
     
    335333static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) 
    336334{ 
    337         struct i2c_algo_bit_data *adap = i2c_adap->algo_data; 
    338335        char c; 
    339336        const char *temp = msg->buf; 
     
    355352                        printk(KERN_ERR "i2c-algo-bit.o: %s sendbytes: error - bailout.\n", 
    356353                               i2c_adap->name); 
    357                         i2c_stop(adap); 
    358354                        return (retval<0)? retval : -EFAULT; 
    359355                                /* got a better one ?? */ 
     
    501497                                DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d\n", 
    502498                                        msgs[i].addr,i)); 
    503                                 return (ret<0) ? ret : -EREMOTEIO
     499                                goto bailout
    504500                        } 
    505501                } 
     
    508504                        ret = readbytes(i2c_adap, pmsg); 
    509505                        DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes.\n",ret)); 
    510                         if (ret < pmsg->len ) { 
    511                                 return (ret<0)? ret : -EREMOTEIO; 
     506                        if (ret < pmsg->len) { 
     507                                if (ret >= 0) 
     508                                        ret = -EREMOTEIO; 
     509                                goto bailout; 
    512510                        } 
    513511                } else { 
     
    515513                        ret = sendbytes(i2c_adap, pmsg); 
    516514                        DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes.\n",ret)); 
    517                         if (ret < pmsg->len ) { 
    518                                 return (ret<0) ? ret : -EREMOTEIO; 
     515                        if (ret < pmsg->len) { 
     516                                if (ret >= 0) 
     517                                        ret = -EREMOTEIO; 
     518                                goto bailout; 
    519519                        } 
    520520                } 
    521521        } 
     522        ret = i; 
     523 
     524bailout: 
    522525        i2c_stop(adap); 
    523         return num
     526        return ret
    524527} 
    525528