| /* |
| * Copyright (C) 2012-2014 Panasonic Corporation |
| * Author: Masahiro Yamada <yamada.m@jp.panasonic.com> |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #include <common.h> |
| #include <asm/io.h> |
| #include <asm/arch/arm-mpcore.h> |
| |
| #define PERIPHCLK (50 * 1000 * 1000) /* 50 MHz */ |
| #define PRESCALER ((PERIPHCLK) / (CONFIG_SYS_TIMER_RATE) - 1) |
| |
| static void *get_global_timer_base(void) |
| { |
| void *val; |
| |
| asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (val) : : "memory"); |
| |
| return val + GLOBAL_TIMER_OFFSET; |
| } |
| |
| unsigned long timer_read_counter(void) |
| { |
| /* |
| * ARM 64bit Global Timer is too much for our purpose. |
| * We use only lower 32 bit of the timer counter. |
| */ |
| return readl(get_global_timer_base() + GTIMER_CNT_L); |
| } |
| |
| int timer_init(void) |
| { |
| /* enable timer */ |
| writel(PRESCALER << 8 | 1, get_global_timer_base() + GTIMER_CTRL); |
| |
| return 0; |
| } |