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
frv
kernel
time.c
Go to the documentation of this file.
1
/* time.c: FRV arch-specific time handling
2
*
3
* Copyright (C) 2003-5 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells (
[email protected]
)
5
* - Derived from arch/m68k/kernel/time.c
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version
10
* 2 of the License, or (at your option) any later version.
11
*/
12
13
#include <linux/module.h>
14
#include <linux/errno.h>
15
#include <linux/sched.h>
16
#include <linux/kernel.h>
17
#include <
linux/param.h
>
18
#include <linux/string.h>
19
#include <
linux/interrupt.h
>
20
#include <
linux/profile.h
>
21
#include <
linux/irq.h
>
22
#include <
linux/mm.h
>
23
24
#include <asm/io.h>
25
#include <asm/timer-regs.h>
26
#include <
asm/mb-regs.h
>
27
#include <
asm/mb86943a.h
>
28
29
#include <linux/timex.h>
30
31
#define TICK_SIZE (tick_nsec / 1000)
32
33
unsigned
long
__nongprelbss
__clkin_clock_speed_HZ
;
34
unsigned
long
__nongprelbss
__ext_bus_clock_speed_HZ
;
35
unsigned
long
__nongprelbss
__res_bus_clock_speed_HZ
;
36
unsigned
long
__nongprelbss
__sdram_clock_speed_HZ
;
37
unsigned
long
__nongprelbss
__core_bus_clock_speed_HZ
;
38
unsigned
long
__nongprelbss
__core_clock_speed_HZ
;
39
unsigned
long
__nongprelbss
__dsu_clock_speed_HZ
;
40
unsigned
long
__nongprelbss
__serial_clock_speed_HZ
;
41
unsigned
long
__delay_loops_MHz
;
42
43
static
irqreturn_t
timer_interrupt
(
int
irq,
void
*
dummy
);
44
45
static
struct
irqaction
timer_irq = {
46
.handler =
timer_interrupt
,
47
.flags =
IRQF_DISABLED
,
48
.name =
"timer"
,
49
};
50
51
/*
52
* timer_interrupt() needs to keep up the real-time clock,
53
* as well as call the "xtime_update()" routine every clocktick
54
*/
55
static
irqreturn_t
timer_interrupt
(
int
irq
,
void
*
dummy
)
56
{
57
profile_tick
(
CPU_PROFILING
);
58
59
xtime_update
(1);
60
61
#ifdef CONFIG_HEARTBEAT
62
static
unsigned
short
n
;
63
n++;
64
__set_LEDS
(n);
65
#endif
/* CONFIG_HEARTBEAT */
66
67
update_process_times
(
user_mode
(
get_irq_regs
()));
68
69
return
IRQ_HANDLED
;
70
}
71
72
void
time_divisor_init
(
void
)
73
{
74
unsigned
short
base
, pre, prediv;
75
76
/* set the scheduling timer going */
77
pre = 1;
78
prediv = 4;
79
base =
__res_bus_clock_speed_HZ
/ pre /
HZ
/ (1 << prediv);
80
81
__set_TPRV
(pre);
82
__set_TxCKSL_DATA
(0, prediv);
83
__set_TCTR
(
TCTR_SC_CTR0
|
TCTR_RL_RW_LH8
|
TCTR_MODE_2
);
84
__set_TCSR_DATA
(0, base & 0xff);
85
__set_TCSR_DATA
(0, base >> 8);
86
}
87
88
89
void
read_persistent_clock
(
struct
timespec
*
ts
)
90
{
91
unsigned
int
year
, mon,
day
,
hour
,
min
,
sec
;
92
93
extern
void
arch_gettod
(
int
*year,
int
*mon,
int
*day,
int
*hour,
int
*min,
int
*sec);
94
95
/* FIX by dqg : Set to zero for platforms that don't have tod */
96
/* without this time is undefined and can overflow time_t, causing */
97
/* very strange errors */
98
year = 1980;
99
mon = day = 1;
100
hour = min = sec = 0;
101
arch_gettod
(&year, &mon, &day, &hour, &min, &sec);
102
103
if
((year += 1900) < 1970)
104
year += 100;
105
ts->
tv_sec
=
mktime
(year, mon, day, hour, min, sec);
106
ts->
tv_nsec
= 0;
107
}
108
109
void
time_init
(
void
)
110
{
111
/* install scheduling interrupt handler */
112
setup_irq
(
IRQ_CPU_TIMER0
, &timer_irq);
113
114
time_divisor_init
();
115
}
116
117
/*
118
* Scheduler clock - returns current time in nanosec units.
119
*/
120
unsigned
long
long
sched_clock
(
void
)
121
{
122
return
jiffies_64
* (1000000000 /
HZ
);
123
}
Generated on Thu Jan 10 2013 12:53:32 for Linux Kernel by
1.8.2