Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1531771

[PATCH v2 12/13] net: ethernet: ti: cpts: calc mult and shift from refclk freq

Path csiph.com!aioe.org!bofh.it!news.nic.it!robomod
From Grygorii Strashko <grygorii.strashko@ti.com>
Newsgroups linux.kernel
Subject [PATCH v2 12/13] net: ethernet: ti: cpts: calc mult and shift from refclk freq
Date Tue, 29 Nov 2016 00:10:01 +0100
Message-ID <sIDdD-75-1@gated-at.bofh.it> (permalink)
References <sIDdD-75-3@gated-at.bofh.it>
X-Mailer git-send-email 2.10.1
MIME-Version 1.0
Content-Type text/plain
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 121
Organization linux.* mail to news gateway
X-Original-Cc Sekhar Nori <nsekhar@ti.com>, <linux-kernel@vger.kernel.org>, <linux-omap@vger.kernel.org>, Rob Herring <robh+dt@kernel.org>, <devicetree@vger.kernel.org>, Murali Karicheri <m-karicheri2@ti.com>, Wingman Kwok <w-kwok2@ti.com>, Grygorii Strashko <grygorii.strashko@ti.com>, John Stultz <john.stultz@linaro.org>, Thomas Gleixner <tglx@linutronix.de>
X-Original-Date Mon, 28 Nov 2016 17:03:36 -0600
X-Original-Message-ID <20161128230337.6731-13-grygorii.strashko@ti.com>
X-Original-References <20161128230337.6731-1-grygorii.strashko@ti.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1531771

Show key headers only | View raw


The cyclecounter mult and shift values can be calculated based on the
CPTS rfclk frequency and timekeepnig framework provides required algos
and API's.

