Skip to contentSkip to conversation

ARM: shmobile: r8a7790 arch timer frequency update

PATCH New Magnus Damm 4 participants 10 messages Jul 9, 2013 – Jul 11, 2013

Subsystems (4)
lore
Share & tools
lore

Magnus Damm

author maintainer
#0 lore raw

cover ARM: shmobile: r8a7790 arch timer frequency update

ARM: shmobile: r8a7790 arch timer frequency update

[PATCH 01/02] ARM: shmobile: Introduce r8a7790_read_mode_pins() [PATCH 02/02] ARM: shmobile: Setup r8a7790 arch timer based on MD pins

Add code to setup r8a7790 arch timer frequency dynamically at boot time based on the EXTAL frequency pointed out by the boot mode pins.

---

Built on top of renesas-next-20130704v2

 arch/arm/mach-shmobile/clock-r8a7790.c        |   11 ----
 arch/arm/mach-shmobile/include/mach/r8a7790.h |    3 +
 arch/arm/mach-shmobile/setup-r8a7790.c        |   63 +++++++++++++++++++++++--
 3 files changed, 63 insertions(+), 14 deletions(-)
author maintainer
#1 lore raw

PATCH 1/2 ARM: shmobile: Introduce r8a7790_read_mode_pins()

From: Magnus Damm <[email protected]>

Break out the r8a7790 boot mode code into a separate function so it can be shared by multiple users.

---

 arch/arm/mach-shmobile/clock-r8a7790.c        |   11 ++---------
 arch/arm/mach-shmobile/include/mach/r8a7790.h |    3 +++
 arch/arm/mach-shmobile/setup-r8a7790.c        |   14 ++++++++++++++
 3 files changed, 19 insertions(+), 9 deletions(-)
arch/arm/mach-shmobile/clock-r8a7790.c +2 -9
@@ -24,6 +24,7 @@
 #include <linux/clkdev.h>
 #include <mach/clock.h>
 #include <mach/common.h>
+#include <mach/r8a7790.h>
 
 /*
  *   MD		EXTAL		PLL0	PLL1	PLL3
@@ -42,8 +43,6 @@
  *	see "p1 / 2" on R8A7790_CLOCK_ROOT() below
  */
 
-#define MD(nr)	(1 << nr)
-
 #define CPG_BASE 0xe6150000
 #define CPG_LEN 0x1000
 
@@ -53,7 +52,6 @@
 #define SMSTPCR5 0xe6150144
 #define SMSTPCR7 0xe615014c
 
-#define MODEMR		0xE6160060
 #define SDCKCR		0xE6150074
 #define SD2CKCR		0xE6150078
 #define SD3CKCR		0xE615007C
@@ -288,14 +286,9 @@ static struct clk_lookup lookups[] = {
 
 void __init r8a7790_clock_init(void)
 {
-	void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
-	u32 mode;
+	u32 mode = r8a7790_read_mode_pins();
 	int k, ret = 0;
 
-	BUG_ON(!modemr);
-	mode = ioread32(modemr);
-	iounmap(modemr);
-
 	switch (mode & (MD(14) | MD(13))) {
 	case 0:
 		R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
arch/arm/mach-shmobile/include/mach/r8a7790.h +3 -0
@@ -8,4 +8,7 @@ void r8a7790_pinmux_init(void);
 void r8a7790_init_delay(void);
 void r8a7790_timer_init(void);
 
+#define MD(nr) BIT(nr)
+u32 r8a7790_read_mode_pins(void);
+
 #endif /* __ASM_R8A7790_H__ */
arch/arm/mach-shmobile/setup-r8a7790.c +14 -0
@@ -201,6 +201,20 @@ void __init r8a7790_add_standard_devices
 	r8a7790_register_thermal();
 }
 
+#define MODEMR 0xe6160060
+
+u32 __init r8a7790_read_mode_pins(void)
+{
+	void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
+	u32 mode;
+
+	BUG_ON(!modemr);
+	mode = ioread32(modemr);
+	iounmap(modemr);
+
+	return mode;
+}
+
 void __init r8a7790_timer_init(void)
 {
 	void __iomem *cntcr;
#2 lore raw

PATCH 1/2 ARM: shmobile: Introduce r8a7790_read_mode_pins()

Hello.

Quoted 7 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Break out the r8a7790 boot mode code into a separate function so it can be shared by multiple users.

---

[...]

arch/arm/mach-shmobile/setup-r8a7790.c void __init r8a7790_add_standard_devices · line 208

Quoted 11 lines
arch/arm/mach-shmobile/setup-r8a7790.c +5 -0
@@ -201,6 +201,20 @@ void __init r8a7790_add_standard_devices
  	r8a7790_register_thermal();
  }
 
+#define MODEMR 0xe6160060
+
+u32 __init r8a7790_read_mode_pins(void)
+{
+	void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);

Why ioremap the whole page if you only need 4 bytes, and the address
is not aligned to page?

arch/arm/mach-shmobile/setup-r8a7790.c void __init r8a7790_add_standard_devices · line 217

Quoted 9 lines
arch/arm/mach-shmobile/setup-r8a7790.c +9 -0
+	u32 mode;
+
+	BUG_ON(!modemr);
+	mode = ioread32(modemr);
+	iounmap(modemr);
+
+	return mode;
+}
+

WBR, Sergei

author maintainer
#3 lore raw

PATCH 1/2 ARM: shmobile: Introduce r8a7790_read_mode_pins()

Hi Sergei,

Quoted 26 lines · Sergei Shtylyov

Hello.

Quoted 9 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Break out the r8a7790 boot mode code into a separate function so it can be shared by multiple users.

---

[...]

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +0 -0

19:59:37.000000000 +0900

arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +0 -0
@@ -201,6 +201,20 @@ void __init r8a7790_add_standard_devices
        r8a7790_register_thermal();
  }
 
