All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ladislav Michl <ladis@linux-mips.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-omap@vger.kernel.org, linux-clk@vger.kernel.org,
	Paul Walmsley <paul@pwsan.com>, Tero Kristo <t-kristo@ti.com>,
	Richard Watts <rrw@kynesim.co.uk>,
	Tony Lindgren <tony@atomide.com>,
	Alexander Kinzer <a.kinzer@plusoptix.de>
Subject: Re: [PATCH v3] clk: ti: omap36xx: Work around sprz319 advisory 2.1
Date: Wed, 7 Dec 2016 17:34:02 +0100	[thread overview]
Message-ID: <20161207163402.GA26187@localhost.localdomain> (raw)
In-Reply-To: <3238104.GnrXpa3VZc@avalon>

Hi Laurent,

On Tue, Dec 06, 2016 at 01:59:56AM +0200, Laurent Pinchart wrote:
> Hi Ladislav,
[snip]
> I've tested both versions with gcc 4.7.3 [1] and 4.8.5 [2]. With 4.7.3 my 
> version is 4 bytes longer, and with 4.8.5 it's 4 bytes shorter. Interestingly 
> enough the "break + test after loop" pattern doesn't make a difference, it's 
> only the intermediate variable that results in changes to the generated code.

Interesting exercise... I hereby present 92 bytes shorter version using
gcc version 5.4.0 (OSELAS.Toolchain-2016.06.0)
I hope it's still easily readable.

> [1] arm-linux-gnueabihf-gcc (crosstool-NG 
> linaro-1.13.1-4.7-2013.02-01-20130221 - Linaro GCC 2013.02) 4.7.3 20130205 
> (prerelease)
> 
> [2] arm-buildroot-linux-uclibcgnueabihf-gcc.br_real (Buildroot 2016.08-dirty) 
> 4.8.5

Best regards,
	ladis

diff --git a/drivers/clk/ti/dpll3xxx.c b/drivers/clk/ti/dpll3xxx.c
index 88f2ce8..f7772fc 100644
--- a/drivers/clk/ti/dpll3xxx.c
+++ b/drivers/clk/ti/dpll3xxx.c
@@ -838,3 +838,69 @@ int omap3_dpll4_set_rate_and_parent(struct clk_hw *hw, unsigned long rate,
 	return omap3_noncore_dpll_set_rate_and_parent(hw, rate, parent_rate,
 						      index);
 }
+
+/* Apply DM3730 errata sprz319 advisory 2.1. */
+static bool omap3_dpll5_apply_errata(struct clk_hw *hw,
+				     unsigned long parent_rate)
+{
+	struct omap3_dpll5_settings {
+		unsigned int rate;
+		unsigned short m, n;
+	};
+
+	int i;
+	struct dpll_data *dd;
+	struct clk_hw_omap *clk;
+	const struct omap3_dpll5_settings *p;
+	static const struct omap3_dpll5_settings precomputed[] = {
+		/*
+		 * From DM3730 errata advisory 2.1, table 35 and 36.
+		 * The N value is increased by 1 compared to the tables as the
+		 * errata lists register values while last_rounded_field is the
+		 * real divider value.
+		 */
+		{ 12000000,  80,  0 + 1 },
+		{ 13000000, 443,  5 + 1 },
+		{ 19200000,  50,  0 + 1 },
+		{ 26000000, 443, 11 + 1 },
+		{ 38400000,  25,  0 + 1 }
+	};
+
+	for (i = 0; i< ARRAY_SIZE(precomputed); i++) {
+		p = precomputed + i;
+		if (parent_rate == p->rate) {
+			clk = to_clk_hw_omap(hw);
+			dd = clk->dpll_data;
+			/* Update the M, N and rounded rate values */
+			dd->last_rounded_m = p->m;
+			dd->last_rounded_n = p->n;
+			dd->last_rounded_rate =
+				div_u64((u64)parent_rate * p->m, p->n);
+			omap3_noncore_dpll_program(clk, 0);
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+/**
+ * omap3_dpll5_set_rate - set rate for omap3 dpll5
+ * @hw: clock to change
+ * @rate: target rate for clock
+ * @parent_rate: rate of the parent clock
+ *
+ * Set rate for the DPLL5 clock. Apply the sprz319 advisory 2.1 on OMAP36xx if
+ * the DPLL is used for USB host (detected through the requested rate).
+ */
+int omap3_dpll5_set_rate(struct clk_hw *hw, unsigned long rate,
+			 unsigned long parent_rate)
+{
+	if (rate == OMAP3_DPLL5_FREQ_FOR_USBHOST * 8) {
+		if (omap3_dpll5_apply_errata(hw, parent_rate))
+			return 0;
+	}
+
+	return omap3_noncore_dpll_set_rate(hw, rate, parent_rate);
+}
-- 
2.1.4


  reply	other threads:[~2016-12-07 16:34 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-02 21:14 [PATCH v3] clk: ti: omap36xx: Work around sprz319 advisory 2.1 Laurent Pinchart
2016-12-02 22:41 ` Michael Turquette
2016-12-02 22:41   ` Michael Turquette
2016-12-05  8:22 ` Ladislav Michl
2016-12-05  8:46   ` Laurent Pinchart
2016-12-05  9:36     ` Ladislav Michl
2016-12-05 11:08       ` Laurent Pinchart
2016-12-05 12:24         ` Tero Kristo
2016-12-05 12:24           ` Tero Kristo
2016-12-08  0:16           ` Stephen Boyd
2016-12-08  7:11             ` Ladislav Michl
2016-12-08 11:40               ` Laurent Pinchart
2016-12-08 21:14                 ` Stephen Boyd
2016-12-05 23:59       ` Laurent Pinchart
2016-12-07 16:34         ` Ladislav Michl [this message]
2016-12-08 21:16 ` Stephen Boyd
2016-12-08 21:24   ` Laurent Pinchart
2017-01-03 18:00     ` Adam Ford
2017-01-03 18:49       ` Stephen Boyd
2017-01-03 22:16         ` Laurent Pinchart
2017-01-04 12:59           ` Adam Ford

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=20161207163402.GA26187@localhost.localdomain \
    --to=ladis@linux-mips.org \
    --cc=a.kinzer@plusoptix.de \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=paul@pwsan.com \
    --cc=rrw@kynesim.co.uk \
    --cc=t-kristo@ti.com \
    --cc=tony@atomide.com \
    /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.