All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
@ 2013-09-08 20:12 Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 1/9] ARM: add common timer functions Rob Herring
                   ` (11 more replies)
  0 siblings, 12 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Much of the ARM timer code is re-implemented for each platform yet it
is all pretty much the same code.

This series introduces a common implementation of timer functions and
simplifies the platform code down to 2 or 3 config defines. It is
intended for platforms with 32-bit freerunning timers. I've converted
a couple of platforms as an example, but there are many more still that
can be converted. This probably could be extended to work with 16-bit
timers as well.

I've compiled all ARM boards, but only tested on highbank.

Rob

Rob Herring (9):
  ARM: add common timer functions
  examples: enable gc-sections option
  time: create default __udelay
  ARM: highbank: convert to common timer code
  ARM: mx25: convert to common timer code
  ARM: mx27: convert to common timer code
  ARM: vexpress: convert to common timer code
  ARM: socfpga: convert to common timer code
  ARM: tegra: convert to common timer code

 arch/arm/cpu/arm926ejs/mx25/timer.c     | 117 --------------------------------
 arch/arm/cpu/arm926ejs/mx27/timer.c     | 110 ------------------------------
 arch/arm/cpu/armv7/highbank/timer.c     |  83 ----------------------
 arch/arm/cpu/armv7/socfpga/timer.c      |  72 --------------------
 arch/arm/cpu/tegra-common/Makefile      |   2 +-
 arch/arm/cpu/tegra-common/timer.c       |  95 --------------------------
 arch/arm/lib/Makefile                   |   2 +-
 arch/arm/lib/time.c                     |  59 ++++++++++++++++
 board/armltd/vexpress/vexpress_common.c |  71 -------------------
 examples/api/Makefile                   |   2 +-
 include/configs/highbank.h              |   4 ++
 include/configs/imx27lite-common.h      |   3 +
 include/configs/mx25pdk.h               |   3 +
 include/configs/socfpga_cyclone5.h      |   3 +-
 include/configs/tegra-common.h          |   3 +
 include/configs/tx25.h                  |   2 +
 include/configs/vexpress_common.h       |   4 ++
 include/configs/zmx25.h                 |   3 +
 lib/time.c                              |  21 ++++++
 19 files changed, 107 insertions(+), 552 deletions(-)
 delete mode 100644 arch/arm/cpu/tegra-common/timer.c
 create mode 100644 arch/arm/lib/time.c

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 1/9] ARM: add common timer functions
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 2/9] examples: enable gc-sections option Rob Herring
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Many ARM platforms duplicate pretty much the same timer code yet they
all have a 32-bit freerunning counter register. Create a common
implementation that simply requires 3 defines to add timer support:

CONFIG_SYS_TIMER_RATE - Clock rate of the timer counter
CONFIG_SYS_TIMER_COUNTER - Address of 32-bit counter
CONFIG_SYS_TIMER_COUNTS_DOWN - Define if counter counts down

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/lib/Makefile |  2 +-
 arch/arm/lib/time.c   | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/lib/time.c

diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index 4e78723..0bf5877 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -38,7 +38,7 @@ else
 COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o
 endif
 
-COBJS-y	+= interrupts.o
+COBJS-y	+= interrupts.o time.o
 COBJS-y	+= reset.o
 
 COBJS-y	+= cache.o
diff --git a/arch/arm/lib/time.c b/arch/arm/lib/time.c
new file mode 100644
index 0000000..0ec8ded
--- /dev/null
+++ b/arch/arm/lib/time.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013 Calxeda, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <div64.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SYS_TIMER_RATE
+ulong notrace get_tbclk(void)
+{
+	return CONFIG_SYS_TIMER_RATE;
+}
+#endif
+
+#ifdef CONFIG_SYS_TIMER_COUNTER
+unsigned long notrace timer_read_counter(void)
+{
+#ifdef CONFIG_SYS_TIMER_COUNTS_DOWN
+	return ~readl(CONFIG_SYS_TIMER_COUNTER);
+#else
+	return readl(CONFIG_SYS_TIMER_COUNTER);
+#endif
+}
+#endif
+
+unsigned long long __weak notrace get_ticks(void)
+{
+	unsigned long now = timer_read_counter();
+
+	/* increment tbu if tbl has rolled over */
+	if (now < gd->arch.tbl)
+		gd->arch.tbu++;
+	gd->arch.tbl = now;
+	return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
+}
+
+static unsigned long long notrace tick_to_time(unsigned long long tick)
+{
+	unsigned int div = get_tbclk();
+
+	tick *= CONFIG_SYS_HZ;
+	do_div(tick, div);
+	return tick;
+}
+
+ulong __weak get_timer(ulong base)
+{
+	return tick_to_time(get_ticks()) - base;
+}
+
+unsigned long __weak notrace timer_get_us(void)
+{
+	return tick_to_time(get_ticks() * 1000);
+}
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 2/9] examples: enable gc-sections option
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 1/9] ARM: add common timer functions Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 3/9] time: create default __udelay Rob Herring
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

This fixes building time.c when unreferenced functions are added.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 examples/api/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/api/Makefile b/examples/api/Makefile
index 4d68340..33cc91b 100644
--- a/examples/api/Makefile
+++ b/examples/api/Makefile
@@ -53,7 +53,7 @@ all:	$(obj).depend $(OUTPUT)
 #########################################################################
 
 $(OUTPUT):	$(OBJS)
-		$(LD) -Ttext $(LOAD_ADDR) -o $@ $^ $(PLATFORM_LIBS)
+		$(LD) --gc-sections -Ttext $(LOAD_ADDR) -o $@ $^ $(PLATFORM_LIBS)
 		$(OBJCOPY) -O binary $@ $(OUTPUT).bin 2>/dev/null
 
 # Rule to build generic library C files
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 3/9] time: create default __udelay
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 1/9] ARM: add common timer functions Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 2/9] examples: enable gc-sections option Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 4/9] ARM: highbank: convert to common timer code Rob Herring
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Implement a default __udelay using get_tbclk and get_ticks.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 lib/time.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/lib/time.c b/lib/time.c
index 68b8ff4..55f05bb 100644
--- a/lib/time.c
+++ b/lib/time.c
@@ -7,11 +7,32 @@
 
 #include <common.h>
 #include <watchdog.h>
+#include <div64.h>
 
 #ifndef CONFIG_WD_PERIOD
 # define CONFIG_WD_PERIOD	(10 * 1000 * 1000)	/* 10 seconds default*/
 #endif
 
+static unsigned long long usec_to_tick(unsigned long usec)
+{
+	unsigned long long tick = usec * get_tbclk();
+	usec *= get_tbclk();
+	do_div(tick, 1000000);
+	return tick;
+}
+
+void __weak __udelay(unsigned long usec)
+{
+	unsigned long long tmp;
+	ulong tmo;
+
+	tmo = usec_to_tick(usec);
+	tmp = get_ticks() + tmo;	/* get current timestamp */
+
+	while (get_ticks() < tmp)	/* loop till event */
+		 /*NOP*/;
+}
+
 /* ------------------------------------------------------------------------- */
 
 void udelay(unsigned long usec)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 4/9] ARM: highbank: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (2 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 3/9] time: create default __udelay Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 5/9] ARM: mx25: " Rob Herring
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert highbank to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/armv7/highbank/timer.c | 83 -------------------------------------
 include/configs/highbank.h          |  4 ++
 2 files changed, 4 insertions(+), 83 deletions(-)

diff --git a/arch/arm/cpu/armv7/highbank/timer.c b/arch/arm/cpu/armv7/highbank/timer.c
index b61cd69..d56bf21 100644
--- a/arch/arm/cpu/armv7/highbank/timer.c
+++ b/arch/arm/cpu/armv7/highbank/timer.c
@@ -7,18 +7,12 @@
  */
 
 #include <common.h>
-#include <div64.h>
-#include <linux/types.h>        /* for size_t */
-#include <linux/stddef.h>       /* for NULL */
 #include <asm/io.h>
 #include <asm/arch-armv7/systimer.h>
 
 #undef SYSTIMER_BASE
 #define SYSTIMER_BASE		0xFFF34000	/* Timer 0 and 1 base	*/
-#define SYSTIMER_RATE		(150000000 / 256)
 
-static ulong timestamp;
-static ulong lastinc;
 static struct systimer *systimer_base = (struct systimer *)SYSTIMER_BASE;
 
 /*
@@ -38,80 +32,3 @@ int timer_init(void)
 	return 0;
 
 }
-
-#define TICK_PER_TIME	((SYSTIMER_RATE + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ)
-#define NS_PER_TICK	(1000000000 / SYSTIMER_RATE)
-
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	do_div(tick, TICK_PER_TIME);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	return time * TICK_PER_TIME;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	unsigned long long tick = us * 1000;
-	tick += NS_PER_TICK - 1;
-	do_div(tick, NS_PER_TICK);
-	return tick;
-}
-
-unsigned long long get_ticks(void)
-{
-	ulong now = ~readl(&systimer_base->timer0value);
-
-	if (now >= lastinc)	/* normal mode (non roll) */
-		/* move stamp forward with absolut diff ticks */
-		timestamp += (now - lastinc);
-	else			/* we have rollover of incrementer */
-		timestamp += (0xFFFFFFFF - lastinc) + now;
-	lastinc = now;
-	return timestamp;
-}
-
-/*
- * Delay x useconds AND preserve advance timstamp value
- *     assumes timer is ticking at 1 msec
- */
-void __udelay(ulong usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = us_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-void reset_timer_masked(void)
-{
-	lastinc = ~readl(&systimer_base->timer0value);
-	timestamp = 0;
-}
-
-void reset_timer(void)
-{
-	reset_timer_masked();
-}
-
-ulong get_timer_masked(void)
-{
-	return tick_to_time(get_ticks());
-}
-
-ulong get_tbclk(void)
-{
-	return SYSTIMER_RATE;
-}
diff --git a/include/configs/highbank.h b/include/configs/highbank.h
index 24f9350..dc027a7 100644
--- a/include/configs/highbank.h
+++ b/include/configs/highbank.h
@@ -19,6 +19,10 @@
 #define CONFIG_SUPPORT_RAW_INITRD
 #define CONFIG_SYS_BOOTMAPSZ		(16 << 20)
 
+#define CONFIG_SYS_TIMER_RATE		(150000000/256)
+#define CONFIG_SYS_TIMER_COUNTER	(0xFFF34000 + 0x4)
+#define CONFIG_SYS_TIMER_COUNTS_DOWN
+
 /*
  * Size of malloc() pool
  */
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: mx25: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (3 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 4/9] ARM: highbank: convert to common timer code Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 23:56   ` Benoît Thébaudeau
  2013-09-08 20:12 ` [U-Boot] [PATCH 6/9] ARM: mx27: " Rob Herring
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert mx25 to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/arm926ejs/mx25/timer.c | 117 ------------------------------------
 include/configs/mx25pdk.h           |   3 +
 include/configs/tx25.h              |   2 +
 include/configs/zmx25.h             |   3 +
 4 files changed, 8 insertions(+), 117 deletions(-)

diff --git a/arch/arm/cpu/arm926ejs/mx25/timer.c b/arch/arm/cpu/arm926ejs/mx25/timer.c
index 42b6076..7f19791 100644
--- a/arch/arm/cpu/arm926ejs/mx25/timer.c
+++ b/arch/arm/cpu/arm926ejs/mx25/timer.c
@@ -21,65 +21,8 @@
  */
 
 #include <common.h>
-#include <div64.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/clock.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define timestamp	(gd->arch.tbl)
-#define lastinc		(gd->arch.lastinc)
-
-/*
- * "time" is measured in 1 / CONFIG_SYS_HZ seconds,
- * "tick" is internal timer period
- */
-#ifdef CONFIG_MX25_TIMER_HIGH_PRECISION
-/* ~0.4% error - measured with stop-watch on 100s boot-delay */
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	tick *= CONFIG_SYS_HZ;
-	do_div(tick, MXC_CLK32);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	time *= MXC_CLK32;
-	do_div(time, CONFIG_SYS_HZ);
-	return time;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us = us * MXC_CLK32 + 999999;
-	do_div(us, 1000000);
-	return us;
-}
-#else
-/* ~2% error */
-#define TICK_PER_TIME	((MXC_CLK32 + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ)
-#define US_PER_TICK	(1000000 / MXC_CLK32)
-
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	do_div(tick, TICK_PER_TIME);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	return time * TICK_PER_TIME;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us += US_PER_TICK - 1;
-	do_div(us, US_PER_TICK);
-	return us;
-}
-#endif
 
 /* nothing really to do with interrupts, just starts up a counter. */
 /* The 32KHz 32-bit timer overruns in 134217 seconds */
@@ -104,63 +47,3 @@ int timer_init(void)
 
 	return 0;
 }
-
-unsigned long long get_ticks(void)
-{
-	struct gpt_regs *gpt = (struct gpt_regs *)IMX_GPT1_BASE;
-	ulong now = readl(&gpt->counter); /* current tick value */
-
-	if (now >= lastinc) {
-		/*
-		 * normal mode (non roll)
-		 * move stamp forward with absolut diff ticks
-		 */
-		timestamp += (now - lastinc);
-	} else {
-		/* we have rollover of incrementer */
-		timestamp += (0xFFFFFFFF - lastinc) + now;
-	}
-	lastinc = now;
-	return timestamp;
-}
-
-ulong get_timer_masked(void)
-{
-	/*
-	 * get_ticks() returns a long long (64 bit), it wraps in
-	 * 2^64 / MXC_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~
-	 * 5 * 10^9 days... and get_ticks() * CONFIG_SYS_HZ wraps in
-	 * 5 * 10^6 days - long enough.
-	 */
-	return tick_to_time(get_ticks());
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/* delay x useconds AND preserve advance timstamp value */
-void __udelay(unsigned long usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = us_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk(void)
-{
-	ulong tbclk;
-
-	tbclk = MXC_CLK32;
-	return tbclk;
-}
diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
index ccd3b6c..568ed6c 100644
--- a/include/configs/mx25pdk.h
+++ b/include/configs/mx25pdk.h
@@ -15,6 +15,9 @@
 #define CONFIG_SYS_TEXT_BASE		0x81200000
 #define CONFIG_MXC_GPIO
 
+#define CONFIG_SYS_TIMER_RATE		32768
+#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)
+
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
 
diff --git a/include/configs/tx25.h b/include/configs/tx25.h
index 2d7479b..f879441 100644
--- a/include/configs/tx25.h
+++ b/include/configs/tx25.h
@@ -15,6 +15,8 @@
  */
 #define CONFIG_MX25
 #define CONFIG_MX25_CLK32		32000	/* OSC32K frequency */
+#define CONFIG_SYS_TIMER_RATE		CONFIG_MX25_CLK32
+#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)
 
 #define	CONFIG_SYS_MONITOR_LEN		(256 << 10)	/* 256 kB for U-Boot */
 
diff --git a/include/configs/zmx25.h b/include/configs/zmx25.h
index 2e7f145..deaadfa 100644
--- a/include/configs/zmx25.h
+++ b/include/configs/zmx25.h
@@ -14,6 +14,9 @@
 #define CONFIG_MX25
 #define CONFIG_SYS_TEXT_BASE		0xA0000000
 
+#define CONFIG_SYS_TIMER_RATE		32768
+#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)
+
 #define CONFIG_MACH_TYPE	MACH_TYPE_ZMX25
 /*
  * Environment settings
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 6/9] ARM: mx27: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (4 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 5/9] ARM: mx25: " Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 7/9] ARM: vexpress: " Rob Herring
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert mx27 to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/arm926ejs/mx27/timer.c | 110 ------------------------------------
 include/configs/imx27lite-common.h  |   3 +
 2 files changed, 3 insertions(+), 110 deletions(-)

diff --git a/arch/arm/cpu/arm926ejs/mx27/timer.c b/arch/arm/cpu/arm926ejs/mx27/timer.c
index 40fe2aa..b64875a 100644
--- a/arch/arm/cpu/arm926ejs/mx27/timer.c
+++ b/arch/arm/cpu/arm926ejs/mx27/timer.c
@@ -17,7 +17,6 @@
  */
 
 #include <common.h>
-#include <div64.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
 
@@ -27,62 +26,6 @@
 #define GPTCR_CLKSOURCE_32	(4 << 1)	/* Clock source		*/
 #define GPTCR_TEN		1		/* Timer enable		*/
 
-DECLARE_GLOBAL_DATA_PTR;
-
-#define timestamp	(gd->arch.tbl)
-#define lastinc		(gd->arch.lastinc)
-
-/*
- * "time" is measured in 1 / CONFIG_SYS_HZ seconds,
- * "tick" is internal timer period
- */
-#ifdef CONFIG_MX27_TIMER_HIGH_PRECISION
-/* ~0.4% error - measured with stop-watch on 100s boot-delay */
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	tick *= CONFIG_SYS_HZ;
-	do_div(tick, CONFIG_MX27_CLK32);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	time *= CONFIG_MX27_CLK32;
-	do_div(time, CONFIG_SYS_HZ);
-	return time;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us = us * CONFIG_MX27_CLK32 + 999999;
-	do_div(us, 1000000);
-	return us;
-}
-#else
-/* ~2% error */
-#define TICK_PER_TIME	((CONFIG_MX27_CLK32 + CONFIG_SYS_HZ / 2) / \
-		CONFIG_SYS_HZ)
-#define US_PER_TICK	(1000000 / CONFIG_MX27_CLK32)
-
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	do_div(tick, TICK_PER_TIME);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	return time * TICK_PER_TIME;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us += US_PER_TICK - 1;
-	do_div(us, US_PER_TICK);
-	return us;
-}
-#endif
-
 /* nothing really to do with interrupts, just starts up a counter. */
 /* The 32768Hz 32-bit timer overruns in 131072 seconds */
 int timer_init(void)
@@ -107,56 +50,3 @@ int timer_init(void)
 
 	return 0;
 }
-
-unsigned long long get_ticks(void)
-{
-	struct gpt_regs *regs = (struct gpt_regs *)IMX_TIM1_BASE;
-	ulong now = readl(&regs->gpt_tcn); /* current tick value */
-
-	if (now >= lastinc) {
-		/*
-		 * normal mode (non roll)
-		 * move stamp forward with absolut diff ticks
-		 */
-		timestamp += (now - lastinc);
-	} else {
-		/* we have rollover of incrementer */
-		timestamp += (0xFFFFFFFF - lastinc) + now;
-	}
-	lastinc = now;
-	return timestamp;
-}
-
-ulong get_timer_masked(void)
-{
-	/*
-	 * get_ticks() returns a long long (64 bit), it wraps in
-	 * 2^64 / CONFIG_MX27_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~
-	 * 5 * 10^9 days... and get_ticks() * CONFIG_SYS_HZ wraps in
-	 * 5 * 10^6 days - long enough.
-	 */
-	return tick_to_time(get_ticks());
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/* delay x useconds AND preserve advance timstamp value */
-void __udelay(unsigned long usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = us_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-ulong get_tbclk(void)
-{
-	return CONFIG_MX27_CLK32;
-}
diff --git a/include/configs/imx27lite-common.h b/include/configs/imx27lite-common.h
index 8236133..3c825df 100644
--- a/include/configs/imx27lite-common.h
+++ b/include/configs/imx27lite-common.h
@@ -17,6 +17,9 @@
 #define CONFIG_MX27
 #define CONFIG_MX27_CLK32	32768		/* OSC32K frequency */
 
+#define CONFIG_SYS_TIMER_RATE		CONFIG_MX27_CLK32
+#define CONFIG_SYS_TIMER_COUNTER	(0x10003000 + 0x10)
+
 #define CONFIG_DISPLAY_BOARDINFO
 #define CONFIG_DISPLAY_CPUINFO
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 7/9] ARM: vexpress: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (5 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 6/9] ARM: mx27: " Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 8/9] ARM: socfpga: " Rob Herring
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert vexpress to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 board/armltd/vexpress/vexpress_common.c | 71 ---------------------------------
 include/configs/vexpress_common.h       |  4 ++
 2 files changed, 4 insertions(+), 71 deletions(-)

diff --git a/board/armltd/vexpress/vexpress_common.c b/board/armltd/vexpress/vexpress_common.c
index 4c7a7f4..25438fb 100644
--- a/board/armltd/vexpress/vexpress_common.c
+++ b/board/armltd/vexpress/vexpress_common.c
@@ -26,9 +26,6 @@
 #include <asm/arch/wdt.h>
 #include "../drivers/mmc/arm_pl180_mmci.h"
 
-static ulong timestamp;
-static ulong lastdec;
-
 static struct systimer *systimer_base = (struct systimer *)V2M_TIMER01;
 static struct sysctrl *sysctrl_base = (struct sysctrl *)SCTL_BASE;
 
@@ -152,8 +149,6 @@ static void vexpress_timer_init(void)
 	writel(SYSTIMER_EN | SYSTIMER_32BIT |
 	       readl(&systimer_base->timer0control),
 	       &systimer_base->timer0control);
-
-	reset_timer_masked();
 }
 
 int v2m_cfg_write(u32 devfn, u32 data)
@@ -183,62 +178,6 @@ void reset_cpu(ulong addr)
 		printf("Unable to reboot\n");
 }
 
-/*
- * Delay x useconds AND perserve advance timstamp value
- *     assumes timer is ticking at 1 msec
- */
-void __udelay(ulong usec)
-{
-	ulong tmo, tmp;
-
-	tmo = usec / 1000;
-	tmp = get_timer(0);	/* get current timestamp */
-
-	/*
-	 * If setting this forward will roll time stamp	then
-	 * reset "advancing" timestamp to 0 and set lastdec value
-	 * otherwise set the advancing stamp to the wake up time
-	 */
-	if ((tmo + tmp + 1) < tmp)
-		reset_timer_masked();
-	else
-		tmo += tmp;
-
-	while (get_timer_masked() < tmo)
-		; /* loop till wakeup event */
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-void reset_timer_masked(void)
-{
-	lastdec = readl(&systimer_base->timer0value) / 1000;
-	timestamp = 0;
-}
-
-ulong get_timer_masked(void)
-{
-	ulong now = readl(&systimer_base->timer0value) / 1000;
-
-	if (lastdec >= now) {	/* normal mode (non roll) */
-		timestamp += lastdec - now;
-	} else {		/* count down timer overflowed */
-		/*
-		 * nts = ts + ld - now
-		 * ts = old stamp, ld = time before passing through - 1
-		 * now = amount of time after passing though - 1
-		 * nts = new "advancing time stamp"
-		 */
-		timestamp += lastdec + SYSTIMER_RELOAD - now;
-	}
-	lastdec = now;
-
-	return timestamp;
-}
-
 void lowlevel_init(void)
 {
 }
@@ -246,13 +185,3 @@ void lowlevel_init(void)
 ulong get_board_rev(void){
 	return readl((u32 *)SYS_ID);
 }
-
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-ulong get_tbclk(void)
-{
-	return (ulong)CONFIG_SYS_HZ;
-}
diff --git a/include/configs/vexpress_common.h b/include/configs/vexpress_common.h
index 5b0721c..f204551 100644
--- a/include/configs/vexpress_common.h
+++ b/include/configs/vexpress_common.h
@@ -131,6 +131,10 @@
 #define SCTL_BASE			V2M_SYSCTL
 #define VEXPRESS_FLASHPROG_FLVPPEN	(1 << 0)
 
+#define CONFIG_SYS_TIMER_RATE		1000000
+#define CONFIG_SYS_TIMER_COUNTER	(0x10011000 + 0x4)
+#define CONFIG_SYS_TIMER_COUNTS_DOWN
+
 /* SMSC9115 Ethernet from SMSC9118 family */
 #define CONFIG_SMC911X			1
 #define CONFIG_SMC911X_32_BIT		1
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 8/9] ARM: socfpga: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (6 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 7/9] ARM: vexpress: " Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-08 20:12 ` [U-Boot] [PATCH 9/9] ARM: tegra: " Rob Herring
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert socfpga to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/armv7/socfpga/timer.c | 72 --------------------------------------
 include/configs/socfpga_cyclone5.h |  3 +-
 2 files changed, 2 insertions(+), 73 deletions(-)

