With the clock driver enabled for the imx8mq, it was noticed that the frequency used to calculate the baud rate is always taken from the root clock of UART1. This can cause problems if UART1 is not used as console and the settings are different from UART1. The result is that the console output is garbage. To do this correctly the UART frequency is taken from the used device. For the implementations that don't have the igp clock frequency written or can't return it the old way is tried.
Signed-off-by: Heiko Thiery <heiko.thi...@gmail.com> --- drivers/serial/serial_mxc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/serial/serial_mxc.c b/drivers/serial/serial_mxc.c index e4970a169b..6fdb2b2397 100644 --- a/drivers/serial/serial_mxc.c +++ b/drivers/serial/serial_mxc.c @@ -3,6 +3,7 @@ * (c) 2007 Sascha Hauer <s.ha...@pengutronix.de> */ +#include <clk.h> #include <common.h> #include <dm.h> #include <errno.h> @@ -266,9 +267,19 @@ __weak struct serial_device *default_serial_console(void) int mxc_serial_setbrg(struct udevice *dev, int baudrate) { struct mxc_serial_plat *plat = dev_get_plat(dev); - u32 clk = imx_get_uartclk(); + u32 rate = 0; + + if (IS_ENABLED(CONFIG_CLK)) { + struct clk clk; + if(!clk_get_by_name(dev, "ipg", &clk)) + rate = clk_get_rate(&clk); + } + + /* as fallback we try to get the clk rate that way */ + if (rate == 0) + rate = imx_get_uartclk(); - _mxc_serial_setbrg(plat->reg, clk, baudrate, plat->use_dte); + _mxc_serial_setbrg(plat->reg, rate, baudrate, plat->use_dte); return 0; } -- 2.30.2