From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Wed, 28 Jan 2015 07:56:16 +0100 Subject: [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction In-Reply-To: References: Message-ID: <54C88810.9010307@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Hello Lubomir, Am 24.11.2014 17:00, schrieb Lubomir Popov: > I2C chips do exist that require a write of some multi-byte data to occur in > a single bus transaction (aka atomic transfer), otherwise either the write > does not come into effect at all, or normal operation of internal circuitry > cannot be guaranteed. The current implementation of the 'i2c write' command > (transfer of multiple bytes from a memory buffer) in fact performs a separate > transaction for each byte to be written and thus cannot support such types of > I2C slave devices. > > This patch provides an alternative by allowing 'i2c write' to execute the > write transfer of the given number of bytes in a single bus transaction if > CONFIG_SYS_I2C_BULK_WRITE is defined in the board header (otherwise the old > method shall compile). > > Signed-off-by: Lubomir Popov > --- > common/cmd_i2c.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) Could you rebase your patch against current mainline, please? As we have now DM in i2c subsystem your patch does not apply clean anymore ... thanks! bye, Heiko > > diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c > index 3a75f94..7116458 100644 > --- a/common/cmd_i2c.c > +++ b/common/cmd_i2c.c > @@ -280,10 +280,22 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ > return cmd_usage(cmdtp); > > /* > - * Length is the number of objects, not number of bytes. > + * Length is the number of bytes. > */ > length = simple_strtoul(argv[4], NULL, 16); > > +#if defined(CONFIG_SYS_I2C_BULK_WRITE) > + /* > + * Write all bytes in a single I2C transaction. If the target > + * device is an EEPROM, it is your responsibility to not cross > + * a page bounady. > + */ > + if (i2c_write(chip, devaddr, alen, memaddr, length) != 0) { > + puts("Error writing to the chip.\n"); > + return 1; > + } > +#else > + /* Perform separate write transactions of one byte each */ > while (length-- > 0) { > if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0) { > puts("Error writing to the chip.\n"); > @@ -296,6 +308,7 @@ static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[ > udelay(11000); > #endif > } > +#endif > return 0; > } > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany