linux-sh.vger.kernel.org archive mirror
 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>
Cc: linux-serial@vger.kernel.org, linux-sh@vger.kernel.org,
	Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [PATCH v3 14/27] serial: sh-sci: Avoid calculating the receive margin for HSCIF
Date: Mon, 14 Dec 2015 18:57:23 +0000	[thread overview]
Message-ID: <1450119456-964-15-git-send-email-geert+renesas@glider.be> (raw)
In-Reply-To: <1450119456-964-1-git-send-email-geert+renesas@glider.be>

When assuming D = 0.5 and F = 0, maximizing the receive margin M is
equivalent to maximizing the sample rate N.

Hence there's no need to calculate the receive margin, as we can obtain
the same result by iterating over all possible sample rates in reverse
order, and skipping parameter sets that don't provide a lower bit rate
error.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
v3:
  - Add Acked-by,
  - Rebased,
  - Terminate loop over sampling rates on perfect match.
---
 drivers/tty/serial/sh-sci.c | 51 +++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 27 deletions(-)

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 306497ee5c326d19..c3a193616484a62c 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1872,13 +1872,24 @@ static void sci_baud_calc_hscif(struct sci_port *s, unsigned int bps,
 				unsigned int *srr, unsigned int *cks)
 {
 	unsigned int sr, br, prediv, scrate, c;
-	int err, recv_margin;
-	int min_err = INT_MAX;
-	int recv_max_margin = 0;
+	int err, min_err = INT_MAX;
 
-	/* Find the combination of sample rate and clock select with the
-	   smallest deviation from the desired baud rate. */
-	for (sr = 8; sr <= 32; sr++) {
+	/*
+	 * Find the combination of sample rate and clock select with the
+	 * smallest deviation from the desired baud rate.
+	 * Prefer high sample rates to maximise the receive margin.
+	 *
+	 * M: Receive margin (%)
+	 * N: Ratio of bit rate to clock (N = sampling rate)
+	 * D: Clock duty (D = 0 to 1.0)
+	 * L: Frame length (L = 9 to 12)
+	 * F: Absolute value of clock frequency deviation
+	 *
+	 *  M = |(0.5 - 1 / 2 * N) - ((L - 0.5) * F) -
+	 *      (|D - 0.5| / N * (1 + F))|
+	 *  NOTE: Usually, treat D for 0.5, F is 0 by this calculation.
+	 */
+	for (sr = 32; sr >= 8; sr--) {
 		for (c = 0; c <= 3; c++) {
 			/* integerized formulas from HSCIF documentation */
 			prediv = sr * (1 << (2 * c + 1));
@@ -1898,36 +1909,22 @@ static void sci_baud_calc_hscif(struct sci_port *s, unsigned int bps,
 			scrate = prediv * bps;
 			br = DIV_ROUND_CLOSEST(freq, scrate);
 			br = clamp(br, 1U, 256U);
+
 			err = DIV_ROUND_CLOSEST(freq, br * prediv) - bps;
-			/* Calc recv margin
-			 * M: Receive margin (%)
-			 * N: Ratio of bit rate to clock (N = sampling rate)
-			 * D: Clock duty (D = 0 to 1.0)
-			 * L: Frame length (L = 9 to 12)
-			 * F: Absolute value of clock frequency deviation
-			 *
-			 *  M = |(0.5 - 1 / 2 * N) - ((L - 0.5) * F) -
-			 *      (|D - 0.5| / N * (1 + F))|
-			 *  NOTE: Usually, treat D for 0.5, F is 0 by this
-			 *        calculation.
-			 */
-			recv_margin = abs((500 -
-					DIV_ROUND_CLOSEST(1000, sr << 1)) / 10);
-			if (abs(min_err) > abs(err)) {
-				min_err = err;
-				recv_max_margin = recv_margin;
-			} else if ((min_err = err) &&
-				   (recv_margin > recv_max_margin))
-				recv_max_margin = recv_margin;
-			else
+			if (abs(err) >= abs(min_err))
 				continue;
 
+			min_err = err;
 			*brr = br - 1;
 			*srr = sr - 1;
 			*cks = c;
+
+			if (!err)
+				goto found;
 		}
 	}
 
+found:
 	dev_dbg(s->port.dev, "BRR: %u%+d bps using N %u SR %u cks %u\n", bps,
 		min_err, *brr, *srr + 1, *cks);
 }
-- 
1.9.1


  parent reply	other threads:[~2015-12-14 18:57 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-14 18:57 [PATCH v3 00/27] serial: sh-sci: External Clock Support Geert Uytterhoeven
     [not found] ` <1450119456-964-1-git-send-email-geert+renesas-gXvu3+zWzMSzQB+pC5nmwQ@public.gmane.org>
2015-12-14 18:57   ` [PATCH v3 01/27] serial: sh-sci: Drop the interface clock Geert Uytterhoeven
2015-12-14 18:57   ` [PATCH v3 20/27] serial: sh-sci: Correct SCIF type on R-Car for BRG Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 02/27] serial: sh-sci: Add fallback compatibility strings Geert Uytterhoeven
2015-12-20  3:39   ` Rob Herring
2015-12-14 18:57 ` [PATCH v3 03/27] serial: sh-sci: Update DT binding documentation for external clock input Geert Uytterhoeven
2015-12-20  3:39   ` Rob Herring
2015-12-14 18:57 ` [PATCH v3 04/27] serial: sh-sci: Update DT binding documentation for BRG support Geert Uytterhoeven
2015-12-20  3:39   ` Rob Herring
2015-12-14 18:57 ` [PATCH v3 05/27] serial: sh-sci: Drop useless check for zero sampling_rate Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 06/27] serial: sh-sci: Grammar s/Get ... for/Get ... from/ Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 07/27] serial: sh-sci: Use existing local variable in sci_parse_dt() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 08/27] serial: sh-sci: Drop unused frame_len parameter for sci_baud_calc_hscif() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 09/27] serial: sh-sci: Don't overwrite clock selection in serial_console_write() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 10/27] serial: sh-sci: Convert from clk_get() to devm_clk_get() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 11/27] serial: sh-sci: Make unsigned values in sci_baud_calc_hscif() unsigned Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 12/27] serial: sh-sci: Avoid overflow in sci_baud_calc_hscif() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 13/27] serial: sh-sci: Improve bit rate error calculation for HSCIF Geert Uytterhoeven
2015-12-14 18:57 ` Geert Uytterhoeven [this message]
2015-12-14 18:57 ` [PATCH v3 15/27] serial: sh-sci: Merge sci_scbrr_calc() and sci_baud_calc_hscif() Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 16/27] serial: sh-sci: Take into account sampling rate for max baud rate Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 17/27] serial: sh-sci: Add BRG register definitions Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 18/27] serial: sh-sci: Replace struct sci_port_info by type/regtype encoding Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 19/27] serial: sh-sci: Correct SCIF type on RZ/A1H Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 21/27] serial: sh-sci: Prepare for multiple sampling clock sources Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 22/27] serial: sh-sci: Add support for optional external (H)SCK input Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 23/27] serial: sh-sci: Add support for optional BRG on (H)SCIF Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 24/27] sh: Rename sci_ick and sci_fck clock to fck Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 25/27] sh: Remove sci_ick clock alias Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 26/27] sh: sh7734: Correct SCIF type for BRG Geert Uytterhoeven
2015-12-14 18:57 ` [PATCH v3 27/27] serial: sh-sci: Drop the sci_fck clock fallback Geert Uytterhoeven
2015-12-15  4:53 ` [PATCH v3 00/27] serial: sh-sci: External Clock Support Simon Horman
2015-12-15  5:23   ` Greg Kroah-Hartman
2015-12-15 13:54     ` Geert Uytterhoeven
2015-12-17 10:28       ` Geert Uytterhoeven

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=1450119456-964-15-git-send-email-geert+renesas@glider.be \
    --to=geert+renesas@glider.be \
    --cc=gregkh@linuxfoundation.org \
    --cc=horms@verge.net.au \
    --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 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).