All of lore.kernel.org
 help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert+renesas@glider.be>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Simon Horman <horms@verge.net.au>,
	Magnus Damm <magnus.damm@gmail.com>,
	Yoshinori Sato <ysato@users.sourceforge.jp>,
	Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Cc: linux-serial@vger.kernel.org, linux-sh@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [PATCH 10/25] serial: sh-sci: Improve bit rate error calculation for HSCIF
Date: Thu, 19 Nov 2015 18:38:49 +0000	[thread overview]
Message-ID: <1447958344-836-11-git-send-email-geert+renesas@glider.be> (raw)
In-Reply-To: <1447958344-836-1-git-send-email-geert+renesas@glider.be>

The algorithm to find the best parameters for the requested bit rate
calculates the relative bit rate error, using "(br * b) / 1000".
For small "br * b", this has two problems:
  - The quotient may be zero, leading to a division by zero error,
  - This may introduce a large rounding error.
Switch from relative to absolute bit rate error calculation to fix this.

The default baud rate generator values can be removed, as there will
always be one set of values that gives the smallest absolute error.

Print the best set of values when debugging.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/tty/serial/sh-sci.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 97a0f8ef5adc55a2..f35c209afd127c02 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1867,12 +1867,13 @@ static unsigned int sci_scbrr_calc(struct sci_port *s, unsigned int bps,
 }
 
 /* calculate sample rate, BRR, and clock select for HSCIF */
-static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
+static void sci_baud_calc_hscif(struct sci_port *s, unsigned int bps,
+				unsigned long freq, int *brr,
 				unsigned int *srr, unsigned int *cks)
 {
 	unsigned int sr, br, a, b, c;
 	int err, recv_margin;
-	int min_err = 1000; /* 100% */
+	int min_err = INT_MAX;
 	int recv_max_margin = 0;
 
 	/* Find the combination of sample rate and clock select with the
@@ -1887,7 +1888,7 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
 			b = a * bps;
 			br = DIV_ROUND_CLOSEST(freq, b);
 			br = clamp(br, 1U, 256U);
-			err = DIV_ROUND_CLOSEST(freq, (br * b) / 1000) - 1000;
+			err = DIV_ROUND_CLOSEST(freq, br * a) - bps;
 			/* Calc recv margin
 			 * M: Receive margin (%)
 			 * N: Ratio of bit rate to clock (N = sampling rate)
@@ -1917,13 +1918,8 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
 		}
 	}
 
-	if (min_err = 1000) {
-		WARN_ON(1);
-		/* use defaults */
-		*brr = 255;
-		*srr = 15;
-		*cks = 0;
-	}
+	dev_dbg(s->port.dev, "BRR: %u%+d bps using N %u SR %u cks %u\n", bps,
+		min_err, *brr, *srr + 1, *cks);
 }
 
 static void sci_reset(struct uart_port *port)