Hence, calc mult and shift basing on CPTS rfclk frequency if both
cpts_clock_shift and cpts_clock_mult properties are not provided in DT (the
basis of calculation algorithm is borrowed from
__clocksource_update_freq_scale() commit 7d2f944a2b83 ("clocksource:
Provide a generic mult/shift factor calculation")). After this change
cpts_clock_shift and cpts_clock_mult DT properties will become optional.

Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
---
 Documentation/devicetree/bindings/net/cpsw.txt |  8 +++--
 drivers/net/ethernet/ti/cpts.c                 | 50 ++++++++++++++++++++++----
 2 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/Documentation/devicetree/bindings/net/cpsw.txt b/Documentation/devicetree/bindings/net/cpsw.txt
index 5ad439f..ebda7c9 100644
--- a/Documentation/devicetree/bindings/net/cpsw.txt
+++ b/Documentation/devicetree/bindings/net/cpsw.txt
@@ -20,8 +20,6 @@ Required properties:
 - slaves		: Specifies number for slaves
 - active_slave		: Specifies the slave to use for time stamping,
 			  ethtool and SIOCGMIIPHY
-- cpts_clock_mult	: Numerator to convert input clock ticks into nanoseconds
-- cpts_clock_shift	: Denominator to convert input clock ticks into nanoseconds
 
 Optional properties:
 - ti,hwmods		: Must be "cpgmac0"
@@ -35,7 +33,11 @@ Optional properties:
 			  For example in dra72x-evm, pcf gpio has to be
 			  driven low so that cpsw slave 0 and phy data
 			  lines are connected via mux.
-
+- cpts_clock_mult	: Numerator to convert input clock ticks into nanoseconds
+- cpts_clock_shift	: Denominator to convert input clock ticks into nanoseconds
+			  Mult and shift will be calculated basing on CPTS
+			  rftclk frequency if both cpts_clock_shift and
+			  cpts_clock_mult properties are not provided.
 
 Slave Properties:
 Required properties:
diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c
index da3339b..4761d8c 100644
--- a/drivers/net/ethernet/ti/cpts.c
+++ b/drivers/net/ethernet/ti/cpts.c
@@ -406,18 +406,54 @@ void cpts_unregister(struct cpts *cpts)
 }
 EXPORT_SYMBOL_GPL(cpts_unregister);
 
+static void cpts_calc_mult_shift(struct cpts *cpts)
+{
+	u64 frac, maxsec, ns;
+	u32 freq, mult, shift;
+
+	freq = clk_get_rate(cpts->refclk);
+
+	/* Calc the maximum number of seconds which we can run before
+	 * wrapping around.
+	 */
+	maxsec = cpts->cc.mask;
+	do_div(maxsec, freq);
+	if (maxsec > 600 && cpts->cc.mask > UINT_MAX)
+		maxsec = 600;
+
+	if (cpts->cc_mult || cpts->cc.shift)
+		return;
+
+	clocks_calc_mult_shift(&mult, &shift, freq, NSEC_PER_SEC, maxsec);
+
+	cpts->cc_mult = mult;
+	cpts->cc.mult = mult;
+	cpts->cc.shift = shift;
+
+	frac = 0;
+	ns = cyclecounter_cyc2ns(&cpts->cc, freq, cpts->cc.mask, &frac);
+
+	dev_info(cpts->dev,
+		 "CPTS: ref_clk_freq:%u calc_mult:%u calc_shift:%u error:%lld nsec/sec\n",
+		 freq, cpts->cc_mult, cpts->cc.shift, (ns - NSEC_PER_SEC));
+}
+
 static int cpts_of_parse(struct cpts *cpts, struct device_node *node)
 {
 	int ret = -EINVAL;
 	u32 prop;
 
-	if (of_property_read_u32(node, "cpts_clock_mult", &prop))
-		goto  of_error;
-	cpts->cc_mult = prop;
+	cpts->cc_mult = 0;
+	if (!of_property_read_u32(node, "cpts_clock_mult", &prop))
+		cpts->cc_mult = prop;
+
+	cpts->cc.shift = 0;
+	if (!of_property_read_u32(node, "cpts_clock_shift", &prop))
+		cpts->cc.shift = prop;
 
-	if (of_property_read_u32(node, "cpts_clock_shift", &prop))
-		goto  of_error;
-	cpts->cc.shift = prop;
+	if ((cpts->cc_mult && !cpts->cc.shift) ||
+	    (!cpts->cc_mult && cpts->cc.shift))
+		goto of_error;
 
 	return 0;
 
@@ -460,6 +496,8 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs,
 	cpts->cc.mask = CLOCKSOURCE_MASK(32);
 	cpts->info = cpts_info;
 
+	cpts_calc_mult_shift(cpts);
+
 	return cpts;
 }
 EXPORT_SYMBOL_GPL(cpts_create);
-- 
2.10.1

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v2 00/13] net: ethernet: ti: cpts: update and fixes Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
  [PATCH  v2 12/13] net: ethernet: ti: cpts: calc mult and shift from refclk freq Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 12/13] net: ethernet: ti: cpts: calc mult and shift  from refclk freq Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:40 +0100
      Re: [PATCH v2 12/13] net: ethernet: ti: cpts: calc mult and shift  from refclk freq Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:30 +0100
  [PATCH  v2 03/13] net: ethernet: ti: cpsw: minimize direct access to struct cpts Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
  [PATCH v2 10/13] net: ethernet: ti: cpts: drop excessive writes to CTRL and INT_EN regs Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH v2 10/13] net: ethernet: ti: cpts: drop excessive writes  to CTRL and INT_EN regs Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
  [PATCH  v2 06/13] net: ethernet: ti: cpts: disable cpts when unregistered Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 06/13] net: ethernet: ti: cpts: disable cpts when  unregistered Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:00 +0100
  [PATCH  v2 07/13] net: ethernet: ti: cpts: rework initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:10 +0100
      Re: [PATCH v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:00 +0100
        Re: [PATCH v2 07/13] net: ethernet: ti: cpts: rework  initialization/deinitialization Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-30 19:40 +0100
  [PATCH  v2 02/13] net: ethernet: ti: allow cpts to be built separately Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 02/13] net: ethernet: ti: allow cpts to be built  separately Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:40 +0100
  [PATCH  v2 01/13] net: ethernet: ti: cpts: switch to readl/writel_relaxed() Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 01/13] net: ethernet: ti: cpts: switch to  readl/writel_relaxed() Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:40 +0100
  [PATCH  v2 13/13] net: ethernet: ti: cpts: fix overflow check period Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH  v2 13/13] net: ethernet: ti: cpts: fix overflow check  period Richard Cochran <richardcochran@gmail.com> - 2016-11-30 10:20 +0100
  [PATCH  v2 11/13] clocksource: export the clocks_calc_mult_shift to use by timestamp code Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:10 +0100
    Re: [PATCH v2 11/13] clocksource: export the clocks_calc_mult_shift  to use by timestamp code Thomas Gleixner <tglx@linutronix.de> - 2016-11-29 10:20 +0100
  [PATCH  v2 09/13] net: ethernet: ti: cpts: clean up event list if event pool is empty Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
    Re: [PATCH  v2 09/13] net: ethernet: ti: cpts: clean up event list  if event pool is empty Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
  [PATCH  v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk api usage in cpts_register/unregister Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
    Re: [PATCH  v2 04/13] net: ethernet: ti: cpts: fix unbalanced clk  api usage in cpts_register/unregister Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:50 +0100
  [PATCH  v2 08/13] net: ethernet: ti: cpts: move dt props parsing to cpts driver Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
    Re: [PATCH  v2 08/13] net: ethernet: ti: cpts: move dt props parsing  to cpts driver Richard Cochran <richardcochran@gmail.com> - 2016-11-29 11:20 +0100
      Re: [PATCH v2 08/13] net: ethernet: ti: cpts: move dt props parsing  to cpts driver Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 17:00 +0100
  [PATCH  v2 05/13] net: ethernet: ti: cpts: fix registration order Grygorii Strashko <grygorii.strashko@ti.com> - 2016-11-29 00:20 +0100
    Re: [PATCH  v2 05/13] net: ethernet: ti: cpts: fix registration order Richard Cochran <richardcochran@gmail.com> - 2016-11-29 10:50 +0100

csiph-web