timer: Provide an early timer

In some cases the timer must be accessible before driver model is active.
Examples include when using CONFIG_TRACE to trace U-Boot's execution before
driver model is set up. Enable this option to use an early timer. These
functions must be supported by your timer driver: timer_early_get_count()
and timer_early_get_rate().

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2016-02-24 09:14:49 -07:00
parent 4f051824b5
commit c95fec3192
3 changed files with 52 additions and 7 deletions

View File

@@ -43,11 +43,17 @@ extern unsigned long __weak timer_read_counter(void);
#ifdef CONFIG_TIMER
ulong notrace get_tbclk(void)
{
int ret;
if (!gd->timer) {
#ifdef CONFIG_TIMER_EARLY
return timer_early_get_rate();
#else
int ret;
ret = dm_timer_init();
if (ret)
return ret;
ret = dm_timer_init();
if (ret)
return ret;
#endif
}
return timer_get_rate(gd->timer);
}
@@ -57,9 +63,17 @@ uint64_t notrace get_ticks(void)
u64 count;
int ret;
ret = dm_timer_init();
if (ret)
return ret;
if (!gd->timer) {
#ifdef CONFIG_TIMER_EARLY
return timer_early_get_count();
#else
int ret;
ret = dm_timer_init();
if (ret)
return ret;
#endif
}
ret = timer_get_count(gd->timer, &count);
if (ret)