aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/rtc.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/rtc.h')
-rw-r--r--include/linux/rtc.h43
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
107extern int rtc_valid_tm(struct rtc_time *tm); 107extern int rtc_valid_tm(struct rtc_time *tm);
108extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time); 108extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time);
109extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm); 109extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm);
110ktime_t rtc_tm_to_ktime(struct rtc_time tm);
111struct 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
117extern struct class *rtc_class; 122extern 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
154struct rtc_task; 159typedef struct rtc_task {
160 void (*func)(void *private_data);
161 void *private_data;
162} rtc_task_t;
163
164
165struct 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);
224extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, 250extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
225 unsigned int enabled); 251 unsigned int enabled);
226 252
227typedef struct rtc_task { 253void rtc_aie_update_irq(void *private);
228 void (*func)(void *private_data); 254void rtc_uie_update_irq(void *private);
229 void *private_data; 255enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
230} rtc_task_t;
231 256
232int rtc_register(rtc_task_t *task); 257int rtc_register(rtc_task_t *task);
233int rtc_unregister(rtc_task_t *task); 258int rtc_unregister(rtc_task_t *task);
234int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg); 259int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg);
235 260
261void rtctimer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
262void rtctimer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
263void rtctimer_init(struct rtc_timer *timer, void (*f)(void* p), void* data);
264int rtctimer_start(struct rtc_device *rtc, struct rtc_timer* timer,
265 ktime_t expires, ktime_t period);
266int rtctimer_cancel(struct rtc_device *rtc, struct rtc_timer* timer);
267void rtctimer_do_work(struct work_struct *work);
268
236static inline bool is_leap_year(unsigned int year) 269static 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);