Hi, On Fri, 24 May 2019 at 03:23, Chuanhua Han <chuanhua....@nxp.com> wrote: > > 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), this patch adds a flag that needs to generate a stop > bit to determine whether the i2c host needs to generate a stop signal > before reading the register data.
Does this mean that the chip does not comply with the i2c protocol? Is it possible instead to so a write and then a read? See dm_i2c_xfer(). > > Signed-off-by: Biwen Li <biwen...@nxp.com> > Signed-off-by: Chuanhua Han <chuanhua....@nxp.com> > --- > Changes in v2: > - Split the original patch into 3 patches > - Add detailed description information for each patch > > drivers/i2c/i2c-uclass.c | 2 ++ > include/i2c.h | 2 ++ > 2 files changed, 4 insertions(+) > > diff --git a/drivers/i2c/i2c-uclass.c b/drivers/i2c/i2c-uclass.c > index e47abf1833..18f7364d72 100644 > --- a/drivers/i2c/i2c-uclass.c > +++ b/drivers/i2c/i2c-uclass.c > @@ -141,6 +141,8 @@ int dm_i2c_read(struct udevice *dev, uint offset, uint8_t > *buffer, int len) > if (len) { > ptr->addr = chip->chip_addr; > ptr->flags = chip->flags & DM_I2C_CHIP_10BIT ? I2C_M_TEN : 0; > + ptr->flags |= chip->flags & DM_I2C_CHIP_RD_NEED_STOP_BIT ? > + I2C_M_RD_NEED_STOP_BIT : 0; > ptr->flags |= I2C_M_RD; > ptr->len = len; > ptr->buf = buffer; > diff --git a/include/i2c.h b/include/i2c.h > index a5c760c711..beaa028349 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_RD_NEED_STOP_BIT = 1 << 3, /* Need generate stop bit */ > }; > > struct udevice; > @@ -87,6 +88,7 @@ enum dm_i2c_msg_flags { > I2C_M_IGNORE_NAK = 0x1000, /* continue after NAK */ > I2C_M_NO_RD_ACK = 0x0800, /* skip the Ack bit on reads */ > I2C_M_RECV_LEN = 0x0400, /* length is first received byte */ > + I2C_M_RD_NEED_STOP_BIT = 0x0002, /* need generate stop bit */ > }; > > /** > -- > 2.17.1 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot