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
powerpc
kernel
rtas-rtc.c
Go to the documentation of this file.
1
#include <linux/kernel.h>
2
#include <linux/time.h>
3
#include <
linux/timer.h
>
4
#include <
linux/init.h
>
5
#include <linux/rtc.h>
6
#include <
linux/delay.h
>
7
#include <
linux/ratelimit.h
>
8
#include <asm/prom.h>
9
#include <
asm/rtas.h
>
10
#include <asm/time.h>
11
12
13
#define MAX_RTC_WAIT 5000
/* 5 sec */
14
#define RTAS_CLOCK_BUSY (-2)
15
unsigned
long
__init
rtas_get_boot_time
(
void
)
16
{
17
int
ret
[8];
18
int
error
;
19
unsigned
int
wait_time
;
20
u64
max_wait_tb;
21
22
max_wait_tb = get_tb() +
tb_ticks_per_usec
* 1000 *
MAX_RTC_WAIT
;
23
do
{
24
error =
rtas_call
(
rtas_token
(
"get-time-of-day"
), 0, 8, ret);
25
26
wait_time =
rtas_busy_delay_time
(error);
27
if
(wait_time) {
28
/* This is boot time so we spin. */
29
udelay
(wait_time*1000);
30
}
31
}
while
(wait_time && (get_tb() < max_wait_tb));
32
33
if
(error != 0) {
34
printk_ratelimited
(
KERN_WARNING
35
"error: reading the clock failed (%d)\n"
,
36
error);
37
return
0;
38
}
39
40
return
mktime
(ret[0], ret[1], ret[2], ret[3], ret[4], ret[5]);
41
}
42
43
/* NOTE: get_rtc_time will get an error if executed in interrupt context
44
* and if a delay is needed to read the clock. In this case we just
45
* silently return without updating rtc_tm.
46
*/
47
void
rtas_get_rtc_time
(
struct
rtc_time
*rtc_tm)
48
{
49
int
ret
[8];
50
int
error
;
51
unsigned
int
wait_time
;
52
u64
max_wait_tb;
53
54
max_wait_tb = get_tb() +
tb_ticks_per_usec
* 1000 *
MAX_RTC_WAIT
;
55
do
{
56
error =
rtas_call
(
rtas_token
(
"get-time-of-day"
), 0, 8, ret);
57
58
wait_time =
rtas_busy_delay_time
(error);
59
if
(wait_time) {
60
if
(
in_interrupt
()) {
61
memset
(rtc_tm, 0,
sizeof
(
struct
rtc_time
));
62
printk_ratelimited
(
KERN_WARNING
63
"error: reading clock "
64
"would delay interrupt\n"
);
65
return
;
/* delay not allowed */
66
}
67
msleep
(wait_time);
68
}
69
}
while
(wait_time && (get_tb() < max_wait_tb));
70
71
if
(error != 0) {
72
printk_ratelimited
(
KERN_WARNING
73
"error: reading the clock failed (%d)\n"
,
74
error);
75
return
;
76
}
77
78
rtc_tm->
tm_sec
= ret[5];
79
rtc_tm->
tm_min
= ret[4];
80
rtc_tm->
tm_hour
= ret[3];
81
rtc_tm->
tm_mday
= ret[2];
82
rtc_tm->
tm_mon
= ret[1] - 1;
83
rtc_tm->
tm_year
= ret[0] - 1900;
84
}
85
86
int
rtas_set_rtc_time
(
struct
rtc_time
*
tm
)
87
{
88
int
error
,
wait_time
;
89
u64
max_wait_tb;
90
91
max_wait_tb = get_tb() +
tb_ticks_per_usec
* 1000 *
MAX_RTC_WAIT
;
92
do
{
93
error =
rtas_call
(
rtas_token
(
"set-time-of-day"
), 7, 1,
NULL
,
94
tm->
tm_year
+ 1900, tm->
tm_mon
+ 1,
95
tm->
tm_mday
, tm->
tm_hour
, tm->
tm_min
,
96
tm->
tm_sec
, 0);
97
98
wait_time =
rtas_busy_delay_time
(error);
99
if
(wait_time) {
100
if
(
in_interrupt
())
101
return
1;
/* probably decrementer */
102
msleep
(wait_time);
103
}
104
}
while
(wait_time && (get_tb() < max_wait_tb));
105
106
if
(error != 0)
107
printk_ratelimited
(
KERN_WARNING
108
"error: setting the clock failed (%d)\n"
,
109
error);
110
111
return
0;
112
}
Generated on Thu Jan 10 2013 13:13:47 for Linux Kernel by
1.8.2