On Tue, Feb 28, 2017 at 5:17 AM, Heiko Stuebner <heiko@xxxxxxxxx> wrote: > 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. > FWIW: Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> > Signed-off-by: Heiko Stuebner <heiko@xxxxxxxxx> > --- > drivers/tty/serial/8250/8250_dw.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c > index 6ee55a2d47bb..223ac234ddb2 100644 > --- a/drivers/tty/serial/8250/8250_dw.c > +++ b/drivers/tty/serial/8250/8250_dw.c > @@ -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) > -- > 2.11.0 > -- With Best Regards, Andy Shevchenko -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html