From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heiko Schocher Date: Wed, 28 Jan 2015 09:52:29 +0100 Subject: [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction In-Reply-To: References: <54C88810.9010307@denx.de> Message-ID: <54C8A34D.20605@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 28.01.2015 09:32, schrieb Lubomir Popov: > 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 >>> --- >>> 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. Sorry, was the wrong EMail I replied ... but the v2 does not apply to current mainline. If you can fix it, that would be great. Thanks! bye, Heiko > > 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 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 >> > > -- DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany