All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nishanth Menon <nm@ti.com>
To: Lokesh Vutla <lokeshvutla@ti.com>, <t-kristo@ti.com>
Cc: Lennart Sorensen <lsorense@csclub.uwaterloo.ca>,
	<linux-omap@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	"Kristo, Tero" <t-kristo@ti.com>, Sekhar Nori <nsekhar@ti.com>
Subject: Re: [PATCH 2/2] ARM: omap5/dra7xx: Fix counter frequency drift for AM572x errata i856.
Date: Tue, 16 Dec 2014 08:58:56 -0600	[thread overview]
Message-ID: <20141216145856.GA23358@kahuna> (raw)
In-Reply-To: <549018EC.8020207@ti.com>

On 17:05-20141216, Lokesh Vutla wrote:
[...]
>  
> @@ -545,6 +546,16 @@ static void __init realtime_counter_init(void)
>  		break;
>  	}
>  
> +	if (soc_is_dra7xx()) {
> +		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
> +		reg = reg & DRA7_SPEEDSELECT_MASK;
> +
> +		if (reg) {
> +			num = 75;
> +			den = 244;
> +		}
> +	}
> +
>  	/* Program numerator and denumerator registers */
>  	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
>  			NUMERATOR_DENUMERATOR_MASK;

A) So, it does look like the 32k node is actually wrong then -> Tero:
any comments? should'nt this now be modeled based on
CTRL_CORE_BOOTSTRAP::SPEEDSELECT considering that clock nodes do have
clk mux options based on the 32k..
sys_32k_ck: sys_32k_ck {
	#clock-cells = <0>;
	compatible = "fixed-clock";
	clock-frequency = <32768>;
};

B) Since rate switch is no longer needed, how about something like the
following:
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
index a3c0133..315d6d1 100644
--- a/arch/arm/mach-omap2/control.h
+++ b/arch/arm/mach-omap2/control.h
@@ -286,6 +286,11 @@
 #define OMAP5XXX_CONTROL_STATUS                0x134
 #define OMAP5_DEVICETYPE_MASK          (0x7 << 6)
 
+
+/* DRA7XX CONTROL CORE BOOTSTRAP */
+#define DRA7_CTRL_CORE_BOOTSTRAP	0x6c4
+#define DRA7_SPEEDSELECT_MASK		(0x3 << 8)
+
 /*
  * REVISIT: This list of registers is not comprehensive - there are more
  * that should be added.
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 4f61148..783d3c3 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -54,6 +54,7 @@
 
 #include "soc.h"
 #include "common.h"
+#include "control.h"
 #include "powerdomain.h"
 #include "omap-secure.h"
 
@@ -511,6 +512,35 @@ static void __init realtime_counter_init(void)
 	}
 
 	rate = clk_get_rate(sys_clk);
+
+	if (soc_is_dra7xx()) {
+		/*
+		 * Errata i856 says the 32.768KHz crystal does not start at
+		 * power on, so the CPU falls back in an emulated 32KHz clock
+		 * based on sysclk / 610 instead. This causes the master counter
+		 * frequency to not be 6.144MHz but at sysclk / 610  * 375 / 2
+		 * (OR sysclk * 75 / 244)
+		 *
+		 * This affects at least the DRA7/AM572x 1.0, 1.1 revisions.
+		 * Of course any board built without a populated 32.768KHz
+		 * crystal would also need this fix even if the CPU is fixed
+		 * later.
+		 *
+		 * Either case can be detected by using the two speedselect bits
+		 * If they are not 0, then the 32.768KHz clock driving the
+		 * course counter that corrects the fine counter every time it
+		 * ticks is actually rate/610 rather than 32.768KHz and we
+		 * should compensate to avoid the 570ppm (At 20MHz, much worse
+		 * at other rates) too fast system time.
+		 */
+		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
+		if (reg & DRA7_SPEEDSELECT_MASK) {
+			num = 75;
+			den = 244;
+			goto sysclk_based;
+		}
+	}
+
 	/* Numerator/denumerator values refer TRM Realtime Counter section */
 	switch (rate) {
 	case 1200000:
@@ -545,6 +575,7 @@ static void __init realtime_counter_init(void)
 		break;
 	}
 
