[PATCH] i2c: add dm_i2c_probe_chip() to detect chip presence
Johan Korsnes
johan.korsnes at remarkable.no
Mon Dec 19 20:57:27 CET 2022
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.korsnes at remarkable.no>
Cc: Eirik Schultz <schultzern at gmail.com>
Cc: Heiko Schocher <hs at denx.de>
Cc: Simon Glass <sjg at 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
More information about the U-Boot
mailing list