[U-Boot] [PATCHv2 08/13] nomadik-mtu: support configurable clock rates

Rabin Vincent rabin.vincent at stericsson.com
Thu Apr 8 15:43:15 CEST 2010


Change the Nomadik MTU driver to get the clock rate and prescaler from
the config file.  Also remove the hardcoded divisors and do the
calculations based on the configured rate.

Acked-by: Alessandro Rubini <rubini at unipv.it>
Acked-by: Michael Brandt <michael.brandt at stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vincent at stericsson.com>
---
 drivers/misc/nomadik_mtu.c |   23 ++++++++++++-----------
 include/configs/nhk8815.h  |    3 +++
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/misc/nomadik_mtu.c b/drivers/misc/nomadik_mtu.c
index 0aeeb63..612ab34 100644
--- a/drivers/misc/nomadik_mtu.c
+++ b/drivers/misc/nomadik_mtu.c
@@ -22,6 +22,7 @@
 
 #include <common.h>
 #include <asm/io.h>
+#include <div64.h>
 
 struct mtu {
 	uint	imsc;
@@ -42,14 +43,6 @@ struct mtu {
 #define MTU_CRn_PRESCALE_256	0x08
 #define MTU_CRn_32BITS		0x02
 
-/*
- * The timer is a decrementer, we'll left it free running at 2.4MHz.
- * We have 2.4 ticks per microsecond and an overflow in almost 30min
- */
-#define TIMER_CLOCK		(24 * 100 * 1000)
-#define COUNT_TO_USEC(x)	((x) * 5 / 12)	/* overflows at 6min */
-#define USEC_TO_COUNT(x)	((x) * 12 / 5)	/* overflows at 6min */
-
 static const struct mtu_timer *timer
 	= &((struct mtu *) CONFIG_SYS_TIMERBASE)->timer[0];
 
@@ -59,10 +52,18 @@ static ulong read_timer(void)
 	return 0 - readl(&timer->val);
 }
 
+static unsigned long usec_to_count(unsigned long long usec)
+{
+	unsigned long long count = usec * CONFIG_NOMADIK_MTU_CLOCK;
+	do_div(count, 1000000);
+	return count;
+}
+
 /* Configure a free-running, auto-wrap counter with no prescaler */
 int timer_init(void)
 {
-	writel(MTU_CRn_ENA | MTU_CRn_PRESCALE_1 | MTU_CRn_32BITS, &timer->cr);
+	writel(MTU_CRn_ENA | CONFIG_NOMADIK_MTU_PRESCALE | MTU_CRn_32BITS,
+	       &timer->cr);
 	reset_timer();
 	return 0;
 }
@@ -85,7 +86,7 @@ void reset_timer(void)
 /* Return how many HZ passed since "base" */
 ulong get_timer(ulong base)
 {
-	ulong hz = read_timer() / (TIMER_CLOCK / CONFIG_SYS_HZ);
+	ulong hz = read_timer() / (CONFIG_NOMADIK_MTU_CLOCK / CONFIG_SYS_HZ);
 	return hz - base;
 }
 
@@ -95,7 +96,7 @@ void __udelay(unsigned long usec)
 	ulong ini, end;
 
 	ini = read_timer();
-	end = ini + USEC_TO_COUNT(usec);
+	end = ini + usec_to_count(usec);
 	while ((signed)(end - read_timer()) > 0)
 		;
 }
diff --git a/include/configs/nhk8815.h b/include/configs/nhk8815.h
index c7700b3..2f8294b 100644
--- a/include/configs/nhk8815.h
+++ b/include/configs/nhk8815.h
@@ -98,6 +98,9 @@
 #define CONFIG_SYS_HZ		1000 /* Mandatory... */
 #define CONFIG_SYS_TIMERBASE	0x101E2000
 #define CONFIG_NOMADIK_MTU
+/* We have 2.4 ticks per microsecond and an overflow in almost 30min */
+#define CONFIG_NOMADIK_MTU_CLOCK	(24 * 100 * 1000)
+#define CONFIG_NOMADIK_MTU_PRESCALE	MTU_CRn_PRESCALE_1
 
 /* GPIO */
 #define CONFIG_NOMADIK_GPIO
-- 
1.7.0



More information about the U-Boot mailing list