Add function to determine whether a chip is present. This check is typically implemented by writing the chip address to the bus and checking that the chip replies with an ACK.
The already existing dm_i2c_probe() will attempt to bind/probe the relevant driver if the chip is present. This makes it unsuitable for situations where one only wants to know the presence of a chip. Signed-off-by: Johan Korsnes <johan.kors...@remarkable.no> Cc: Eirik Schultz <schultz...@gmail.com> Cc: Heiko Schocher <h...@denx.de> Cc: Simon Glass <s...@chromium.org> --- Previously, I've used i2c_probe() to determine whether or not an i2c chip is present on an i2c bus. With the introduction of the driver model this function is deprecated. Fortunately, I found dm_i2c_probe(), which I expected to perform the same check, it was even documented to be suitable for this purpose: ``` dm_i2c_probe() - probe a particular chip address This can be useful to check for the existence of a chip on the bus. It is typically implemented by writing the chip address to the bus and checking that the chip replies with an ACK. ``` Unfortunately, it does not seem to be a replacement. It seems dm_i2c_probe() will attempt to bind/probe a driver if the chip is present, and will in turn return the return value from the driver probe/bind attempt. --- drivers/i2c/i2c-uclass.c | 11 +++++++++++ include/i2c.h | 16 +++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c index 8d9a89ed89..16a2be7531 100644 --- a/drivers/i2c/i2c-uclass.c +++ b/drivers/i2c/i2c-uclass.c @@ -409,6 +409,17 @@ int dm_i2c_probe(struct udevice *bus, uint chip_addr, uint chip_flags, return ret; } +int dm_i2c_probe_chip(struct udevice *bus, uint chip_addr, uint chip_flags) +{ + int ret; + + ret = i2c_probe_chip(bus, chip_addr, chip_flags); + debug("%s: bus='%s', address %02x, ret=%d\n", __func__, bus->name, + chip_addr, ret); + + return ret; +} + int dm_i2c_set_bus_speed(struct udevice *bus, unsigned int speed) { struct dm_i2c_ops *ops = i2c_get_ops(bus); diff --git a/include/i2c.h b/include/i2c.h index e0ee94e550..4c22d8c887 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -206,6 +206,18 @@ int dm_i2c_write(struct udevice *dev, uint offset, const uint8_t *buffer, /** * dm_i2c_probe() - probe a particular chip address * + * @bus: Bus to probe + * @chip_addr: 7-bit address to probe (10-bit and others are not supported) + * @chip_flags: Flags for the probe (see enum dm_i2c_chip_flags) + * @devp: Returns the device found, or NULL if none + * Return: 0 if a chip was found at that address, -ve if not + */ +int dm_i2c_probe(struct udevice *bus, uint chip_addr, uint chip_flags, + struct udevice **devp); + +/** + * dm_i2c_probe_chip() - probe a particular chip address + * * This can be useful to check for the existence of a chip on the bus. * It is typically implemented by writing the chip address to the bus * and checking that the chip replies with an ACK. @@ -213,11 +225,9 @@ int dm_i2c_write(struct udevice *dev, uint offset, const uint8_t *buffer, * @bus: Bus to probe * @chip_addr: 7-bit address to probe (10-bit and others are not supported) * @chip_flags: Flags for the probe (see enum dm_i2c_chip_flags) - * @devp: Returns the device found, or NULL if none * Return: 0 if a chip was found at that address, -ve if not */ -int dm_i2c_probe(struct udevice *bus, uint chip_addr, uint chip_flags, - struct udevice **devp); +int dm_i2c_probe_chip(struct udevice *bus, uint chip_addr, uint chip_flags); /** * dm_i2c_reg_read() - Read a value from an I2C register -- 2.38.1