|
@@ -36,23 +36,26 @@
|
|
|
|
|
|
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 +77,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 +118,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);
|
|
|
}
|