11802d0beSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
29d8d47eaSDaniel Lezcano /*
39d8d47eaSDaniel Lezcano  *
49d8d47eaSDaniel Lezcano  * Copyright (C) 2014 ARM Limited
59d8d47eaSDaniel Lezcano  */
69d8d47eaSDaniel Lezcano 
79d8d47eaSDaniel Lezcano #include <linux/clocksource.h>
89d8d47eaSDaniel Lezcano #include <linux/io.h>
9*7a3768c2SSaravana Kannan #include <linux/of.h>
109d8d47eaSDaniel Lezcano #include <linux/of_address.h>
119d8d47eaSDaniel Lezcano #include <linux/sched_clock.h>
129d8d47eaSDaniel Lezcano 
139d8d47eaSDaniel Lezcano #define SYS_24MHZ 0x05c
149d8d47eaSDaniel Lezcano 
159d8d47eaSDaniel Lezcano static void __iomem *versatile_sys_24mhz;
169d8d47eaSDaniel Lezcano 
versatile_sys_24mhz_read(void)179d8d47eaSDaniel Lezcano static u64 notrace versatile_sys_24mhz_read(void)
189d8d47eaSDaniel Lezcano {
199d8d47eaSDaniel Lezcano 	return readl(versatile_sys_24mhz);
209d8d47eaSDaniel Lezcano }
219d8d47eaSDaniel Lezcano 
versatile_sched_clock_init(struct device_node * node)229d8d47eaSDaniel Lezcano static int __init versatile_sched_clock_init(struct device_node *node)
239d8d47eaSDaniel Lezcano {
249d8d47eaSDaniel Lezcano 	void __iomem *base = of_iomap(node, 0);
259d8d47eaSDaniel Lezcano 
26*7a3768c2SSaravana Kannan 	of_node_clear_flag(node, OF_POPULATED);
27*7a3768c2SSaravana Kannan 
289d8d47eaSDaniel Lezcano 	if (!base)
299d8d47eaSDaniel Lezcano 		return -ENXIO;
309d8d47eaSDaniel Lezcano 
319d8d47eaSDaniel Lezcano 	versatile_sys_24mhz = base + SYS_24MHZ;
329d8d47eaSDaniel Lezcano 
339d8d47eaSDaniel Lezcano 	sched_clock_register(versatile_sys_24mhz_read, 32, 24000000);
349d8d47eaSDaniel Lezcano 
359d8d47eaSDaniel Lezcano 	return 0;
369d8d47eaSDaniel Lezcano }
379d8d47eaSDaniel Lezcano TIMER_OF_DECLARE(vexpress, "arm,vexpress-sysreg",
389d8d47eaSDaniel Lezcano 		       versatile_sched_clock_init);
399d8d47eaSDaniel Lezcano TIMER_OF_DECLARE(versatile, "arm,versatile-sysreg",
409d8d47eaSDaniel Lezcano 		       versatile_sched_clock_init);
41