* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
@ 2014-11-24 16:00 Lubomir Popov
2014-11-25 21:48 ` Simon Glass
2015-01-28 6:56 ` [U-Boot] [PATCH] " Heiko Schocher
0 siblings, 2 replies; 10+ messages in thread
From: Lubomir Popov @ 2014-11-24 16:00 UTC (permalink / raw)
To: u-boot
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-popov@ti.com>
---
common/cmd_i2c.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
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;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2014-11-24 16:00 [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction Lubomir Popov
@ 2014-11-25 21:48 ` Simon Glass
2014-11-26 9:08 ` Lubomir Popov
2014-11-26 19:37 ` [U-Boot] [PATCH V2] " Lubomir Popov
2015-01-28 6:56 ` [U-Boot] [PATCH] " Heiko Schocher
1 sibling, 2 replies; 10+ messages in thread
From: Simon Glass @ 2014-11-25 21:48 UTC (permalink / raw)
To: u-boot
Hi,
On 24 November 2014 at 09:00, Lubomir Popov <lpopov@mm-sol.com> wrote:
> 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-popov@ti.com>
> ---
> common/cmd_i2c.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> 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
This should really be an option/flag on the command. We might want to
do different things depending on the situation.
In fact with driver model's I2C implementation, currently in review,
this logic of splitting things up can be handled in the uclass layer:
http://patchwork.ozlabs.org/patch/414066/
Regards,
Simon
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2014-11-25 21:48 ` Simon Glass
@ 2014-11-26 9:08 ` Lubomir Popov
2014-11-26 19:37 ` [U-Boot] [PATCH V2] " Lubomir Popov
1 sibling, 0 replies; 10+ messages in thread
From: Lubomir Popov @ 2014-11-26 9:08 UTC (permalink / raw)
To: u-boot
Hi Simon,
> Hi,
>
> On 24 November 2014 at 09:00, Lubomir Popov <lpopov@mm-sol.com> wrote:
>> 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-popov@ti.com>
>> ---
>> common/cmd_i2c.c | 15 ++++++++++++++-
>> 1 file changed, 14 insertions(+), 1 deletion(-)
>>
>> 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
>
> This should really be an option/flag on the command. We might want to
> do different things depending on the situation.
Agree. I thought about this initially, even about adding a separate command,
but then decided that the human device using 'i2c write' with or without the
config option would be intelligent enough to know what is being needed and
done. From a chip compatibility perspective this is not an issue, since for
byte-wise transfers the 'i2c mw' and 'i2c mm' commands still do exist. So I
went the easy way :-).
>
> In fact with driver model's I2C implementation, currently in review,
> this logic of splitting things up can be handled in the uclass layer:
>
> http://patchwork.ozlabs.org/patch/414066/
Right, in the DM context a command line option would be the better solution.
I shall see to revising the patch in this respect.
>
> Regards,
> Simon
>
Best regards,
Lubo
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2014-11-25 21:48 ` Simon Glass
2014-11-26 9:08 ` Lubomir Popov
@ 2014-11-26 19:37 ` Lubomir Popov
2014-11-26 19:43 ` Simon Glass
1 sibling, 1 reply; 10+ messages in thread
From: Lubomir Popov @ 2014-11-26 19:37 UTC (permalink / raw)
To: u-boot
Hi Simon,
[snip]
>> + while (length-- > 0) {
>> + if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0)
>> + return i2c_report_err(-1, I2C_ERR_WRITE);
>> /*
>> * No write delay with FRAM devices.
>> */
>Should this be indented?
>> #if !defined(CONFIG_SYS_I2C_FRAM)
>> - udelay(11000);
>> + udelay(11000);
>> #endif
>> + }
[snip]
Which indent do you mean? The udelay() is within the while loop, so it should. The
comment above your note - I kept it as is, aligned with the #if/#endif.
Regards,
Lubo
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH V2] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2014-11-26 19:37 ` [U-Boot] [PATCH V2] " Lubomir Popov
@ 2014-11-26 19:43 ` Simon Glass
0 siblings, 0 replies; 10+ messages in thread
From: Simon Glass @ 2014-11-26 19:43 UTC (permalink / raw)
To: u-boot
+Heiko
Hi,
On 26 November 2014 at 12:37, Lubomir Popov <lpopov@mm-sol.com> wrote:
> Hi Simon,
>
> [snip]
>
>>> + while (length-- > 0) {
>>> + if (i2c_write(chip, devaddr++, alen, memaddr++, 1) != 0)
>>> + return i2c_report_err(-1, I2C_ERR_WRITE);
>>> /*
>>> * No write delay with FRAM devices.
>>> */
>
>>Should this be indented?
>
>>> #if !defined(CONFIG_SYS_I2C_FRAM)
>>> - udelay(11000);
>>> + udelay(11000);
>>> #endif
>>> + }
>
> [snip]
>
> Which indent do you mean? The udelay() is within the while loop, so it should. The
> comment above your note - I kept it as is, aligned with the #if/#endif.
It was hard to tell in my emailed, but yes i see, you have kept it
where it was, which is fine.
I added Heiko (I2C maintainer) to cc. As mentioned, but in more
detail, with driver model 'i2c flags 2' will select this behaviour for
any i2c access, not just for this command. See u-boot-dm/i2c-working2
file i2c-uclass.c.
Regards,
Simon
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2014-11-24 16:00 [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction Lubomir Popov
2014-11-25 21:48 ` Simon Glass
@ 2015-01-28 6:56 ` Heiko Schocher
2015-01-28 8:32 ` Lubomir Popov
1 sibling, 1 reply; 10+ messages in thread
From: Heiko Schocher @ 2015-01-28 6:56 UTC (permalink / raw)
To: u-boot
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-popov@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!
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
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2015-01-28 6:56 ` [U-Boot] [PATCH] " Heiko Schocher
@ 2015-01-28 8:32 ` Lubomir Popov
2015-01-28 8:52 ` Heiko Schocher
0 siblings, 1 reply; 10+ messages in thread
From: Lubomir Popov @ 2015-01-28 8:32 UTC (permalink / raw)
To: u-boot
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-popov@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
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2015-01-28 8:32 ` Lubomir Popov
@ 2015-01-28 8:52 ` Heiko Schocher
2015-01-28 9:00 ` Lubomir Popov
0 siblings, 1 reply; 10+ messages in thread
From: Heiko Schocher @ 2015-01-28 8:52 UTC (permalink / raw)
To: u-boot
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 <l-popov@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.
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 <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
>>
>
>
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2015-01-28 8:52 ` Heiko Schocher
@ 2015-01-28 9:00 ` Lubomir Popov
2015-01-28 10:11 ` Heiko Schocher
0 siblings, 1 reply; 10+ messages in thread
From: Lubomir Popov @ 2015-01-28 9:00 UTC (permalink / raw)
To: u-boot
Hi Heiko,
> 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 <l-popov@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.
>
> 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.
OK. Do you have a deadline to finish the I2C updates? I'm really
very busy right now and am not sure if I shall manage with this
before the end of the week, but can try...
Regards,
Lubo
>
> 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 <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
>>>
>>
>>
>
> --
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction
2015-01-28 9:00 ` Lubomir Popov
@ 2015-01-28 10:11 ` Heiko Schocher
0 siblings, 0 replies; 10+ messages in thread
From: Heiko Schocher @ 2015-01-28 10:11 UTC (permalink / raw)
To: u-boot
Hello Lubomir,
Am 28.01.2015 10:00, schrieb Lubomir Popov:
> Hi Heiko,
>
>> 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 <l-popov@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.
>>
>> 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.
> OK. Do you have a deadline to finish the I2C updates? I'm really
> very busy right now and am not sure if I shall manage with this
> before the end of the week, but can try...
No, I have no deadline for your patch, as you posted it before
the current merge window opened ... but It would be nice to
get it in, so we may have tester before the next release ...
Thanks!
bye,
Heiko
>
> Regards,
> Lubo
>
>>
>> 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 <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
>>>>
>>>
>>>
>>
>> --
>> 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
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-01-28 10:11 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-24 16:00 [U-Boot] [PATCH] cmd_i2c: Provide option for bulk 'i2c write' in one transaction Lubomir Popov
2014-11-25 21:48 ` Simon Glass
2014-11-26 9:08 ` Lubomir Popov
2014-11-26 19:37 ` [U-Boot] [PATCH V2] " Lubomir Popov
2014-11-26 19:43 ` Simon Glass
2015-01-28 6:56 ` [U-Boot] [PATCH] " Heiko Schocher
2015-01-28 8:32 ` Lubomir Popov
2015-01-28 8:52 ` Heiko Schocher
2015-01-28 9:00 ` Lubomir Popov
2015-01-28 10:11 ` Heiko Schocher
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox