[U-Boot] [PATCH 1/2] dm: i2c: Add a flag that need generate stop bit

Chuanhua Han chuanhua.han at nxp.com
Mon Jun 17 13:12:40 UTC 2019


Usually the i2c bus needs to write the address of the register before
reading the internal register data of the device (ignoring the
transmission of the slave address).

Generally, the stop signal is not needed before the register is read,
but there is a special chip that needs this stop signal (such as pcf2127).
However, in the current i2c general code, the dm_i2c_read api encapsulates
two messages, the first time is to set the register address message,
the second time is a message to read the register data, so that no stop
signal is generated.

This patch uses the DM_I2C_CHIP_ADDR_STOP flag for specific
i2c chips, so if the i2c slave requires a stop signal, chips driver can
set this flag, then call the dm_i2c_write to set the register address
(a stop signal is generated after this API call), then call dm_i2c_read
to read the register data.

Signed-off-by: Chuanhua Han <chuanhua.han at nxp.com>
---
Changes in v4:
	- Replace DM_I2C_CHIP_RD_NO_I2C_SETUP_OFFSET with
DM_I2C_CHIP_ADDR_STOP.

Changes in v3:
	- Use the new flag DM_I2C_CHIP_RD_NO_I2C_SETUP_OFFSET	

Changes in v2: 
        - Split the original patch into 3 patches
        - Add detailed description information for each patch

 drivers/i2c/i2c-uclass.c | 6 ++++--
 include/i2c.h            | 1 +
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c
index e47abf1833..9804b5e8c7 100644
--- a/drivers/i2c/i2c-uclass.c
+++ b/drivers/i2c/i2c-uclass.c
@@ -135,8 +135,10 @@ int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len)
 	if (chip->flags & DM_I2C_CHIP_RD_ADDRESS)
 		return i2c_read_bytewise(dev, offset, buffer, len);
 	ptr = msg;
-	if (!i2c_setup_offset(chip, offset, offset_buf, ptr))
-		ptr++;
+	if (!(chip->flags & DM_I2C_CHIP_ADDR_STOP)) {
+		if (!i2c_setup_offset(chip, offset, offset_buf, ptr))
+			ptr++;
+	}
 
 	if (len) {
 		ptr->addr = chip->chip_addr;
diff --git a/include/i2c.h b/include/i2c.h
index a5c760c711..3123cbf280 100644
--- a/include/i2c.h
+++ b/include/i2c.h
@@ -28,6 +28,7 @@ enum dm_i2c_chip_flags {
 	DM_I2C_CHIP_10BIT	= 1 << 0, /* Use 10-bit addressing */
 	DM_I2C_CHIP_RD_ADDRESS	= 1 << 1, /* Send address for each read byte */
 	DM_I2C_CHIP_WR_ADDRESS	= 1 << 2, /* Send address for each write byte */
+	DM_I2C_CHIP_ADDR_STOP  = 1 << 3, /* Need generate stop bit */
 };
 
 struct udevice;
-- 
2.17.1



More information about the U-Boot mailing list