1 /* drivers/rtc/alarm-dev.c
3 * Copyright (C) 2007-2009 Google, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/time.h>
17 #include <linux/module.h>
18 #include <linux/device.h>
19 #include <linux/miscdevice.h>
21 #include <linux/platform_device.h>
22 #include <linux/sched.h>
23 #include <linux/spinlock.h>
24 #include <linux/uaccess.h>
25 #include <linux/alarmtimer.h>
26 #include "android_alarm.h"
28 #define ANDROID_ALARM_PRINT_INFO (1U << 0)
29 #define ANDROID_ALARM_PRINT_IO (1U << 1)
30 #define ANDROID_ALARM_PRINT_INT (1U << 2)
32 static int debug_mask = ANDROID_ALARM_PRINT_INFO | ANDROID_ALARM_PRINT_IO | \
33 ANDROID_ALARM_PRINT_INT;
34 module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
36 #define alarm_dbg(debug_level_mask, fmt, ...) \
38 if (debug_mask & ANDROID_ALARM_PRINT_##debug_level_mask) \
39 pr_info(fmt, ##__VA_ARGS__); \
42 #define ANDROID_ALARM_WAKEUP_MASK ( \
43 ANDROID_ALARM_RTC_WAKEUP_MASK | \
44 ANDROID_ALARM_POWER_OFF_WAKEUP_MASK | \
45 ANDROID_ALARM_POWER_OFF_ALARM_MASK | \
46 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK)
48 static int alarm_opened;
49 static DEFINE_SPINLOCK(alarm_slock);
50 static struct wakeup_source alarm_wake_lock;
51 static struct wakeup_source alarm_rtc_lock;
52 static DECLARE_WAIT_QUEUE_HEAD(alarm_wait_queue);
53 static DECLARE_WAIT_QUEUE_HEAD(alarm_wait_change_queue);
54 static uint32_t alarm_pending;
55 static uint32_t alarm_enabled;
56 static uint32_t wait_pending;
64 enum android_alarm_type type;
67 static struct devalarm alarms[ANDROID_ALARM_TYPE_COUNT];
70 static int is_wakeup(enum android_alarm_type type)
72 return (type == ANDROID_ALARM_RTC_WAKEUP ||
73 type == ANDROID_ALARM_POWER_OFF_WAKEUP ||
74 type == ANDROID_ALARM_POWER_OFF_ALARM ||
75 type == ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP);
79 static void devalarm_start(struct devalarm *alrm, ktime_t exp)
81 if (is_wakeup(alrm->type)) {
82 __pm_stay_awake(&alarm_rtc_lock);
83 alarm_start(&alrm->u.alrm, exp);
84 __pm_relax(&alarm_rtc_lock);
87 hrtimer_start(&alrm->u.hrt, exp, HRTIMER_MODE_ABS);
91 static int devalarm_try_to_cancel(struct devalarm *alrm)
93 if (is_wakeup(alrm->type))
94 return alarm_try_to_cancel(&alrm->u.alrm);
95 return hrtimer_try_to_cancel(&alrm->u.hrt);
98 static void devalarm_cancel(struct devalarm *alrm)
100 if (is_wakeup(alrm->type))
101 alarm_cancel(&alrm->u.alrm);
103 hrtimer_cancel(&alrm->u.hrt);
106 static void alarm_clear(enum android_alarm_type alarm_type)
108 uint32_t alarm_type_mask = 1U << alarm_type;
111 spin_lock_irqsave(&alarm_slock, flags);
112 alarm_dbg(INFO, "alarm %d clear\n", alarm_type);
113 devalarm_try_to_cancel(&alarms[alarm_type]);
115 alarm_pending &= ~alarm_type_mask;
117 alarm_enabled &= ~alarm_type_mask;
119 if (!alarm_enabled && !wait_pending) {
120 __pm_relax(&alarm_wake_lock);
121 alarm_dbg(INFO, "%s: wakeup_event cleared\n", __func__);
124 spin_unlock_irqrestore(&alarm_slock, flags);
127 static void alarm_set(enum android_alarm_type alarm_type,
130 uint32_t alarm_type_mask = 1U << alarm_type;
133 spin_lock_irqsave(&alarm_slock, flags);
134 alarm_dbg(INFO, "alarm %d set %ld.%09ld\n",
135 alarm_type, ts->tv_sec, ts->tv_nsec);
136 alarm_enabled |= alarm_type_mask;
137 devalarm_start(&alarms[alarm_type], timespec_to_ktime(*ts));
138 spin_unlock_irqrestore(&alarm_slock, flags);
141 static int alarm_wait(void)
146 spin_lock_irqsave(&alarm_slock, flags);
147 alarm_dbg(INFO, "alarm wait, alarm_pending 0x%x, wait_pending 0x%x\n",
148 alarm_pending, wait_pending);
149 if (!alarm_pending && wait_pending) {
150 __pm_relax(&alarm_wake_lock);
153 spin_unlock_irqrestore(&alarm_slock, flags);
155 rv = wait_event_interruptible(alarm_wait_queue, alarm_pending);
157 alarm_dbg(IO, "alarm wait ret %d\n", rv);
161 spin_lock_irqsave(&alarm_slock, flags);
165 spin_unlock_irqrestore(&alarm_slock, flags);
166 alarm_dbg(IO, "alarm wake up %d\n", rv);
171 static int alarm_set_rtc(struct timespec *ts)
173 struct rtc_time new_rtc_tm;
174 struct timespec old_rtc_time;
175 struct rtc_device *rtc_dev;
179 /* get original rct time */
180 getnstimeofday(&old_rtc_time);
182 rtc_time_to_tm(ts->tv_sec, &new_rtc_tm);
183 rtc_dev = alarmtimer_get_rtcdev();
184 rv = do_settimeofday(ts);
188 rv = rtc_set_time(rtc_dev, &new_rtc_tm);
190 spin_lock_irqsave(&alarm_slock, flags);
191 alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
192 delta += ts->tv_sec - old_rtc_time.tv_sec;
193 wake_up(&alarm_wait_queue);
194 wake_up(&alarm_wait_change_queue);
195 spin_unlock_irqrestore(&alarm_slock, flags);
200 static int alarm_get_time(enum android_alarm_type alarm_type,
205 switch (alarm_type) {
206 case ANDROID_ALARM_RTC_WAKEUP:
207 case ANDROID_ALARM_RTC:
208 case ANDROID_ALARM_POWER_OFF_WAKEUP:
209 case ANDROID_ALARM_POWER_OFF_ALARM:
212 case ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP:
213 case ANDROID_ALARM_ELAPSED_REALTIME:
214 get_monotonic_boottime(ts);
216 case ANDROID_ALARM_SYSTEMTIME:
225 static long alarm_do_ioctl(struct file *file, unsigned int cmd,
230 enum android_alarm_type alarm_type = ANDROID_ALARM_IOCTL_TO_TYPE(cmd);
232 if (alarm_type >= ANDROID_ALARM_TYPE_COUNT)
235 if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_GET_TIME(0) && ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_WAIT_CHANGE) {
236 if ((file->f_flags & O_ACCMODE) == O_RDONLY)
238 if (file->private_data == NULL &&
239 cmd != ANDROID_ALARM_SET_RTC) {
240 spin_lock_irqsave(&alarm_slock, flags);
242 spin_unlock_irqrestore(&alarm_slock, flags);
246 file->private_data = (void *)1;
247 spin_unlock_irqrestore(&alarm_slock, flags);
251 switch (ANDROID_ALARM_BASE_CMD(cmd)) {
252 case ANDROID_ALARM_CLEAR(0):
253 alarm_clear(alarm_type);
255 case ANDROID_ALARM_SET(0):
256 alarm_set(alarm_type, ts);
258 case ANDROID_ALARM_SET_AND_WAIT(0):
259 alarm_set(alarm_type, ts);
261 case ANDROID_ALARM_WAIT:
264 case ANDROID_ALARM_WAIT_CHANGE:
266 rv = wait_event_interruptible(alarm_wait_change_queue, delta);
267 if (rv == -ERESTARTSYS) {
272 case ANDROID_ALARM_SET_RTC:
273 rv = alarm_set_rtc(ts);
275 case ANDROID_ALARM_GET_TIME(0):
276 rv = alarm_get_time(alarm_type, ts);
286 static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
292 switch (ANDROID_ALARM_BASE_CMD(cmd)) {
293 case ANDROID_ALARM_SET_AND_WAIT(0):
294 case ANDROID_ALARM_SET(0):
295 case ANDROID_ALARM_SET_RTC:
296 if (copy_from_user(&ts, (void __user *)arg, sizeof(ts)))
301 rv = alarm_do_ioctl(file, cmd, &ts);
305 switch (ANDROID_ALARM_BASE_CMD(cmd)) {
306 case ANDROID_ALARM_GET_TIME(0):
307 if (copy_to_user((void __user *)arg, &ts, sizeof(ts)))
310 case ANDROID_ALARM_WAIT_CHANGE:
313 spin_lock_irqsave(&alarm_slock, flags);
314 if (copy_to_user((void __user *)arg, &delta, 4)) {
317 spin_unlock_irqrestore(&alarm_slock, flags);
321 spin_unlock_irqrestore(&alarm_slock, flags);
329 static long alarm_compat_ioctl(struct file *file, unsigned int cmd,
336 switch (ANDROID_ALARM_BASE_CMD(cmd)) {
337 case ANDROID_ALARM_SET_AND_WAIT_COMPAT(0):
338 case ANDROID_ALARM_SET_COMPAT(0):
339 case ANDROID_ALARM_SET_RTC_COMPAT:
340 if (compat_get_timespec(&ts, (void __user *)arg))
343 case ANDROID_ALARM_GET_TIME_COMPAT(0):
344 cmd = ANDROID_ALARM_COMPAT_TO_NORM(cmd);
348 rv = alarm_do_ioctl(file, cmd, &ts);
352 switch (ANDROID_ALARM_BASE_CMD(cmd)) {
353 case ANDROID_ALARM_GET_TIME(0): /* NOTE: we modified cmd above */
354 if (compat_put_timespec(&ts, (void __user *)arg))
363 static int alarm_open(struct inode *inode, struct file *file)
365 file->private_data = NULL;
369 static int alarm_release(struct inode *inode, struct file *file)
374 spin_lock_irqsave(&alarm_slock, flags);
375 if (file->private_data) {
376 for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) {
377 uint32_t alarm_type_mask = 1U << i;
378 if (alarm_enabled & alarm_type_mask) {
380 "%s: clear alarm, pending %d\n",
382 !!(alarm_pending & alarm_type_mask));
383 alarm_enabled &= ~alarm_type_mask;
385 spin_unlock_irqrestore(&alarm_slock, flags);
386 devalarm_cancel(&alarms[i]);
387 spin_lock_irqsave(&alarm_slock, flags);
389 if (alarm_pending | wait_pending) {
391 alarm_dbg(INFO, "%s: clear pending alarms %x\n",
392 __func__, alarm_pending);
393 __pm_relax(&alarm_wake_lock);
399 spin_unlock_irqrestore(&alarm_slock, flags);
403 static void devalarm_triggered(struct devalarm *alarm)
406 uint32_t alarm_type_mask = 1U << alarm->type;
408 alarm_dbg(INT, "%s: type %d, time %lu\n", __func__, alarm->type,
409 alarm->u.alrm.node.expires.tv64);
410 spin_lock_irqsave(&alarm_slock, flags);
411 if (alarm_enabled & alarm_type_mask) {
412 __pm_wakeup_event(&alarm_wake_lock, 3000); /* 3secs */
413 alarm_dbg(INFO, "%s: wakeup_event keep 3s\n", __func__);
415 alarm_enabled &= ~alarm_type_mask;
416 alarm_pending |= alarm_type_mask;
417 wake_up(&alarm_wait_queue);
418 alarm_dbg(INT, "%s: wake up alarm_wait_queue\n", __func__);
420 spin_unlock_irqrestore(&alarm_slock, flags);
424 static enum hrtimer_restart devalarm_hrthandler(struct hrtimer *hrt)
426 struct devalarm *devalrm = container_of(hrt, struct devalarm, u.hrt);
428 devalarm_triggered(devalrm);
429 return HRTIMER_NORESTART;
432 static enum alarmtimer_restart devalarm_alarmhandler(struct alarm *alrm,
435 struct devalarm *devalrm = container_of(alrm, struct devalarm, u.alrm);
437 devalarm_triggered(devalrm);
438 return ALARMTIMER_NORESTART;
442 static const struct file_operations alarm_fops = {
443 .owner = THIS_MODULE,
444 .unlocked_ioctl = alarm_ioctl,
446 .release = alarm_release,
448 .compat_ioctl = alarm_compat_ioctl,
452 static struct miscdevice alarm_device = {
453 .minor = MISC_DYNAMIC_MINOR,
458 static int __init alarm_dev_init(void)
463 err = misc_register(&alarm_device);
467 alarm_init(&alarms[ANDROID_ALARM_RTC_WAKEUP].u.alrm,
468 ALARM_REALTIME, devalarm_alarmhandler);
469 hrtimer_init(&alarms[ANDROID_ALARM_RTC].u.hrt,
470 CLOCK_REALTIME, HRTIMER_MODE_ABS);
471 alarm_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP].u.alrm,
472 ALARM_BOOTTIME, devalarm_alarmhandler);
473 hrtimer_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME].u.hrt,
474 CLOCK_BOOTTIME, HRTIMER_MODE_ABS);
475 hrtimer_init(&alarms[ANDROID_ALARM_SYSTEMTIME].u.hrt,
476 CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
477 alarm_init(&alarms[ANDROID_ALARM_POWER_OFF_WAKEUP].u.alrm,
478 ALARM_POWEROFF, devalarm_alarmhandler);
479 alarm_init(&alarms[ANDROID_ALARM_POWER_OFF_ALARM].u.alrm,
480 ALARM_POWEROFF_ALARM, devalarm_alarmhandler);
482 for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) {
485 alarms[i].u.hrt.function = devalarm_hrthandler;
488 wakeup_source_init(&alarm_wake_lock, "alarm");
489 wakeup_source_init(&alarm_rtc_lock, "alarm-rtc-lock");
493 static void __exit alarm_dev_exit(void)
495 misc_deregister(&alarm_device);
496 wakeup_source_trash(&alarm_wake_lock);
497 wakeup_source_trash(&alarm_rtc_lock);
500 module_init(alarm_dev_init);
501 module_exit(alarm_dev_exit);