serial: 8250_dw: Honor clk_round_rate errors in

A patch from »serial: 8250_dw: Honor clk_round_rate errors in« in state Mainline for linux-kernel

From: Heiko Stuebner <heiko@...> Date: Tue, 28 Feb 2017 04:09:22 +0100

Commit-Message

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 6a171b299379 ("serial: 8250_dw: Allow hardware flow control to be used") enabled set_termios callback in all cases, not only ACPI. Fixes: 6a171b299379 ("serial: 8250_dw: Allow hardware flow control to be used") Signed-off-by: Heiko Stuebner <heiko@...> Reviewed-by: Andy Shevchenko <andy.shevchenko@...>

Patch-Comment

There is also another patch floating around, fixing a separate issue on top of this one: "serial: 8250_dw: Fix breakage when HAVE_CLK=n" changes in v2: - adapt commit message to make it more explicit, that this is a somewhat critical fix - add Andy's Reviewed-by drivers/tty/serial/8250/8250_dw.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)

Statistics

  • 5 lines added
  • 2 lines removed

Changes

---------------------- drivers/tty/serial/8250/8250_dw.c -----------------------
index 6ee55a2d47bb..223ac234ddb2 100644
@@ -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,7 +265,10 @@ 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);
- ret = clk_set_rate(d->clk, rate);
+ if (rate < 0)
+ ret = rate;
+ else
+ ret = clk_set_rate(d->clk, rate);
clk_prepare_enable(d->clk);
if (!ret)
 
 

Recent Patches

About Us

Sed lacus. Donec lectus. Nullam pretium nibh ut turpis. Nam bibendum. In nulla tortor, elementum vel, tempor at, varius non, purus. Mauris vitae nisl nec metus placerat consectetuer.

Read More...