diff mbox series

i2c: add dm_i2c_probe_chip() to detect chip presence

Message ID 20221219195727.494332-1-johan.korsnes@remarkable.no
State Superseded
Delegated to: Heiko Schocher
Headers show
Series i2c: add dm_i2c_probe_chip() to detect chip presence | expand

Commit Message

Johan Korsnes Dec. 19, 2022, 7:57 p.m. UTC
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@remarkable.no>
Cc: Eirik Schultz <schultzern@gmail.com>
Cc: Heiko Schocher <hs@denx.de>
Cc: Simon Glass <sjg@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(-)

Comments

Simon Glass Dec. 22, 2022, 8:23 p.m. UTC | #1
Hi Johan,

On Mon, 19 Dec 2022 at 12:57, Johan Korsnes <johan.korsnes@remarkable.no> wrote:
>
> 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@remarkable.no>
> Cc: Eirik Schultz <schultzern@gmail.com>
> Cc: Heiko Schocher <hs@denx.de>
> Cc: Simon Glass <sjg@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(-)

This looks OK but please add a test to dm/test/i2c.c for your new function.

https://u-boot.readthedocs.io/en/latest/develop/testing.html

Regards,
Simon
Heiko Schocher Jan. 1, 2023, 7:48 a.m. UTC | #2
Hello Johan,

On 19.12.22 20:57, Johan Korsnes wrote:
> 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@remarkable.no>
> Cc: Eirik Schultz <schultzern@gmail.com>
> Cc: Heiko Schocher <hs@denx.de>
> Cc: Simon Glass <sjg@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(-)

Reviewed-by: Heiko Schocher <hs@denx.de>

Please add a test, as Simon requested, thanks!

bye,
Heiko
diff mbox series

Patch

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