diff --git a/arch/arm/cpu/armv7/socfpga/timer.c b/arch/arm/cpu/armv7/socfpga/timer.c
index 09f6f14..58fc789 100644
--- a/arch/arm/cpu/armv7/socfpga/timer.c
+++ b/arch/arm/cpu/armv7/socfpga/timer.c
@@ -8,8 +8,6 @@
 #include <asm/io.h>
 #include <asm/arch/timer.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 static const struct socfpga_timer *timer_base = (void *)CONFIG_SYS_TIMERBASE;
 
 /*
@@ -22,73 +20,3 @@ int timer_init(void)
 	writel(readl(&timer_base->ctrl) | 0x3, &timer_base->ctrl);
 	return 0;
 }
-
-static u32 read_timer(void)
-{
-	return readl(&timer_base->curr_val);
-}
-
-/*
- * Delay x useconds
- */
-void __udelay(unsigned long usec)
-{
-	unsigned long now, last;
-	/*
-	 * get the tmo value based on timer clock speed
-	 * tmo = delay required / period of timer clock
-	 */
-	long tmo = usec * CONFIG_TIMER_CLOCK_KHZ / 1000;
-
-	last = read_timer();
-	while (tmo > 0) {
-		now = read_timer();
-		if (last >= now)
-			/* normal mode (non roll) */
-			tmo -= last - now;
-		else
-			/* we have overflow of the count down timer */
-			tmo -= TIMER_LOAD_VAL - last + now;
-		last = now;
-	}
-}
-
-/*
- * Get the timer value
- */
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/*
- * Timer : get the time difference
- * Unit of tick is based on the CONFIG_SYS_HZ
- */
-ulong get_timer_masked(void)
-{
-	/* current tick value */
-	ulong now = read_timer() / (CONFIG_TIMER_CLOCK_KHZ/CONFIG_SYS_HZ);
-	if (gd->arch.lastinc >= now) {
-		/* normal mode (non roll) */
-		/* move stamp forward with absolute diff ticks */
-		gd->arch.tbl += gd->arch.lastinc - now;
-	} else {
-		/* we have overflow of the count down timer */
-		gd->arch.tbl += TIMER_LOAD_VAL - gd->arch.lastinc + now;
-	}
-	gd->arch.lastinc = now;
-	return gd->arch.tbl;
-}
-
-/*
- * Reset the timer
- */
-void reset_timer(void)
-{
-	/* capture current decrementer value time */
-	gd->arch.lastinc = read_timer() /
-				(CONFIG_TIMER_CLOCK_KHZ / CONFIG_SYS_HZ);
-	/* start "advancing" time stamp from 0 */
-	gd->arch.tbl = 0;
-}
diff --git a/include/configs/socfpga_cyclone5.h b/include/configs/socfpga_cyclone5.h
index 450b5e6..aecb217 100644
--- a/include/configs/socfpga_cyclone5.h
+++ b/include/configs/socfpga_cyclone5.h
@@ -24,7 +24,8 @@
 #define CONFIG_SYS_TEXT_BASE		0x08000040
 #define V_NS16550_CLK			1000000
 #define CONFIG_BAUDRATE			57600
