1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2015 Rockchip Electronics Co., Ltd 4 */ 5 6 #include <common.h> 7 #include <asm/arch/timer.h> 8 #include <asm/io.h> 9 #include <linux/types.h> 10 11 struct rk_timer * const timer_ptr = (void *)CONFIG_SYS_TIMER_BASE; 12 13 static uint64_t rockchip_get_ticks(void) 14 { 15 uint64_t timebase_h, timebase_l; 16 17 timebase_l = readl(&timer_ptr->timer_curr_value0); 18 timebase_h = readl(&timer_ptr->timer_curr_value1); 19 20 return timebase_h << 32 | timebase_l; 21 } 22 23 static uint64_t usec_to_tick(unsigned int usec) 24 { 25 uint64_t tick = usec; 26 tick *= CONFIG_SYS_TIMER_RATE / (1000 * 1000); 27 return tick; 28 } 29 30 void rockchip_udelay(unsigned int usec) 31 { 32 uint64_t tmp; 33 34 /* get timestamp */ 35 tmp = rockchip_get_ticks() + usec_to_tick(usec); 36 37 /* loop till event */ 38 while (rockchip_get_ticks() < tmp+1) 39 ; 40 } 41 42 void rockchip_timer_init(void) 43 { 44 writel(0xffffffff, &timer_ptr->timer_load_count0); 45 writel(0xffffffff, &timer_ptr->timer_load_count1); 46 writel(1, &timer_ptr->timer_ctrl_reg); 47 } 48