[PATCH] i2c: stm32f7: Move reinit_completion() to stm32f7_i2c_xfer_core()
Wolfram Sang
wsa+renesas at sang-engineering.com
Mon May 4 01:25:27 PDT 2026
On Sat, May 02, 2026 at 05:31:54PM +0200, Marek Vasut wrote:
> Currently, the driver may repeatedly call reinit_completion() during
> transfer which contains multiple messages, while another thread is
> waiting for the completion.
>
> This happens during transfer with more than 1 message, invoked via
> stm32f7_i2c_xfer_core() -> stm32f7_i2c_xfer_msg(). After invoking the
> stm32f7_i2c_xfer_msg() to start transfer, stm32f7_i2c_xfer_core()
> calls wait_for_completion_timeout() to wait for completion of the
> transfer of all messages. When the first message transfer completes,
> the hard IRQ handler triggers, and detects transfer completion, which
> leads to stm32f7_i2c_isr_event_thread() IRQ thread being started. The
> stm32f7_i2c_isr_event_thread() calls stm32f7_i2c_xfer_msg() in case
> there are more messages.
>
> Without this change, the second and later stm32f7_i2c_xfer_msg() would
> call reinit_completion() on the completion which is still being waited
> for in stm32f7_i2c_xfer_core(). Fix this by moving the reinit_completion()
> into stm32f7_i2c_xfer_core(), together with wait_for_completion_timeout().
>
> Since stm32f7_i2c_xfer_core() now waits for completion of the entire
> transfer, increase the default timeout. This fixes sporadic transfer
> timeouts on STM32MP25xx during kernel boot.
>
> Fixes: aeb068c57214 ("i2c: i2c-stm32f7: add driver")
> Signed-off-by: Marek Vasut <marex at nabladev.com>
Reworded $subject a little and applied to for-current, thanks!
More information about the linux-arm-kernel
mailing list