Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09498087 authored by Heiko Stuebner's avatar Heiko Stuebner Committed by Greg Kroah-Hartman
Browse files

serial: 8250_dw: Honor clk_round_rate errors in dw8250_set_termios



clk_round_rate returns a signed long and may possibly return errors
in it, for example if there is no possible rate.

Till now dw8250_set_termios ignored any error, the signednes and would
just use the value as input to clk_set_rate. This of course falls apart
if there is an actual error, so check for errors and only try to set
a rate if the value is actually valid.

This turned up on some Rockchip platforms after commit
6a171b29 ("serial: 8250_dw: Allow hardware flow control to be used")
enabled set_termios callback in all cases, not only ACPI.

Fixes: 6a171b29 ("serial: 8250_dw: Allow hardware flow control to be used")
Signed-off-by: default avatarHeiko Stuebner <heiko@sntech.de>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4495c08e
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -257,7 +257,7 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios,
{
	unsigned int baud = tty_termios_baud_rate(termios);
	struct dw8250_data *d = p->private_data;
	unsigned int rate;
	long rate;
	int ret;

	if (IS_ERR(d->clk) || !old)
@@ -265,6 +265,9 @@ static void dw8250_set_termios(struct uart_port *p, struct ktermios *termios,

	clk_disable_unprepare(d->clk);
	rate = clk_round_rate(d->clk, baud * 16);
	if (rate < 0)
		ret = rate;
	else
		ret = clk_set_rate(d->clk, rate);
	clk_prepare_enable(d->clk);