-#define CONFIG_TIMER_CLOCK_KHZ		2400
+#define CONFIG_SYS_TIMER_RATE		2400000
+#define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMERBASE + 0x4)
 #define CONFIG_SYS_LOAD_ADDR		0x7fc0
 
 /* Console I/O Buffer Size */
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 9/9] ARM: tegra: convert to common timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (7 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 8/9] ARM: socfpga: " Rob Herring
@ 2013-09-08 20:12 ` Rob Herring
  2013-09-09  5:53 ` [U-Boot] [PATCH 0/9] Consolidate ARM " Wolfgang Denk
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-08 20:12 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert tegra to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/tegra-common/Makefile |  2 +-
 arch/arm/cpu/tegra-common/timer.c  | 95 --------------------------------------
 include/configs/tegra-common.h     |  3 ++
 3 files changed, 4 insertions(+), 96 deletions(-)
 delete mode 100644 arch/arm/cpu/tegra-common/timer.c

diff --git a/arch/arm/cpu/tegra-common/Makefile b/arch/arm/cpu/tegra-common/Makefile
index 1b6cdf7..89b2210 100644
--- a/arch/arm/cpu/tegra-common/Makefile
+++ b/arch/arm/cpu/tegra-common/Makefile
@@ -12,7 +12,7 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)libcputegra-common.o
 
 SOBJS += lowlevel_init.o
-COBJS-y	+= ap.o board.o sys_info.o timer.o clock.o cache.o
+COBJS-y	+= ap.o board.o sys_info.o clock.o cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
diff --git a/arch/arm/cpu/tegra-common/timer.c b/arch/arm/cpu/tegra-common/timer.c
deleted file mode 100644
index d0f783e..0000000
--- a/arch/arm/cpu/tegra-common/timer.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * (C) Copyright 2010,2011
- * NVIDIA Corporation <www.nvidia.com>
- *
- * (C) Copyright 2008
- * Texas Instruments
- *
- * Richard Woodruff <r-woodruff2@ti.com>
- * Syed Moahmmed Khasim <khasim@ti.com>
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger@sysgo.de>
- * Alex Zuepke <azu@sysgo.de>
- *
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/tegra.h>
-#include <asm/arch-tegra/timer.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* counter runs at 1MHz */
-#define TIMER_CLK	1000000
-#define TIMER_LOAD_VAL	0xffffffff
-
-/* timer without interrupts */
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/* delay x useconds */
-void __udelay(unsigned long usec)
-{
-	long tmo = usec * (TIMER_CLK / 1000) / 1000;
-	unsigned long now, last = timer_get_us();
-
-	while (tmo > 0) {
-		now = timer_get_us();
-		if (last > now) /* count up timer overflow */
-			tmo -= TIMER_LOAD_VAL - last + now;
-		else
-			tmo -= now - last;
-		last = now;
-	}
-}
-
-ulong get_timer_masked(void)
-{
-	ulong now;
-
-	/* current tick value */
-	now = timer_get_us() / (TIMER_CLK / CONFIG_SYS_HZ);
-
-	if (now >= gd->arch.lastinc)	/* normal mode (non roll) */
-		/* move stamp forward with absolute diff ticks */
-		gd->arch.tbl += (now - gd->arch.lastinc);
-	else	/* we have rollover of incrementer */
-		gd->arch.tbl += ((TIMER_LOAD_VAL / (TIMER_CLK / CONFIG_SYS_HZ))
-				- gd->arch.lastinc) + now;
-	gd->arch.lastinc = now;
-	return gd->arch.tbl;
-}
-
-/*
- * This function is derived from PowerPC code (read timebase as long long).
- * On ARM it just returns the timer value.
- */
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk(void)
-{
-	return CONFIG_SYS_HZ;
-}
-
-unsigned long timer_get_us(void)
-{
-	struct timerus *timer_base = (struct timerus *)NV_PA_TMRUS_BASE;
-
-	return readl(&timer_base->cntr_1us);
-}
diff --git a/include/configs/tegra-common.h b/include/configs/tegra-common.h
index e75e8cc..c605dd0 100644
--- a/include/configs/tegra-common.h
+++ b/include/configs/tegra-common.h
@@ -21,6 +21,9 @@
 
 #include <asm/arch/tegra.h>		/* get chip and board defs */
 
+#define CONFIG_SYS_TIMER_RATE		1000000
+#define CONFIG_SYS_TIMER_COUNTER	NV_PA_TMRUS_BASE
+
 /*
  * Display CPU and Board information
  */
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: mx25: convert to common timer code
  2013-09-08 20:12 ` [U-Boot] [PATCH 5/9] ARM: mx25: " Rob Herring
@ 2013-09-08 23:56   ` Benoît Thébaudeau
  2013-09-09 21:00     ` Rob Herring
  0 siblings, 1 reply; 30+ messages in thread
From: Benoît Thébaudeau @ 2013-09-08 23:56 UTC (permalink / raw)
  To: u-boot

Dear Rob Herring,

On Sunday, September 8, 2013 10:12:50 PM, Rob Herring wrote:
> From: Rob Herring <rob.herring@calxeda.com>
> 
> Convert mx25 to use the commmon timer code.
> 
> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
> ---
[...]
> diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
> index ccd3b6c..568ed6c 100644
> --- a/include/configs/mx25pdk.h
> +++ b/include/configs/mx25pdk.h
> @@ -15,6 +15,9 @@
>  #define CONFIG_SYS_TEXT_BASE		0x81200000
>  #define CONFIG_MXC_GPIO
>  
> +#define CONFIG_SYS_TIMER_RATE		32768
                                                ^
MXC_CLK32 could be used here.

> +#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)

This Linux-style (base + offset) register access is against U-Boot rules. You
could write:
(&((struct gpt_regs *)IMX_GPT1_BASE)->counter)

> +
>  #define CONFIG_DISPLAY_CPUINFO
>  #define CONFIG_DISPLAY_BOARDINFO
>  
> diff --git a/include/configs/tx25.h b/include/configs/tx25.h
> index 2d7479b..f879441 100644
> --- a/include/configs/tx25.h
> +++ b/include/configs/tx25.h
> @@ -15,6 +15,8 @@
>   */
>  #define CONFIG_MX25
>  #define CONFIG_MX25_CLK32		32000	/* OSC32K frequency */
> +#define CONFIG_SYS_TIMER_RATE		CONFIG_MX25_CLK32

Ditto 1.

> +#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)

Ditto 2.

>  
>  #define	CONFIG_SYS_MONITOR_LEN		(256 << 10)	/* 256 kB for U-Boot */
>  
> diff --git a/include/configs/zmx25.h b/include/configs/zmx25.h
> index 2e7f145..deaadfa 100644
> --- a/include/configs/zmx25.h
> +++ b/include/configs/zmx25.h
> @@ -14,6 +14,9 @@
>  #define CONFIG_MX25
>  #define CONFIG_SYS_TEXT_BASE		0xA0000000
>  
> +#define CONFIG_SYS_TIMER_RATE		32768

Ditto 1.

> +#define CONFIG_SYS_TIMER_COUNTER	(IMX_GPT1_BASE + 0x24)

Ditto 2.

> +
>  #define CONFIG_MACH_TYPE	MACH_TYPE_ZMX25
>  /*
>   * Environment settings

Best regards,
Beno?t

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (8 preceding siblings ...)
  2013-09-08 20:12 ` [U-Boot] [PATCH 9/9] ARM: tegra: " Rob Herring
