Merge branches 'at91', 'dyntick', 'ep93xx', 'iop', 'ixp', 'misc', 'orion', 'omap...
[pandora-kernel.git] / drivers / i2c / algos / i2c-algo-bit.c
index fc16f9d..3581282 100644 (file)
@@ -1,7 +1,7 @@
-/* ------------------------------------------------------------------------- */
-/* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters              */
-/* ------------------------------------------------------------------------- */
-/*   Copyright (C) 1995-2000 Simon G. Vogl
+/* -------------------------------------------------------------------------
+ * i2c-algo-bit.c i2c driver algorithms for bit-shift adapters
+ * -------------------------------------------------------------------------
+ *   Copyright (C) 1995-2000 Simon G. Vogl
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               */
-/* ------------------------------------------------------------------------- */
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * ------------------------------------------------------------------------- */
 
-/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
+/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
    <kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
 
 #include <linux/kernel.h>
 
 
 /* ----- global defines ----------------------------------------------- */
-#define DEB(x) if (i2c_debug>=1) x;
-#define DEB2(x) if (i2c_debug>=2) x;
-#define DEBSTAT(x) if (i2c_debug>=3) x; /* print several statistical values*/
-#define DEBPROTO(x) if (i2c_debug>=9) { x; }
-       /* debug the protocol by showing transferred bits */
 
+#ifdef DEBUG
+#define bit_dbg(level, dev, format, args...) \
+       do { \
+               if (i2c_debug >= level) \
+                       dev_dbg(dev, format, ##args); \
+       } while (0)
+#else
+#define bit_dbg(level, dev, format, args...) \
+       do {} while (0)
+#endif /* DEBUG */
 
 /* ----- global variables ---------------------------------------------        */
 
-/* module parameters:
- */
-static int i2c_debug;
 static int bit_test;   /* see if the line-setting functions work       */
+module_param(bit_test, bool, 0);
+MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
+
+#ifdef DEBUG
+static int i2c_debug = 1;
+module_param(i2c_debug, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(i2c_debug,
+                "debug level - 0 off; 1 normal; 2 verbose; 3 very verbose");
+#endif
 
 /* --- setting states on the bus with the right timing: ---------------        */
 
-#define setsda(adap,val) adap->setsda(adap->data, val)
-#define setscl(adap,val) adap->setscl(adap->data, val)
-#define getsda(adap) adap->getsda(adap->data)
-#define getscl(adap) adap->getscl(adap->data)
+#define setsda(adap, val)      adap->setsda(adap->data, val)
+#define setscl(adap, val)      adap->setscl(adap->data, val)
+#define getsda(adap)           adap->getsda(adap->data)
+#define getscl(adap)           adap->getscl(adap->data)
 
 static inline void sdalo(struct i2c_algo_bit_data *adap)
 {
-       setsda(adap,0);
-       udelay(adap->udelay);
+       setsda(adap, 0);
+       udelay((adap->udelay + 1) / 2);
 }
 
 static inline void sdahi(struct i2c_algo_bit_data *adap)
 {
-       setsda(adap,1);
-       udelay(adap->udelay);
+       setsda(adap, 1);
+       udelay((adap->udelay + 1) / 2);
 }
 
 static inline void scllo(struct i2c_algo_bit_data *adap)
 {
-       setscl(adap,0);
-       udelay(adap->udelay);
+       setscl(adap, 0);
+       udelay(adap->udelay / 2);
 }
 
 /*
@@ -80,72 +91,74 @@ static int sclhi(struct i2c_algo_bit_data *adap)
 {
        unsigned long start;
 
-       setscl(adap,1);
+       setscl(adap, 1);
 
        /* Not all adapters have scl sense line... */
        if (!adap->getscl)
                goto done;
 
-       start=jiffies;
-       while (! getscl(adap) ) {       
-               /* the hw knows how to read the clock line,
-                * so we wait until it actually gets high.
-                * This is safer as some chips may hold it low
-                * while they are processing data internally. 
-                */
-               if (time_after_eq(jiffies, start+adap->timeout)) {
+       start = jiffies;
+       while (!getscl(adap)) {
+               /* This hw knows how to read the clock line, so we wait
+                * until it actually gets high.  This is safer as some
+                * chips may hold it low ("clock stretching") while they
+                * are processing data internally.
+                */
+               if (time_after_eq(jiffies, start + adap->timeout))
                        return -ETIMEDOUT;
-               }
                cond_resched();
        }
-       DEBSTAT(printk(KERN_DEBUG "needed %ld jiffies\n", jiffies-start));
+#ifdef DEBUG
+       if (jiffies != start && i2c_debug >= 3)
+               pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go "
+                        "high\n", jiffies - start);
+#endif
 
 done:
        udelay(adap->udelay);
        return 0;
-} 
+}
 
 
 /* --- other auxiliary functions --------------------------------------        */
