diff options
| -rw-r--r-- | drivers/media/video/cx23885/cx23885-i2c.c | 12 | ||||
| -rw-r--r-- | drivers/media/video/cx88/cx88-i2c.c | 16 |
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 | } |
