aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2010-05-26 09:05:11 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-06-01 00:23:19 -0400
commit806b07c29b711aaf90c81d2a19711607769f8246 (patch)
treeac9a5066c43dd086832a399af6e098efa28ffd5d /drivers/media
parentf137f9d0009067289a2fa6c4da9b82084cdd257e (diff)
V4L/DVB: FusionHDTV: Use quick reads for I2C IR device probing
IR support on FusionHDTV cards is broken since kernel 2.6.31. One side effect of the switch to the standard binding model for IR I2C devices was to let i2c-core do the probing instead of the ir-kbd-i2c driver. There is a slight difference between the two probe methods: i2c-core uses 0-byte writes, while the ir-kbd-i2c was using 0-byte reads. As some IR I2C devices only support reads, the new probe method fails to detect them. For now, revert to letting the driver do the probe, using 0-byte reads. In the future, i2c-core will be extended to let callers of i2c_new_probed_device() provide a custom probing function. Signed-off-by: Jean Delvare <khali@linux-fr.org> Tested-by: "Timothy D. Lenz" <tlenz@vorgon.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/cx23885/cx23885-i2c.c12
-rw-r--r--drivers/media/video/cx88/cx88-i2c.c16
2 files changed, 26 insertions, 2 deletions
diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c
index 4172cb387420..d4746e064516 100644
--- a/drivers/media/video/cx23885/cx23885-i2c.c
+++ b/drivers/media/video/cx23885/cx23885-i2c.c
@@ -365,7 +365,17 @@ int cx23885_i2c_register(struct cx23885_i2c *bus)
365 365
366 memset(&info, 0, sizeof(struct i2c_board_info)); 366 memset(&info, 0, sizeof(struct i2c_board_info));
367 strlcpy(info.type, "ir_video", I2C_NAME_SIZE); 367 strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
368 i2c_new_probed_device(&bus->i2c_adap, &info, addr_list); 368 /*
369 * We can't call i2c_new_probed_device() because it uses
370 * quick writes for probing and the IR receiver device only
371 * replies to reads.
372 */
373 if (i2c_smbus_xfer(&bus->i2c_adap, addr_list[0], 0,
374 I2C_SMBUS_READ, 0, I2C_SMBUS_QUICK,
375 NULL) >= 0) {
376 info.addr = addr_list[0];
377 i2c_new_device(&bus->i2c_adap, &info);
378 }
369 } 379 }
370 380
371 return bus->i2c_rc; 381 return bus->i2c_rc;
diff --git a/drivers/media/video/cx88/cx88-i2c.c b/drivers/media/video/cx88/cx88-i2c.c
index ee1ca39db06a..fb39f1184558 100644
--- a/drivers/media/video/cx88/cx88-i2c.c
+++ b/drivers/media/video/cx88/cx88-i2c.c
@@ -188,10 +188,24 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci)
188 0x18, 0x6b, 0x71, 188 0x18, 0x6b, 0x71,
189 I2C_CLIENT_END 189 I2C_CLIENT_END
190 }; 190 };
191 const unsigned short *addrp;
191 192
192 memset(&info, 0, sizeof(struct i2c_board_info)); 193 memset(&info, 0, sizeof(struct i2c_board_info));
193 strlcpy(info.type, "ir_video", I2C_NAME_SIZE); 194 strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
194 i2c_new_probed_device(&core->i2c_adap, &info, addr_list); 195 /*
196 * We can't call i2c_new_probed_device() because it uses
197 * quick writes for probing and at least some R receiver
198 * devices only reply to reads.
199 */
200 for (addrp = addr_list; *addrp != I2C_CLIENT_END; addrp++) {
201 if (i2c_smbus_xfer(&core->i2c_adap, *addrp, 0,
202 I2C_SMBUS_READ, 0,
203 I2C_SMBUS_QUICK, NULL) >= 0) {
204 info.addr = *addrp;
205 i2c_new_device(&core->i2c_adap, &info);
206 break;
207 }
208 }
195 } 209 }
196 return core->i2c_rc; 210 return core->i2c_rc;
197} 211}