-static void i2c_start(struct i2c_algo_bit_data *adap) 
+static void i2c_start(struct i2c_algo_bit_data *adap)
 {
        /* assert: scl, sda are high */
-       DEBPROTO(printk("S "));
-       sdalo(adap);
+       setsda(adap, 0);
+       udelay(adap->udelay);
        scllo(adap);
 }
 
-static void i2c_repstart(struct i2c_algo_bit_data *adap) 
+static void i2c_repstart(struct i2c_algo_bit_data *adap)
 {
-       /* scl, sda may not be high */
-       DEBPROTO(printk(" Sr "));
-       setsda(adap,1);
+       /* assert: scl is low */
+       sdahi(adap);
        sclhi(adap);
-       
-       sdalo(adap);
+       setsda(adap, 0);
+       udelay(adap->udelay);
        scllo(adap);
 }
 
 
-static void i2c_stop(struct i2c_algo_bit_data *adap) 
+static void i2c_stop(struct i2c_algo_bit_data *adap)
 {
-       DEBPROTO(printk("P\n"));
        /* assert: scl is low */
        sdalo(adap);
-       sclhi(adap); 
-       sdahi(adap);
+       sclhi(adap);
+       setsda(adap, 1);
+       udelay(adap->udelay);
 }
 
 
 
-/* send a byte without start cond., look for arbitration, 
+/* send a byte without start cond., look for arbitration,
    check ackn. from slave */
 /* returns:
  * 1 if the device acknowledged
  * 0 if the device did not ack
  * -ETIMEDOUT if an error occurred (while raising the scl line)
  */
-static int i2c_outb(struct i2c_adapter *i2c_adap, char c)
+static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c)
 {
        int i;
        int sb;
@@ -153,141 +166,139 @@ static int i2c_outb(struct i2c_adapter *i2c_adap, char c)
        struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
 
        /* assert: scl is low */
-       for ( i=7 ; i>=0 ; i-- ) {
-               sb = c & ( 1 << i );
-               setsda(adap,sb);
-               udelay(adap->udelay);
-               DEBPROTO(printk(KERN_DEBUG "%d",sb!=0));
-               if (sclhi(adap)<0) { /* timed out */
-                       sdahi(adap); /* we don't want to block the net */
-                       DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at bit #%d\n", c&0xff, i));
+       for (i = 7; i >= 0; i--) {
+               sb = (c >> i) & 1;
+               setsda(adap, sb);
+               udelay((adap->udelay + 1) / 2);
+               if (sclhi(adap) < 0) { /* timed out */
+                       bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
+                               "timeout at bit #%d\n", (int)c, i);
                        return -ETIMEDOUT;
-               };
-               /* do arbitration here: 
-                * if ( sb && ! getsda(adap) ) -> ouch! Get out of here.
+               }
+               /* FIXME do arbitration here:
+                * if (sb && !getsda(adap)) -> ouch! Get out of here.
+                *
+                * Report a unique code, so higher level code can retry
+                * the whole (combined) message and *NOT* issue STOP.
                 */
-               setscl(adap, 0 );
-               udelay(adap->udelay);
+               scllo(adap);
        }
        sdahi(adap);
-       if (sclhi(adap)<0){ /* timeout */
-           DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x, timeout at ack\n", c&0xff));
-           return -ETIMEDOUT;
-       };
-       /* read ack: SDA should be pulled down by slave */
-       ack=getsda(adap);       /* ack: sda is pulled low ->success.     */
-       DEB2(printk(KERN_DEBUG " i2c_outb: 0x%02x , getsda() = %d\n", c & 0xff, ack));
-
-       DEBPROTO( printk(KERN_DEBUG "[%2.2x]",c&0xff) );
-       DEBPROTO(if (0==ack){ printk(KERN_DEBUG " A ");} else printk(KERN_DEBUG " NA ") );
+       if (sclhi(adap) < 0) { /* timeout */
+               bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
+                       "timeout at ack\n", (int)c);
+               return -ETIMEDOUT;
+       }
+
+       /* read ack: SDA should be pulled down by slave, or it may
+        * NAK (usually to report problems with the data we wrote).
+        */
+       ack = !getsda(adap);    /* ack: sda is pulled low -> success */
+       bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c,
+               ack ? "A" : "NA");
+
        scllo(adap);