Quoted 9 lines

arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 void __init r8a7790_add_standard_devices · line 208

Quoted 5 lines
arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +5 -0
+#define MODEMR 0xe6160060
+
+u32 __init r8a7790_read_mode_pins(void)
+{
+       void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);

Why ioremap the whole page if you only need 4 bytes, and the address is
not aligned to page?

Because the original code did so. =)

But yes, indeed, using two pages seems kind of pointless.

/ magnus

#4 lore raw

PATCH 1/2 ARM: shmobile: Introduce r8a7790_read_mode_pins()

Quoted 40 lines · Magnus Damm

Hi Sergei,

Quoted 26 lines · Sergei Shtylyov

Hello.

Quoted 9 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Break out the r8a7790 boot mode code into a separate function so it can be shared by multiple users.

---

[...]

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +0 -0

19:59:37.000000000 +0900

arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +0 -0
@@ -201,6 +201,20 @@ void __init r8a7790_add_standard_devices
        r8a7790_register_thermal();
  }
 
Quoted 9 lines

arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 void __init r8a7790_add_standard_devices · line 208

Quoted 5 lines
arch/arm/mach-shmobile/setup-r8a7790.c 2013-07-09 renamed from arch/arm/mach-shmobile/setup-r8a7790.c +5 -0
+#define MODEMR 0xe6160060
+
+u32 __init r8a7790_read_mode_pins(void)
+{
+       void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);

Why ioremap the whole page if you only need 4 bytes, and the address is
not aligned to page?

Quoted 3 lines

Because the original code did so. =)

But yes, indeed, using two pages seems kind of pointless.

Lets fix that up in another patch, it seems orthogonal to this change.

author maintainer
#5 lore raw

PATCH 2/2 ARM: shmobile: Setup r8a7790 arch timer based on MD pins

In reply to Magnus Damm

From: Magnus Damm <[email protected]>

Update the r8a7790 arch timer setup code to configure the frequency dynamically at boot time. This means that the arch timer driver will be able to detect a timer frequency that has been calculated based on the MD pins instead of a fixed and potentially incorrect 13 MHz.

With this patch applied the Linux kernel will correctly support the r8a7790 Lager board that uses a 20 Mhz EXTAL. The arch timer will operate on 10 MHz and the Linux arch timer driver will be correctly configured to use 10 MHz.

Without this patch the 20 MHz EXTAL will be used to drive the arch timer at 10 MHz, but the Linux arch timer driver will believe it is counting at 13 Mhz.

---

 arch/arm/mach-shmobile/setup-r8a7790.c |   49 ++++++++++++++++++++++++++++----
 1 file changed, 44 insertions(+), 5 deletions(-)
arch/arm/mach-shmobile/setup-r8a7790.c +44 -5
@@ -215,14 +215,53 @@ u32 __init r8a7790_read_mode_pins(void)
 	return mode;
 }
 
+#define CNTCR 0
+#define CNTFID0 0x20
+
 void __init r8a7790_timer_init(void)
 {
-	void __iomem *cntcr;
+#ifdef CONFIG_ARM_ARCH_TIMER
+	u32 mode = r8a7790_read_mode_pins();
+	void __iomem *base;
+	int extal_mhz = 0;
+	u32 freq;
+
+	/* At Linux boot time the r8a7790 arch timer comes up
+	 * with the counter disabled. Moreover, it may also report
+	 * a potentially incorrect fixed 13 MHz frequency. To be
+	 * correct these registers need to be updated to use the
+	 * frequency EXTAL / 2 which can be determined by the MD pins.
+	 */
+
+	switch (mode & (MD(14) | MD(13))) {
+	case 0:
+		extal_mhz = 15;
+		break;
+	case MD(13):
+		extal_mhz = 20;
+		break;
+	case MD(14):
+		extal_mhz = 26;
+		break;
+	case MD(13) | MD(14):
+		extal_mhz = 30;
+		break;
+	}
+
+	/* The arch timer frequency equals EXTAL / 2 */
+	freq = extal_mhz * (1000000 / 2);
+
+	/* Remap "armgcnt address map" space */
+	base = ioremap(0xe6080000, PAGE_SIZE);
+
+	/* Update registers with correct frequency */
+	iowrite32(freq, base + CNTFID0);
+	asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r" (freq));
 
-	/* make sure arch timer is started by setting bit 0 of CNTCT */
-	cntcr = ioremap(0xe6080000, PAGE_SIZE);
-	iowrite32(1, cntcr);
-	iounmap(cntcr);
+	/* make sure arch timer is started by setting bit 0 of CNTCR */
+	iowrite32(1, base + CNTCR);
+	iounmap(base);
+#endif /* CONFIG_ARM_ARCH_TIMER */
 
 	shmobile_timer_init();
 }
