From a2eca49d837880dbdb8f07c7022fc740def4e4e4 Mon Sep 17 00:00:00 2001 From: Maximilian Brune Date: Sun, 14 Jan 2024 20:06:10 +0600 Subject: drivers/uart/sifive.c: Fix divisor calculation The divisor is calculated using the following formula: div = (frequency / baudrate) - 1; The current implementation however essentially calculates: div = (frequency / baudrate); Signed-off-by: Maximilian Brune Change-Id: I8a0898ce9016a70c0f91dc8a99fc1cf9e46d20c4 Reviewed-on: https://review.coreboot.org/c/coreboot/+/79951 Reviewed-by: ron minnich Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel --- src/drivers/uart/sifive.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/drivers/uart/sifive.c') diff --git a/src/drivers/uart/sifive.c b/src/drivers/uart/sifive.c index d1b89dc745..815a0cfb05 100644 --- a/src/drivers/uart/sifive.c +++ b/src/drivers/uart/sifive.c @@ -47,9 +47,16 @@ static void sifive_uart_init(struct sifive_uart_registers *regs, int div) void uart_init(unsigned int idx) { - unsigned int div; - div = uart_baudrate_divisor(get_uart_baudrate(), - uart_platform_refclk(), uart_input_clock_divider()); + /* + * according to FU540/FU740 manual: + * f_baud = f_in / (div + 1) + * <=> + * div = (f_in / f_baud) - 1 + */ + unsigned int div = uart_baudrate_divisor(get_uart_baudrate(), uart_platform_refclk(), + uart_input_clock_divider()); + div -= 1; + sifive_uart_init(uart_platform_baseptr(idx), div); } -- cgit v1.2.3