+sysclk_based:
 	/* Program numerator and denumerator registers */
 	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
 			NUMERATOR_DENUMERATOR_MASK;

-- 
Regards,
Nishanth Menon

WARNING: multiple messages have this Message-ID (diff)
From: Nishanth Menon <nm@ti.com>
To: Lokesh Vutla <lokeshvutla@ti.com>
Cc: Lennart Sorensen <lsorense@csclub.uwaterloo.ca>,
	linux-omap@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, "Kristo,
	Tero" <t-kristo@ti.com>, Sekhar Nori <nsekhar@ti.com>
Subject: Re: [PATCH 2/2] ARM: omap5/dra7xx: Fix counter frequency drift for AM572x errata i856.
Date: Tue, 16 Dec 2014 08:58:56 -0600	[thread overview]
Message-ID: <20141216145856.GA23358@kahuna> (raw)
In-Reply-To: <549018EC.8020207@ti.com>

On 17:05-20141216, Lokesh Vutla wrote:
[...]
>  
> @@ -545,6 +546,16 @@ static void __init realtime_counter_init(void)
>  		break;
>  	}
>  
> +	if (soc_is_dra7xx()) {
> +		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
> +		reg = reg & DRA7_SPEEDSELECT_MASK;
> +
> +		if (reg) {
> +			num = 75;
> +			den = 244;
> +		}
> +	}
> +
>  	/* Program numerator and denumerator registers */
>  	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
>  			NUMERATOR_DENUMERATOR_MASK;

A) So, it does look like the 32k node is actually wrong then -> Tero:
any comments? should'nt this now be modeled based on
CTRL_CORE_BOOTSTRAP::SPEEDSELECT considering that clock nodes do have
clk mux options based on the 32k..
sys_32k_ck: sys_32k_ck {
	#clock-cells = <0>;
	compatible = "fixed-clock";
	clock-frequency = <32768>;
};

B) Since rate switch is no longer needed, how about something like the
following:
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
index a3c0133..315d6d1 100644
--- a/arch/arm/mach-omap2/control.h
+++ b/arch/arm/mach-omap2/control.h
@@ -286,6 +286,11 @@
 #define OMAP5XXX_CONTROL_STATUS                0x134
 #define OMAP5_DEVICETYPE_MASK          (0x7 << 6)
 
+
+/* DRA7XX CONTROL CORE BOOTSTRAP */
+#define DRA7_CTRL_CORE_BOOTSTRAP	0x6c4
+#define DRA7_SPEEDSELECT_MASK		(0x3 << 8)
+
 /*
  * REVISIT: This list of registers is not comprehensive - there are more
  * that should be added.
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 4f61148..783d3c3 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -54,6 +54,7 @@
 
 #include "soc.h"
 #include "common.h"
+#include "control.h"
 #include "powerdomain.h"
 #include "omap-secure.h"
 
@@ -511,6 +512,35 @@ static void __init realtime_counter_init(void)
 	}
 
 	rate = clk_get_rate(sys_clk);
+
+	if (soc_is_dra7xx()) {
+		/*
+		 * Errata i856 says the 32.768KHz crystal does not start at
+		 * power on, so the CPU falls back in an emulated 32KHz clock
+		 * based on sysclk / 610 instead. This causes the master counter
+		 * frequency to not be 6.144MHz but at sysclk / 610  * 375 / 2
+		 * (OR sysclk * 75 / 244)
+		 *
+		 * This affects at least the DRA7/AM572x 1.0, 1.1 revisions.
+		 * Of course any board built without a populated 32.768KHz
+		 * crystal would also need this fix even if the CPU is fixed
+		 * later.
+		 *
+		 * Either case can be detected by using the two speedselect bits
+		 * If they are not 0, then the 32.768KHz clock driving the
+		 * course counter that corrects the fine counter every time it
+		 * ticks is actually rate/610 rather than 32.768KHz and we
+		 * should compensate to avoid the 570ppm (At 20MHz, much worse
+		 * at other rates) too fast system time.
+		 */
+		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
+		if (reg & DRA7_SPEEDSELECT_MASK) {
+			num = 75;
+			den = 244;
+			goto sysclk_based;
+		}
+	}
+
 	/* Numerator/denumerator values refer TRM Realtime Counter section */
 	switch (rate) {
 	case 1200000:
@@ -545,6 +575,7 @@ static void __init realtime_counter_init(void)
 		break;
 	}
 
