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
This commit is contained in:
@@ -107,12 +107,17 @@ extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year
|
||||
extern int rtc_valid_tm(struct rtc_time *tm);
|
||||
extern int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time);
|
||||
extern void rtc_time_to_tm(unsigned long time, struct rtc_time *tm);
|
||||
ktime_t rtc_tm_to_ktime(struct rtc_time tm);
|
||||
struct rtc_time rtc_ktime_to_tm(ktime_t kt);
|
||||
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/timerqueue.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
extern struct class *rtc_class;
|
||||
|
||||
@@ -151,7 +156,19 @@ struct rtc_class_ops {
|
||||
};
|
||||
|
||||
#define RTC_DEVICE_NAME_SIZE 20
|
||||
struct rtc_task;
|
||||
typedef struct rtc_task {
|
||||
void (*func)(void *private_data);
|
||||
void *private_data;
|
||||
} rtc_task_t;
|
||||
|
||||
|
||||
struct rtc_timer {
|
||||
struct rtc_task task;
|
||||
struct timerqueue_node node;
|
||||
ktime_t period;
|
||||
int enabled;
|
||||
};
|
||||
|
||||
|
||||
/* flags */
|
||||
#define RTC_DEV_BUSY 0
|
||||
@@ -179,16 +196,13 @@ struct rtc_device
|
||||
spinlock_t irq_task_lock;
|
||||
int irq_freq;
|
||||
int max_user_freq;
|
||||
#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
|
||||
struct work_struct uie_task;
|
||||
struct timer_list uie_timer;
|
||||
/* Those fields are protected by rtc->irq_lock */
|
||||
unsigned int oldsecs;
|
||||
unsigned int uie_irq_active:1;
|
||||
unsigned int stop_uie_polling:1;
|
||||
unsigned int uie_task_active:1;
|
||||
unsigned int uie_timer_active:1;
|
||||
#endif
|
||||
|
||||
struct timerqueue_head timerqueue;
|
||||
struct rtc_timer aie_timer;
|
||||
struct rtc_timer uie_rtctimer;
|
||||
struct hrtimer pie_timer; /* sub second exp, so needs hrtimer */
|
||||
int pie_enabled;
|
||||
struct work_struct irqwork;
|
||||
};
|
||||
#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
|
||||
|
||||
@@ -224,15 +238,22 @@ extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled);
|
||||
extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
|
||||
unsigned int enabled);
|
||||
|
||||
typedef struct rtc_task {
|
||||
void (*func)(void *private_data);
|
||||
void *private_data;
|
||||
} rtc_task_t;
|
||||
void rtc_aie_update_irq(void *private);
|
||||
void rtc_uie_update_irq(void *private);
|
||||
enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
|
||||
|
||||
int rtc_register(rtc_task_t *task);
|
||||
int rtc_unregister(rtc_task_t *task);
|
||||
int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg);
|
||||
|
||||
void rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer);
|
||||
void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer);
|
||||
void rtc_timer_init(struct rtc_timer *timer, void (*f)(void* p), void* data);
|
||||
int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer* timer,
|
||||
ktime_t expires, ktime_t period);
|
||||
int rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer* timer);
|
||||
void rtc_timer_do_work(struct work_struct *work);
|
||||
|
||||
static inline bool is_leap_year(unsigned int year)
|
||||
{
|
||||
return (!(year % 4) && (year % 100)) || !(year % 400);
|
||||
|
Reference in New Issue
Block a user