1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_RTC_H_
12#define _LINUX_RTC_H_
13
14
15#include <linux/types.h>
16#include <linux/interrupt.h>
17#include <uapi/linux/rtc.h>
18
19extern int rtc_month_days(unsigned int month, unsigned int year);
20extern int rtc_year_days(unsigned int day, unsigned int month, unsigned int year);
21extern int rtc_valid_tm(struct rtc_time *tm);
22extern time64_t rtc_tm_to_time64(struct rtc_time *tm);
23extern void rtc_time64_to_tm(time64_t time, struct rtc_time *tm);
24ktime_t rtc_tm_to_ktime(struct rtc_time tm);
25struct rtc_time rtc_ktime_to_tm(ktime_t kt);
26
27
28
29
30static inline time64_t rtc_tm_sub(struct rtc_time *lhs, struct rtc_time *rhs)
31{
32 return rtc_tm_to_time64(lhs) - rtc_tm_to_time64(rhs);
33}
34
35
36
37
38static inline void rtc_time_to_tm(unsigned long time, struct rtc_time *tm)
39{
40 rtc_time64_to_tm(time, tm);
41}
42
43
44
45
46static inline int rtc_tm_to_time(struct rtc_time *tm, unsigned long *time)
47{
48 *time = rtc_tm_to_time64(tm);
49
50 return 0;
51}
52
53#include <linux/device.h>
54#include <linux/seq_file.h>
55#include <linux/cdev.h>
56#include <linux/poll.h>
57#include <linux/mutex.h>
58#include <linux/timerqueue.h>
59#include <linux/workqueue.h>
60
61extern struct class *rtc_class;
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79struct rtc_class_ops {
80 int (*open)(struct device *);
81 void (*release)(struct device *);
82 int (*ioctl)(struct device *, unsigned int, unsigned long);
83 int (*read_time)(struct device *, struct rtc_time *);
84 int (*set_time)(struct device *, struct rtc_time *);
85 int (*read_alarm)(struct device *, struct rtc_wkalrm *);
86 int (*set_alarm)(struct device *, struct rtc_wkalrm *);
87 int (*proc)(struct device *, struct seq_file *);
88 int (*set_mmss64)(struct device *, time64_t secs);
89 int (*set_mmss)(struct device *, unsigned long secs);
90 int (*read_callback)(struct device *, int data);
91 int (*alarm_irq_enable)(struct device *, unsigned int enabled);
92};
93
94#define RTC_DEVICE_NAME_SIZE 20
95typedef struct rtc_task {
96 void (*func)(void *private_data);
97 void *private_data;
98} rtc_task_t;
99
100
101struct rtc_timer {
102 struct rtc_task task;
103 struct timerqueue_node node;
104 ktime_t period;
105 int enabled;
106};
107
108
109
110#define RTC_DEV_BUSY 0
111
112struct rtc_device {
113 struct device dev;
114 struct module *owner;
115
116 int id;
117 char name[RTC_DEVICE_NAME_SIZE];
118
119 const struct rtc_class_ops *ops;
120 struct mutex ops_lock;
121
122 struct cdev char_dev;
123 unsigned long flags;
124
125 unsigned long irq_data;
126 spinlock_t irq_lock;
127 wait_queue_head_t irq_queue;
128 struct fasync_struct *async_queue;
129
130 struct rtc_task *irq_task;
131 spinlock_t irq_task_lock;
132 int irq_freq;
133 int max_user_freq;
134
135 struct timerqueue_head timerqueue;
136 struct rtc_timer aie_timer;
137 struct rtc_timer uie_rtctimer;
138 struct hrtimer pie_timer;
139 int pie_enabled;
140 struct work_struct irqwork;
141
142 int uie_unsupported;
143
144#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
145 struct work_struct uie_task;
146 struct timer_list uie_timer;
147
148 unsigned int oldsecs;
149 unsigned int uie_irq_active:1;
150 unsigned int stop_uie_polling:1;
151 unsigned int uie_task_active:1;
152 unsigned int uie_timer_active:1;
153#endif
154};
155#define to_rtc_device(d) container_of(d, struct rtc_device, dev)
156
157extern struct rtc_device *rtc_device_register(const char *name,
158 struct device *dev,
159 const struct rtc_class_ops *ops,
160 struct module *owner);
161extern struct rtc_device *devm_rtc_device_register(struct device *dev,
162 const char *name,
163 const struct rtc_class_ops *ops,
164 struct module *owner);
165extern void rtc_device_unregister(struct rtc_device *rtc);
166extern void devm_rtc_device_unregister(struct device *dev,
167 struct rtc_device *rtc);
168
169extern int rtc_read_time(struct rtc_device *rtc, struct rtc_time *tm);
170extern int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm);
171extern int rtc_set_ntp_time(struct timespec64 now);
172int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm);
173extern int rtc_read_alarm(struct rtc_device *rtc,
174 struct rtc_wkalrm *alrm);
175extern int rtc_set_alarm(struct rtc_device *rtc,
176 struct rtc_wkalrm *alrm);
177extern int rtc_initialize_alarm(struct rtc_device *rtc,
178 struct rtc_wkalrm *alrm);
179extern void rtc_update_irq(struct rtc_device *rtc,
180 unsigned long num, unsigned long events);
181
182extern struct rtc_device *rtc_class_open(const char *name);
183extern void rtc_class_close(struct rtc_device *rtc);
184
185extern int rtc_irq_register(struct rtc_device *rtc,
186 struct rtc_task *task);
187extern void rtc_irq_unregister(struct rtc_device *rtc,
188 struct rtc_task *task);
189extern int rtc_irq_set_state(struct rtc_device *rtc,
190 struct rtc_task *task, int enabled);
191extern int rtc_irq_set_freq(struct rtc_device *rtc,
192 struct rtc_task *task, int freq);
193extern int rtc_update_irq_enable(struct rtc_device *rtc, unsigned int enabled);
194extern int rtc_alarm_irq_enable(struct rtc_device *rtc, unsigned int enabled);
195extern int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc,
196 unsigned int enabled);
197
198void rtc_handle_legacy_irq(struct rtc_device *rtc, int num, int mode);
199void rtc_aie_update_irq(void *private);
200void rtc_uie_update_irq(void *private);
201enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer);
202
203int rtc_register(rtc_task_t *task);
204int rtc_unregister(rtc_task_t *task);
205int rtc_control(rtc_task_t *t, unsigned int cmd, unsigned long arg);
206
207void rtc_timer_init(struct rtc_timer *timer, void (*f)(void *p), void *data);
208int rtc_timer_start(struct rtc_device *rtc, struct rtc_timer *timer,
209 ktime_t expires, ktime_t period);
210void rtc_timer_cancel(struct rtc_device *rtc, struct rtc_timer *timer);
211void rtc_timer_do_work(struct work_struct *work);
212
213static inline bool is_leap_year(unsigned int year)
214{
215 return (!(year % 4) && (year % 100)) || !(year % 400);
216}
217
218#ifdef CONFIG_RTC_HCTOSYS_DEVICE
219extern int rtc_hctosys_ret;
220#else
221#define rtc_hctosys_ret -ENODEV
222#endif
223
224#endif
225