@ 2013-09-09  5:53 ` Wolfgang Denk
  2013-09-09 14:52   ` Rob Herring
  2013-09-09  7:13 ` Lukasz Majewski
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
  11 siblings, 1 reply; 30+ messages in thread
From: Wolfgang Denk @ 2013-09-09  5:53 UTC (permalink / raw)
  To: u-boot

Dear Rob Herring,

In message <1378671174-18535-1-git-send-email-robherring2@gmail.com> you wrote:
> From: Rob Herring <rob.herring@calxeda.com>
> 
> Much of the ARM timer code is re-implemented for each platform yet it
> is all pretty much the same code.
> 
> This series introduces a common implementation of timer functions and
> simplifies the platform code down to 2 or 3 config defines. It is
> intended for platforms with 32-bit freerunning timers. I've converted
> a couple of platforms as an example, but there are many more still that
> can be converted. This probably could be extended to work with 16-bit
> timers as well.
> 
> I've compiled all ARM boards, but only tested on highbank.

Why do we need any ARM specific code at all?  What's the difference
between an ARM and - say - a PowerPC system in this respect, and why
do we need different code for both?

If we consolidate code, it should always be done in a cross-platform
way, unless platform specifc code really cannot be avoided (which I
fail to see yet here).

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Teenagers are people who express a burning desire to be different by
dressing exactly alike.
There are some strings. They're just not attached.

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (9 preceding siblings ...)
  2013-09-09  5:53 ` [U-Boot] [PATCH 0/9] Consolidate ARM " Wolfgang Denk
@ 2013-09-09  7:13 ` Lukasz Majewski
  2013-09-09 18:55   ` Rob Herring
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
  11 siblings, 1 reply; 30+ messages in thread
From: Lukasz Majewski @ 2013-09-09  7:13 UTC (permalink / raw)
  To: u-boot

Hi Rob,

> From: Rob Herring <rob.herring@calxeda.com>
> 
> Much of the ARM timer code is re-implemented for each platform yet it
> is all pretty much the same code.
> 
> This series introduces a common implementation of timer functions and
> simplifies the platform code down to 2 or 3 config defines. It is
> intended for platforms with 32-bit freerunning timers. I've converted
> a couple of platforms as an example, but there are many more still
> that can be converted. This probably could be extended to work with
> 16-bit timers as well.

I'm wondering if we could also move the Exynos related timer code
to ./arch/arm/lib/time.c?

Anyway, Rob very good idea!

> 
> I've compiled all ARM boards, but only tested on highbank.
> 
> Rob
> 
> Rob Herring (9):
>   ARM: add common timer functions
>   examples: enable gc-sections option
>   time: create default __udelay
>   ARM: highbank: convert to common timer code
>   ARM: mx25: convert to common timer code
>   ARM: mx27: convert to common timer code
>   ARM: vexpress: convert to common timer code
>   ARM: socfpga: convert to common timer code
>   ARM: tegra: convert to common timer code
> 
>  arch/arm/cpu/arm926ejs/mx25/timer.c     | 117
> --------------------------------
> arch/arm/cpu/arm926ejs/mx27/timer.c     | 110
> ------------------------------
> arch/arm/cpu/armv7/highbank/timer.c     |  83 ----------------------
> arch/arm/cpu/armv7/socfpga/timer.c      |  72 --------------------
> arch/arm/cpu/tegra-common/Makefile      |   2 +-
> arch/arm/cpu/tegra-common/timer.c       |  95
> -------------------------- arch/arm/lib/Makefile
> |   2 +- arch/arm/lib/time.c                     |  59
> ++++++++++++++++ board/armltd/vexpress/vexpress_common.c |  71
> ------------------- examples/api/Makefile                   |   2 +-
> include/configs/highbank.h              |   4 ++
> include/configs/imx27lite-common.h      |   3 +
> include/configs/mx25pdk.h               |   3 +
> include/configs/socfpga_cyclone5.h      |   3 +-
> include/configs/tegra-common.h          |   3 +
> include/configs/tx25.h                  |   2 +
> include/configs/vexpress_common.h       |   4 ++
> include/configs/zmx25.h                 |   3 +
> lib/time.c                              |  21 ++++++ 19 files
> changed, 107 insertions(+), 552 deletions(-) delete mode 100644
> arch/arm/cpu/tegra-common/timer.c create mode 100644
> arch/arm/lib/time.c
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
  2013-09-09  5:53 ` [U-Boot] [PATCH 0/9] Consolidate ARM " Wolfgang Denk
@ 2013-09-09 14:52   ` Rob Herring
  2013-09-09 15:37     ` Wolfgang Denk
  0 siblings, 1 reply; 30+ messages in thread
From: Rob Herring @ 2013-09-09 14:52 UTC (permalink / raw)
  To: u-boot

On 09/09/2013 12:53 AM, Wolfgang Denk wrote:
> Dear Rob Herring,
> 
> In message <1378671174-18535-1-git-send-email-robherring2@gmail.com> you wrote:
>> From: Rob Herring <rob.herring@calxeda.com>
>>
>> Much of the ARM timer code is re-implemented for each platform yet it
>> is all pretty much the same code.
>>
>> This series introduces a common implementation of timer functions and
>> simplifies the platform code down to 2 or 3 config defines. It is
>> intended for platforms with 32-bit freerunning timers. I've converted
>> a couple of platforms as an example, but there are many more still that
>> can be converted. This probably could be extended to work with 16-bit
>> timers as well.
>>
>> I've compiled all ARM boards, but only tested on highbank.
> 
> Why do we need any ARM specific code at all?  What's the difference
> between an ARM and - say - a PowerPC system in this respect, and why
> do we need different code for both?
> 
> If we consolidate code, it should always be done in a cross-platform
> way, unless platform specifc code really cannot be avoided (which I
> fail to see yet here).

I agree, but it appeared that at least some PPC platforms implement
timers differently using a timer interrupt. I haven't really looked at
other architectures. At least moving the code to a common spot is
trivial. Aside from the location, do you have any comments on the
implementation?

Rob

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
  2013-09-09 14:52   ` Rob Herring
@ 2013-09-09 15:37     ` Wolfgang Denk
  0 siblings, 0 replies; 30+ messages in thread
From: Wolfgang Denk @ 2013-09-09 15:37 UTC (permalink / raw)
  To: u-boot

Dear Rob Herring,

In message <522DE0B3.20201@gmail.com> you wrote:
>
> > If we consolidate code, it should always be done in a cross-platform
> > way, unless platform specifc code really cannot be avoided (which I
> > fail to see yet here).
> 
> I agree, but it appeared that at least some PPC platforms implement
> timers differently using a timer interrupt. I haven't really looked at

Correct, PPC uses the decrementer with interrupts.

> other architectures. At least moving the code to a common spot is
> trivial. Aside from the location, do you have any comments on the
> implementation?

Only very cursory.

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
(null cookie; hope that's ok)

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 0/9] Consolidate ARM timer code
  2013-09-09  7:13 ` Lukasz Majewski
@ 2013-09-09 18:55   ` Rob Herring
  0 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-09 18:55 UTC (permalink / raw)
  To: u-boot

On Mon, Sep 9, 2013 at 2:13 AM, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Hi Rob,
>
>> From: Rob Herring <rob.herring@calxeda.com>
>>
>> Much of the ARM timer code is re-implemented for each platform yet it
>> is all pretty much the same code.
>>
>> This series introduces a common implementation of timer functions and
>> simplifies the platform code down to 2 or 3 config defines. It is
>> intended for platforms with 32-bit freerunning timers. I've converted
>> a couple of platforms as an example, but there are many more still
>> that can be converted. This probably could be extended to work with
>> 16-bit timers as well.
>
> I'm wondering if we could also move the Exynos related timer code
> to ./arch/arm/lib/time.c?

Most likely yes. I don't intend to sloth thru all the implementations,
so patches welcome. :)

Rob

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: mx25: convert to common timer code
  2013-09-08 23:56   ` Benoît Thébaudeau
@ 2013-09-09 21:00     ` Rob Herring
  2013-09-10 10:25       ` Benoît Thébaudeau
  0 siblings, 1 reply; 30+ messages in thread
From: Rob Herring @ 2013-09-09 21:00 UTC (permalink / raw)
  To: u-boot

On Sun, Sep 8, 2013 at 6:56 PM, Beno?t Th?baudeau
<benoit.thebaudeau@advansee.com> wrote:
> Dear Rob Herring,
>
> On Sunday, September 8, 2013 10:12:50 PM, Rob Herring wrote:
>> From: Rob Herring <rob.herring@calxeda.com>
>>
>> Convert mx25 to use the commmon timer code.
>>
>> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
>> ---
> [...]
>> diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
>> index ccd3b6c..568ed6c 100644
>> --- a/include/configs/mx25pdk.h
>> +++ b/include/configs/mx25pdk.h
>> @@ -15,6 +15,9 @@
>>  #define CONFIG_SYS_TEXT_BASE         0x81200000
>>  #define CONFIG_MXC_GPIO
>>
>> +#define CONFIG_SYS_TIMER_RATE                32768
>                                                 ^
> MXC_CLK32 could be used here.

The problem the circular dependency that creates. MXC_CLK32 depends on
CONFIG_MX25_CLK32. Ordering could fix this, but


>> +#define CONFIG_SYS_TIMER_COUNTER     (IMX_GPT1_BASE + 0x24)
>
> This Linux-style (base + offset) register access is against U-Boot rules. You
> could write:
> (&((struct gpt_regs *)IMX_GPT1_BASE)->counter)

This may also have ordering issues. Including imx-regs.h just for the
base address doesn't work on mx27 for example.

Also, it seems like if u-boot is moving towards using kconfig, then
creating more include dependencies in the config headers is the wrong
direction.

Rob

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: mx25: convert to common timer code
  2013-09-09 21:00     ` Rob Herring
@ 2013-09-10 10:25       ` Benoît Thébaudeau
  2013-09-10 16:20         ` Rob Herring
  0 siblings, 1 reply; 30+ messages in thread
From: Benoît Thébaudeau @ 2013-09-10 10:25 UTC (permalink / raw)
  To: u-boot

On Monday, September 9, 2013 11:00:51 PM, Rob Herring wrote:
> On Sun, Sep 8, 2013 at 6:56 PM, Beno?t Th?baudeau
> <benoit.thebaudeau@advansee.com> wrote:
> > Dear Rob Herring,
> >
> > On Sunday, September 8, 2013 10:12:50 PM, Rob Herring wrote:
> >> From: Rob Herring <rob.herring@calxeda.com>
> >>
> >> Convert mx25 to use the commmon timer code.
> >>
> >> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
> >> ---
> > [...]
> >> diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
> >> index ccd3b6c..568ed6c 100644
> >> --- a/include/configs/mx25pdk.h
> >> +++ b/include/configs/mx25pdk.h
> >> @@ -15,6 +15,9 @@
> >>  #define CONFIG_SYS_TEXT_BASE         0x81200000
> >>  #define CONFIG_MXC_GPIO
> >>
> >> +#define CONFIG_SYS_TIMER_RATE                32768
> >                                                 ^
> > MXC_CLK32 could be used here.
> 
> The problem the circular dependency that creates. MXC_CLK32 depends on
> CONFIG_MX25_CLK32. Ordering could fix this, but

"but" what?

Yes:
#define CONFIG_MX25_CLK32		32000	/* OSC32K frequency */
#include <asm/arch/clock.h>
#define CONFIG_SYS_TIMER_RATE		MXC_CLK32

> >> +#define CONFIG_SYS_TIMER_COUNTER     (IMX_GPT1_BASE + 0x24)
> >
> > This Linux-style (base + offset) register access is against U-Boot rules.
> > You
> > could write:
> > (&((struct gpt_regs *)IMX_GPT1_BASE)->counter)
> 
> This may also have ordering issues. Including imx-regs.h just for the
> base address doesn't work on mx27 for example.

There has to be a way to make the inclusion of imx-regs.h work on mx27 like on
mx25. Also, imx27lite-common.h uses UART1_BASE from imx-regs.h, and it is very
dirty to use literal constants for CONFIG_SYS_TIMER_COUNTER instead of
definitions from imx-regs.h. The fix here should really be to make the inclusion
of imx-regs.h work on mx27.

> Also, it seems like if u-boot is moving towards using kconfig, then
> creating more include dependencies in the config headers is the wrong
> direction.

Right. However, the only thing that asm/arch/clock.h does here is to define a
SoC-specific value with a default value. Converted to kconfig, that would just
give:

Kconfig file for i.MX25 SoC:
---
config MXC_CLK32
	int "32-kHz oscillator frequency"
	default 32768
	help
	  Exact frequency of the 32-kHz oscillator, expressed in Hz
---

Kconfig file for your generic timer base driver:
---
config SYS_TIMER_RATE
	int "System timer rate (Hz)"
	default MXC_CLK32 if MXC
---

Best regards,
Beno?t

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH 5/9] ARM: mx25: convert to common timer code
  2013-09-10 10:25       ` Benoît Thébaudeau
