serial: stm32: BRR must be set only when usart is disable
authorPatrice Chotard <patrice.chotard@foss.st.com>
Wed, 31 May 2023 06:01:31 +0000 (08:01 +0200)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Fri, 16 Jun 2023 09:29:29 +0000 (11:29 +0200)
To avoid spurious chars, BRR register must only be written when
USART is disabled.

Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
drivers/serial/serial_stm32.c

index 93f7094..0085113 100644 (file)
@@ -29,6 +29,10 @@ static void _stm32_serial_setbrg(fdt_addr_t base,
 {
        bool stm32f4 = uart_info->stm32f4;
        u32 int_div, mantissa, fraction, oversampling;
+       u8 uart_enable_bit = uart_info->uart_enable_bit;
+
+       /* BRR register must be set when uart is disabled */
+       clrbits_le32(base + CR1_OFFSET(stm32f4), BIT(uart_enable_bit));
 
        int_div = DIV_ROUND_CLOSEST(clock_rate, baudrate);
 
@@ -44,6 +48,8 @@ static void _stm32_serial_setbrg(fdt_addr_t base,
        fraction = int_div % oversampling;
 
        writel(mantissa | fraction, base + BRR_OFFSET(stm32f4));
+
+       setbits_le32(base + CR1_OFFSET(stm32f4), BIT(uart_enable_bit));
 }
 
 static int stm32_serial_setbrg(struct udevice *dev, int baudrate)