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