@ 2013-09-10 16:20         ` Rob Herring
  0 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-09-10 16:20 UTC (permalink / raw)
  To: u-boot

On Tue, Sep 10, 2013 at 5:25 AM, Beno?t Th?baudeau
<benoit.thebaudeau@advansee.com> wrote:
> On Monday, September 9, 2013 11:00:51 PM, Rob Herring wrote:
>> On Sun, Sep 8, 2013 at 6:56 PM, Beno?t Th?baudeau
>> <benoit.thebaudeau@advansee.com> wrote:
>> > Dear Rob Herring,
>> >
>> > On Sunday, September 8, 2013 10:12:50 PM, Rob Herring wrote:
>> >> From: Rob Herring <rob.herring@calxeda.com>
>> >>
>> >> Convert mx25 to use the commmon timer code.
>> >>
>> >> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
>> >> ---
>> > [...]
>> >> diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
>> >> index ccd3b6c..568ed6c 100644
>> >> --- a/include/configs/mx25pdk.h
>> >> +++ b/include/configs/mx25pdk.h
>> >> @@ -15,6 +15,9 @@
>> >>  #define CONFIG_SYS_TEXT_BASE         0x81200000
>> >>  #define CONFIG_MXC_GPIO
>> >>
>> >> +#define CONFIG_SYS_TIMER_RATE                32768
>> >                                                 ^
>> > MXC_CLK32 could be used here.
>>
>> The problem the circular dependency that creates. MXC_CLK32 depends on
>> CONFIG_MX25_CLK32. Ordering could fix this, but
>
> "but" what?

Oops. But it is fragile is what I meant to say.

> Yes:
> #define CONFIG_MX25_CLK32               32000   /* OSC32K frequency */
> #include <asm/arch/clock.h>
> #define CONFIG_SYS_TIMER_RATE           MXC_CLK32

This example highlights the fragility as you have to know all the
CONFIG_* defines clock.h and anything clock.h includes.


>> >> +#define CONFIG_SYS_TIMER_COUNTER     (IMX_GPT1_BASE + 0x24)
>> >
>> > This Linux-style (base + offset) register access is against U-Boot rules.
>> > You
>> > could write:
>> > (&((struct gpt_regs *)IMX_GPT1_BASE)->counter)
>>
>> This may also have ordering issues. Including imx-regs.h just for the
>> base address doesn't work on mx27 for example.
>
> There has to be a way to make the inclusion of imx-regs.h work on mx27 like on
> mx25. Also, imx27lite-common.h uses UART1_BASE from imx-regs.h, and it is very
> dirty to use literal constants for CONFIG_SYS_TIMER_COUNTER instead of
> definitions from imx-regs.h. The fix here should really be to make the inclusion
> of imx-regs.h work on mx27.

Well, to start with mx27 imx-regs.h has this:

#ifdef CONFIG_MXC_UART
extern void mx27_uart1_init_pins(void);
#endif /* CONFIG_MXC_UART */

#ifdef CONFIG_FEC_MXC
extern void mx27_fec_init_pins(void);
#endif /* CONFIG_FEC_MXC */

#ifdef CONFIG_MXC_MMC
extern void mx27_sd1_init_pins(void);
extern void mx27_sd2_init_pins(void);
#endif /* CONFIG_MXC_MMC */

I will drop mx27 from the series and leave this to someone else to fix.

>> Also, it seems like if u-boot is moving towards using kconfig, then
>> creating more include dependencies in the config headers is the wrong
>> direction.
>
> Right. However, the only thing that asm/arch/clock.h does here is to define a
> SoC-specific value with a default value. Converted to kconfig, that would just
> give:
>
> Kconfig file for i.MX25 SoC:
> ---
> config MXC_CLK32
>         int "32-kHz oscillator frequency"
>         default 32768
>         help
>           Exact frequency of the 32-kHz oscillator, expressed in Hz
> ---
>
> Kconfig file for your generic timer base driver:
> ---
> config SYS_TIMER_RATE
>         int "System timer rate (Hz)"
>         default MXC_CLK32 if MXC

This would not scale well to hundreds of platforms, so it probably
needs to be in the platform kconfig. But this is another discussion...

Rob

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 0/9] Consolidate timer code
  2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
                   ` (10 preceding siblings ...)
  2013-09-09  7:13 ` Lukasz Majewski
@ 2013-10-04 15:22 ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 1/9] examples: enable gc-sections option Rob Herring
                     ` (9 more replies)
  11 siblings, 10 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Much of the timer code is re-implemented for each platform/arch yet it
is all pretty much the same code. 

This series introduces a common implementation of timer functions and
simplifies the platform code down to 2 or 3 config defines or 2 simple
functions. It is intended for platforms with 32-bit freerunning timers.
I've converted SH and a couple of ARM platforms as an example, but there
are many more still that can be converted. This probably could be
extended to work with 16-bit timers as well.

I've compiled on ARM, SH4, and PPC.

v2:
- Make timer code common for all architectures
- Convert SH timer to common code
- Drop mx27 due to include mess.
- Add converting versatile to common code

Rob

Rob Herring (9):
  examples: enable gc-sections option
  Introduce common timer functions
  sh: convert to common timer code
  ARM: highbank: convert to common timer code
  ARM: mx25: convert to common timer code
  ARM: vexpress: convert to common timer code
  ARM: socfpga: convert to common timer code
  ARM: tegra: convert to common timer code
  ARM: versatile: convert to common timer code

 arch/arm/cpu/arm926ejs/mx25/timer.c      | 117 -------------------------------
 arch/arm/cpu/arm926ejs/versatile/timer.c | 116 ------------------------------
 arch/arm/cpu/armv7/highbank/timer.c      |  83 ----------------------
 arch/arm/cpu/armv7/socfpga/timer.c       |  72 -------------------
 arch/arm/cpu/tegra-common/Makefile       |   2 +-
 arch/arm/cpu/tegra-common/timer.c        |  95 -------------------------
 arch/sh/lib/time.c                       |  61 +---------------
 board/armltd/vexpress/vexpress_common.c  |  71 -------------------
 examples/api/Makefile                    |   2 +-
 include/asm-generic/global_data.h        |   2 +
 include/configs/highbank.h               |   4 ++
 include/configs/mx25pdk.h                |   4 ++
 include/configs/socfpga_cyclone5.h       |   5 +-
 include/configs/tegra-common.h           |   3 +
 include/configs/tx25.h                   |   5 +-
 include/configs/versatile.h              |   9 ++-
 include/configs/vexpress_common.h        |   4 ++
 include/configs/zmx25.h                  |   6 ++
 lib/time.c                               |  73 +++++++++++++++++++
 19 files changed, 111 insertions(+), 623 deletions(-)
 delete mode 100644 arch/arm/cpu/tegra-common/timer.c

-- 
1.8.1.2

^ permalink raw reply	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 1/9] examples: enable gc-sections option
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 2/9] Introduce common timer functions Rob Herring
                     ` (8 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

This fixes building time.c when unreferenced functions are added.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 examples/api/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/api/Makefile b/examples/api/Makefile
index 4d68340..33cc91b 100644
--- a/examples/api/Makefile
+++ b/examples/api/Makefile
@@ -53,7 +53,7 @@ all:	$(obj).depend $(OUTPUT)
 #########################################################################
 
 $(OUTPUT):	$(OBJS)
-		$(LD) -Ttext $(LOAD_ADDR) -o $@ $^ $(PLATFORM_LIBS)
+		$(LD) --gc-sections -Ttext $(LOAD_ADDR) -o $@ $^ $(PLATFORM_LIBS)
 		$(OBJCOPY) -O binary $@ $(OUTPUT).bin 2>/dev/null
 
 # Rule to build generic library C files
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 2/9] Introduce common timer functions
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 1/9] examples: enable gc-sections option Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 3/9] sh: convert to common timer code Rob Herring
                     ` (7 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Many platforms duplicate pretty much the same timer code yet they all have
a 32-bit freerunning counter register. Create a common implementation that
minimally requires 2 or 3 defines to add timer support:

CONFIG_SYS_TIMER_RATE - Clock rate of the timer counter
CONFIG_SYS_TIMER_COUNTER - Address of 32-bit counter
CONFIG_SYS_TIMER_COUNTS_DOWN - Define if counter counts down

All functions are weak or ifdef'ed so they can still be overriden by any
platform.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
v2:
- Move to common location for all arches
- Add extern timer_read_counter declaration
- Add new global data timebase_h and timebase_l


 include/asm-generic/global_data.h |  2 ++
 lib/time.c                        | 73 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)

diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
index 77e06fb..0de0bea 100644
--- a/include/asm-generic/global_data.h
+++ b/include/asm-generic/global_data.h
@@ -72,6 +72,8 @@ typedef struct global_data {
 #if defined(CONFIG_SYS_I2C)
 	int		cur_i2c_bus;	/* current used i2c bus */
 #endif
+	unsigned long timebase_h;
+	unsigned long timebase_l;
 	struct arch_global_data arch;	/* architecture-specific data */
 } gd_t;
 #endif
diff --git a/lib/time.c b/lib/time.c
index 68b8ff4..761272a 100644
--- a/lib/time.c
+++ b/lib/time.c
@@ -7,11 +7,84 @@
 
 #include <common.h>
 #include <watchdog.h>
+#include <div64.h>
+#include <asm/io.h>
 
 #ifndef CONFIG_WD_PERIOD
 # define CONFIG_WD_PERIOD	(10 * 1000 * 1000)	/* 10 seconds default*/
 #endif
 
