[PATCH v2 3/3] i2c: stm32: only send a STOP upon transfer completion
Heiko Schocher
hs at denx.de
Fri Sep 9 10:43:47 CEST 2022
Hello Jorge,
On 09.09.22 10:30, Jorge Ramirez-Ortiz, Foundries wrote:
> On 08/09/22, Patrick DELAUNAY wrote:
>> Hi,
>>
>> On 9/8/22 12:59, Alain Volmat wrote:
>>> Current function stm32_i2c_message_xfer is sending a STOP
>>> whatever the result of the transaction is. This can cause issues
>>> such as making the bus busy since the controller itself is already
>>> sending automatically a STOP when a NACK is generated. This can
>>> be especially seen when the processing get slower (ex: enabling lots
>>> of debug messages), ending up send 2 STOP (one automatically by the
>>> controller and a 2nd one at the end of the stm32_i2c_message_xfer
>>> function).
>>>
>
> Cmon no need to thank me, that is kind of excessive :)
> Just the sign-off or codevelop tags for reference
>
>
> if you can wait before merging I will test the series before monday
I would love to see a test before we merge this.
@Patrick: feel free to merge it through stm32 repo.
Thanks!
bye,
Heiko
>
> thanks
> Jorge
>
>>> Thanks to Jorge Ramirez-Ortiz for diagnosing and proposing a first
>>> fix for this. [1]
>>>
>>> [1] https://lore.kernel.org/u-boot/20220815145211.31342-2-jorge@foundries.io/
>>>
>>> Reported-by: Jorge Ramirez-Ortiz, Foundries <jorge at foundries.io>
>>> Signed-off-by: Jorge Ramirez-Ortiz <jorge at foundries.io>
>>> Signed-off-by: Alain Volmat <alain.volmat at foss.st.com>
>>> ---
>>> drivers/i2c/stm32f7_i2c.c | 8 ++++----
>>> 1 file changed, 4 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c
>>> index 0ec67b5c12..8803979d3e 100644
>>> --- a/drivers/i2c/stm32f7_i2c.c
>>> +++ b/drivers/i2c/stm32f7_i2c.c
>>> @@ -477,16 +477,16 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv *i2c_priv,
>>> if (ret)
>>> break;
>>> + /* End of transfer, send stop condition */
>>> + mask = STM32_I2C_CR2_STOP;
>>> + setbits_le32(®s->cr2, mask);
>>> +
>>> if (!stop)
>>> /* Message sent, new message has to be sent */
>>> return 0;
>>> }
>>> }
>>> - /* End of transfer, send stop condition */
>>> - mask = STM32_I2C_CR2_STOP;
>>> - setbits_le32(®s->cr2, mask);
>>> -
>>> return stm32_i2c_check_end_of_message(i2c_priv);
>>> }
>>
>>
>> Reviewed-by: Patrick Delaunay <patrick.delaunay at foss.st.com>
>>
>> Thanks
>> Patrick
>>
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: hs at denx.de
More information about the U-Boot
mailing list