@@ -1973,7 +1969,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
 	baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
 	if (likely(baud && port->uartclk)) {
 		if (s->cfg->type = PORT_HSCIF) {
-			sci_baud_calc_hscif(baud, port->uartclk, &t, &srr,
+			sci_baud_calc_hscif(s, baud, port->uartclk, &t, &srr,
 					    &cks);
 		} else {
 			t = sci_scbrr_calc(s, baud, port->uartclk);
-- 
1.9.1


WARNING: multiple messages have this Message-ID (diff)
From: Geert Uytterhoeven <geert+renesas@glider.be>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Simon Horman <horms@verge.net.au>,
	Magnus Damm <magnus.damm@gmail.com>,
	Yoshinori Sato <ysato@users.sourceforge.jp>,
	Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Cc: linux-serial@vger.kernel.org, linux-sh@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [PATCH 10/25] serial: sh-sci: Improve bit rate error calculation for HSCIF
Date: Thu, 19 Nov 2015 19:38:49 +0100	[thread overview]
Message-ID: <1447958344-836-11-git-send-email-geert+renesas@glider.be> (raw)
In-Reply-To: <1447958344-836-1-git-send-email-geert+renesas@glider.be>

The algorithm to find the best parameters for the requested bit rate
calculates the relative bit rate error, using "(br * b) / 1000".
For small "br * b", this has two problems:
  - The quotient may be zero, leading to a division by zero error,
  - This may introduce a large rounding error.
Switch from relative to absolute bit rate error calculation to fix this.

The default baud rate generator values can be removed, as there will
always be one set of values that gives the smallest absolute error.

Print the best set of values when debugging.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
 drivers/tty/serial/sh-sci.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 97a0f8ef5adc55a2..f35c209afd127c02 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1867,12 +1867,13 @@ static unsigned int sci_scbrr_calc(struct sci_port *s, unsigned int bps,
 }
 
 /* calculate sample rate, BRR, and clock select for HSCIF */
-static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
+static void sci_baud_calc_hscif(struct sci_port *s, unsigned int bps,
+				unsigned long freq, int *brr,
 				unsigned int *srr, unsigned int *cks)
 {
 	unsigned int sr, br, a, b, c;
 	int err, recv_margin;
-	int min_err = 1000; /* 100% */
+	int min_err = INT_MAX;
 	int recv_max_margin = 0;
 
 	/* Find the combination of sample rate and clock select with the
@@ -1887,7 +1888,7 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
 			b = a * bps;
 			br = DIV_ROUND_CLOSEST(freq, b);
 			br = clamp(br, 1U, 256U);
-			err = DIV_ROUND_CLOSEST(freq, (br * b) / 1000) - 1000;
+			err = DIV_ROUND_CLOSEST(freq, br * a) - bps;
 			/* Calc recv margin
 			 * M: Receive margin (%)
 			 * N: Ratio of bit rate to clock (N = sampling rate)
@@ -1917,13 +1918,8 @@ static void sci_baud_calc_hscif(unsigned int bps, unsigned long freq, int *brr,
 		}
 	}
 
-	if (min_err == 1000) {
-		WARN_ON(1);
-		/* use defaults */
-		*brr = 255;
-		*srr = 15;
-		*cks = 0;
-	}
+	dev_dbg(s->port.dev, "BRR: %u%+d bps using N %u SR %u cks %u\n", bps,
+		min_err, *brr, *srr + 1, *cks);
 }
 
 static void sci_reset(struct uart_port *port)
@@ -1973,7 +1969,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
 	baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
 	if (likely(baud && port->uartclk)) {
 		if (s->cfg->type == PORT_HSCIF) {
-			sci_baud_calc_hscif(baud, port->uartclk, &t, &srr,
+			sci_baud_calc_hscif(s, baud, port->uartclk, &t, &srr,
 					    &cks);
 		} else {
 			t = sci_scbrr_calc(s, baud, port->uartclk);
-- 
1.9.1


  parent reply	other threads:[~2015-11-19 18:38 UTC|newest]

Thread overview: 151+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-19 18:38 [PATCH 00/25] serial: sh-sci: Add external clock and BRG Support Geert Uytterhoeven
2015-11-19 18:38 ` Geert Uytterhoeven
     [not found] ` <1447958344-836-1-git-send-email-geert+renesas-gXvu3+zWzMSzQB+pC5nmwQ@public.gmane.org>
2015-11-19 18:38   ` [PATCH 01/25] serial: sh-sci: Update DT binding documentation for external clock input Geert Uytterhoeven
2015-11-19 18:38     ` Geert Uytterhoeven
2015-11-19 18:38     ` Geert Uytterhoeven
     [not found]     ` <1447958344-836-2-git-send-email-geert+renesas-gXvu3+zWzMSzQB+pC5nmwQ@public.gmane.org>
2015-11-19 20:19       ` Laurent Pinchart
2015-11-19 20:19         ` Laurent Pinchart
2015-11-19 20:19         ` Laurent Pinchart
2015-11-19 20:27         ` Laurent Pinchart
2015-11-19 20:27           ` Laurent Pinchart
2015-11-19 20:39           ` Geert Uytterhoeven
2015-11-19 20:39             ` Geert Uytterhoeven
2015-11-19 20:39             ` Geert Uytterhoeven
     [not found]             ` <CAMuHMdUnT2zCnj9QBVgxJaHV2fk5iuc7cxq=fh+fVTv3toOVaQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-19 21:17               ` Laurent Pinchart
2015-11-19 21:17                 ` Laurent Pinchart
2015-11-19 21:17                 ` Laurent Pinchart
2015-11-20  8:00                 ` Geert Uytterhoeven
2015-11-20  8:00                   ` Geert Uytterhoeven
2015-11-19 20:33         ` Geert Uytterhoeven
2015-11-19 20:33           ` Geert Uytterhoeven
     [not found]           ` <CAMuHMdX4ToefbBLR6o2AMuzCMoKcYo9XRZOzHJzgtQn552vmNg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-12-21 14:20             ` Geert Uytterhoeven
2015-12-21 14:20               ` Geert Uytterhoeven
2015-12-21 14:20               ` Geert Uytterhoeven
2015-11-19 18:38   ` [PATCH 02/25] serial: sh-sci: Update DT binding documentation for BRG support Geert Uytterhoeven
2015-11-19 18:38     ` Geert Uytterhoeven
2015-11-19 18:38     ` Geert Uytterhoeven
2015-11-19 20:26     ` Laurent Pinchart
2015-11-19 20:26       ` Laurent Pinchart
2015-11-19 20:44       ` Geert Uytterhoeven
2015-11-19 20:44         ` Geert Uytterhoeven
     [not found]         ` <CAMuHMdWHbc1kK7MipyZ_M_C6gPyPqvC4H35eZLXQezjbQNK2Jw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-19 21:13           ` Laurent Pinchart
2015-11-19 21:13             ` Laurent Pinchart
2015-11-19 21:13             ` Laurent Pinchart
2015-11-20  7:58             ` Geert Uytterhoeven
2015-11-20  7:58               ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 03/25] serial: sh-sci: Drop useless check for zero sampling_rate Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 04/25] serial: sh-sci: Grammar s/Get ... for/Get ... from/ Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 05/25] serial: sh-sci: Drop unused frame_len parameter for sci_baud_calc_hscif() Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 06/25] serial: sh-sci: Don't overwrite clock selection in serial_console_write() Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 07/25] serial: sh-sci: Convert from clk_get() to devm_clk_get() Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 20:38   ` Laurent Pinchart
2015-11-19 20:38     ` Laurent Pinchart
2015-12-10 12:30     ` Geert Uytterhoeven
2015-12-10 12:30       ` Geert Uytterhoeven
2015-12-13 19:39       ` Laurent Pinchart
2015-12-13 19:39         ` Laurent Pinchart
2015-12-14 10:34         ` Geert Uytterhoeven
2015-12-14 10:34           ` Geert Uytterhoeven
2015-12-14 15:47           ` Laurent Pinchart
2015-12-14 15:47             ` Laurent Pinchart
2015-11-19 18:38 ` [PATCH 08/25] serial: sh-sci: Make unsigned values in sci_baud_calc_hscif() unsigned Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 20:36   ` Laurent Pinchart
2015-11-19 20:36     ` Laurent Pinchart
2015-11-19 20:49     ` Geert Uytterhoeven
2015-11-19 20:49       ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 09/25] serial: sh-sci: Avoid overflow in sci_baud_calc_hscif() Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 20:37   ` Laurent Pinchart
2015-11-19 20:37     ` Laurent Pinchart
2015-11-19 20:50     ` Geert Uytterhoeven
2015-11-19 20:50       ` Geert Uytterhoeven
2015-11-19 18:38 ` Geert Uytterhoeven [this message]
2015-11-19 18:38   ` [PATCH 10/25] serial: sh-sci: Improve bit rate error calculation for HSCIF Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 11/25] serial: sh-sci: Avoid calculating the receive margin " Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 12/25] serial: sh-sci: Merge sci_scbrr_calc() and sci_baud_calc_hscif() Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 13/25] serial: sh-sci: Take into account sampling rate for max baud rate Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 14/25] serial: sh-sci: Add BRG register definitions Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 20:45   ` Laurent Pinchart
2015-11-19 20:45     ` Laurent Pinchart
2015-11-19 18:38 ` [PATCH 15/25] serial: sh-sci: Replace struct sci_port_info by type/regtype encoding Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 16/25] serial: sh-sci: Correct SCIF type on RZ/A1H Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 17/25] serial: sh-sci: Correct SCIF type on R-Car for BRG Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 20:55   ` Laurent Pinchart
2015-11-19 20:55     ` Laurent Pinchart
2015-11-20  7:46     ` Geert Uytterhoeven
2015-11-20  7:46       ` Geert Uytterhoeven
2015-11-20 14:52       ` Laurent Pinchart
2015-11-20 14:52         ` Laurent Pinchart
2015-11-20 15:30         ` Geert Uytterhoeven
2015-11-20 15:30           ` Geert Uytterhoeven
2015-11-20 15:33           ` Laurent Pinchart
2015-11-20 15:33             ` Laurent Pinchart
2015-12-10  9:21             ` Geert Uytterhoeven
2015-12-10  9:21               ` Geert Uytterhoeven
2015-12-11  1:12               ` Simon Horman
2015-12-11  1:12                 ` Simon Horman
2015-12-13 19:18               ` Laurent Pinchart
2015-12-13 19:18                 ` Laurent Pinchart
2015-11-19 18:38 ` [PATCH 18/25] serial: sh-sci: Prepare for multiple clocks and baud rate generators Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 21:04   ` Laurent Pinchart
2015-11-19 21:04     ` Laurent Pinchart
2015-11-20  7:52     ` Geert Uytterhoeven
2015-11-20  7:52       ` Geert Uytterhoeven
2015-11-20 14:47       ` Laurent Pinchart
2015-11-20 14:47         ` Laurent Pinchart
2015-11-20 15:17         ` Geert Uytterhoeven
2015-11-20 15:17           ` Geert Uytterhoeven
2015-11-20 15:31           ` Laurent Pinchart
2015-11-20 15:31             ` Laurent Pinchart
2015-11-19 18:38 ` [PATCH 19/25] serial: sh-sci: Add support for optional external (H)SCK input Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:38 ` [PATCH 20/25] serial: sh-sci: Add support for optional BRG on (H)SCIF Geert Uytterhoeven
2015-11-19 18:38   ` Geert Uytterhoeven
2015-11-19 18:39 ` [PATCH 21/25] ARM: shmobile: r8a7791 dtsi: Add BRG support for (H)SCIF Geert Uytterhoeven
2015-11-19 18:39   ` Geert Uytterhoeven
2015-11-19 18:39 ` [PATCH 22/25] ARM: shmobile: koelsch dts: Enable SCIF_CLK frequency and pins Geert Uytterhoeven
2015-11-19 18:39   ` Geert Uytterhoeven
2015-11-19 18:39 ` [PATCH 23/25] arm64: renesas: r8a7795 dtsi: Add BRG support for (H)SCIF Geert Uytterhoeven
2015-11-19 18:39   ` Geert Uytterhoeven
2015-11-19 21:07   ` Laurent Pinchart
2015-11-19 21:07     ` Laurent Pinchart
2015-11-20  8:17     ` Geert Uytterhoeven
2015-11-20  8:17       ` Geert Uytterhoeven
2015-11-19 18:39 ` [PATCH 24/25] arm64: renesas: salvator-x dts: Enable SCIF_CLK frequency and pins Geert Uytterhoeven
2015-11-19 18:39   ` Geert Uytterhoeven
2015-11-19 18:39 ` [PATCH 25/25] sh: sh7734: Correct SCIF type for BRG Geert Uytterhoeven
2015-11-19 18:39   ` Geert Uytterhoeven
2015-11-19 21:08 ` [PATCH 00/25] serial: sh-sci: Add external clock and BRG Support Laurent Pinchart
2015-11-19 21:08   ` Laurent Pinchart
2015-11-20  8:22   ` Geert Uytterhoeven
2015-11-20  8:22     ` Geert Uytterhoeven
2015-11-20  8:58     ` Laurent Pinchart
2015-11-20  8:58       ` Laurent Pinchart
2015-11-20  9:07       ` Geert Uytterhoeven
2015-11-20  9:07         ` Geert Uytterhoeven
2015-11-20 14:50         ` Laurent Pinchart
2015-11-20 14:50           ` Laurent Pinchart
2015-11-20 15:31           ` Geert Uytterhoeven
2015-11-20 15:31             ` Geert Uytterhoeven
2015-11-20  9:09 ` Geert Uytterhoeven
2015-11-20  9:09   ` Geert Uytterhoeven
2015-12-13  6:43   ` Greg Kroah-Hartman
2015-12-13  6:43     ` Greg Kroah-Hartman
2015-12-13  9:09     ` Geert Uytterhoeven
2015-12-13  9:09       ` Geert Uytterhoeven
2015-11-24  2:43 ` Simon Horman
2015-11-24  2:43   ` Simon Horman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1447958344-836-11-git-send-email-geert+renesas@glider.be \
    --to=geert+renesas@glider.be \
    --cc=gregkh@linuxfoundation.org \
    --cc=horms@verge.net.au \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=magnus.damm@gmail.com \
    --cc=ysato@users.sourceforge.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.