-       return 0==ack;          /* return 1 if device acked      */
+       return ack;
        /* assert: scl is low (sda undef) */
 }
 
 
-static int i2c_inb(struct i2c_adapter *i2c_adap) 
+static int i2c_inb(struct i2c_adapter *i2c_adap)
 {
        /* read byte via i2c port, without start/stop sequence  */
        /* acknowledge is sent in i2c_read.                     */
        int i;
-       unsigned char indata=0;
+       unsigned char indata = 0;
        struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
 
        /* assert: scl is low */
        sdahi(adap);
-       for (i=0;i<8;i++) {
-               if (sclhi(adap)<0) { /* timeout */
-                       DEB2(printk(KERN_DEBUG " i2c_inb: timeout at bit #%d\n", 7-i));
+       for (i = 0; i < 8; i++) {
+               if (sclhi(adap) < 0) { /* timeout */
+                       bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit "
+                               "#%d\n", 7 - i);
                        return -ETIMEDOUT;
-               };
+               }
                indata *= 2;
-               if ( getsda(adap) ) 
+               if (getsda(adap))
                        indata |= 0x01;
-               scllo(adap);
+               setscl(adap, 0);
+               udelay(i == 7 ? adap->udelay / 2 : adap->udelay);
        }
        /* assert: scl is low */
-       DEB2(printk(KERN_DEBUG "i2c_inb: 0x%02x\n", indata & 0xff));
-
-       DEBPROTO(printk(KERN_DEBUG " 0x%02x", indata & 0xff));
-       return (int) (indata & 0xff);
+       return indata;
 }
 
 /*
  * Sanity check for the adapter hardware - check the reaction of
  * the bus lines only if it seems to be idle.
  */