+sysclk_based:
 	/* Program numerator and denumerator registers */
 	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
 			NUMERATOR_DENUMERATOR_MASK;

-- 
Regards,
Nishanth Menon

WARNING: multiple messages have this Message-ID (diff)
From: nm@ti.com (Nishanth Menon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] ARM: omap5/dra7xx: Fix counter frequency drift for AM572x errata i856.
Date: Tue, 16 Dec 2014 08:58:56 -0600	[thread overview]
Message-ID: <20141216145856.GA23358@kahuna> (raw)
In-Reply-To: <549018EC.8020207@ti.com>

On 17:05-20141216, Lokesh Vutla wrote:
[...]
>  
> @@ -545,6 +546,16 @@ static void __init realtime_counter_init(void)
>  		break;
>  	}
>  
> +	if (soc_is_dra7xx()) {
> +		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
> +		reg = reg & DRA7_SPEEDSELECT_MASK;
> +
> +		if (reg) {
> +			num = 75;
> +			den = 244;
> +		}
> +	}
> +
>  	/* Program numerator and denumerator registers */
>  	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
>  			NUMERATOR_DENUMERATOR_MASK;

A) So, it does look like the 32k node is actually wrong then -> Tero:
any comments? should'nt this now be modeled based on
CTRL_CORE_BOOTSTRAP::SPEEDSELECT considering that clock nodes do have
clk mux options based on the 32k..
sys_32k_ck: sys_32k_ck {
	#clock-cells = <0>;
	compatible = "fixed-clock";
	clock-frequency = <32768>;
};

B) Since rate switch is no longer needed, how about something like the
following:
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h
index a3c0133..315d6d1 100644
--- a/arch/arm/mach-omap2/control.h
+++ b/arch/arm/mach-omap2/control.h
@@ -286,6 +286,11 @@
 #define OMAP5XXX_CONTROL_STATUS                0x134
 #define OMAP5_DEVICETYPE_MASK          (0x7 << 6)
 
+
+/* DRA7XX CONTROL CORE BOOTSTRAP */
+#define DRA7_CTRL_CORE_BOOTSTRAP	0x6c4
+#define DRA7_SPEEDSELECT_MASK		(0x3 << 8)
+
 /*
  * REVISIT: This list of registers is not comprehensive - there are more
  * that should be added.
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 4f61148..783d3c3 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -54,6 +54,7 @@
 
 #include "soc.h"
 #include "common.h"
+#include "control.h"
 #include "powerdomain.h"
 #include "omap-secure.h"
 
@@ -511,6 +512,35 @@ static void __init realtime_counter_init(void)
 	}
 
 	rate = clk_get_rate(sys_clk);
+
+	if (soc_is_dra7xx()) {
+		/*
+		 * Errata i856 says the 32.768KHz crystal does not start at
+		 * power on, so the CPU falls back in an emulated 32KHz clock
+		 * based on sysclk / 610 instead. This causes the master counter
+		 * frequency to not be 6.144MHz but at sysclk / 610  * 375 / 2
+		 * (OR sysclk * 75 / 244)
+		 *
+		 * This affects at least the DRA7/AM572x 1.0, 1.1 revisions.
+		 * Of course any board built without a populated 32.768KHz
+		 * crystal would also need this fix even if the CPU is fixed
+		 * later.
+		 *
+		 * Either case can be detected by using the two speedselect bits
+		 * If they are not 0, then the 32.768KHz clock driving the
+		 * course counter that corrects the fine counter every time it
+		 * ticks is actually rate/610 rather than 32.768KHz and we
+		 * should compensate to avoid the 570ppm (At 20MHz, much worse
+		 *@other rates) too fast system time.
+		 */
+		reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP);
+		if (reg & DRA7_SPEEDSELECT_MASK) {
+			num = 75;
+			den = 244;
+			goto sysclk_based;
+		}
+	}
+
 	/* Numerator/denumerator values refer TRM Realtime Counter section */
 	switch (rate) {
 	case 1200000:
@@ -545,6 +575,7 @@ static void __init realtime_counter_init(void)
 		break;
 	}
 
