From b6701c0c45d494bd29c20df63edcc86a3b1dd4f9 Mon Sep 17 00:00:00 2001 From: Aymeric Aillet Date: Tue, 14 Jun 2022 17:07:28 +0200 Subject: [PATCH] drivers/can/rcar: Add delay to mode switching Fix issue #45168. When setting high bit timing, the controller is timing out when trying to switch from an internal mode to another. To fix this issue, we add some delay when switching modes. Signed-off-by: Aymeric Aillet --- drivers/can/can_rcar.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/can/can_rcar.c b/drivers/can/can_rcar.c index 34822cca3d7..23af7c8a70a 100644 --- a/drivers/can/can_rcar.c +++ b/drivers/can/can_rcar.c @@ -530,6 +530,10 @@ static int can_rcar_enter_halt_mode(const struct can_rcar_cfg *config) ctlr &= ~RCAR_CAN_CTLR_CANM_MASK; ctlr |= RCAR_CAN_CTLR_CANM_HALT; can_rcar_write16(config, RCAR_CAN_CTLR, ctlr); + + /* Wait for controller to apply high bit timing settings */ + k_usleep(1); + for (i = 0; i < MAX_STR_READS; i++) { if (can_rcar_read16(config, RCAR_CAN_STR) & RCAR_CAN_STR_HLTST) { return 0; @@ -548,6 +552,9 @@ static int can_rcar_enter_operation_mode(const struct can_rcar_cfg *config) ctlr &= ~RCAR_CAN_CTLR_CANM_MASK; can_rcar_write16(config, RCAR_CAN_CTLR, ctlr); + /* Wait for controller to apply high bit timing settings */ + k_usleep(1); + for (i = 0; i < MAX_STR_READS; i++) { str = can_rcar_read16(config, RCAR_CAN_STR); if (!(str & RCAR_CAN_CTLR_CANM_MASK)) {