public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Rob Herring <robherring2@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 2/9] Introduce common timer functions
Date: Fri,  4 Oct 2013 10:22:41 -0500	[thread overview]
Message-ID: <1380900168-23791-3-git-send-email-robherring2@gmail.com> (raw)
In-Reply-To: <1380900168-23791-1-git-send-email-robherring2@gmail.com>

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

  parent reply	other threads:[~2013-10-04 15:22 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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   ` Rob Herring [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1380900168-23791-3-git-send-email-robherring2@gmail.com \
    --to=robherring2@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox