aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-01-11 14:06:41 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-11 14:06:41 -0500
commit5943a268002fce97885f2ca08827ff1b0312068c (patch)
tree5e304e79b68263e799224ebb1a08ead474ab299b /include
parent42776163e13a56ea3096edff7a5df95408e80eb4 (diff)
parent96c8f06a0fb359a9a89701a7afab6d837e466ab0 (diff)
Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: rtc: Namespace fixup RTC: Remove UIE emulation RTC: Rework RTC code to use timerqueue for events Fix up trivial conflict in drivers/rtc/rtc-dev.c
Diffstat (limited to 'include')
-rw-r--r--include/linux/rtc.h51
1 files changed, 36 insertions, 15 deletions
diff --git a/include/linux/rtc.h b/include/linux/rtc.h
index 14dbc83ded20..3c995b4d742c 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,16 +196,13 @@ 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;
182#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL 199
183 struct work_struct uie_task; 200 struct timerqueue_head timerqueue;
184 struct timer_list uie_timer; 201 struct rtc_timer aie_timer;
185 /* Those fields are protected by rtc->irq_lock */ 202 struct rtc_timer uie_rtctimer;
186 unsigned int oldsecs; 203 struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */
187 unsigned int uie_irq_active:1; 204 int pie_enabled;
188 unsigned int stop_uie_polling:1; 205 struct work_struct irqwork;
189 unsigned int uie_task_active:1;
190 unsigned int uie_timer_active:1;
191#endif
192}; 206};
193#define to_rtc_device(d) container_of(d, struct rtc_device, dev) 207#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
194 208
@@ -224,15 +238,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, 238extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
225 unsigned int enabled); 239 unsigned int enabled);
226 240
227typedef struct rtc_task { 241void rtc_aie_update_irq(void *private);
228 void (*func)(void *private_data); 242void rtc_uie_update_irq(void *private);
229 void *private_data; 243enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
230} rtc_task_t;
231 244
232int rtc_register(rtc_task_t *task); 245int rtc_register(rtc_task_t *task);
233int rtc_unregister(rtc_task_t *task); 246int rtc_unregister(rtc_task_t *task);
234int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg); 247int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg);
235 248
249void rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
250void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
251void rtc_timer_init(struct rtc_timer *timer, void (*f)(void* p), void* data);
252int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer* timer,
253 ktime_t expires, ktime_t period);
254int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer* timer);
255void rtc_timer_do_work(struct work_struct *work);
256
236static inline bool is_leap_year(unsigned int year) 257static inline bool is_leap_year(unsigned int year)
237{ 258{
238 return (!(year % 4) && (year % 100)) || !(year % 400); 259 return (!(year % 4) && (year % 100)) || !(year % 400);