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:
49
lib/time.c
49
lib/time.c
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user