#6 lore raw

cover ARM: shmobile: r8a7790 arch timer frequency update

In reply to Magnus Damm
Quoted 9 lines · Magnus Damm

ARM: shmobile: r8a7790 arch timer frequency update

[PATCH 01/02] ARM: shmobile: Introduce r8a7790_read_mode_pins() [PATCH 02/02] ARM: shmobile: Setup r8a7790 arch timer based on MD pins

Add code to setup r8a7790 arch timer frequency dynamically at boot time based on the EXTAL frequency pointed out by the boot mode pins.

Quoted 8 lines

---

Built on top of renesas-next-20130704v2

 arch/arm/mach-shmobile/clock-r8a7790.c        |   11 ----
 arch/arm/mach-shmobile/include/mach/r8a7790.h |    3 +
 arch/arm/mach-shmobile/setup-r8a7790.c        |   63 +++++++++++++++++++++++--
 3 files changed, 63 insertions(+), 14 deletions(-)

Hi Magnus,

could you please let me know if/when these patches are ready to queue-up for v3.12?

author maintainer
#7 lore raw

cover ARM: shmobile: r8a7790 arch timer frequency update

Quoted 12 lines · Simon Horman
Quoted 11 lines · Magnus Damm

ARM: shmobile: r8a7790 arch timer frequency update

[PATCH 01/02] ARM: shmobile: Introduce r8a7790_read_mode_pins() [PATCH 02/02] ARM: shmobile: Setup r8a7790 arch timer based on MD pins

Add code to setup r8a7790 arch timer frequency dynamically at boot time based on the EXTAL frequency pointed out by the boot mode pins.

---

Quoted 8 lines
Quoted 6 lines

Built on top of renesas-next-20130704v2

 arch/arm/mach-shmobile/clock-r8a7790.c        |   11 ----
 arch/arm/mach-shmobile/include/mach/r8a7790.h |    3 +
 arch/arm/mach-shmobile/setup-r8a7790.c        |   63 +++++++++++++++++++++++--
 3 files changed, 63 insertions(+), 14 deletions(-)

Hi Magnus,

Hi Simon,

Thanks for your help picking up patches.

Quoted 2 lines

could you please let me know if/when these patches are ready to queue-up for v3.12?

There are two things to consider:
1) Patch 1/2 needs to be updated to handle feedback from Sergei.
2) I'd like the series to be tested by Ulrich to see if they actually help!

I can resend 1/2 today or tomorrow and I think Ulrich can most likely help us with testing sometime this week.

Cheers,

/ magnus

#8 lore raw

cover ARM: shmobile: r8a7790 arch timer frequency update

Quoted 29 lines · Magnus Damm
Quoted 12 lines · Simon Horman
Quoted 11 lines · Magnus Damm

ARM: shmobile: r8a7790 arch timer frequency update

[PATCH 01/02] ARM: shmobile: Introduce r8a7790_read_mode_pins() [PATCH 02/02] ARM: shmobile: Setup r8a7790 arch timer based on MD pins

Add code to setup r8a7790 arch timer frequency dynamically at boot time based on the EXTAL frequency pointed out by the boot mode pins.

---

Quoted 8 lines
Quoted 6 lines

Built on top of renesas-next-20130704v2

 arch/arm/mach-shmobile/clock-r8a7790.c        |   11 ----
 arch/arm/mach-shmobile/include/mach/r8a7790.h |    3 +
 arch/arm/mach-shmobile/setup-r8a7790.c        |   63 +++++++++++++++++++++++--
 3 files changed, 63 insertions(+), 14 deletions(-)

Hi Magnus,

Hi Simon,

Thanks for your help picking up patches.

Quoted 2 lines

could you please let me know if/when these patches are ready to queue-up for v3.12?

Quoted 6 lines

There are two things to consider:
1) Patch 1/2 needs to be updated to handle feedback from Sergei.
2) I'd like the series to be tested by Ulrich to see if they actually help!

I can resend 1/2 today or tomorrow and I think Ulrich can most likely help us with testing sometime this week.

Thanks, I'll wait for your repost and feedback from Ulrich.

#9 lore raw

cover ARM: shmobile: r8a7790 arch timer frequency update

Quoted 5 lines · Simon Horman
Quoted 2 lines · Magnus Damm

I can resend 1/2 today or tomorrow and I think Ulrich can most likely help us with testing sometime this week.

Thanks, I'll wait for your repost and feedback from Ulrich.

Works for me, "sleep 10" actually sleeps for 10 seconds now.

CU
Uli