+DECLARE_GLOBAL_DATA_PTR;
+
+#ifdef CONFIG_SYS_TIMER_RATE
+ulong notrace get_tbclk(void)
+{
+	return CONFIG_SYS_TIMER_RATE;
+}
+#endif
+
+#ifdef CONFIG_SYS_TIMER_COUNTER
+unsigned long notrace timer_read_counter(void)
+{
+#ifdef CONFIG_SYS_TIMER_COUNTS_DOWN
+	return ~readl(CONFIG_SYS_TIMER_COUNTER);
+#else
+	return readl(CONFIG_SYS_TIMER_COUNTER);
+#endif
+}
+#else
+extern unsigned long timer_read_counter(void);
+#endif
+
+unsigned long long __weak notrace get_ticks(void)
+{
+	unsigned long now = timer_read_counter();
+
+	/* increment tbu if tbl has rolled over */
+	if (now < gd->timebase_l)
+		gd->timebase_h++;
+	gd->timebase_l = now;
+	return ((unsigned long long)gd->timebase_h << 32) | gd->timebase_l;
+}
+
+static unsigned long long notrace tick_to_time(unsigned long long tick)
+{
+	unsigned int div = get_tbclk();
+
+	tick *= CONFIG_SYS_HZ;
+	do_div(tick, div);
+	return tick;
+}
+
+ulong __weak get_timer(ulong base)
+{
+	return tick_to_time(get_ticks()) - base;
+}
+
+unsigned long __weak notrace timer_get_us(void)
+{
+	return tick_to_time(get_ticks() * 1000);
+}
+static unsigned long long usec_to_tick(unsigned long usec)
+{
+	unsigned long long tick = usec * get_tbclk();
+	usec *= get_tbclk();
+	do_div(tick, 1000000);
+	return tick;
+}
+
+void __weak __udelay(unsigned long usec)
+{
+	unsigned long long tmp;
+	ulong tmo;
+
+	tmo = usec_to_tick(usec);
+	tmp = get_ticks() + tmo;	/* get current timestamp */
+
+	while (get_ticks() < tmp)	/* loop till event */
+		 /*NOP*/;
+}
+
 /* ------------------------------------------------------------------------- */
 
 void udelay(unsigned long usec)
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 3/9] sh: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 1/9] examples: enable gc-sections option Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 2/9] Introduce common timer functions Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 4/9] ARM: highbank: " Rob Herring
                     ` (6 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert sh to use the commmon timer code. Remove reset_timer and
set_timer as they are unused on sh.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/sh/lib/time.c | 61 ++----------------------------------------------------
 1 file changed, 2 insertions(+), 59 deletions(-)

diff --git a/arch/sh/lib/time.c b/arch/sh/lib/time.c
index 1fe537e..b182dd2 100644
--- a/arch/sh/lib/time.c
+++ b/arch/sh/lib/time.c
@@ -12,7 +12,6 @@
  */
 
 #include <common.h>
-#include <div64.h>
 #include <asm/processor.h>
 #include <asm/io.h>
 #include <sh_tmu.h>
@@ -20,28 +19,15 @@
 static struct tmu_regs *tmu = (struct tmu_regs *)TMU_BASE;
 
 static u16 bit;
-static unsigned long last_tcnt;
-static unsigned long long overflow_ticks;
 
 unsigned long get_tbclk(void)
 {
 	return get_tmu0_clk_rate() >> ((bit + 1) * 2);
 }
 
-static inline unsigned long long tick_to_time(unsigned long long tick)
+unsigned long timer_read_counter(void)
 {
-	tick *= CONFIG_SYS_HZ;
-	do_div(tick, get_tbclk());
-
-	return tick;
-}
-
-static inline unsigned long long usec_to_tick(unsigned long long usec)
-{
-	usec *= get_tbclk();
-	do_div(usec, 1000000);
-
-	return usec;
+	return ~readl(&tmu->tcnt0);
 }
 
 static void tmu_timer_start(unsigned int timer)
@@ -66,49 +52,6 @@ int timer_init(void)
 	tmu_timer_stop(0);
 	tmu_timer_start(0);
 
-	last_tcnt = 0;
-	overflow_ticks = 0;
-
 	return 0;
 }
 
-unsigned long long get_ticks(void)
-{
-	unsigned long tcnt = 0 - readl(&tmu->tcnt0);
-
-	if (last_tcnt > tcnt) /* overflow */
-		overflow_ticks++;
-	last_tcnt = tcnt;
-
-	return (overflow_ticks << 32) | tcnt;
-}
-
-void __udelay(unsigned long usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = usec_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-unsigned long get_timer(unsigned long base)
-{
-	/* return msec */
-	return tick_to_time(get_ticks()) - base;
-}
-
-void set_timer(unsigned long t)
-{
-	writel((0 - t), &tmu->tcnt0);
-}
-
-void reset_timer(void)
-{
-	tmu_timer_stop(0);
-	set_timer(0);
-	tmu_timer_start(0);
-}
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 4/9] ARM: highbank: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (2 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 3/9] sh: convert to common timer code Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 5/9] ARM: mx25: " Rob Herring
                     ` (5 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert highbank to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/armv7/highbank/timer.c | 83 -------------------------------------
 include/configs/highbank.h          |  4 ++
 2 files changed, 4 insertions(+), 83 deletions(-)

diff --git a/arch/arm/cpu/armv7/highbank/timer.c b/arch/arm/cpu/armv7/highbank/timer.c
index b61cd69..d56bf21 100644
--- a/arch/arm/cpu/armv7/highbank/timer.c
+++ b/arch/arm/cpu/armv7/highbank/timer.c
@@ -7,18 +7,12 @@
  */
 
 #include <common.h>
-#include <div64.h>
-#include <linux/types.h>        /* for size_t */
-#include <linux/stddef.h>       /* for NULL */
 #include <asm/io.h>
 #include <asm/arch-armv7/systimer.h>
 
 #undef SYSTIMER_BASE
 #define SYSTIMER_BASE		0xFFF34000	/* Timer 0 and 1 base	*/
-#define SYSTIMER_RATE		(150000000 / 256)
 
-static ulong timestamp;
-static ulong lastinc;
 static struct systimer *systimer_base = (struct systimer *)SYSTIMER_BASE;
 
 /*
@@ -38,80 +32,3 @@ int timer_init(void)
 	return 0;
 
 }
-
-#define TICK_PER_TIME	((SYSTIMER_RATE + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ)
-#define NS_PER_TICK	(1000000000 / SYSTIMER_RATE)
-
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	do_div(tick, TICK_PER_TIME);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	return time * TICK_PER_TIME;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	unsigned long long tick = us * 1000;
-	tick += NS_PER_TICK - 1;
-	do_div(tick, NS_PER_TICK);
-	return tick;
-}
-
-unsigned long long get_ticks(void)
-{
-	ulong now = ~readl(&systimer_base->timer0value);
-
-	if (now >= lastinc)	/* normal mode (non roll) */
-		/* move stamp forward with absolut diff ticks */
-		timestamp += (now - lastinc);
-	else			/* we have rollover of incrementer */
-		timestamp += (0xFFFFFFFF - lastinc) + now;
-	lastinc = now;
-	return timestamp;
-}
-
-/*
- * Delay x useconds AND preserve advance timstamp value
- *     assumes timer is ticking at 1 msec
- */
-void __udelay(ulong usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = us_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-void reset_timer_masked(void)
-{
-	lastinc = ~readl(&systimer_base->timer0value);
-	timestamp = 0;
-}
-
-void reset_timer(void)
-{
-	reset_timer_masked();
-}
-
-ulong get_timer_masked(void)
-{
-	return tick_to_time(get_ticks());
-}
-
-ulong get_tbclk(void)
-{
-	return SYSTIMER_RATE;
-}
diff --git a/include/configs/highbank.h b/include/configs/highbank.h
index afb6e64..2504c42 100644
--- a/include/configs/highbank.h
+++ b/include/configs/highbank.h
@@ -21,6 +21,10 @@
 #define CONFIG_SUPPORT_RAW_INITRD
 #define CONFIG_SYS_BOOTMAPSZ		(16 << 20)
 
+#define CONFIG_SYS_TIMER_RATE		(150000000/256)
+#define CONFIG_SYS_TIMER_COUNTER	(0xFFF34000 + 0x4)
+#define CONFIG_SYS_TIMER_COUNTS_DOWN
+
 /*
  * Size of malloc() pool
  */
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 5/9] ARM: mx25: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (3 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 4/9] ARM: highbank: " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 6/9] ARM: vexpress: " Rob Herring
                     ` (4 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert mx25 to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---

v2:
- Use GPT struct for register offset

 arch/arm/cpu/arm926ejs/mx25/timer.c | 117 ------------------------------------
 include/configs/mx25pdk.h           |   4 ++
 include/configs/tx25.h              |   5 +-
 include/configs/zmx25.h             |   6 ++
 4 files changed, 14 insertions(+), 118 deletions(-)

diff --git a/arch/arm/cpu/arm926ejs/mx25/timer.c b/arch/arm/cpu/arm926ejs/mx25/timer.c
index 42b6076..7f19791 100644
--- a/arch/arm/cpu/arm926ejs/mx25/timer.c
+++ b/arch/arm/cpu/arm926ejs/mx25/timer.c
@@ -21,65 +21,8 @@
  */
 
 #include <common.h>
-#include <div64.h>
 #include <asm/io.h>
 #include <asm/arch/imx-regs.h>
-#include <asm/arch/clock.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define timestamp	(gd->arch.tbl)
-#define lastinc		(gd->arch.lastinc)
-
-/*
- * "time" is measured in 1 / CONFIG_SYS_HZ seconds,
- * "tick" is internal timer period
- */
-#ifdef CONFIG_MX25_TIMER_HIGH_PRECISION
-/* ~0.4% error - measured with stop-watch on 100s boot-delay */
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	tick *= CONFIG_SYS_HZ;
-	do_div(tick, MXC_CLK32);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	time *= MXC_CLK32;
-	do_div(time, CONFIG_SYS_HZ);
-	return time;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us = us * MXC_CLK32 + 999999;
-	do_div(us, 1000000);
-	return us;
-}
-#else
-/* ~2% error */
-#define TICK_PER_TIME	((MXC_CLK32 + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ)
-#define US_PER_TICK	(1000000 / MXC_CLK32)
-
-static inline unsigned long long tick_to_time(unsigned long long tick)
-{
-	do_div(tick, TICK_PER_TIME);
-	return tick;
-}
-
-static inline unsigned long long time_to_tick(unsigned long long time)
-{
-	return time * TICK_PER_TIME;
-}
-
-static inline unsigned long long us_to_tick(unsigned long long us)
-{
-	us += US_PER_TICK - 1;
-	do_div(us, US_PER_TICK);
-	return us;
-}
-#endif
 
 /* nothing really to do with interrupts, just starts up a counter. */
 /* The 32KHz 32-bit timer overruns in 134217 seconds */
@@ -104,63 +47,3 @@ int timer_init(void)
 
 	return 0;
 }
-
-unsigned long long get_ticks(void)
-{
-	struct gpt_regs *gpt = (struct gpt_regs *)IMX_GPT1_BASE;
-	ulong now = readl(&gpt->counter); /* current tick value */
-
-	if (now >= lastinc) {
-		/*
-		 * normal mode (non roll)
-		 * move stamp forward with absolut diff ticks
-		 */
-		timestamp += (now - lastinc);
-	} else {
-		/* we have rollover of incrementer */
-		timestamp += (0xFFFFFFFF - lastinc) + now;
-	}
-	lastinc = now;
-	return timestamp;
-}
-
-ulong get_timer_masked(void)
-{
-	/*
-	 * get_ticks() returns a long long (64 bit), it wraps in
-	 * 2^64 / MXC_CLK32 = 2^64 / 2^15 = 2^49 ~ 5 * 10^14 (s) ~
-	 * 5 * 10^9 days... and get_ticks() * CONFIG_SYS_HZ wraps in
-	 * 5 * 10^6 days - long enough.
-	 */
-	return tick_to_time(get_ticks());
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/* delay x useconds AND preserve advance timstamp value */
-void __udelay(unsigned long usec)
-{
-	unsigned long long tmp;
-	ulong tmo;
-
-	tmo = us_to_tick(usec);
-	tmp = get_ticks() + tmo;	/* get current timestamp */
-
-	while (get_ticks() < tmp)	/* loop till event */
-		 /*NOP*/;
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk(void)
-{
-	ulong tbclk;
-
-	tbclk = MXC_CLK32;
-	return tbclk;
-}
diff --git a/include/configs/mx25pdk.h b/include/configs/mx25pdk.h
index 543c415..0a9f442 100644
--- a/include/configs/mx25pdk.h
+++ b/include/configs/mx25pdk.h
@@ -16,6 +16,10 @@
 #define CONFIG_SYS_TEXT_BASE		0x81200000
 #define CONFIG_MXC_GPIO
 
+#define CONFIG_SYS_TIMER_RATE		32768
+#define CONFIG_SYS_TIMER_COUNTER	\
+	(&((struct gpt_regs *)IMX_GPT1_BASE)->counter)
+
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
 
diff --git a/include/configs/tx25.h b/include/configs/tx25.h
index 93dd3c5..beea612 100644
--- a/include/configs/tx25.h
+++ b/include/configs/tx25.h
@@ -16,6 +16,9 @@
 #define CONFIG_MX25
 #define CONFIG_MX25_CLK32		32000	/* OSC32K frequency */
 #define CONFIG_SYS_HZ			1000
+#define CONFIG_SYS_TIMER_RATE		CONFIG_MX25_CLK32
+#define CONFIG_SYS_TIMER_COUNTER	\
+	(&((struct gpt_regs *)IMX_GPT1_BASE)->counter)
 
 #define	CONFIG_SYS_MONITOR_LEN		(256 << 10)	/* 256 kB for U-Boot */
 
diff --git a/include/configs/zmx25.h b/include/configs/zmx25.h
index 765b849..ee48429 100644
--- a/include/configs/zmx25.h
+++ b/include/configs/zmx25.h
@@ -10,11 +10,17 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
+#include <asm/arch/imx-regs.h>
+
 #define CONFIG_ARM926EJS			/* arm926ejs CPU core */
 #define CONFIG_MX25
 #define CONFIG_SYS_HZ			1000
 #define CONFIG_SYS_TEXT_BASE		0xA0000000
 
+#define CONFIG_SYS_TIMER_RATE		32768
+#define CONFIG_SYS_TIMER_COUNTER	\
+	(&((struct gpt_regs *)IMX_GPT1_BASE)->counter)
+
 #define CONFIG_MACH_TYPE	MACH_TYPE_ZMX25
 /*
  * Environment settings
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 6/9] ARM: vexpress: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (4 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 5/9] ARM: mx25: " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 7/9] ARM: socfpga: " Rob Herring
                     ` (3 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert vexpress to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 board/armltd/vexpress/vexpress_common.c | 71 ---------------------------------
 include/configs/vexpress_common.h       |  4 ++
 2 files changed, 4 insertions(+), 71 deletions(-)

diff --git a/board/armltd/vexpress/vexpress_common.c b/board/armltd/vexpress/vexpress_common.c
index 4c7a7f4..25438fb 100644
--- a/board/armltd/vexpress/vexpress_common.c
+++ b/board/armltd/vexpress/vexpress_common.c
@@ -26,9 +26,6 @@
 #include <asm/arch/wdt.h>
 #include "../drivers/mmc/arm_pl180_mmci.h"
 
-static ulong timestamp;
-static ulong lastdec;
-
 static struct systimer *systimer_base = (struct systimer *)V2M_TIMER01;
 static struct sysctrl *sysctrl_base = (struct sysctrl *)SCTL_BASE;
 
@@ -152,8 +149,6 @@ static void vexpress_timer_init(void)
 	writel(SYSTIMER_EN | SYSTIMER_32BIT |
 	       readl(&systimer_base->timer0control),
 	       &systimer_base->timer0control);
-
-	reset_timer_masked();
 }
 
 int v2m_cfg_write(u32 devfn, u32 data)
