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;