some rockchip soc will not include lib/timer.c in SPL stage, so implement timer driver for some soc can use us delay function in SPL. Signed-off-by: Lin Huang <hl@rock-chips.com> Acked-by: Simon Glass <sjg@chromium.org>master
parent
abe919ec54
commit
cc2244b8fa
@ -0,0 +1,22 @@ |
||||
/*
|
||||
* (C) Copyright 2015 Rockchip Electronics Co., Ltd |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef __ASM_ARCH_TIMER_H |
||||
#define __ASM_ARCH_TIMER_H |
||||
|
||||
struct rk_timer { |
||||
unsigned int timer_load_count0; |
||||
unsigned int timer_load_count1; |
||||
unsigned int timer_curr_value0; |
||||
unsigned int timer_curr_value1; |
||||
unsigned int timer_ctrl_reg; |
||||
unsigned int timer_int_status; |
||||
}; |
||||
|
||||
void rockchip_timer_init(void); |
||||
void rockchip_udelay(unsigned int usec); |
||||
|
||||
#endif |
@ -0,0 +1,48 @@ |
||||
/*
|
||||
* (C) Copyright 2015 Rockchip Electronics Co., Ltd |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <asm/arch/timer.h> |
||||
#include <asm/io.h> |
||||
#include <common.h> |
||||
#include <linux/types.h> |
||||
|
||||
struct rk_timer * const timer_ptr = (void *)CONFIG_SYS_TIMER_BASE; |
||||
|
||||
static uint64_t rockchip_get_ticks(void) |
||||
{ |
||||
uint64_t timebase_h, timebase_l; |
||||
|
||||
timebase_l = readl(&timer_ptr->timer_curr_value0); |
||||
timebase_h = readl(&timer_ptr->timer_curr_value1); |
||||
|
||||
return timebase_h << 32 | timebase_l; |
||||
} |
||||
|
||||
static uint64_t usec_to_tick(unsigned int usec) |
||||
{ |
||||
uint64_t tick = usec; |
||||
tick *= CONFIG_SYS_TIMER_RATE / (1000 * 1000); |
||||
return tick; |
||||
} |
||||
|
||||
void rockchip_udelay(unsigned int usec) |
||||
{ |
||||
uint64_t tmp; |
||||
|
||||
/* get timestamp */ |
||||
tmp = rockchip_get_ticks() + usec_to_tick(usec); |
||||
|
||||
/* loop till event */ |
||||
while (rockchip_get_ticks() < tmp+1) |
||||
; |
||||
} |
||||
|
||||
void rockchip_timer_init(void) |
||||
{ |
||||
writel(0xffffffff, &timer_ptr->timer_load_count0); |
||||
writel(0xffffffff, &timer_ptr->timer_load_count1); |
||||
writel(1, &timer_ptr->timer_ctrl_reg); |
||||
} |
Loading…
Reference in new issue