From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933431AbcIULAZ (ORCPT ); Wed, 21 Sep 2016 07:00:25 -0400 Received: from exsmtp03.microchip.com ([198.175.253.49]:19711 "EHLO email.microchip.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753632AbcIULAY (ORCPT ); Wed, 21 Sep 2016 07:00:24 -0400 From: Nicolas Ferre To: , Ludovic Desroches , Boris BREZILLON , , CC: , , Cyrille Pitchen , Alexandre Belloni , Greg Kroah-Hartman , Nicolas Ferre Subject: [PATCH] tty/serial: atmel: fix fractional baud rate computation Date: Wed, 21 Sep 2016 12:44:14 +0200 Message-ID: <20160921104414.16241-1-nicolas.ferre@atmel.com> X-Mailer: git-send-email 2.9.0 MIME-Version: 1.0 Content-Type: text/plain X-Brightmail-Tracker: H4sIAAAAAAAAC+NgFvrDosTGxcLF5cOiG53yKNzg6cb3fzksvjYZW9z7tI3R4v610ywWG9rXMll0TFnFZPH/9WlWi2nT3zE7sAcwRLFm5iXlVySwZiy+fpCx4IJAxZOJV9gbGI/ydjFycQgJrGOUOH7qJ0sXIycHm4CuxNkJT9hAEiICexklLvw9wQ6SYBaYyiSx53geiC0s4CHR/vQDWJxFQFWib81jRhCbV8BG4kH/OrBBEgJyEg3n7zNDxAUlTs58wgIxR0Li4IsXYHEhARWJvvf97BD1gRJ/Xhxmg7CdJJZe2QA1x07i8PSLUDX2Et1LtzPC1Hz4/RbK1pbY/mofK4StI7HtYD9Ur63EnhkTmSBsd4kHj5ZD2b4Ssx42QNVESWzY95p9AqPYLCSnzkJy6gJGplWM0skZebrFZbqpFckZBsZ6uckZBbq5iZl5esn5uZsYITFjuINx0wO/Q4ySHExKorxT44+EC/El5adUZiQWZ8QXleakFh9ilODgURLhXXsaKMdbXJCYW5yZDpOS4eBQkuAVAkkJFqWmp1akZeaUpBZBpE8xSkqJ8x48BZQUAOnLKM2Dy11iFJUS5q3bC5TjKUgtys0sgYjfYhTmeMgkxJKXn5cqBXQiAxBoML5iFOdgVBLm1QNZxJOZVwJ3wiug65iAriu4cxjkupJEhJRUA2PNqdoVIeU6f6+5e2xk1lk48eFZwYPJ5uExZQ7hyd2PPsik3DQPiQg4+N4m9N0520MbDkxczvog/zLPl89nXHlb1skKvKgr1rE5t/dw3KPN/P+vn7B3TT2rzXZx8uKkb8vSanL+b97bqvQhOeMOz1lu1QSDauEIn1dVQrypsziaZmvGLs/5fFSJpTgj0VCLuag4EQAb23rFDwMAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Alexey Starikovskiy The problem with previous code was it rounded values in wrong place and produced wrong baud rate in some cases. Signed-off-by: Alexey Starikovskiy [nicolas.ferre@atmel.com: port to newer kernel and add commit log] Signed-off-by: Nicolas Ferre --- drivers/tty/serial/atmel_serial.c | 10 ++++++---- include/linux/atmel_serial.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index 5f550d9feed9..fd8aa1f4ba78 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -2170,13 +2170,15 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, * accurately. This feature is enabled only when using normal mode. * baudrate = selected clock / (8 * (2 - OVER) * (CD + FP / 8)) * Currently, OVER is always set to 0 so we get - * baudrate = selected clock (16 * (CD + FP / 8)) + * baudrate = selected clock / (16 * (CD + FP / 8)) + * then + * 8 CD + FP = selected clock / (2 * baudrate) */ if (atmel_port->has_frac_baudrate && (mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_NORMAL) { - div = DIV_ROUND_CLOSEST(port->uartclk, baud); - cd = div / 16; - fp = DIV_ROUND_CLOSEST(div % 16, 2); + div = DIV_ROUND_CLOSEST(port->uartclk, baud * 2); + cd = div >> 3; + fp = div & ATMEL_US_FP_MASK; } else { cd = uart_get_divisor(port, baud); } diff --git a/include/linux/atmel_serial.h b/include/linux/atmel_serial.h index f8e452aa48d7..bd2560502f3c 100644 --- a/include/linux/atmel_serial.h +++ b/include/linux/atmel_serial.h @@ -119,6 +119,7 @@ #define ATMEL_US_BRGR 0x20 /* Baud Rate Generator Register */ #define ATMEL_US_CD GENMASK(15, 0) /* Clock Divider */ #define ATMEL_US_FP_OFFSET 16 /* Fractional Part */ +#define ATMEL_US_FP_MASK 0x7 #define ATMEL_US_RTOR 0x24 /* Receiver Time-out Register for USART */ #define ATMEL_UA_RTOR 0x28 /* Receiver Time-out Register for UART */ -- 2.9.0