]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/arm926ejs/at91/timer.c
Merge branch 'master' of git://git.denx.de/u-boot-x86
[karo-tx-uboot.git] / arch / arm / cpu / arm926ejs / at91 / timer.c
index 82b8d7e7d7f65bc39023444270feff720f20b13d..4443fefb6472f984a9072002d88239bc8b66602a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * (C) Copyright 2007-2008
- * Stelian Pop <stelian.pop@leadtechdesign.com>
+ * Stelian Pop <stelian@popies.net>
  * Lead Tech Design <www.leadtechdesign.com>
  *
  * See file CREDITS for list of people who contributed to this
  */
 
 #include <common.h>
+#include <asm/io.h>
 #include <asm/arch/hardware.h>
 #include <asm/arch/at91_pit.h>
 #include <asm/arch/at91_pmc.h>
 #include <asm/arch/clk.h>
-#include <asm/arch/io.h>
 #include <div64.h>
 
 #if !defined(CONFIG_AT91FAMILY)
@@ -52,14 +52,14 @@ DECLARE_GLOBAL_DATA_PTR;
 static inline unsigned long long tick_to_time(unsigned long long tick)
 {
        tick *= CONFIG_SYS_HZ;
-       do_div(tick, gd->timer_rate_hz);
+       do_div(tick, gd->arch.timer_rate_hz);
 
        return tick;
 }
 
 static inline unsigned long long usec_to_tick(unsigned long long usec)
 {
-       usec *= gd->timer_rate_hz;
+       usec *= gd->arch.timer_rate_hz;
        do_div(usec, 1000000);
 
        return usec;
@@ -70,17 +70,17 @@ static inline unsigned long long usec_to_tick(unsigned long long usec)
  */
 int timer_init(void)
 {
-       at91_pmc_t *pmc = (at91_pmc_t *) AT91_PMC_BASE;
-       at91_pit_t *pit = (at91_pit_t *) AT91_PIT_BASE;
+       at91_pmc_t *pmc = (at91_pmc_t *) ATMEL_BASE_PMC;
+       at91_pit_t *pit = (at91_pit_t *) ATMEL_BASE_PIT;
 
        /* Enable PITC Clock */
-       writel(1 << AT91_ID_SYS, &pmc->pcer);
+       writel(1 << ATMEL_ID_SYS, &pmc->pcer);
 
        /* Enable PITC */
        writel(TIMER_LOAD_VAL | AT91_PIT_MR_EN , &pit->mr);
 
-       gd->timer_rate_hz = gd->mck_rate_hz / 16;
-       gd->tbu = gd->tbl = 0;
+       gd->arch.timer_rate_hz = gd->arch.mck_rate_hz / 16;
+       gd->arch.tbu = gd->arch.tbl = 0;
 
        return 0;
 }
@@ -90,46 +90,41 @@ int timer_init(void)
  */
 unsigned long long get_ticks(void)
 {
-       at91_pit_t *pit = (at91_pit_t *) AT91_PIT_BASE;
+       at91_pit_t *pit = (at91_pit_t *) ATMEL_BASE_PIT;
 
        ulong now = readl(&pit->piir);
 
        /* increment tbu if tbl has rolled over */
-       if (now < gd->tbl)
-               gd->tbu++;
-       gd->tbl = now;
-       return (((unsigned long long)gd->tbu) << 32) | gd->tbl;
+       if (now < gd->arch.tbl)
+               gd->arch.tbu++;
+       gd->arch.tbl = now;
+       return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
 }
 
 void __udelay(unsigned long usec)
 {
-       unsigned long long tmp;
+       unsigned long long start;
        ulong tmo;
 
-       tmo = usec_to_tick(usec);
-       tmp = get_ticks() + tmo;        /* get current timestamp */
-
-       while (get_ticks() < tmp)       /* loop till event */
-               ;
+       start = get_ticks();            /* get current timestamp */
+       tmo = usec_to_tick(usec);       /* convert usecs to ticks */
+       while ((get_ticks() - start) < tmo)
+               ;                       /* loop till time has passed */
 }
 
 /*
- * reset_timer() and get_timer(base) are a pair of functions that are used by
- * some timeout/sleep mechanisms in u-boot.
+ * get_timer(base) can be used to check for timeouts or
+ * to measure elasped time relative to an event:
  *
- * reset_timer() marks the current time as epoch and
- * get_timer(base) works relative to that epoch.
+ * ulong start_time = get_timer(0) sets start_time to the current
+ * time value.
+ * get_timer(start_time) returns the time elapsed since then.
  *
  * The time is used in CONFIG_SYS_HZ units!
  */
-void reset_timer(void)
-{
-       gd->timer_reset_value = get_ticks();
-}
-
 ulong get_timer(ulong base)
 {
-       return tick_to_time(get_ticks() - gd->timer_reset_value) - base;
+       return tick_to_time(get_ticks()) - base;
 }
 
 /*
@@ -137,5 +132,5 @@ ulong get_timer(ulong base)
  */
 ulong get_tbclk(void)
 {
-       return gd->timer_rate_hz;
+       return gd->arch.timer_rate_hz;
 }