diff options
Diffstat (limited to 'include/linux/rtc.h')
-rw-r--r-- | include/linux/rtc.h | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/include/linux/rtc.h b/include/linux/rtc.h index 14dbc83ded20..a3421abca703 100644 --- a/include/linux/rtc.h +++ b/include/linux/rtc.h | |||
@@ -107,12 +107,17 @@ extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year | |||
107 | extern int rtc_valid_tm(struct rtc_time *tm); | 107 | extern int rtc_valid_tm(struct rtc_time *tm); |
108 | extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); | 108 | extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); |
109 | extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); | 109 | extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); |
110 | ktime_t rtc_tm_to_ktime(struct rtc_time tm); | ||
111 | struct rtc_time rtc_ktime_to_tm(ktime_t kt); | ||
112 | |||
110 | 113 | ||
111 | #include <linux/device.h> | 114 | #include <linux/device.h> |
112 | #include <linux/seq_file.h> | 115 | #include <linux/seq_file.h> |
113 | #include <linux/cdev.h> | 116 | #include <linux/cdev.h> |
114 | #include <linux/poll.h> | 117 | #include <linux/poll.h> |
115 | #include <linux/mutex.h> | 118 | #include <linux/mutex.h> |
119 | #include <linux/timerqueue.h> | ||
120 | #include <linux/workqueue.h> | ||
116 | 121 | ||
117 | extern struct class *rtc_class; | 122 | extern struct class *rtc_class; |
118 | 123 | ||
@@ -151,7 +156,19 @@ struct rtc_class_ops { | |||
151 | }; | 156 | }; |
152 | 157 | ||
153 | #define RTC_DEVICE_NAME_SIZE 20 | 158 | #define RTC_DEVICE_NAME_SIZE 20 |
154 | struct rtc_task; | 159 | typedef struct rtc_task { |
160 | void (*func)(void *private_data); | ||
161 | void *private_data; | ||
162 | } rtc_task_t; | ||
163 | |||
164 | |||
165 | struct rtc_timer { | ||
166 | struct rtc_task task; | ||
167 | struct timerqueue_node node; | ||
168 | ktime_t period; | ||
169 | int enabled; | ||
170 | }; | ||
171 | |||
155 | 172 | ||
156 | /* flags */ | 173 | /* flags */ |
157 | #define RTC_DEV_BUSY 0 | 174 | #define RTC_DEV_BUSY 0 |
@@ -179,6 +196,15 @@ struct rtc_device | |||
179 | spinlock_t irq_task_lock; | 196 | spinlock_t irq_task_lock; |
180 | int irq_freq; | 197 | int irq_freq; |
181 | int max_user_freq; | 198 | int max_user_freq; |
199 | |||
200 | struct timerqueue_head timerqueue; | ||
201 | struct rtc_timer aie_timer; | ||
202 | struct rtc_timer uie_rtctimer; | ||
203 | struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */ | ||
204 | int pie_enabled; | ||
205 | struct work_struct irqwork; | ||
206 | |||
207 | |||
182 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | 208 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL |
183 | struct work_struct uie_task; | 209 | struct work_struct uie_task; |
184 | struct timer_list uie_timer; | 210 | struct timer_list uie_timer; |
@@ -224,15 +250,22 @@ extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled); | |||
224 | extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, | 250 | extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, |
225 | unsigned int enabled); | 251 | unsigned int enabled); |
226 | 252 | ||
227 | typedef struct rtc_task { | 253 | void rtc_aie_update_irq(void *private); |
228 | void (*func)(void *private_data); | 254 | void rtc_uie_update_irq(void *private); |
229 | void *private_data; | 255 | enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer); |
230 | } rtc_task_t; | ||
231 | 256 | ||
232 | int rtc_register(rtc_task_t *task); | 257 | int rtc_register(rtc_task_t *task); |
233 | int rtc_unregister(rtc_task_t *task); | 258 | int rtc_unregister(rtc_task_t *task); |
234 | int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg); | 259 | int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg); |
235 | 260 | ||
261 | void rtctimer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer); | ||
262 | void rtctimer_remove(struct rtc_device *rtc, struct rtc_timer *timer); | ||
263 | void rtctimer_init(struct rtc_timer *timer, void (*f)(void* p), void* data); | ||
264 | int rtctimer_start(struct rtc_device *rtc, struct rtc_timer* timer, | ||
265 | ktime_t expires, ktime_t period); | ||
266 | int rtctimer_cancel(struct rtc_device *rtc, struct rtc_timer* timer); | ||
267 | void rtctimer_do_work(struct work_struct *work); | ||
268 | |||
236 | static inline bool is_leap_year(unsigned int year) | 269 | static inline bool is_leap_year(unsigned int year) |
237 | { | 270 | { |
238 | return (!(year % 4) && (year % 100)) || !(year % 400); | 271 | return (!(year % 4) && (year % 100)) || !(year % 400); |