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 14dbc83ded2..a3421abca70 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  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,6 +196,15 @@ struct rtc_device  	spinlock_t irq_task_lock;  	int irq_freq;  	int max_user_freq; + +	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; + +  #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL  	struct work_struct uie_task;  	struct timer_list uie_timer; @@ -224,15 +250,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 rtctimer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer); +void rtctimer_remove(struct rtc_device *rtc, struct rtc_timer *timer); +void rtctimer_init(struct rtc_timer *timer, void (*f)(void* p), void* data); +int rtctimer_start(struct rtc_device *rtc, struct rtc_timer* timer, +			ktime_t expires, ktime_t period); +int rtctimer_cancel(struct rtc_device *rtc, struct rtc_timer* timer); +void rtctimer_do_work(struct work_struct *work); +  static inline bool is_leap_year(unsigned int year)  {  	return (!(year % 4) && (year % 100)) || !(year % 400);  |