]>
Commit | Line | Data |
---|---|---|
5894ca00 | 1 | /* |
f6e7f07c | 2 | * Copyright (C) 2012-2015 Masahiro Yamada <yamada.masahiro@socionext.com> |
5894ca00 MY |
3 | * |
4 | * SPDX-License-Identifier: GPL-2.0+ | |
5 | */ | |
6 | ||
7 | #include <common.h> | |
f6e7f07c | 8 | #include <linux/io.h> |
107b3fb4 MY |
9 | |
10 | #include "arm-mpcore.h" | |
5894ca00 MY |
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 | } |