V4L/DVB (10843): saa7146: Clean-up i2c error handling
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>
This commit is contained in:
parent
7c9e34aaab
commit
632fe9fe44
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user