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
include
asm-generic
rtc.h
Go to the documentation of this file.
1
/*
2
* include/asm-generic/rtc.h
3
*
4
* Author: Tom Rini <
[email protected]
>
5
*
6
* Based on:
7
* drivers/char/rtc.c
8
*
9
* Please read the COPYING file for all license details.
10
*/
11
12
#ifndef __ASM_RTC_H__
13
#define __ASM_RTC_H__
14
15
#include <
linux/mc146818rtc.h
>
16
#include <linux/rtc.h>
17
#include <
linux/bcd.h
>
18
#include <
linux/delay.h
>
19
20
#define RTC_PIE 0x40
/* periodic interrupt enable */
21
#define RTC_AIE 0x20
/* alarm interrupt enable */
22
#define RTC_UIE 0x10
/* update-finished interrupt enable */
23
24
/* some dummy definitions */
25
#define RTC_BATT_BAD 0x100
/* battery bad */
26
#define RTC_SQWE 0x08
/* enable square-wave output */
27
#define RTC_DM_BINARY 0x04
/* all time/date values are BCD if clear */
28
#define RTC_24H 0x02
/* 24 hour mode - else hours bit 7 means pm */
29
#define RTC_DST_EN 0x01
/* auto switch DST - works f. USA only */
30
31
/*
32
* Returns true if a clock update is in progress
33
*/
34
static
inline
unsigned
char
rtc_is_updating(
void
)
35
{
36
unsigned
char
uip;
37
unsigned
long
flags
;
38
39
spin_lock_irqsave
(&
rtc_lock
, flags);
40
uip = (
CMOS_READ
(
RTC_FREQ_SELECT
) &
RTC_UIP
);
41
spin_unlock_irqrestore(&
rtc_lock
, flags);
42
return
uip;
43
}
44
45
static
inline
unsigned
int
__get_rtc_time(
struct
rtc_time
*
time
)
46
{
47
unsigned
char
ctrl
;
48
unsigned
long
flags
;
49
50
#ifdef CONFIG_MACH_DECSTATION
51
unsigned
int
real_year;
52
#endif
53
54
/*
55
* read RTC once any update in progress is done. The update
56
* can take just over 2ms. We wait 20ms. There is no need to
57
* to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP.
58
* If you need to know *exactly* when a second has started, enable
59
* periodic update complete interrupts, (via ioctl) and then
60
* immediately read /dev/rtc which will block until you get the IRQ.
61
* Once the read clears, read the RTC time (again via ioctl). Easy.
62
*/
63
if
(rtc_is_updating())
64
mdelay
(20);
65
66
/*
67
* Only the values that we read from the RTC are set. We leave
68
* tm_wday, tm_yday and tm_isdst untouched. Even though the
69
* RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated
70
* by the RTC when initially set to a non-zero value.
71
*/
72
spin_lock_irqsave
(&rtc_lock, flags);
73
time->
tm_sec
=
CMOS_READ
(
RTC_SECONDS
);
74
time->
tm_min
=
CMOS_READ
(
RTC_MINUTES
);
75
time->
tm_hour
=
CMOS_READ
(
RTC_HOURS
);
76
time->
tm_mday
=
CMOS_READ
(
RTC_DAY_OF_MONTH
);
77
time->
tm_mon
=
CMOS_READ
(
RTC_MONTH
);
78
time->
tm_year
=
CMOS_READ
(
RTC_YEAR
);
79
#ifdef CONFIG_MACH_DECSTATION
80
real_year =
CMOS_READ
(
RTC_DEC_YEAR
);
81
#endif
82
ctrl =
CMOS_READ
(
RTC_CONTROL
);
83
spin_unlock_irqrestore(&rtc_lock, flags);
84
85
if
(!(ctrl &
RTC_DM_BINARY
) ||
RTC_ALWAYS_BCD
)
86
{
87
time->
tm_sec
=
bcd2bin
(time->
tm_sec
);
88
time->
tm_min
=
bcd2bin
(time->
tm_min
);
89
time->
tm_hour
=
bcd2bin
(time->
tm_hour
);
90
time->
tm_mday
=
bcd2bin
(time->
tm_mday
);
91
time->
tm_mon
=
bcd2bin
(time->
tm_mon
);
92
time->
tm_year
=
bcd2bin
(time->
tm_year
);
93
}
94
95
#ifdef CONFIG_MACH_DECSTATION
96
time->
tm_year
+= real_year - 72;
97
#endif
98
99
/*
100
* Account for differences between how the RTC uses the values
101
* and how they are defined in a struct rtc_time;
102
*/
103
if
(time->
tm_year
<= 69)
104
time->
tm_year
+= 100;
105
106
time->
tm_mon
--;
107
108
return
RTC_24H
;
109
}
110
111
#ifndef get_rtc_time
112
#define get_rtc_time __get_rtc_time
113
#endif
114
115
/* Set the current date and time in the real time clock. */
116
static
inline
int
__set_rtc_time(
struct
rtc_time
*time)
117
{
118
unsigned
long
flags
;
119
unsigned
char
mon,
day
, hrs,
min
,
sec
;
120
unsigned
char
save_control, save_freq_select;
121
unsigned
int
yrs;
122
#ifdef CONFIG_MACH_DECSTATION
123
unsigned
int
real_yrs, leap_yr;
124
#endif
125
126
yrs = time->
tm_year
;
127
mon = time->
tm_mon
+ 1;
/* tm_mon starts at zero */
128
day = time->
tm_mday
;
129
hrs = time->
tm_hour
;
130
min = time->
tm_min
;
131
sec = time->
tm_sec
;
132
133
if
(yrs > 255)
/* They are unsigned */
134
return
-
EINVAL
;
135
136
spin_lock_irqsave
(&
rtc_lock
, flags);
137
#ifdef CONFIG_MACH_DECSTATION
138
real_yrs = yrs;
139
leap_yr = ((!((yrs + 1900) % 4) && ((yrs + 1900) % 100)) ||
140
!((yrs + 1900) % 400));
141
yrs = 72;
142
143
/*
144
* We want to keep the year set to 73 until March
145
* for non-leap years, so that Feb, 29th is handled
146
* correctly.
147
*/
148
if
(!leap_yr && mon < 3) {
149
real_yrs--;
150
yrs = 73;
151
}
152
#endif
153
/* These limits and adjustments are independent of
154
* whether the chip is in binary mode or not.
155
*/
156
if
(yrs > 169) {
157
spin_unlock_irqrestore(&
rtc_lock
, flags);
158
return
-
EINVAL
;
159
}
160
161
if
(yrs >= 100)
162
yrs -= 100;
163
164
if
(!(
CMOS_READ
(
RTC_CONTROL
) & RTC_DM_BINARY)
165
||
RTC_ALWAYS_BCD
) {
166
sec =
bin2bcd
(sec);
167
min =
bin2bcd
(min);
168
hrs =
bin2bcd
(hrs);
169
day =
bin2bcd
(day);
170
mon =
bin2bcd
(mon);
171
yrs =
bin2bcd
(yrs);
172
}
173
174
save_control =
CMOS_READ
(
RTC_CONTROL
);
175
CMOS_WRITE
((save_control|
RTC_SET
),
RTC_CONTROL
);
176
save_freq_select =
CMOS_READ
(
RTC_FREQ_SELECT
);
177
CMOS_WRITE
((save_freq_select|
RTC_DIV_RESET2
),
RTC_FREQ_SELECT
);
178
179
#ifdef CONFIG_MACH_DECSTATION
180
CMOS_WRITE
(real_yrs,
RTC_DEC_YEAR
);
181
#endif
182
CMOS_WRITE
(yrs,
RTC_YEAR
);
183
CMOS_WRITE
(mon,
RTC_MONTH
);
184
CMOS_WRITE
(day,
RTC_DAY_OF_MONTH
);
185
CMOS_WRITE
(hrs,
RTC_HOURS
);
186
CMOS_WRITE
(min,
RTC_MINUTES
);
187
CMOS_WRITE
(sec,
RTC_SECONDS
);
188
189
CMOS_WRITE
(save_control,
RTC_CONTROL
);
190
CMOS_WRITE
(save_freq_select,
RTC_FREQ_SELECT
);
191
192
spin_unlock_irqrestore(&
rtc_lock
, flags);
193
194
return
0;
195
}
196
197
#ifndef set_rtc_time
198
#define set_rtc_time __set_rtc_time
199
#endif
200
201
static
inline
unsigned
int
get_rtc_ss(
void
)
202
{
203
struct
rtc_time
h;
204
205
get_rtc_time
(&h);
206
return
h.
tm_sec
;
207
}
208
209
static
inline
int
get_rtc_pll(
struct
rtc_pll_info
*
pll
)
210
{
211
return
-
EINVAL
;
212
}
213
static
inline
int
set_rtc_pll(
struct
rtc_pll_info
*
pll
)
214
{
215
return
-
EINVAL
;
216
}
217
218
#endif
/* __ASM_RTC_H__ */
Generated on Thu Jan 10 2013 12:50:24 for Linux Kernel by
1.8.2