+sysclk_based:
 	/* Program numerator and denumerator registers */
 	reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) &
 			NUMERATOR_DENUMERATOR_MASK;

-- 
Regards,
Nishanth Menon

  reply	other threads:[~2014-12-16 14:59 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-12 22:08 [PATCH 0/2] ARM: omap5/dra7xx counter frequency fixes Lennart Sorensen
2014-12-12 22:08 ` Lennart Sorensen
2014-12-12 22:08 ` [PATCH 1/2] ARM: omap5/dra7xx: Fix frequency typos Lennart Sorensen
2014-12-12 22:08   ` Lennart Sorensen
2014-12-16 11:38   ` Lokesh Vutla
2014-12-16 11:38     ` Lokesh Vutla
2014-12-16 11:38     ` Lokesh Vutla
2014-12-16 14:06   ` Nishanth Menon
2014-12-16 14:06     ` Nishanth Menon
2014-12-16 14:06     ` Nishanth Menon
2014-12-16 16:39     ` Lennart Sorensen
2014-12-16 16:39       ` Lennart Sorensen
2014-12-12 22:08 ` [PATCH 2/2] ARM: omap5/dra7xx: Fix counter frequency drift for AM572x errata i856 Lennart Sorensen
2014-12-12 22:08   ` Lennart Sorensen
2014-12-14  4:45   ` Lennart Sorensen
2014-12-14  4:45     ` Lennart Sorensen
2014-12-16 11:35     ` Lokesh Vutla
2014-12-16 11:35       ` Lokesh Vutla
2014-12-16 11:35       ` Lokesh Vutla
2014-12-16 14:58       ` Nishanth Menon [this message]
2014-12-16 14:58         ` Nishanth Menon
2014-12-16 14:58         ` Nishanth Menon
2014-12-16 16:36         ` Lennart Sorensen
2014-12-16 16:36           ` Lennart Sorensen
2014-12-16 18:59           ` Nishanth Menon
2014-12-16 18:59             ` Nishanth Menon
2014-12-16 18:59             ` Nishanth Menon
2014-12-16 19:27             ` Lennart Sorensen
2014-12-16 19:27               ` Lennart Sorensen
2014-12-16 19:33               ` Nishanth Menon
2014-12-16 19:33                 ` Nishanth Menon
2014-12-16 19:33                 ` Nishanth Menon
2014-12-17 13:21         ` Tero Kristo
2014-12-17 13:21           ` Tero Kristo
2014-12-17 13:21           ` Tero Kristo
2014-12-17 14:55           ` Lennart Sorensen
2014-12-17 14:55             ` Lennart Sorensen
2014-12-17 15:22             ` Nishanth Menon
2014-12-17 15:22               ` Nishanth Menon
2014-12-17 15:22               ` Nishanth Menon
2014-12-17 15:27               ` Lennart Sorensen
2014-12-17 15:27                 ` Lennart Sorensen
2014-12-17 15:45                 ` Tero Kristo
2014-12-17 15:45                   ` Tero Kristo
2014-12-17 15:45                   ` Tero Kristo
2014-12-17 15:49                   ` Lennart Sorensen
2014-12-17 15:49                     ` Lennart Sorensen
2014-12-17 15:53                   ` Nishanth Menon
2014-12-17 15:53                     ` Nishanth Menon
2014-12-17 15:53                     ` Nishanth Menon
2014-12-17 15:56                     ` Tero Kristo
2014-12-17 15:56                       ` Tero Kristo
2014-12-17 15:56                       ` Tero Kristo
2014-12-16 16:16       ` Lennart Sorensen
2014-12-16 16:16         ` Lennart Sorensen
2014-12-16 19:56         ` Nishanth Menon
2014-12-16 19:56           ` Nishanth Menon
2014-12-16 19:56           ` Nishanth Menon
2014-12-16 19:58           ` Lennart Sorensen
2014-12-16 19:58             ` Lennart Sorensen

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=20141216145856.GA23358@kahuna \
    --to=nm@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=lokeshvutla@ti.com \
    --cc=lsorense@csclub.uwaterloo.ca \
    --cc=nsekhar@ti.com \
    --cc=t-kristo@ti.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.