summaryrefslogtreecommitdiffstats
path: root/drivers/staging/tm6000/tm6000-i2c.c
diff options
context:
space:
mode:
authorStefan Ringel2010-02-22 18:35:06 +0100
committerMauro Carvalho Chehab2010-05-18 05:44:08 +0200
commit02512fe33e9162713cd522937aabc81fcd97ad74 (patch)
tree50e382c7fb6bb06ae38bd9f9af9b165074267dda /drivers/staging/tm6000/tm6000-i2c.c
parentV4L/DVB: tm6000: add send and recv function (diff)
downloadkernel-qcow2-linux-02512fe33e9162713cd522937aabc81fcd97ad74.tar.gz
kernel-qcow2-linux-02512fe33e9162713cd522937aabc81fcd97ad74.tar.xz
kernel-qcow2-linux-02512fe33e9162713cd522937aabc81fcd97ad74.zip
V4L/DVB: tm6000: bugfix reading problems with demodulator zl10353
Reading from zl10353 with tm6000 has a bug. For example: regs w/o patch with patch 0x06 0x00 0x7f 0x07 0x33 0x30 0x08 0x00 0x00 0x09 0x58 0x50 0x0f 0x31 0x28 0x10 0x00 0x84 This patch provides the workaround for the bug [mchehab@redhat.com: Fix merge conflict and add a comment at the workaround] Signed-off-by: Stefan Ringel <stefan.ringel@arcor.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/staging/tm6000/tm6000-i2c.c')
-rw-r--r--drivers/staging/tm6000/tm6000-i2c.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/staging/tm6000/tm6000-i2c.c b/drivers/staging/tm6000/tm6000-i2c.c
index a5323303c34a..ec4c9381c14a 100644
--- a/drivers/staging/tm6000/tm6000-i2c.c
+++ b/drivers/staging/tm6000/tm6000-i2c.c
@@ -56,9 +56,23 @@ static int tm6000_i2c_recv_regs(struct tm6000_core *dev, unsigned char addr,
__u8 reg, char *buf, int len)
{
int rc;
+ u8 b[2];
- rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ if ((dev->caps.has_zl10353) && (dev->demod_addr << 1 == addr) && (reg % 2 == 0)) {
+ /*
+ * Workaround an I2C bug when reading from zl10353
+ */
+ reg -= 1;
+ len += 1;
+
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
+ REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, b, len);
+
+ *buf = b[1];
+ } else {
+ rc = tm6000_read_write_usb(dev, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
REQ_16_SET_GET_I2C_WR1_RDN, addr | reg << 8, 0, buf, len);
+ }
return rc;
}