1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2014 ARM Limited
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <linux/clocksource.h>
8*4882a593Smuzhiyun #include <linux/io.h>
9*4882a593Smuzhiyun #include <linux/of.h>
10*4882a593Smuzhiyun #include <linux/of_address.h>
11*4882a593Smuzhiyun #include <linux/sched_clock.h>
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define SYS_24MHZ 0x05c
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun static void __iomem *versatile_sys_24mhz;
16*4882a593Smuzhiyun
versatile_sys_24mhz_read(void)17*4882a593Smuzhiyun static u64 notrace versatile_sys_24mhz_read(void)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun return readl(versatile_sys_24mhz);
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun
versatile_sched_clock_init(struct device_node * node)22*4882a593Smuzhiyun static int __init versatile_sched_clock_init(struct device_node *node)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun void __iomem *base = of_iomap(node, 0);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun of_node_clear_flag(node, OF_POPULATED);
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun if (!base)
29*4882a593Smuzhiyun return -ENXIO;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun versatile_sys_24mhz = base + SYS_24MHZ;
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun sched_clock_register(versatile_sys_24mhz_read, 32, 24000000);
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun return 0;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun TIMER_OF_DECLARE(vexpress, "arm,vexpress-sysreg",
38*4882a593Smuzhiyun versatile_sched_clock_init);
39*4882a593Smuzhiyun TIMER_OF_DECLARE(versatile, "arm,versatile-sysreg",
40*4882a593Smuzhiyun versatile_sched_clock_init);
41