~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/kernel/time.c

Version: ~ [ linux-5.1-rc5 ] ~ [ linux-5.0.7 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.34 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.111 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.168 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.178 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.138 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.65 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  linux/arch/arm/kernel/time.c
  3  *
  4  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
  5  *  Modifications for ARM (C) 1994-2001 Russell King
  6  *
  7  * This program is free software; you can redistribute it and/or modify
  8  * it under the terms of the GNU General Public License version 2 as
  9  * published by the Free Software Foundation.
 10  *
 11  *  This file contains the ARM-specific time handling details:
 12  *  reading the RTC at bootup, etc...
 13  */
 14 #include <linux/module.h>
 15 #include <linux/kernel.h>
 16 #include <linux/interrupt.h>
 17 #include <linux/time.h>
 18 #include <linux/init.h>
 19 #include <linux/sched.h>
 20 #include <linux/smp.h>
 21 #include <linux/timex.h>
 22 #include <linux/errno.h>
 23 #include <linux/profile.h>
 24 #include <linux/syscore_ops.h>
 25 #include <linux/timer.h>
 26 #include <linux/irq.h>
 27 
 28 #include <linux/mc146818rtc.h>
 29 
 30 #include <asm/leds.h>
 31 #include <asm/thread_info.h>
 32 #include <asm/sched_clock.h>
 33 #include <asm/stacktrace.h>
 34 #include <asm/mach/arch.h>
 35 #include <asm/mach/time.h>
 36 
 37 /*
 38  * Our system timer.
 39  */
 40 static struct sys_timer *system_timer;
 41 
 42 #if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE)
 43 /* this needs a better home */
 44 DEFINE_SPINLOCK(rtc_lock);
 45 
 46 #ifdef CONFIG_RTC_DRV_CMOS_MODULE
 47 EXPORT_SYMBOL(rtc_lock);
 48 #endif
 49 #endif  /* pc-style 'CMOS' RTC support */
 50 
 51 /* change this if you have some constant time drift */
 52 #define USECS_PER_JIFFY (1000000/HZ)
 53 
 54 #ifdef CONFIG_SMP
 55 unsigned long profile_pc(struct pt_regs *regs)
 56 {
 57         struct stackframe frame;
 58 
 59         if (!in_lock_functions(regs->ARM_pc))
 60                 return regs->ARM_pc;
 61 
 62         frame.fp = regs->ARM_fp;
 63         frame.sp = regs->ARM_sp;
 64         frame.lr = regs->ARM_lr;
 65         frame.pc = regs->ARM_pc;
 66         do {
 67                 int ret = unwind_frame(&frame);
 68                 if (ret < 0)
 69                         return 0;
 70         } while (in_lock_functions(frame.pc));
 71 
 72         return frame.pc;
 73 }
 74 EXPORT_SYMBOL(profile_pc);
 75 #endif
 76 
 77 #ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
 78 u32 arch_gettimeoffset(void)
 79 {
 80         if (system_timer->offset != NULL)
 81                 return system_timer->offset() * 1000;
 82 
 83         return 0;
 84 }
 85 #endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
 86 
 87 #ifdef CONFIG_LEDS_TIMER
 88 static inline void do_leds(void)
 89 {
 90         static unsigned int count = HZ/2;
 91 
 92         if (--count == 0) {
 93                 count = HZ/2;
 94                 leds_event(led_timer);
 95         }
 96 }
 97 #else
 98 #define do_leds()
 99 #endif
100 
101 
102 #ifndef CONFIG_GENERIC_CLOCKEVENTS
103 /*
104  * Kernel system timer support.
105  */
106 void timer_tick(void)
107 {
108         profile_tick(CPU_PROFILING);
109         do_leds();
110         xtime_update(1);
111 #ifndef CONFIG_SMP
112         update_process_times(user_mode(get_irq_regs()));
113 #endif
114 }
115 #endif
116 
117 #if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
118 static int timer_suspend(void)
119 {
120         if (system_timer->suspend)
121                 system_timer->suspend();
122 
123         return 0;
124 }
125 
126 static void timer_resume(void)
127 {
128         if (system_timer->resume)
129                 system_timer->resume();
130 }
131 #else
132 #define timer_suspend NULL
133 #define timer_resume NULL
134 #endif
135 
136 static struct syscore_ops timer_syscore_ops = {
137         .suspend        = timer_suspend,
138         .resume         = timer_resume,
139 };
140 
141 static int __init timer_init_syscore_ops(void)
142 {
143         register_syscore_ops(&timer_syscore_ops);
144 
145         return 0;
146 }
147 
148 device_initcall(timer_init_syscore_ops);
149 
150 void __init time_init(void)
151 {
152         system_timer = machine_desc->timer;
153         system_timer->init();
154 #ifdef CONFIG_HAVE_SCHED_CLOCK
155         sched_clock_postinit();
156 #endif
157 }
158 
159 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp