From 85adeb4f55065a9b00b7062b6847be5352cc8685 Mon Sep 17 00:00:00 2001 From: Tony Xie Date: Thu, 17 Mar 2022 11:18:00 +0800 Subject: [PATCH] serial: 8250_dw: don't set clk when clk is null for rockchip Fixes: b205560ab13f ("serial: 8250_dw: set uart clk according to baudrate") Change-Id: I89593824840b2d1c3f5671f46cd92ddea5929d46 Signed-off-by: Tony Xie Signed-off-by: Huibin Hong --- drivers/tty/serial/8250/8250_dw.c | 54 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index f8f0e7b1f615..7ba14b8bfca6 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -349,35 +349,37 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios, clk_disable_unprepare(d->clk); #ifdef CONFIG_ARCH_ROCKCHIP - if (baud <= 115200) - rate = 24000000; - else if (baud == 230400) - rate = baud * 16 * 2; - else if (baud == 1152000) - rate = baud * 16 * 2; - else - rate = baud * 16; + if (d->clk) { + if (baud <= 115200) + rate = 24000000; + else if (baud == 230400) + rate = baud * 16 * 2; + else if (baud == 1152000) + rate = baud * 16 * 2; + else + rate = baud * 16; - ret = clk_set_rate(d->clk, rate); - rate_temp = clk_get_rate(d->clk); - diff = rate * 20 / 1000; - /* - * If rate_temp is not equal to rate, is means fractional frequency - * division is failed. Then use Integer frequency division, and - * the baud rate error must be under -+2% - */ - if ((rate_temp < rate) && ((rate - rate_temp) > diff)) { - ret = clk_set_rate(d->clk, rate + diff); + ret = clk_set_rate(d->clk, rate); rate_temp = clk_get_rate(d->clk); - if ((rate_temp < rate) && ((rate - rate_temp) > diff)) - dev_info(p->dev, "set rate:%ld, but get rate:%d\n", - rate, rate_temp); - else if ((rate < rate_temp) && ((rate_temp - rate) > diff)) - dev_info(p->dev, "set rate:%ld, but get rate:%d\n", - rate, rate_temp); + diff = rate * 20 / 1000; + /* + * If rate_temp is not equal to rate, is means fractional frequency + * division is failed. Then use Integer frequency division, and + * the baud rate error must be under -+2% + */ + if ((rate_temp < rate) && ((rate - rate_temp) > diff)) { + ret = clk_set_rate(d->clk, rate + diff); + rate_temp = clk_get_rate(d->clk); + if ((rate_temp < rate) && ((rate - rate_temp) > diff)) + dev_info(p->dev, "set rate:%ld, but get rate:%d\n", + rate, rate_temp); + else if ((rate < rate_temp) && ((rate_temp - rate) > diff)) + dev_info(p->dev, "set rate:%ld, but get rate:%d\n", + rate, rate_temp); + } + if (!ret) + p->uartclk = rate; } - if (!ret) - p->uartclk = rate; #else rate = clk_round_rate(d->clk, newrate); if (rate > 0) {