V4L/DVB (10843): saa7146: Clean-up i2c error handling
authorOliver Endriss <o.endriss@gmx.de>
Sat, 28 Feb 2009 13:35:48 +0000 (10:35 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:43:08 +0000 (12:43 -0300)
saa7146: Clean-up i2c error handling

Simplify i2c error handling and fix incorrect handling of
address errors in poll mode.

Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/saa7146_i2c.c

index 76229f9..7e8f568 100644 (file)
@@ -293,7 +293,6 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
        int i = 0, count = 0;
        __le32 *buffer = dev->d_i2c.cpu_addr;
        int err = 0;
-       int address_err = 0;
        int short_delay = 0;
 
        if (mutex_lock_interruptible(&dev->i2c_lock))
@@ -333,17 +332,10 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
                                   i2c address probing, however, and address errors indicate that a
                                   device is really *not* there. retrying in that case
                                   increases the time the device needs to probe greatly, so
-                                  it should be avoided. because of the fact, that only
-                                  analog based cards use irq based i2c transactions (for dvb
-                                  cards, this screwes up other interrupt sources), we bail out
-                                  completely for analog cards after an address error and trust
-                                  the saa7146 address error detection. */
-                               if ( -EREMOTEIO == err ) {
-                                       if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
-                                               goto out;
-                                       }
-                                       address_err++;
-                               }
+                                  it should be avoided. So we bail out in irq mode after an
+                                  address error and trust the saa7146 address error detection. */
+                               if (-EREMOTEIO == err && 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags))
+                                       goto out;
                                DEB_I2C(("error while sending message(s). starting again.\n"));
                                break;
                        }
@@ -358,10 +350,9 @@ static int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg *m
 
        } while (err != num && retries--);
 
-       /* if every retry had an address error, exit right away */
-       if (address_err == retries) {
+       /* quit if any error occurred */
+       if (err != num)
                goto out;
-       }
 
        /* if any things had to be read, get the results */
        if ( 0 != saa7146_i2c_msg_cleanup(msgs, num, buffer)) {