]> git.sur5r.net Git - u-boot/blobdiff - arch/sh/lib/time.c
mx53ard: Change default environment to cope with OE changes
[u-boot] / arch / sh / lib / time.c
index 48404727c3dcd91f61625cc39eec709da0f0d905..2cc61ddcbb55cc3e1ed19b8a68805b5bb17120a7 100644 (file)
 #include <common.h>
 #include <div64.h>
 #include <asm/processor.h>
-#include <asm/clk.h>
 #include <asm/io.h>
 #include <sh_tmu.h>
 
 static struct tmu_regs *tmu = (struct tmu_regs *)TMU_BASE;
 
-#define TMU_MAX_COUNTER (~0UL)
-
-static ulong timer_freq;
+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)
 {
        tick *= CONFIG_SYS_HZ;
-       do_div(tick, timer_freq);
+       do_div(tick, get_tbclk());
 
        return tick;
 }
 
 static inline unsigned long long usec_to_tick(unsigned long long usec)
 {
-       usec *= timer_freq;
+       usec *= get_tbclk();
        do_div(usec, 1000000);
 
        return usec;
@@ -74,31 +76,9 @@ static void tmu_timer_stop(unsigned int timer)
 
 int timer_init(void)
 {
-       /* Divide clock by CONFIG_SYS_TMU_CLK_DIV */
-       u16 bit = 0;
-
-       switch (CONFIG_SYS_TMU_CLK_DIV) {
-       case 1024:
-               bit = 4;
-               break;
-       case 256:
-               bit = 3;
-               break;
-       case 64:
-               bit = 2;
-               break;
-       case 16:
-               bit = 1;
-               break;
-       case 4:
-       default:
-               break;
-       }
+       bit = (ffs(CONFIG_SYS_TMU_CLK_DIV) >> 1) - 1;
        writew(readw(&tmu->tcr0) | bit, &tmu->tcr0);
 
-       /* Calc clock rate */
-       timer_freq = get_tmu0_clk_rate() >> ((bit + 1) * 2);
-
        tmu_timer_stop(0);
        tmu_timer_start(0);
 
@@ -137,7 +117,14 @@ unsigned long get_timer(unsigned long base)
        return tick_to_time(get_ticks()) - base;
 }
 
-unsigned long get_tbclk(void)
+void set_timer(unsigned long t)
+{
+       writel((0 - t), &tmu->tcnt0);
+}
+
+void reset_timer(void)
 {
-       return timer_freq;
+       tmu_timer_stop(0);
+       set_timer(0);
+       tmu_timer_start(0);
 }