@@ -183,62 +178,6 @@ void reset_cpu(ulong addr)
 		printf("Unable to reboot\n");
 }
 
-/*
- * Delay x useconds AND perserve advance timstamp value
- *     assumes timer is ticking at 1 msec
- */
-void __udelay(ulong usec)
-{
-	ulong tmo, tmp;
-
-	tmo = usec / 1000;
-	tmp = get_timer(0);	/* get current timestamp */
-
-	/*
-	 * If setting this forward will roll time stamp	then
-	 * reset "advancing" timestamp to 0 and set lastdec value
-	 * otherwise set the advancing stamp to the wake up time
-	 */
-	if ((tmo + tmp + 1) < tmp)
-		reset_timer_masked();
-	else
-		tmo += tmp;
-
-	while (get_timer_masked() < tmo)
-		; /* loop till wakeup event */
-}
-
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-void reset_timer_masked(void)
-{
-	lastdec = readl(&systimer_base->timer0value) / 1000;
-	timestamp = 0;
-}
-
-ulong get_timer_masked(void)
-{
-	ulong now = readl(&systimer_base->timer0value) / 1000;
-
-	if (lastdec >= now) {	/* normal mode (non roll) */
-		timestamp += lastdec - now;
-	} else {		/* count down timer overflowed */
-		/*
-		 * nts = ts + ld - now
-		 * ts = old stamp, ld = time before passing through - 1
-		 * now = amount of time after passing though - 1
-		 * nts = new "advancing time stamp"
-		 */
-		timestamp += lastdec + SYSTIMER_RELOAD - now;
-	}
-	lastdec = now;
-
-	return timestamp;
-}
-
 void lowlevel_init(void)
 {
 }
@@ -246,13 +185,3 @@ void lowlevel_init(void)
 ulong get_board_rev(void){
 	return readl((u32 *)SYS_ID);
 }
-
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-ulong get_tbclk(void)
-{
-	return (ulong)CONFIG_SYS_HZ;
-}
diff --git a/include/configs/vexpress_common.h b/include/configs/vexpress_common.h
index 75a4500..46bab0b 100644
--- a/include/configs/vexpress_common.h
+++ b/include/configs/vexpress_common.h
@@ -132,6 +132,10 @@
 #define SCTL_BASE			V2M_SYSCTL
 #define VEXPRESS_FLASHPROG_FLVPPEN	(1 << 0)
 
+#define CONFIG_SYS_TIMER_RATE		1000000
+#define CONFIG_SYS_TIMER_COUNTER	(0x10011000 + 0x4)
+#define CONFIG_SYS_TIMER_COUNTS_DOWN
+
 /* SMSC9115 Ethernet from SMSC9118 family */
 #define CONFIG_SMC911X			1
 #define CONFIG_SMC911X_32_BIT		1
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 7/9] ARM: socfpga: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (5 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 6/9] ARM: vexpress: " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 8/9] ARM: tegra: " Rob Herring
                     ` (2 subsequent siblings)
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert socfpga to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/armv7/socfpga/timer.c | 72 --------------------------------------
 include/configs/socfpga_cyclone5.h |  5 +--
 2 files changed, 3 insertions(+), 74 deletions(-)

diff --git a/arch/arm/cpu/armv7/socfpga/timer.c b/arch/arm/cpu/armv7/socfpga/timer.c
index 09f6f14..58fc789 100644
--- a/arch/arm/cpu/armv7/socfpga/timer.c
+++ b/arch/arm/cpu/armv7/socfpga/timer.c
@@ -8,8 +8,6 @@
 #include <asm/io.h>
 #include <asm/arch/timer.h>
 
-DECLARE_GLOBAL_DATA_PTR;
-
 static const struct socfpga_timer *timer_base = (void *)CONFIG_SYS_TIMERBASE;
 
 /*
@@ -22,73 +20,3 @@ int timer_init(void)
 	writel(readl(&timer_base->ctrl) | 0x3, &timer_base->ctrl);
 	return 0;
 }
-
-static u32 read_timer(void)
-{
-	return readl(&timer_base->curr_val);
-}
-
-/*
- * Delay x useconds
- */
-void __udelay(unsigned long usec)
-{
-	unsigned long now, last;
-	/*
-	 * get the tmo value based on timer clock speed
-	 * tmo = delay required / period of timer clock
-	 */
-	long tmo = usec * CONFIG_TIMER_CLOCK_KHZ / 1000;
-
-	last = read_timer();
-	while (tmo > 0) {
-		now = read_timer();
-		if (last >= now)
-			/* normal mode (non roll) */
-			tmo -= last - now;
-		else
-			/* we have overflow of the count down timer */
-			tmo -= TIMER_LOAD_VAL - last + now;
-		last = now;
-	}
-}
-
-/*
- * Get the timer value
- */
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/*
- * Timer : get the time difference
- * Unit of tick is based on the CONFIG_SYS_HZ
- */
-ulong get_timer_masked(void)
-{
-	/* current tick value */
-	ulong now = read_timer() / (CONFIG_TIMER_CLOCK_KHZ/CONFIG_SYS_HZ);
-	if (gd->arch.lastinc >= now) {
-		/* normal mode (non roll) */
-		/* move stamp forward with absolute diff ticks */
-		gd->arch.tbl += gd->arch.lastinc - now;
-	} else {
-		/* we have overflow of the count down timer */
-		gd->arch.tbl += TIMER_LOAD_VAL - gd->arch.lastinc + now;
-	}
-	gd->arch.lastinc = now;
-	return gd->arch.tbl;
-}
-
-/*
- * Reset the timer
- */
-void reset_timer(void)
-{
-	/* capture current decrementer value time */
-	gd->arch.lastinc = read_timer() /
-				(CONFIG_TIMER_CLOCK_KHZ / CONFIG_SYS_HZ);
-	/* start "advancing" time stamp from 0 */
-	gd->arch.tbl = 0;
-}
diff --git a/include/configs/socfpga_cyclone5.h b/include/configs/socfpga_cyclone5.h
index 06aeba6..fa49f85 100644
--- a/include/configs/socfpga_cyclone5.h
+++ b/include/configs/socfpga_cyclone5.h
@@ -197,10 +197,11 @@
 /* Timer info */
 #define CONFIG_SYS_HZ			1000
 #ifdef CONFIG_SOCFPGA_VIRTUAL_TARGET
-#define CONFIG_TIMER_CLOCK_KHZ		2400
+#define CONFIG_SYS_TIMER_RATE		2400000
 #else
-#define CONFIG_TIMER_CLOCK_KHZ		25000
+#define CONFIG_SYS_TIMER_RATE		25000000
 #endif
+#define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMERBASE + 0x4)
 
 #define CONFIG_ENV_IS_NOWHERE
 
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 8/9] ARM: tegra: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (6 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 7/9] ARM: socfpga: " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 9/9] ARM: versatile: " Rob Herring
  2013-11-04 21:31   ` [U-Boot] [PATCH v2 0/9] Consolidate " Tom Rini
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert tegra to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/tegra-common/Makefile |  2 +-
 arch/arm/cpu/tegra-common/timer.c  | 95 --------------------------------------
 include/configs/tegra-common.h     |  3 ++
 3 files changed, 4 insertions(+), 96 deletions(-)
 delete mode 100644 arch/arm/cpu/tegra-common/timer.c

diff --git a/arch/arm/cpu/tegra-common/Makefile b/arch/arm/cpu/tegra-common/Makefile
index 1b6cdf7..89b2210 100644
--- a/arch/arm/cpu/tegra-common/Makefile
+++ b/arch/arm/cpu/tegra-common/Makefile
@@ -12,7 +12,7 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)libcputegra-common.o
 
 SOBJS += lowlevel_init.o
