Commit dc8685b5 authored by Devin Heitmueller's avatar Devin Heitmueller Committed by Mauro Carvalho Chehab

V4L/DVB (11074): au0828: fix i2c enumeration bug

There was a bug where enumerating the i2c for devices would result in false
positives.  The root of the issue was the scanning was using SMBUS_QUICK
messages, which are zero length write requests (which our i2c adapter
implementation didn't handle).  Because we never strobed any bytes onto the
bus, the status register would still contain the value from the previous
request.

Thanks to Michael Krufky <mkrufky@linuxtv.org> and Steven Toth
<stoth@linuxtv.org> for providing sample hardware, engineering level support,
and testing.
Signed-off-by: default avatarDevin Heitmueller <dheitmueller@linuxtv.org>
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 5a5a4e16
...@@ -156,6 +156,24 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap, ...@@ -156,6 +156,24 @@ static int i2c_sendbytes(struct i2c_adapter *i2c_adap,
dprintk(4, "SEND: %02x\n", msg->addr); dprintk(4, "SEND: %02x\n", msg->addr);
/* Deal with i2c_scan */
if (msg->len == 0) {
/* The analog tuner detection code makes use of the SMBUS_QUICK
message (which involves a zero length i2c write). To avoid
checking the status register when we didn't strobe out any
actual bytes to the bus, just do a read check. This is
consistent with how I saw i2c device checking done in the
USB trace of the Windows driver */
au0828_write(dev, REG_200, 0x20);
if (!i2c_wait_done(i2c_adap))
return -EIO;
if (i2c_wait_read_ack(i2c_adap))
return -EIO;
return 0;
}
for (i = 0; i < msg->len;) { for (i = 0; i < msg->len;) {
dprintk(4, " %02x\n", msg->buf[i]); dprintk(4, " %02x\n", msg->buf[i]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment