1 /* 2 * Based on arch/arm/kernel/time.c 3 * 4 * Copyright (C) 1991, 1992, 1995 Linus Torvalds 5 * Modifications for ARM (C) 1994-2001 Russell King 6 * Copyright (C) 2012 ARM Ltd. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 21 #include <linux/clockchips.h> 22 #include <linux/export.h> 23 #include <linux/kernel.h> 24 #include <linux/interrupt.h> 25 #include <linux/time.h> 26 #include <linux/init.h> 27 #include <linux/sched.h> 28 #include <linux/smp.h> 29 #include <linux/timex.h> 30 #include <linux/errno.h> 31 #include <linux/profile.h> 32 #include <linux/syscore_ops.h> 33 #include <linux/timer.h> 34 #include <linux/irq.h> 35 #include <linux/delay.h> 36 #include <linux/clocksource.h> 37 #include <linux/clk-provider.h> 38 #include <linux/acpi.h> 39 40 #include <clocksource/arm_arch_timer.h> 41 42 #include <asm/thread_info.h> 43 #include <asm/stacktrace.h> 44 45 #ifdef CONFIG_SMP 46 unsigned long profile_pc(struct pt_regs *regs) 47 { 48 struct stackframe frame; 49 50 if (!in_lock_functions(regs->pc)) 51 return regs->pc; 52 53 frame.fp = regs->regs[29]; 54 frame.sp = regs->sp; 55 frame.pc = regs->pc; 56 do { 57 int ret = unwind_frame(&frame); 58 if (ret < 0) 59 return 0; 60 } while (in_lock_functions(frame.pc)); 61 62 return frame.pc; 63 } 64 EXPORT_SYMBOL(profile_pc); 65 #endif 66 67 void __init time_init(void) 68 { 69 u32 arch_timer_rate; 70 71 of_clk_init(NULL); 72 clocksource_of_init(); 73 74 tick_setup_hrtimer_broadcast(); 75 76 /* 77 * Since ACPI or FDT will only one be available in the system, 78 * we can use acpi_generic_timer_init() here safely 79 */ 80 acpi_generic_timer_init(); 81 82 arch_timer_rate = arch_timer_get_rate(); 83 if (!arch_timer_rate) 84 panic("Unable to initialise architected timer.\n"); 85 86 /* Calibrate the delay loop directly */ 87 lpj_fine = arch_timer_rate / HZ; 88 } 89