1 /* 2 * This program is free software; you can redistribute it and/or modify 3 * it under the terms of the GNU General Public License version 2 as 4 * published by the Free Software Foundation. 5 * 6 * This program is distributed in the hope that it will be useful, 7 * but WITHOUT ANY WARRANTY; without even the implied warranty of 8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 * GNU General Public License for more details. 10 * 11 * Copyright (C) 2014 ARM Limited 12 */ 13 14 #include <linux/clocksource.h> 15 #include <linux/io.h> 16 #include <linux/of_address.h> 17 #include <linux/sched_clock.h> 18 19 #define SYS_24MHZ 0x05c 20 21 static void __iomem *versatile_sys_24mhz; 22 23 static u64 notrace versatile_sys_24mhz_read(void) 24 { 25 return readl(versatile_sys_24mhz); 26 } 27 28 static int __init versatile_sched_clock_init(struct device_node *node) 29 { 30 void __iomem *base = of_iomap(node, 0); 31 32 if (!base) 33 return -ENXIO; 34 35 versatile_sys_24mhz = base + SYS_24MHZ; 36 37 sched_clock_register(versatile_sys_24mhz_read, 32, 24000000); 38 39 return 0; 40 } 41 TIMER_OF_DECLARE(vexpress, "arm,vexpress-sysreg", 42 versatile_sched_clock_init); 43 TIMER_OF_DECLARE(versatile, "arm,versatile-sysreg", 44 versatile_sched_clock_init); 45