Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
m68k
kernel
time.c
Go to the documentation of this file.
1
/*
2
* linux/arch/m68k/kernel/time.c
3
*
4
* Copyright (C) 1991, 1992, 1995 Linus Torvalds
5
*
6
* This file contains the m68k-specific time handling details.
7
* Most of the stuff is located in the machine specific files.
8
*
9
* 1997-09-10 Updated NTP code according to technical memorandum Jan '96
10
* "A Kernel Model for Precision Timekeeping" by Dave Mills
11
*/
12
13
#include <linux/errno.h>
14
#include <linux/module.h>
15
#include <linux/sched.h>
16
#include <linux/kernel.h>
17
#include <
linux/param.h
>
18
#include <linux/string.h>
19
#include <
linux/mm.h
>
20
#include <linux/rtc.h>
21
#include <
linux/platform_device.h
>
22
23
#include <asm/machdep.h>
24
#include <asm/io.h>
25
#include <asm/irq_regs.h>
26
27
#include <linux/time.h>
28
#include <linux/timex.h>
29
#include <
linux/profile.h
>
30
31
/*
32
* timer_interrupt() needs to keep up the real-time clock,
33
* as well as call the "xtime_update()" routine every clocktick
34
*/
35
static
irqreturn_t
timer_interrupt
(
int
irq,
void
*
dummy
)
36
{
37
xtime_update
(1);
38
update_process_times
(
user_mode
(
get_irq_regs
()));
39
profile_tick
(
CPU_PROFILING
);
40
41
#ifdef CONFIG_HEARTBEAT
42
/* use power LED as a heartbeat instead -- much more useful
43
for debugging -- based on the version for PReP by Cort */
44
/* acts like an actual heart beat -- ie thump-thump-pause... */
45
if
(mach_heartbeat) {
46
static
unsigned
cnt
= 0,
period
= 0,
dist
= 0;
47
48
if
(cnt == 0 || cnt ==
dist
)
49
mach_heartbeat
( 1 );
50
else
if
(cnt == 7 || cnt ==
dist
+7)
51
mach_heartbeat
( 0 );
52
53
if
(++cnt >
period
) {
54
cnt = 0;
55
/* The hyperbolic function below modifies the heartbeat period
56
* length in dependency of the current (5min) load. It goes
57
* through the points f(0)=126, f(1)=86, f(5)=51,
58
* f(inf)->30. */
59
period
= ((672<<
FSHIFT
)/(5*
avenrun
[0]+(7<<
FSHIFT
))) + 30;
60
dist
=
period
/ 4;
61
}
62
}
63
#endif
/* CONFIG_HEARTBEAT */
64
return
IRQ_HANDLED
;
65
}
66
67
void
read_persistent_clock
(
struct
timespec
*
ts
)
68
{
69
struct
rtc_time
time;
70
ts->
tv_sec
= 0;
71
ts->
tv_nsec
= 0;
72
73
if
(
mach_hwclk
) {
74
mach_hwclk
(0, &time);
75
76
if
((time.
tm_year
+= 1900) < 1970)
77
time.
tm_year
+= 100;
78
ts->
tv_sec
=
mktime
(time.
tm_year
, time.
tm_mon
, time.
tm_mday
,
79
time.
tm_hour
, time.
tm_min
, time.
tm_sec
);
80
}
81
}
82
83
void
__init
time_init
(
void
)
84
{
85
mach_sched_init
(
timer_interrupt
);
86
}
87
88
#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
89
90
u32
arch_gettimeoffset
(
void
)
91
{
92
return
mach_gettimeoffset
() * 1000;
93
}
94
95
static
int
__init
rtc_init(
void
)
96
{
97
struct
platform_device
*
pdev
;
98
99
if
(!
mach_hwclk
)
100
return
-
ENODEV
;
101
102
pdev = platform_device_register_simple(
"rtc-generic"
, -1,
NULL
, 0);
103
return
PTR_RET(pdev);
104
}
105
106
module_init
(rtc_init);
107
108
#endif
/* CONFIG_ARCH_USES_GETTIMEOFFSET */
Generated on Thu Jan 10 2013 12:53:34 for Linux Kernel by
1.8.2