| From 251d9d81c0ccd3512745f15ff4be085d5bf51f35 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de> |
| Date: Mon, 20 Mar 2017 10:05:38 +0100 |
| Subject: [PATCH] serial: mxs-auart: Fix baudrate calculation |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit a6040bc610554c66088fda3608ae5d6307c548e4 upstream. |
| |
| The reference manual for the i.MX28 recommends to calculate the divisor |
| as |
| |
| divisor = (UARTCLK * 32) / baud rate, rounded to the nearest integer |
| |
| , so let's do this. For a typical setup of UARTCLK = 24 MHz and baud |
| rate = 115200 this changes the divisor from 6666 to 6667 and so the |
| actual baud rate improves from 115211.521 Bd (error ≅ 0.01 %) to |
| 115194.240 Bd (error ≅ 0.005 %). |
| |
| Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> |
| Cc: stable <stable@vger.kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c |
| index eb54e5c77ead..8cecc9b63d71 100644 |
| --- a/drivers/tty/serial/mxs-auart.c |
| +++ b/drivers/tty/serial/mxs-auart.c |
| @@ -1085,7 +1085,7 @@ static void mxs_auart_settermios(struct uart_port *u, |
| AUART_LINECTRL_BAUD_DIV_MAX); |
| baud_max = u->uartclk * 32 / AUART_LINECTRL_BAUD_DIV_MIN; |
| baud = uart_get_baud_rate(u, termios, old, baud_min, baud_max); |
| - div = u->uartclk * 32 / baud; |
| + div = DIV_ROUND_CLOSEST(u->uartclk * 32, baud); |
| } |
| |
| ctrl |= AUART_LINECTRL_BAUD_DIVFRAC(div & 0x3F); |
| -- |
| 2.12.0 |
| |