-COBJS-y	+= ap.o board.o sys_info.o timer.o clock.o cache.o
+COBJS-y	+= ap.o board.o sys_info.o clock.o cache.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(SOBJS) $(COBJS-y))
diff --git a/arch/arm/cpu/tegra-common/timer.c b/arch/arm/cpu/tegra-common/timer.c
deleted file mode 100644
index d0f783e..0000000
--- a/arch/arm/cpu/tegra-common/timer.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * (C) Copyright 2010,2011
- * NVIDIA Corporation <www.nvidia.com>
- *
- * (C) Copyright 2008
- * Texas Instruments
- *
- * Richard Woodruff <r-woodruff2@ti.com>
- * Syed Moahmmed Khasim <khasim@ti.com>
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger@sysgo.de>
- * Alex Zuepke <azu@sysgo.de>
- *
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
- *
- * SPDX-License-Identifier:	GPL-2.0+
- */
-
-#include <common.h>
-#include <asm/io.h>
-#include <asm/arch/tegra.h>
-#include <asm/arch-tegra/timer.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-/* counter runs at 1MHz */
-#define TIMER_CLK	1000000
-#define TIMER_LOAD_VAL	0xffffffff
-
-/* timer without interrupts */
-ulong get_timer(ulong base)
-{
-	return get_timer_masked() - base;
-}
-
-/* delay x useconds */
-void __udelay(unsigned long usec)
-{
-	long tmo = usec * (TIMER_CLK / 1000) / 1000;
-	unsigned long now, last = timer_get_us();
-
-	while (tmo > 0) {
-		now = timer_get_us();
-		if (last > now) /* count up timer overflow */
-			tmo -= TIMER_LOAD_VAL - last + now;
-		else
-			tmo -= now - last;
-		last = now;
-	}
-}
-
-ulong get_timer_masked(void)
-{
-	ulong now;
-
-	/* current tick value */
-	now = timer_get_us() / (TIMER_CLK / CONFIG_SYS_HZ);
-
-	if (now >= gd->arch.lastinc)	/* normal mode (non roll) */
-		/* move stamp forward with absolute diff ticks */
-		gd->arch.tbl += (now - gd->arch.lastinc);
-	else	/* we have rollover of incrementer */
-		gd->arch.tbl += ((TIMER_LOAD_VAL / (TIMER_CLK / CONFIG_SYS_HZ))
-				- gd->arch.lastinc) + now;
-	gd->arch.lastinc = now;
-	return gd->arch.tbl;
-}
-
-/*
- * This function is derived from PowerPC code (read timebase as long long).
- * On ARM it just returns the timer value.
- */
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk(void)
-{
-	return CONFIG_SYS_HZ;
-}
-
-unsigned long timer_get_us(void)
-{
-	struct timerus *timer_base = (struct timerus *)NV_PA_TMRUS_BASE;
-
-	return readl(&timer_base->cntr_1us);
-}
diff --git a/include/configs/tegra-common.h b/include/configs/tegra-common.h
index ba6c6bb..d4361a5 100644
--- a/include/configs/tegra-common.h
+++ b/include/configs/tegra-common.h
@@ -19,6 +19,9 @@
 
 #include <asm/arch/tegra.h>		/* get chip and board defs */
 
+#define CONFIG_SYS_TIMER_RATE		1000000
+#define CONFIG_SYS_TIMER_COUNTER	NV_PA_TMRUS_BASE
+
 /*
  * Display CPU and Board information
  */
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 9/9] ARM: versatile: convert to common timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (7 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 8/9] ARM: tegra: " Rob Herring
@ 2013-10-04 15:22   ` Rob Herring
  2013-11-04 21:31   ` [U-Boot] [PATCH v2 0/9] Consolidate " Tom Rini
  9 siblings, 0 replies; 30+ messages in thread
From: Rob Herring @ 2013-10-04 15:22 UTC (permalink / raw)
  To: u-boot

From: Rob Herring <rob.herring@calxeda.com>

Convert versatile to use the commmon timer code.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
 arch/arm/cpu/arm926ejs/versatile/timer.c | 116 -------------------------------
 include/configs/versatile.h              |   9 ++-
 2 files changed, 4 insertions(+), 121 deletions(-)

diff --git a/arch/arm/cpu/arm926ejs/versatile/timer.c b/arch/arm/cpu/arm926ejs/versatile/timer.c
index 5436162..f31d9bd 100644
--- a/arch/arm/cpu/arm926ejs/versatile/timer.c
+++ b/arch/arm/cpu/arm926ejs/versatile/timer.c
@@ -21,16 +21,6 @@
 
 #include <common.h>
 
-#define TIMER_LOAD_VAL 0xffffffff
-
-/* macro to read the 32 bit timer */
-#define READ_TIMER (*(volatile ulong *)(CONFIG_SYS_TIMERBASE+4))
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define timestamp gd->arch.tbl
-#define lastdec gd->arch.lastinc
-
 #define TIMER_ENABLE	(1 << 7)
 #define TIMER_MODE_MSK	(1 << 6)
 #define TIMER_MODE_FR	(0 << 6)
@@ -69,112 +59,6 @@ int timer_init (void)
 
 	*(volatile ulong *)(CONFIG_SYS_TIMERBASE + 8) = tmr_ctrl_val;
 
-	/* init the timestamp and lastdec value */
-	reset_timer_masked();
-
 	return 0;
 }
 
-/*
- * timer without interrupts
- */
-ulong get_timer (ulong base)
-{
-	return get_timer_masked () - base;
-}
-
-/* delay x useconds AND preserve advance timestamp value */
-void __udelay (unsigned long usec)
-{
-	ulong tmo, tmp;
-
-	if(usec >= 1000){		/* if "big" number, spread normalization to seconds */
-		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
-		tmo *= CONFIG_SYS_HZ;	/* find number of "ticks" to wait to achieve target */
-		tmo /= 1000;		/* finish normalize. */
-	}else{				/* else small number, don't kill it prior to HZ multiply */
-		tmo = usec * CONFIG_SYS_HZ;
-		tmo /= (1000*1000);
-	}
-
-	tmp = get_timer (0);		/* get current timestamp */
-	if( (tmo + tmp + 1) < tmp )	/* if setting this fordward will roll time stamp */
-		reset_timer_masked ();	/* reset "advancing" timestamp to 0, set lastdec value */
-	else
-		tmo += tmp;		/* else, set advancing stamp wake up time */
-
-	while (get_timer_masked () < tmo)/* loop till event */
-		/*NOP*/;
-}
-
-void reset_timer_masked (void)
-{
-	/* reset time */
-	lastdec = READ_TIMER;  /* capure current decrementer value time */
-	timestamp = 0;	       /* start "advancing" time stamp from 0 */
-}
-
-ulong get_timer_masked (void)
-{
-	ulong now = READ_TIMER;		/* current tick value */
-
-	if (lastdec >= now) {		/* normal mode (non roll) */
-		/* normal mode */
-		timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
-	} else {			/* we have overflow of the count down timer */
-		/* nts = ts + ld + (TLV - now)
-		 * ts=old stamp, ld=time that passed before passing through -1
-		 * (TLV-now) amount of time after passing though -1
-		 * nts = new "advancing time stamp"...it could also roll and cause problems.
-		 */
-		timestamp += lastdec + TIMER_LOAD_VAL - now;
-	}
-	lastdec = now;
-
-	return timestamp;
-}
-
-/* waits specified delay value and resets timestamp */
-void udelay_masked (unsigned long usec)
-{
-	ulong tmo;
-	ulong endtime;
-	signed long diff;
-
-	if (usec >= 1000) {		/* if "big" number, spread normalization to seconds */
-		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
-		tmo *= CONFIG_SYS_HZ;		/* find number of "ticks" to wait to achieve target */
-		tmo /= 1000;		/* finish normalize. */
-	} else {			/* else small number, don't kill it prior to HZ multiply */
-		tmo = usec * CONFIG_SYS_HZ;
-		tmo /= (1000*1000);
-	}
-
-	endtime = get_timer_masked () + tmo;
-
-	do {
-		ulong now = get_timer_masked ();
-		diff = endtime - now;
-	} while (diff >= 0);
-}
-
-/*
- * This function is derived from PowerPC code (read timebase as long long).
- * On ARM it just returns the timer value.
- */
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk (void)
-{
-	ulong tbclk;
-
-	tbclk = CONFIG_SYS_HZ;
-	return tbclk;
-}
diff --git a/include/configs/versatile.h b/include/configs/versatile.h
index 8d3ff6a..0d23262 100644
--- a/include/configs/versatile.h
+++ b/include/configs/versatile.h
@@ -25,12 +25,11 @@
 
 #define CONFIG_SYS_MEMTEST_START	0x100000
 #define CONFIG_SYS_MEMTEST_END		0x10000000
-#define CONFIG_SYS_HZ			(1000000 / 256)
-#define CONFIG_SYS_TIMERBASE		0x101E2000	/* Timer 0 and 1 base */
 
-#define CONFIG_SYS_TIMER_INTERVAL	10000
-#define CONFIG_SYS_TIMER_RELOAD		(CONFIG_SYS_TIMER_INTERVAL >> 4)
-#define CONFIG_SYS_TIMER_CTRL		0x84		/* Enable, Clock / 16 */
+#define CONFIG_SYS_TIMERBASE		0x101E2000	/* Timer 0 and 1 base */
+#define CONFIG_SYS_TIMER_RATE		(1000000 / 256)
+#define CONFIG_SYS_TIMER_COUNTER	(CONFIG_SYS_TIMERBASE + 0x4)
+#define CONFIG_SYS_TIMER_COUNTS_DOWN
 
 /*
  * control registers
-- 
1.8.1.2

^ permalink raw reply related	[flat|nested] 30+ messages in thread

* [U-Boot] [PATCH v2 0/9] Consolidate timer code
  2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
                     ` (8 preceding siblings ...)
  2013-10-04 15:22   ` [U-Boot] [PATCH v2 9/9] ARM: versatile: " Rob Herring
@ 2013-11-04 21:31   ` Tom Rini
  9 siblings, 0 replies; 30+ messages in thread
From: Tom Rini @ 2013-11-04 21:31 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 04, 2013 at 10:22:39AM -0500, Rob Herring wrote:

> From: Rob Herring <rob.herring@calxeda.com>
> 
> Much of the timer code is re-implemented for each platform/arch yet it
> is all pretty much the same code. 
> 
> This series introduces a common implementation of timer functions and
> simplifies the platform code down to 2 or 3 config defines or 2 simple
> functions. It is intended for platforms with 32-bit freerunning timers.
> I've converted SH and a couple of ARM platforms as an example, but there
> are many more still that can be converted. This probably could be
> extended to work with 16-bit timers as well.
> 
> I've compiled on ARM, SH4, and PPC.

For the series, applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20131104/56055f52/attachment.pgp>

^ permalink raw reply	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2013-11-04 21:31 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-08 20:12 [U-Boot] [PATCH 0/9] Consolidate ARM timer code Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 1/9] ARM: add common timer functions Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 2/9] examples: enable gc-sections option Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 3/9] time: create default __udelay Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 4/9] ARM: highbank: convert to common timer code Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 5/9] ARM: mx25: " Rob Herring
2013-09-08 23:56   ` Benoît Thébaudeau
2013-09-09 21:00     ` Rob Herring
2013-09-10 10:25       ` Benoît Thébaudeau
2013-09-10 16:20         ` Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 6/9] ARM: mx27: " Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 7/9] ARM: vexpress: " Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 8/9] ARM: socfpga: " Rob Herring
2013-09-08 20:12 ` [U-Boot] [PATCH 9/9] ARM: tegra: " Rob Herring
2013-09-09  5:53 ` [U-Boot] [PATCH 0/9] Consolidate ARM " Wolfgang Denk
2013-09-09 14:52   ` Rob Herring
2013-09-09 15:37     ` Wolfgang Denk
2013-09-09  7:13 ` Lukasz Majewski
2013-09-09 18:55   ` Rob Herring
2013-10-04 15:22 ` [U-Boot] [PATCH v2 0/9] Consolidate " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 1/9] examples: enable gc-sections option Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 2/9] Introduce common timer functions Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 3/9] sh: convert to common timer code Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 4/9] ARM: highbank: " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 5/9] ARM: mx25: " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 6/9] ARM: vexpress: " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 7/9] ARM: socfpga: " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 8/9] ARM: tegra: " Rob Herring
2013-10-04 15:22   ` [U-Boot] [PATCH v2 9/9] ARM: versatile: " Rob Herring
2013-11-04 21:31   ` [U-Boot] [PATCH v2 0/9] Consolidate " Tom Rini

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.