Hi Heiko, > 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 <l-po...@ti.com> >> --- >> 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!
It looks like you are referring V1 of the patch here. The correct version is V2 (http://patchwork.ozlabs.org/patch/415117/). If it doesn't apply as well, I shall try to find some time to fix it. Thanks, Lubo > > 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 <length> 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 > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot