From 1aebcec02ff9b901cab8056bc6168266033efe0a Mon Sep 17 00:00:00 2001 From: Patryk Duda Date: Fri, 28 Oct 2022 14:25:13 +0200 Subject: [PATCH] drivers: serial: Reset UART using RCC before initialization In multi-image environment, after jump to the image we can have UART in unexpected state. Reset UART to default state to make sure that UART is initialized properly and won't cause system to crash or hang. Signed-off-by: Patryk Duda --- drivers/serial/Kconfig.stm32 | 1 + drivers/serial/uart_stm32.c | 10 ++++++++++ drivers/serial/uart_stm32.h | 2 ++ 3 files changed, 13 insertions(+) diff --git a/drivers/serial/Kconfig.stm32 b/drivers/serial/Kconfig.stm32 index ee839dae820..c6aa6051993 100644 --- a/drivers/serial/Kconfig.stm32 +++ b/drivers/serial/Kconfig.stm32 @@ -16,6 +16,7 @@ config UART_STM32 DT_HAS_ST_STM32_DMA_V2BIS_ENABLED || \ DT_HAS_ST_STM32U5_DMA_ENABLED select DMA if UART_ASYNC_API + select RESET help This option enables the UART driver for STM32 family of processors. diff --git a/drivers/serial/uart_stm32.c b/drivers/serial/uart_stm32.c index d9730ffbf57..d8c63cdbf13 100644 --- a/drivers/serial/uart_stm32.c +++ b/drivers/serial/uart_stm32.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -1620,6 +1621,14 @@ static int uart_stm32_init(const struct device *dev) LL_USART_Disable(config->usart); + if (!device_is_ready(data->reset.dev)) { + LOG_ERR("reset controller not ready"); + return -ENODEV; + } + + /* Reset UART to default state using RCC */ + reset_line_toggle_dt(&data->reset); + /* TX/RX direction */ LL_USART_SetTransferDirection(config->usart, LL_USART_DIRECTION_TX_RX); @@ -1896,6 +1905,7 @@ static const struct uart_stm32_config uart_stm32_cfg_##index = { \ \ static struct uart_stm32_data uart_stm32_data_##index = { \ .baud_rate = DT_INST_PROP(index, current_speed), \ + .reset = RESET_DT_SPEC_GET(DT_DRV_INST(index)), \ UART_DMA_CHANNEL(index, rx, RX, PERIPHERAL, MEMORY) \ UART_DMA_CHANNEL(index, tx, TX, MEMORY, PERIPHERAL) \ }; \ diff --git a/drivers/serial/uart_stm32.h b/drivers/serial/uart_stm32.h index 1d1f40b1d73..1faab298abc 100644 --- a/drivers/serial/uart_stm32.h +++ b/drivers/serial/uart_stm32.h @@ -76,6 +76,8 @@ struct uart_stm32_data { uint32_t baud_rate; /* clock device */ const struct device *clock; + /* Reset controller device configuration */ + const struct reset_dt_spec reset; #ifdef CONFIG_UART_INTERRUPT_DRIVEN uart_irq_callback_user_data_t user_cb; void *user_data;