Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 806b07c2 authored by Jean Delvare's avatar Jean Delvare Committed by Mauro Carvalho Chehab
Browse files

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: default avatarJean Delvare <khali@linux-fr.org>
Tested-by: default avatar"Timothy D. Lenz" <tlenz@vorgon.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent f137f9d0
Loading
Loading
Loading
Loading
+11 −1
Original line number Original line Diff line number Diff line
@@ -365,7 +365,17 @@ int cx23885_i2c_register(struct cx23885_i2c *bus)


		memset(&info, 0, sizeof(struct i2c_board_info));
		memset(&info, 0, sizeof(struct i2c_board_info));
		strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
		strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
		i2c_new_probed_device(&bus->i2c_adap, &info, addr_list);
		/*
		 * We can't call i2c_new_probed_device() because it uses
		 * quick writes for probing and the IR receiver device only
		 * replies to reads.
		 */
		if (i2c_smbus_xfer(&bus->i2c_adap, addr_list[0], 0,
				   I2C_SMBUS_READ, 0, I2C_SMBUS_QUICK,
				   NULL) >= 0) {
			info.addr = addr_list[0];
			i2c_new_device(&bus->i2c_adap, &info);
		}
	}
	}


	return bus->i2c_rc;
	return bus->i2c_rc;
+15 −1
Original line number Original line Diff line number Diff line
@@ -188,10 +188,24 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci)
			0x18, 0x6b, 0x71,
			0x18, 0x6b, 0x71,
			I2C_CLIENT_END
			I2C_CLIENT_END
		};
		};
		const unsigned short *addrp;


		memset(&info, 0, sizeof(struct i2c_board_info));
		memset(&info, 0, sizeof(struct i2c_board_info));
		strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
		strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
		i2c_new_probed_device(&core->i2c_adap, &info, addr_list);
		/*
		 * We can't call i2c_new_probed_device() because it uses
		 * quick writes for probing and at least some R receiver
		 * devices only reply to reads.
		 */
		for (addrp = addr_list; *addrp != I2C_CLIENT_END; addrp++) {
			if (i2c_smbus_xfer(&core->i2c_adap, *addrp, 0,
					   I2C_SMBUS_READ, 0,
					   I2C_SMBUS_QUICK, NULL) >= 0) {
				info.addr = *addrp;
				i2c_new_device(&core->i2c_adap, &info);
				break;
			}
		}
	}
	}
	return core->i2c_rc;
	return core->i2c_rc;
}
}