1 /* 2 * Copyright (C) 2012-2015 Masahiro Yamada <yamada.masahiro@socionext.com> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #include <common.h> 8 #include <linux/io.h> 9 10 #include "arm-mpcore.h" 11 12 #define PERIPHCLK (50 * 1000 * 1000) /* 50 MHz */ 13 #define PRESCALER ((PERIPHCLK) / (CONFIG_SYS_TIMER_RATE) - 1) 14 15 static void *get_global_timer_base(void) 16 { 17 void *val; 18 19 asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (val) : : "memory"); 20 21 return val + GLOBAL_TIMER_OFFSET; 22 } 23 24 unsigned long timer_read_counter(void) 25 { 26 /* 27 * ARM 64bit Global Timer is too much for our purpose. 28 * We use only lower 32 bit of the timer counter. 29 */ 30 return readl(get_global_timer_base() + GTIMER_CNT_L); 31 } 32 33 int timer_init(void) 34 { 35 /* enable timer */ 36 writel(PRESCALER << 8 | 1, get_global_timer_base() + GTIMER_CTRL); 37 38 return 0; 39 } 40