* [PATCH] serial: 8250_dw: Honor clk_round_rate errors in dw8250_set_termios
@ 2017-02-28 3:17 Heiko Stuebner
2017-02-28 13:55 ` Andy Shevchenko
0 siblings, 1 reply; 2+ messages in thread
From: Heiko Stuebner @ 2017-02-28 3:17 UTC (permalink / raw)
To: gregkh; +Cc: jslaby, linux-serial, linux-kernel, Heiko Stuebner
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.
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
---
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] serial: 8250_dw: Honor clk_round_rate errors in dw8250_set_termios
2017-02-28 3:17 [PATCH] serial: 8250_dw: Honor clk_round_rate errors in dw8250_set_termios Heiko Stuebner
@ 2017-02-28 13:55 ` Andy Shevchenko
0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2017-02-28 13:55 UTC (permalink / raw)
To: Heiko Stuebner; +Cc: Greg Kroah-Hartman, Jiri Slaby, linux-serial, linux-kernel
On Tue, Feb 28, 2017 at 5:17 AM, Heiko Stuebner <heiko@sntech.de> 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@gmail.com>
> Signed-off-by: Heiko Stuebner <heiko@sntech.de>
> ---
> 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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-02-28 14:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-28 3:17 [PATCH] serial: 8250_dw: Honor clk_round_rate errors in dw8250_set_termios Heiko Stuebner
2017-02-28 13:55 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).