dm: implement a Timer uclass

Implement a Timer uclass to work with lib/time.c.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Thomas Chou
2015-10-09 13:46:34 +08:00
parent bcae80e955
commit c8a7ba9e6a
9 changed files with 169 additions and 0 deletions

View File

@@ -6,6 +6,9 @@
*/
#include <common.h>
#include <dm.h>
#include <errno.h>
#include <timer.h>
#include <watchdog.h>
#include <div64.h>
#include <asm/io.h>
@@ -37,6 +40,52 @@ unsigned long notrace timer_read_counter(void)
extern unsigned long __weak timer_read_counter(void);
#endif
#ifdef CONFIG_TIMER
static int notrace dm_timer_init(void)
{
struct udevice *dev;
int ret;
if (!gd->timer) {
ret = uclass_first_device(UCLASS_TIMER, &dev);
if (ret)
return ret;
if (!dev)
return -ENODEV;
gd->timer = dev;
}
return 0;
}
ulong notrace get_tbclk(void)
{
int ret;
ret = dm_timer_init();
if (ret)
return ret;
return timer_get_rate(gd->timer);
}
unsigned long notrace timer_read_counter(void)
{
unsigned long count;
int ret;
ret = dm_timer_init();
if (ret)
return ret;
ret = timer_get_count(gd->timer, &count);
if (ret)
return ret;
return count;
}
#endif /* CONFIG_TIMER */
uint64_t __weak notrace get_ticks(void)
{
unsigned long now = timer_read_counter();