-static int test_bus(struct i2c_algo_bit_data *adap, char* name) {
-       int scl,sda;
-
-       if (adap->getscl==NULL)
-               printk(KERN_INFO "i2c-algo-bit.o: Testing SDA only, "
-                       "SCL is not readable.\n");
-
-       sda=getsda(adap);
-       scl=(adap->getscl==NULL?1:getscl(adap));
-       printk(KERN_DEBUG "i2c-algo-bit.o: (0) scl=%d, sda=%d\n",scl,sda);
-       if (!scl || !sda ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: %s seems to be busy.\n", name);
+static int test_bus(struct i2c_algo_bit_data *adap, char *name)
+{
+       int scl, sda;
+
+       if (adap->getscl == NULL)
+               pr_info("%s: Testing SDA only, SCL is not readable\n", name);
+
+       sda = getsda(adap);
+       scl = (adap->getscl == NULL) ? 1 : getscl(adap);
+       if (!scl || !sda) {
+               printk(KERN_WARNING "%s: bus seems to be busy\n", name);
                goto bailout;
        }
 
        sdalo(adap);
-       sda=getsda(adap);
-       scl=(adap->getscl==NULL?1:getscl(adap));
-       printk(KERN_DEBUG "i2c-algo-bit.o: (1) scl=%d, sda=%d\n",scl,sda);
-       if ( 0 != sda ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck high!\n");
+       sda = getsda(adap);
+       scl = (adap->getscl == NULL) ? 1 : getscl(adap);
+       if (sda) {
+               printk(KERN_WARNING "%s: SDA stuck high!\n", name);
                goto bailout;
        }
-       if ( 0 == scl ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
-                       "while pulling SDA low!\n");
+       if (!scl) {
+               printk(KERN_WARNING "%s: SCL unexpected low "
+                      "while pulling SDA low!\n", name);
                goto bailout;
-       }               
+       }
 
        sdahi(adap);
-       sda=getsda(adap);
-       scl=(adap->getscl==NULL?1:getscl(adap));
-       printk(KERN_DEBUG "i2c-algo-bit.o: (2) scl=%d, sda=%d\n",scl,sda);
-       if ( 0 == sda ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SDA stuck low!\n");
+       sda = getsda(adap);
+       scl = (adap->getscl == NULL) ? 1 : getscl(adap);
+       if (!sda) {
+               printk(KERN_WARNING "%s: SDA stuck low!\n", name);
                goto bailout;
        }
-       if ( 0 == scl ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SCL unexpected low "
-                       "while pulling SDA high!\n");
+       if (!scl) {
+               printk(KERN_WARNING "%s: SCL unexpected low "
+                      "while pulling SDA high!\n", name);
                goto bailout;
        }
 
        scllo(adap);
-       sda=getsda(adap);
-       scl=(adap->getscl==NULL?0:getscl(adap));
-       printk(KERN_DEBUG "i2c-algo-bit.o: (3) scl=%d, sda=%d\n",scl,sda);
-       if ( 0 != scl ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck high!\n");
+       sda = getsda(adap);
+       scl = (adap->getscl == NULL) ? 0 : getscl(adap);
+       if (scl) {
+               printk(KERN_WARNING "%s: SCL stuck high!\n", name);
                goto bailout;
        }
-       if ( 0 == sda ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
-                       "while pulling SCL low!\n");
+       if (!sda) {
+               printk(KERN_WARNING "%s: SDA unexpected low "
+                      "while pulling SCL low!\n", name);
                goto bailout;
        }
-       
+
        sclhi(adap);
-       sda=getsda(adap);
-       scl=(adap->getscl==NULL?1:getscl(adap));
-       printk(KERN_DEBUG "i2c-algo-bit.o: (4) scl=%d, sda=%d\n",scl,sda);
-       if ( 0 == scl ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SCL stuck low!\n");
+       sda = getsda(adap);
+       scl = (adap->getscl == NULL) ? 1 : getscl(adap);
+       if (!scl) {
+               printk(KERN_WARNING "%s: SCL stuck low!\n", name);
                goto bailout;
        }
-       if ( 0 == sda ) {
-               printk(KERN_WARNING "i2c-algo-bit.o: SDA unexpected low "
-                       "while pulling SCL high!\n");
+       if (!sda) {
+               printk(KERN_WARNING "%s: SDA unexpected low "
+                      "while pulling SCL high!\n", name);
                goto bailout;
        }
-       printk(KERN_INFO "i2c-algo-bit.o: %s passed test.\n",name);
+       pr_info("%s: Test OK\n", name);
        return 0;
 bailout:
        sdahi(adap);
@@ -309,95 +320,112 @@ static int try_address(struct i2c_adapter *i2c_adap,
                       unsigned char addr, int retries)
 {
        struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-       int i,ret = -1;
-       for (i=0;i<=retries;i++) {
-               ret = i2c_outb(i2c_adap,addr);
+       int i, ret = -1;
+
+       for (i = 0; i <= retries; i++) {
+               ret = i2c_outb(i2c_adap, addr);
                if (ret == 1 || i == retries)
                        break;
+               bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
                i2c_stop(adap);
-               udelay(5/*adap->udelay*/);
-               i2c_start(adap);
                udelay(adap->udelay);
+               yield();
+               bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
+               i2c_start(adap);
        }
-       DEB2(if (i)
-            printk(KERN_DEBUG "i2c-algo-bit.o: Used %d tries to %s client at 0x%02x : %s\n",
-                   i+1, addr & 1 ? "read" : "write", addr>>1,
-                   ret==1 ? "success" : ret==0 ? "no ack" : "failed, timeout?" )
-           );
+       if (i && ret)
+               bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at "
+                       "0x%02x: %s\n", i + 1,
+                       addr & 1 ? "read from" : "write to", addr >> 1,
+                       ret == 1 ? "success" : "failed, timeout?");
        return ret;
 }
 
 static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
 {
-       char c;
-       const char *temp = msg->buf;
+       const unsigned char *temp = msg->buf;
        int count = msg->len;
-       unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK; 
+       unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
        int retval;
-       int wrcount=0;
+       int wrcount = 0;
 
        while (count > 0) {
-               c = *temp;
-               DEB2(dev_dbg(&i2c_adap->dev, "sendbytes: writing %2.2X\n", c&0xff));
-               retval = i2c_outb(i2c_adap,c);
-               if ((retval>0) || (nak_ok && (retval==0)))  { /* ok or ignored NAK */
-                       count--; 
+               retval = i2c_outb(i2c_adap, *temp);
+
+               /* OK/ACK; or ignored NAK */
+               if ((retval > 0) || (nak_ok && (retval == 0))) {
+                       count--;
                        temp++;
                        wrcount++;
-               } else { /* arbitration or no acknowledge */
-                       dev_err(&i2c_adap->dev, "sendbytes: error - bailout.\n");
-                       return (retval<0)? retval : -EFAULT;
-                               /* got a better one ?? */
+
+               /* A slave NAKing the master means the slave didn't like
+                * something about the data it saw.  For example, maybe
+                * the SMBus PEC was wrong.
+                */
+               } else if (retval == 0) {
+                       dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n");
+                       return -EIO;
+
+               /* Timeout; or (someday) lost arbitration
+                *
+                * FIXME Lost ARB implies retrying the transaction from
+                * the first message, after the "winning" master issues
+                * its STOP.  As a rule, upper layer code has no reason
+                * to know or care about this ... it is *NOT* an error.
+                */
+               } else {
+                       dev_err(&i2c_adap->dev, "sendbytes: error %d\n",
+                                       retval);
+                       return retval;
                }
        }
        return wrcount;
 }
 
+static int acknak(struct i2c_adapter *i2c_adap, int is_ack)
+{
+       struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
+
+       /* assert: sda is high */
+       if (is_ack)             /* send ack */
+               setsda(adap, 0);
+       udelay((adap->udelay + 1) / 2);
+       if (sclhi(adap) < 0) {  /* timeout */
+               dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n");
+               return -ETIMEDOUT;
+       }
+       scllo(adap);
+       return 0;
+}
+
 static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
 {
        int inval;
-       int rdcount=0;          /* counts bytes read */
-       struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-       char *temp = msg->buf;
+       int rdcount = 0;        /* counts bytes read */
+       unsigned char *temp = msg->buf;
        int count = msg->len;
+       const unsigned flags = msg->flags;
 
        while (count > 0) {
                inval = i2c_inb(i2c_adap);
-               if (inval>=0) {
+               if (inval >= 0) {
                        *temp = inval;
                        rdcount++;
                } else {   /* read timed out */
-                       printk(KERN_ERR "i2c-algo-bit.o: readbytes: i2c_inb timed out.\n");
                        break;
                }
 
                temp++;
                count--;
 
-               if (msg->flags & I2C_M_NO_RD_ACK)
-                       continue;
-
-               if ( count > 0 ) {              /* send ack */
-                       sdalo(adap);
-                       DEBPROTO(printk(" Am "));
-               } else {
-                       sdahi(adap);    /* neg. ack on last byte */
-                       DEBPROTO(printk(" NAm "));
-               }
-               if (sclhi(adap)<0) {    /* timeout */
-                       sdahi(adap);
-                       printk(KERN_ERR "i2c-algo-bit.o: readbytes: Timeout at ack\n");
-                       return -ETIMEDOUT;
-               };
-               scllo(adap);
-               sdahi(adap);
-
                /* Some SMBus transactions require that we receive the
                   transaction length as the first read byte. */
-               if (rdcount == 1 && (msg->flags & I2C_M_RECV_LEN)) {
+               if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) {
                        if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
-                               printk(KERN_ERR "i2c-algo-bit: readbytes: "
-                                      "invalid block length (%d)\n", inval);
+                               if (!(flags & I2C_M_NO_RD_ACK))
+                                       acknak(i2c_adap, 0);
+                               dev_err(&i2c_adap->dev, "readbytes: invalid "
+                                       "block length (%d)\n", inval);
                                return -EREMOTEIO;
                        }
                        /* The original count value accounts for the extra
@@ -406,6 +434,18 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
                        count += inval;
                        msg->len += inval;
                }
+
+               bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n",
+                       inval,
+                       (flags & I2C_M_NO_RD_ACK)
+                               ? "(no ack/nak)"
+                               : (count ? "A" : "NA"));
+
+               if (!(flags & I2C_M_NO_RD_ACK)) {
+                       inval = acknak(i2c_adap, count);
+                       if (inval < 0)
+                               return inval;
+               }
        }
        return rdcount;
 }
@@ -416,7 +456,7 @@ static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  * returns:
  *  0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
  * -x an error occurred (like: -EREMOTEIO if the device did not answer, or
- *     -ETIMEDOUT, for example if the lines are stuck...) 
+ *     -ETIMEDOUT, for example if the lines are stuck...)
  */
 static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
 {
@@ -428,42 +468,46 @@ static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
        int ret, retries;
 
        retries = nak_ok ? 0 : i2c_adap->retries;
-       
-       if ( (flags & I2C_M_TEN)  ) { 
+
+       if (flags & I2C_M_TEN) {
                /* a ten bit address */
-               addr = 0xf0 | (( msg->addr >> 7) & 0x03);
-               DEB2(printk(KERN_DEBUG "addr0: %d\n",addr));
+               addr = 0xf0 | ((msg->addr >> 7) & 0x03);
+               bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr);
                /* try extended address code...*/
                ret = try_address(i2c_adap, addr, retries);
                if ((ret != 1) && !nak_ok)  {
-                       printk(KERN_ERR "died at extended address code.\n");
+                       dev_err(&i2c_adap->dev,
+                               "died at extended address code\n");
                        return -EREMOTEIO;
                }
                /* the remaining 8 bit address */
-               ret = i2c_outb(i2c_adap,msg->addr & 0x7f);
+               ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
                if ((ret != 1) && !nak_ok) {
                        /* the chip did not ack / xmission error occurred */
-                       printk(KERN_ERR "died at 2nd address code.\n");
+                       dev_err(&i2c_adap->dev, "died at 2nd address code\n");
                        return -EREMOTEIO;
                }
-               if ( flags & I2C_M_RD ) {
+               if (flags & I2C_M_RD) {
+                       bit_dbg(3, &i2c_adap->dev, "emitting repeated "
+                               "start condition\n");
                        i2c_repstart(adap);
                        /* okay, now switch into reading mode */
                        addr |= 0x01;
                        ret = try_address(i2c_adap, addr, retries);
-                       if ((ret!=1) && !nak_ok) {
-                               printk(KERN_ERR "died at extended address code.\n");
+                       if ((ret != 1) && !nak_ok) {
+                               dev_err(&i2c_adap->dev,
+                                       "died at repeated address code\n");
                                return -EREMOTEIO;
                        }
                }
        } else {                /* normal 7bit address  */
-               addr = ( msg->addr << 1 );
-               if (flags & I2C_M_RD )
+               addr = msg->addr << 1;
+               if (flags & I2C_M_RD)
                        addr |= 1;
-               if (flags & I2C_M_REV_DIR_ADDR )
+               if (flags & I2C_M_REV_DIR_ADDR)
                        addr ^= 1;
                ret = try_address(i2c_adap, addr, retries);
-               if ((ret!=1) && !nak_ok)
+               if ((ret != 1) && !nak_ok)
                        return -EREMOTEIO;
        }
 
@@ -475,29 +519,34 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
 {
        struct i2c_msg *pmsg;
        struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
-       
-       int i,ret;
+       int i, ret;
        unsigned short nak_ok;
 
+       bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
        i2c_start(adap);
-       for (i=0;i<num;i++) {
+       for (i = 0; i < num; i++) {
                pmsg = &msgs[i];
-               nak_ok = pmsg->flags & I2C_M_IGNORE_NAK; 
+               nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
                if (!(pmsg->flags & I2C_M_NOSTART)) {
                        if (i) {
+                               bit_dbg(3, &i2c_adap->dev, "emitting "
+                                       "repeated start condition\n");
                                i2c_repstart(adap);
                        }
                        ret = bit_doAddress(i2c_adap, pmsg);
                        if ((ret != 0) && !nak_ok) {
-                           DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d\n"
-                                       ,msgs[i].addr,i));
+                               bit_dbg(1, &i2c_adap->dev, "NAK from "
+                                       "device addr 0x%02x msg #%d\n",
+                                       msgs[i].addr, i);
                                goto bailout;
                        }
                }
-               if (pmsg->flags & I2C_M_RD ) {
+               if (pmsg->flags & I2C_M_RD) {
                        /* read bytes into buffer*/
                        ret = readbytes(i2c_adap, pmsg);
-                       DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes.\n",ret));
+                       if (ret >= 1)
+                               bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n",
+                                       ret, ret == 1 ? "" : "s");
                        if (ret < pmsg->len) {
                                if (ret >= 0)
                                        ret = -EREMOTEIO;
@@ -506,7 +555,9 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
                } else {
                        /* write bytes from buffer */
                        ret = sendbytes(i2c_adap, pmsg);
-                       DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes.\n",ret));
+                       if (ret >= 1)
+                               bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n",
+                                       ret, ret == 1 ? "" : "s");
                        if (ret < pmsg->len) {
                                if (ret >= 0)
                                        ret = -EREMOTEIO;
@@ -517,13 +568,14 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
        ret = i;
 
 bailout:
+       bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
        i2c_stop(adap);
        return ret;
 }
 
 static u32 bit_func(struct i2c_adapter *adap)
 {
-       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | 
+       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
               I2C_FUNC_SMBUS_READ_BLOCK_DATA |
               I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
               I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
@@ -537,8 +589,8 @@ static const struct i2c_algorithm i2c_bit_algo = {
        .functionality  = bit_func,
 };
 
-/* 
- * registering functions to load algorithms at runtime 
+/*
+ * registering functions to load algorithms at runtime
  */
 static int i2c_bit_prepare_bus(struct i2c_adapter *adap)
 {
@@ -546,12 +598,10 @@ static int i2c_bit_prepare_bus(struct i2c_adapter *adap)
 
        if (bit_test) {
                int ret = test_bus(bit_adap, adap->name);
-               if (ret<0)
+               if (ret < 0)
                        return -ENODEV;
        }
 
-       DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
-
        /* register new adapter to i2c module... */
        adap->algo = &i2c_bit_algo;
 
@@ -588,10 +638,3 @@ EXPORT_SYMBOL(i2c_bit_add_numbered_bus);
 MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
 MODULE_DESCRIPTION("I2C-Bus bit-banging algorithm");
 MODULE_LICENSE("GPL");
-
-module_param(bit_test, bool, 0);
-module_param(i2c_debug, int, S_IRUGO | S_IWUSR);
-
-MODULE_PARM_DESC(bit_test, "Test the lines of the bus to see if it is stuck");
-MODULE_PARM_DESC(i2c_debug,
-                "debug level - 0 off; 1 normal; 2,3 more verbose; 9 bit-protocol");