1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_RTC_H_
12#define _LINUX_RTC_H_
13
14
15
16
17
18
19
20struct rtc_time {
21 int tm_sec;
22 int tm_min;
23 int tm_hour;
24 int tm_mday;
25 int tm_mon;
26 int tm_year;
27 int tm_wday;
28 int tm_yday;
29 int tm_isdst;
30};
31
32
33
34
35
36struct rtc_wkalrm {
37 unsigned char enabled;
38 unsigned char pending;
39 struct rtc_time time;
40};
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55struct rtc_pll_info {
56 int pll_ctrl;
57 int pll_value;
58 int pll_max;
59 int pll_min;
60 int pll_posmult;
61 int pll_negmult;
62 long pll_clock;
63};
64
65
66
67
68
69
70#define RTC_AIE_ON _IO('p', 0x01)
71#define RTC_AIE_OFF _IO('p', 0x02)
72#define RTC_UIE_ON _IO('p', 0x03)
73#define RTC_UIE_OFF _IO('p', 0x04)
74#define RTC_PIE_ON _IO('p', 0x05)
75#define RTC_PIE_OFF _IO('p', 0x06)
76#define RTC_WIE_ON _IO('p', 0x0f)
77#define RTC_WIE_OFF _IO('p', 0x10)
78
79#define RTC_ALM_SET _IOW('p', 0x07, struct rtc_time)
80#define RTC_ALM_READ _IOR('p', 0x08, struct rtc_time)
81#define RTC_RD_TIME _IOR('p', 0x09, struct rtc_time)
82#define RTC_SET_TIME _IOW('p', 0x0a, struct rtc_time)
83#define RTC_IRQP_READ _IOR('p', 0x0b, unsigned long)
84#define RTC_IRQP_SET _IOW('p', 0x0c, unsigned long)
85#define RTC_EPOCH_READ _IOR('p', 0x0d, unsigned long)
86#define RTC_EPOCH_SET _IOW('p', 0x0e, unsigned long)
87
88#define RTC_WKALM_SET _IOW('p', 0x0f, struct rtc_wkalrm)
89#define RTC_WKALM_RD _IOR('p', 0x10, struct rtc_wkalrm)
90
91#define RTC_PLL_GET _IOR('p', 0x11, struct rtc_pll_info)
92#define RTC_PLL_SET _IOW('p', 0x12, struct rtc_pll_info)
93
94#define RTC_VL_READ _IOR('p', 0x13, int)
95#define RTC_VL_CLR _IO('p', 0x14)
96
97
98#define RTC_IRQF 0x80
99#define RTC_PF 0x40
100#define RTC_AF 0x20
101#define RTC_UF 0x10
102
103
104#define RTC_MAX_FREQ 8192
105
106#ifdef __KERNEL__
107
108#include <linux/types.h>
109#include <linux/interrupt.h>
110
111extern int rtc_month_days(unsigned int month, unsigned int year);
112extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year);
113extern int rtc_valid_tm(struct rtc_time *tm);
114extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time);
115extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm);
116ktime_t rtc_tm_to_ktime(struct rtc_time tm);
117struct rtc_time rtc_ktime_to_tm(ktime_t kt);
118
119
120#include <linux/device.h>
121#include <linux/seq_file.h>
122#include <linux/cdev.h>
123#include <linux/poll.h>
124#include <linux/mutex.h>
125#include <linux/timerqueue.h>
126#include <linux/workqueue.h>
127
128extern struct class *rtc_class;
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146struct rtc_class_ops {
147 int (*open)(struct device *);
148 void (*release)(struct device *);
149 int (*ioctl)(struct device *, unsigned int, unsigned long);
150 int (*read_time)(struct device *, struct rtc_time *);
151 int (*set_time)(struct device *, struct rtc_time *);
152 int (*read_alarm)(struct device *, struct rtc_wkalrm *);
153 int (*set_alarm)(struct device *, struct rtc_wkalrm *);
154 int (*proc)(struct device *, struct seq_file *);
155 int (*set_mmss)(struct device *, unsigned long secs);
156 int (*read_callback)(struct device *, int data);
157 int (*alarm_irq_enable)(struct device *, unsigned int enabled);
158};
159
160#define RTC_DEVICE_NAME_SIZE 20
161typedef struct rtc_task {
162 void (*func)(void *private_data);
163 void *private_data;
164} rtc_task_t;
165
166
167struct rtc_timer {
168 struct rtc_task task;
169 struct timerqueue_node node;
170 ktime_t period;
171 int enabled;
172};
173
174
175
176#define RTC_DEV_BUSY 0
177
178struct rtc_device
179{
180 struct device dev;
181 struct module *owner;
182
183 int id;
184 char name[RTC_DEVICE_NAME_SIZE];
185
186 const struct rtc_class_ops *ops;
187 struct mutex ops_lock;
188
189 struct cdev char_dev;
190 unsigned long flags;
191
192 unsigned long irq_data;
193 spinlock_t irq_lock;
194 wait_queue_head_t irq_queue;
195 struct fasync_struct *async_queue;
196
197 struct rtc_task *irq_task;
198 spinlock_t irq_task_lock;
199 int irq_freq;
200 int max_user_freq;
201
202 struct timerqueue_head timerqueue;
203 struct rtc_timer aie_timer;
204 struct rtc_timer uie_rtctimer;
205 struct hrtimer pie_timer;
206 int pie_enabled;
207 struct work_struct irqwork;
208
209 int uie_unsupported;
210
211#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
212 struct work_struct uie_task;
213 struct timer_list uie_timer;
214
215 unsigned int oldsecs;
216 unsigned int uie_irq_active:1;
217 unsigned int stop_uie_polling:1;
218 unsigned int uie_task_active:1;
219 unsigned int uie_timer_active:1;
220#endif
221};
222#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
223
224extern struct rtc_device *rtc_device_register(const char *name,
225 struct device *dev,
226 const struct rtc_class_ops *ops,
227 struct module *owner);
228extern void rtc_device_unregister(struct rtc_device *rtc);
229
230extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm);
231extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm);
232extern int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs);
233int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm);
234extern int rtc_read_alarm(struct rtc_device *rtc,
235 struct rtc_wkalrm *alrm);
236extern int rtc_set_alarm(struct rtc_device *rtc,
237 struct rtc_wkalrm *alrm);
238extern int rtc_initialize_alarm(struct rtc_device *rtc,
239 struct rtc_wkalrm *alrm);
240extern void rtc_update_irq(struct rtc_device *rtc,
241 unsigned long num, unsigned long events);
242
243extern struct rtc_device *rtc_class_open(char *name);
244extern void rtc_class_close(struct rtc_device *rtc);
245
246extern int rtc_irq_register(struct rtc_device *rtc,
247 struct rtc_task *task);
248extern void rtc_irq_unregister(struct rtc_device *rtc,
249 struct rtc_task *task);
250extern int rtc_irq_set_state(struct rtc_device *rtc,
251 struct rtc_task *task, int enabled);
252extern int rtc_irq_set_freq(struct rtc_device *rtc,
253 struct rtc_task *task, int freq);
254extern int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled);
255extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled);
256extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
257 unsigned int enabled);
258
259void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode);
260void rtc_aie_update_irq(void *private);
261void rtc_uie_update_irq(void *private);
262enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
263
264int rtc_register(rtc_task_t *task);
265int rtc_unregister(rtc_task_t *task);
266int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg);
267
268void rtc_timer_init(struct rtc_timer *timer, void (*f)(void* p), void* data);
269int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer* timer,
270 ktime_t expires, ktime_t period);
271int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer* timer);
272void rtc_timer_do_work(struct work_struct *work);
273
274static inline bool is_leap_year(unsigned int year)
275{
276 return (!(year % 4) && (year % 100)) || !(year % 400);
277}
278
279#ifdef CONFIG_RTC_HCTOSYS
280extern int rtc_hctosys_ret;
281#else
282#define rtc_hctosys_ret -ENODEV
283#endif
284
285#endif
286
287#endif
288