alarm-dev.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /* drivers/rtc/alarm-dev.c
  2. *
  3. * Copyright (C) 2007-2009 Google, Inc.
  4. *
  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.
  8. *
  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.
  13. *
  14. */
  15. #ifdef pr_fmt
  16. #undef pr_fmt
  17. #endif
  18. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  19. #include <linux/time.h>
  20. #include <linux/module.h>
  21. #include <linux/device.h>
  22. #include <linux/miscdevice.h>
  23. #include <linux/fs.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/sched.h>
  26. #include <linux/spinlock.h>
  27. #include <linux/uaccess.h>
  28. #include <linux/rtc.h>
  29. #include <linux/alarmtimer.h>
  30. #include "android_alarm.h"
  31. #include <linux/ioctl.h>
  32. #define LOG_MYTAG "Power/Alarm"
  33. #define ANDROID_ALARM_PRINT_INFO (1U << 0)
  34. #define ANDROID_ALARM_PRINT_IO (1U << 1)
  35. #define ANDROID_ALARM_PRINT_INT (1U << 2)
  36. static int debug_mask = ANDROID_ALARM_PRINT_INFO;
  37. module_param_named(debug_mask, debug_mask, int, S_IRUGO | S_IWUSR | S_IWGRP);
  38. #define alarm_dbg(debug_level_mask, fmt, args...) \
  39. do { \
  40. if (debug_mask & ANDROID_ALARM_PRINT_##debug_level_mask) \
  41. pr_debug(LOG_MYTAG fmt, ##args); \
  42. } while (0)
  43. #define ANDROID_ALARM_WAKEUP_MASK ( \
  44. ANDROID_ALARM_RTC_WAKEUP_MASK | \
  45. ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP_MASK)
  46. static int alarm_opened;
  47. static DEFINE_SPINLOCK(alarm_slock);
  48. static struct wakeup_source alarm_wake_lock;
  49. static DECLARE_WAIT_QUEUE_HEAD(alarm_wait_queue);
  50. static uint32_t alarm_pending;
  51. static uint32_t alarm_enabled;
  52. static uint32_t wait_pending;
  53. struct devalarm {
  54. union {
  55. struct hrtimer hrt;
  56. struct alarm alrm;
  57. } u;
  58. enum android_alarm_type type;
  59. };
  60. static struct devalarm alarms[ANDROID_ALARM_TYPE_COUNT];
  61. static int is_wakeup(enum android_alarm_type type)
  62. {
  63. return (type == ANDROID_ALARM_RTC_WAKEUP ||
  64. type == ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP);
  65. }
  66. static void devalarm_start(struct devalarm *alrm, ktime_t exp)
  67. {
  68. if (is_wakeup(alrm->type))
  69. alarm_start(&alrm->u.alrm, exp);
  70. else
  71. hrtimer_start(&alrm->u.hrt, exp, HRTIMER_MODE_ABS);
  72. }
  73. static int devalarm_try_to_cancel(struct devalarm *alrm)
  74. {
  75. if (is_wakeup(alrm->type))
  76. return alarm_try_to_cancel(&alrm->u.alrm);
  77. return hrtimer_try_to_cancel(&alrm->u.hrt);
  78. }
  79. static void devalarm_cancel(struct devalarm *alrm)
  80. {
  81. if (is_wakeup(alrm->type))
  82. alarm_cancel(&alrm->u.alrm);
  83. else
  84. hrtimer_cancel(&alrm->u.hrt);
  85. }
  86. void alarm_set_power_on(struct timespec new_pwron_time, bool logo)
  87. {
  88. unsigned long pwron_time;
  89. struct rtc_wkalrm alm;
  90. struct rtc_device *alarm_rtc_dev;
  91. alarm_dbg(INFO, "alarm set power on\n");
  92. #ifdef RTC_PWRON_SEC
  93. /* round down the second */
  94. new_pwron_time.tv_sec = (new_pwron_time.tv_sec / 60) * 60;
  95. #endif
  96. if (new_pwron_time.tv_sec > 0) {
  97. pwron_time = new_pwron_time.tv_sec;
  98. #ifdef RTC_PWRON_SEC
  99. pwron_time += RTC_PWRON_SEC;
  100. #endif
  101. alm.enabled = (logo ? 3 : 2);
  102. } else {
  103. pwron_time = 0;
  104. alm.enabled = 4;
  105. }
  106. alarm_rtc_dev = alarmtimer_get_rtcdev();
  107. rtc_time_to_tm(pwron_time, &alm.time);
  108. rtc_set_alarm(alarm_rtc_dev, &alm);
  109. rtc_set_alarm_poweron(alarm_rtc_dev, &alm);
  110. }
  111. void alarm_get_power_on(struct rtc_wkalrm *alm)
  112. {
  113. if (!alm)
  114. return;
  115. memset(alm, 0, sizeof(struct rtc_wkalrm));
  116. #ifndef CONFIG_MTK_FPGA
  117. rtc_read_pwron_alarm(alm);
  118. #endif
  119. }
  120. static void alarm_clear(enum android_alarm_type alarm_type,
  121. struct timespec *ts)
  122. {
  123. uint32_t alarm_type_mask = 1U << alarm_type;
  124. unsigned long flags;
  125. alarm_dbg(IO, "alarm %d clear\n", alarm_type);
  126. if (alarm_type == ANDROID_ALARM_POWER_ON ||
  127. alarm_type == ANDROID_ALARM_POWER_ON_LOGO) {
  128. ts->tv_sec = 0;
  129. alarm_set_power_on(*ts, false);
  130. return;
  131. }
  132. spin_lock_irqsave(&alarm_slock, flags);
  133. devalarm_try_to_cancel(&alarms[alarm_type]);
  134. if (alarm_pending) {
  135. alarm_pending &= ~alarm_type_mask;
  136. if (!alarm_pending && !wait_pending)
  137. __pm_relax(&alarm_wake_lock);
  138. }
  139. alarm_enabled &= ~alarm_type_mask;
  140. spin_unlock_irqrestore(&alarm_slock, flags);
  141. }
  142. static void alarm_set(enum android_alarm_type alarm_type,
  143. struct timespec *ts)
  144. {
  145. uint32_t alarm_type_mask = 1U << alarm_type;
  146. unsigned long flags;
  147. if (alarm_type == ANDROID_ALARM_POWER_ON) {
  148. alarm_set_power_on(*ts, false);
  149. return;
  150. }
  151. if (alarm_type == ANDROID_ALARM_POWER_ON_LOGO) {
  152. alarm_set_power_on(*ts, true);
  153. return;
  154. }
  155. spin_lock_irqsave(&alarm_slock, flags);
  156. alarm_enabled |= alarm_type_mask;
  157. devalarm_start(&alarms[alarm_type], timespec_to_ktime(*ts));
  158. spin_unlock_irqrestore(&alarm_slock, flags);
  159. }
  160. static int alarm_wait(void)
  161. {
  162. unsigned long flags;
  163. int rv = 0;
  164. spin_lock_irqsave(&alarm_slock, flags);
  165. alarm_dbg(IO, "alarm wait\n");
  166. if (!alarm_pending && wait_pending) {
  167. __pm_relax(&alarm_wake_lock);
  168. wait_pending = 0;
  169. }
  170. spin_unlock_irqrestore(&alarm_slock, flags);
  171. rv = wait_event_interruptible(alarm_wait_queue, alarm_pending);
  172. if (rv)
  173. return rv;
  174. spin_lock_irqsave(&alarm_slock, flags);
  175. rv = alarm_pending;
  176. wait_pending = 1;
  177. alarm_pending = 0;
  178. spin_unlock_irqrestore(&alarm_slock, flags);
  179. return rv;
  180. }
  181. static int alarm_set_rtc(struct timespec *ts)
  182. {
  183. struct rtc_time new_rtc_tm;
  184. struct rtc_device *rtc_dev;
  185. unsigned long flags;
  186. int rv = 0;
  187. rtc_time_to_tm(ts->tv_sec, &new_rtc_tm);
  188. alarm_dbg(INFO, "set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
  189. ts->tv_sec, ts->tv_nsec,
  190. new_rtc_tm.tm_hour, new_rtc_tm.tm_min,
  191. new_rtc_tm.tm_sec, new_rtc_tm.tm_mon + 1,
  192. new_rtc_tm.tm_mday,
  193. new_rtc_tm.tm_year + 1900);
  194. rtc_dev = alarmtimer_get_rtcdev();
  195. rv = do_settimeofday(ts);
  196. if (rv < 0)
  197. return rv;
  198. if (rtc_dev)
  199. rv = rtc_set_time(rtc_dev, &new_rtc_tm);
  200. spin_lock_irqsave(&alarm_slock, flags);
  201. alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
  202. wake_up(&alarm_wait_queue);
  203. spin_unlock_irqrestore(&alarm_slock, flags);
  204. return rv;
  205. }
  206. static int alarm_get_time(enum android_alarm_type alarm_type,
  207. struct timespec *ts)
  208. {
  209. int rv = 0;
  210. switch (alarm_type) {
  211. case ANDROID_ALARM_RTC_WAKEUP:
  212. case ANDROID_ALARM_RTC:
  213. getnstimeofday(ts);
  214. break;
  215. case ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP:
  216. case ANDROID_ALARM_ELAPSED_REALTIME:
  217. get_monotonic_boottime(ts);
  218. break;
  219. case ANDROID_ALARM_SYSTEMTIME:
  220. ktime_get_ts(ts);
  221. break;
  222. case ANDROID_ALARM_POWER_ON:
  223. case ANDROID_ALARM_POWER_ON_LOGO:
  224. break;
  225. default:
  226. rv = -EINVAL;
  227. }
  228. return rv;
  229. }
  230. static long alarm_do_ioctl(struct file *file, unsigned int cmd,
  231. struct timespec *ts, struct rtc_wkalrm *alm)
  232. {
  233. int rv = 0;
  234. unsigned long flags;
  235. enum android_alarm_type alarm_type = ANDROID_ALARM_IOCTL_TO_TYPE(cmd);
  236. alarm_dbg(INFO, "alarm_do_ioctl cmd:%d type:%d (%lu)\n",
  237. cmd, alarm_type, (uintptr_t)file->private_data);
  238. if (alarm_type >= ANDROID_ALARM_TYPE_COUNT &&
  239. alarm_type != ANDROID_ALARM_POWER_ON &&
  240. alarm_type != ANDROID_ALARM_POWER_ON_LOGO) {
  241. return -EINVAL;
  242. }
  243. if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_GET_TIME(0)
  244. && ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_SET_IPO(0)
  245. && ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_GET_POWER_ON_IPO) {
  246. if ((file->f_flags & O_ACCMODE) == O_RDONLY)
  247. return -EPERM;
  248. if (file->private_data == NULL &&
  249. cmd != ANDROID_ALARM_SET_RTC) {
  250. spin_lock_irqsave(&alarm_slock, flags);
  251. if (alarm_opened) {
  252. spin_unlock_irqrestore(&alarm_slock, flags);
  253. alarm_dbg(INFO, "alarm_do_ioctl EBUSY\n");
  254. file->private_data = NULL;
  255. return -EBUSY;
  256. }
  257. alarm_opened = 1;
  258. file->private_data = (void *)1;
  259. spin_unlock_irqrestore(&alarm_slock, flags);
  260. alarm_dbg(INFO, "alarm_do_ioctl opened\n");
  261. }
  262. }
  263. switch (ANDROID_ALARM_BASE_CMD(cmd)) {
  264. case ANDROID_ALARM_CLEAR(0):
  265. alarm_clear(alarm_type, ts);
  266. break;
  267. case ANDROID_ALARM_SET(0):
  268. alarm_set(alarm_type, ts);
  269. break;
  270. case ANDROID_ALARM_SET_AND_WAIT(0):
  271. alarm_set(alarm_type, ts);
  272. /* fall though */
  273. case ANDROID_ALARM_WAIT:
  274. rv = alarm_wait();
  275. break;
  276. case ANDROID_ALARM_SET_IPO(0):
  277. alarm_set(alarm_type, ts);
  278. break;
  279. case ANDROID_ALARM_SET_AND_WAIT_IPO(0):
  280. alarm_set(alarm_type, ts);
  281. /* fall though */
  282. case ANDROID_ALARM_WAIT_IPO:
  283. rv = alarm_wait();
  284. break;
  285. case ANDROID_ALARM_SET_RTC:
  286. rv = alarm_set_rtc(ts);
  287. break;
  288. case ANDROID_ALARM_GET_TIME(0):
  289. rv = alarm_get_time(alarm_type, ts);
  290. break;
  291. case ANDROID_ALARM_GET_POWER_ON:
  292. alarm_get_power_on(alm);
  293. break;
  294. case ANDROID_ALARM_GET_POWER_ON_IPO:
  295. alarm_get_power_on(alm);
  296. break;
  297. default:
  298. rv = -EINVAL;
  299. }
  300. return rv;
  301. }
  302. static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  303. {
  304. struct timespec ts;
  305. struct rtc_wkalrm pwron_alm;
  306. int rv;
  307. switch (ANDROID_ALARM_BASE_CMD(cmd)) {
  308. case ANDROID_ALARM_SET_AND_WAIT(0):
  309. case ANDROID_ALARM_SET(0):
  310. case ANDROID_ALARM_SET_RTC:
  311. case ANDROID_ALARM_SET_IPO(0):
  312. if (copy_from_user(&ts, (void __user *)arg, sizeof(ts)))
  313. return -EFAULT;
  314. break;
  315. }
  316. rv = alarm_do_ioctl(file, cmd, &ts, &pwron_alm);
  317. if (rv)
  318. return rv;
  319. switch (ANDROID_ALARM_BASE_CMD(cmd)) {
  320. case ANDROID_ALARM_GET_TIME(0):
  321. if (copy_to_user((void __user *)arg, &ts, sizeof(ts)))
  322. return -EFAULT;
  323. break;
  324. case ANDROID_ALARM_GET_POWER_ON:
  325. case ANDROID_ALARM_GET_POWER_ON_IPO:
  326. if (copy_to_user((void __user *)arg,
  327. &pwron_alm, sizeof(struct rtc_wkalrm))) {
  328. rv = -EFAULT;
  329. return rv;
  330. }
  331. break;
  332. default:
  333. break;
  334. }
  335. return 0;
  336. }
  337. #ifdef CONFIG_COMPAT
  338. static long alarm_compat_ioctl(struct file *file, unsigned int cmd,
  339. unsigned long arg)
  340. {
  341. struct timespec ts;
  342. struct rtc_wkalrm pwron_alm;
  343. int rv;
  344. switch (ANDROID_ALARM_BASE_CMD(cmd)) {
  345. case ANDROID_ALARM_SET_AND_WAIT_COMPAT(0):
  346. case ANDROID_ALARM_SET_COMPAT(0):
  347. case ANDROID_ALARM_SET_RTC_COMPAT:
  348. case ANDROID_ALARM_SET_IPO_COMPAT(0):
  349. if (compat_get_timespec(&ts, (void __user *)arg))
  350. return -EFAULT;
  351. /* fall through */
  352. case ANDROID_ALARM_GET_TIME_COMPAT(0):
  353. cmd = ANDROID_ALARM_COMPAT_TO_NORM(cmd);
  354. break;
  355. }
  356. rv = alarm_do_ioctl(file, cmd, &ts, &pwron_alm);
  357. if (rv)
  358. return rv;
  359. switch (ANDROID_ALARM_BASE_CMD(cmd)) {
  360. case ANDROID_ALARM_GET_TIME(0): /* NOTE: we modified cmd above */
  361. if (compat_put_timespec(&ts, (void __user *)arg))
  362. return -EFAULT;
  363. break;
  364. case ANDROID_ALARM_GET_POWER_ON:
  365. case ANDROID_ALARM_GET_POWER_ON_IPO:
  366. if (copy_to_user((void __user *)arg, &pwron_alm,
  367. sizeof(struct rtc_wkalrm))) {
  368. rv = -EFAULT;
  369. return rv;
  370. }
  371. break;
  372. }
  373. return 0;
  374. }
  375. #endif
  376. static int alarm_open(struct inode *inode, struct file *file)
  377. {
  378. file->private_data = NULL;
  379. alarm_dbg(INFO, "alarm_open (%d:%d)\n", current->tgid, current->pid);
  380. return 0;
  381. }
  382. static int alarm_release(struct inode *inode, struct file *file)
  383. {
  384. int i;
  385. unsigned long flags;
  386. spin_lock_irqsave(&alarm_slock, flags);
  387. if (file->private_data) {
  388. for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) {
  389. uint32_t alarm_type_mask = 1U << i;
  390. if (alarm_enabled & alarm_type_mask) {
  391. alarm_dbg(INFO,
  392. "%s: clear alarm, pending %d\n",
  393. __func__,
  394. !!(alarm_pending & alarm_type_mask));
  395. alarm_enabled &= ~alarm_type_mask;
  396. }
  397. spin_unlock_irqrestore(&alarm_slock, flags);
  398. devalarm_cancel(&alarms[i]);
  399. spin_lock_irqsave(&alarm_slock, flags);
  400. }
  401. if (alarm_pending | wait_pending) {
  402. if (alarm_pending)
  403. alarm_dbg(INFO, "%s: clear pending alarms %x\n",
  404. __func__, alarm_pending);
  405. __pm_relax(&alarm_wake_lock);
  406. wait_pending = 0;
  407. alarm_pending = 0;
  408. }
  409. alarm_opened = 0;
  410. }
  411. spin_unlock_irqrestore(&alarm_slock, flags);
  412. alarm_dbg(INFO, "alarm_release (%d:%d)(%lu)\n",
  413. current->tgid, current->pid, (uintptr_t)file->private_data);
  414. return 0;
  415. }
  416. static void devalarm_triggered(struct devalarm *alarm)
  417. {
  418. unsigned long flags;
  419. uint32_t alarm_type_mask = 1U << alarm->type;
  420. alarm_dbg(INT, "%s: type %d\n", __func__, alarm->type);
  421. spin_lock_irqsave(&alarm_slock, flags);
  422. if (alarm_enabled & alarm_type_mask) {
  423. __pm_wakeup_event(&alarm_wake_lock, 5000); /* 5secs */
  424. alarm_enabled &= ~alarm_type_mask;
  425. alarm_pending |= alarm_type_mask;
  426. wake_up(&alarm_wait_queue);
  427. }
  428. spin_unlock_irqrestore(&alarm_slock, flags);
  429. }
  430. static enum hrtimer_restart devalarm_hrthandler(struct hrtimer *hrt)
  431. {
  432. struct devalarm *devalrm = container_of(hrt, struct devalarm, u.hrt);
  433. alarm_dbg(INT, "devalarm_hrthandler\n");
  434. devalarm_triggered(devalrm);
  435. return HRTIMER_NORESTART;
  436. }
  437. static enum alarmtimer_restart devalarm_alarmhandler(struct alarm *alrm,
  438. ktime_t now)
  439. {
  440. struct devalarm *devalrm = container_of(alrm, struct devalarm, u.alrm);
  441. alarm_dbg(INT, "devalarm_alarmhandler\n");
  442. devalarm_triggered(devalrm);
  443. return ALARMTIMER_NORESTART;
  444. }
  445. static const struct file_operations alarm_fops = {
  446. .owner = THIS_MODULE,
  447. .unlocked_ioctl = alarm_ioctl,
  448. .open = alarm_open,
  449. .release = alarm_release,
  450. #ifdef CONFIG_COMPAT
  451. .compat_ioctl = alarm_compat_ioctl,
  452. #endif
  453. };
  454. static struct miscdevice alarm_device = {
  455. .minor = MISC_DYNAMIC_MINOR,
  456. .name = "alarm",
  457. .fops = &alarm_fops,
  458. };
  459. static int __init alarm_dev_init(void)
  460. {
  461. int err;
  462. int i;
  463. err = misc_register(&alarm_device);
  464. if (err)
  465. return err;
  466. alarm_init(&alarms[ANDROID_ALARM_RTC_WAKEUP].u.alrm,
  467. ALARM_REALTIME, devalarm_alarmhandler);
  468. hrtimer_init(&alarms[ANDROID_ALARM_RTC].u.hrt,
  469. CLOCK_REALTIME, HRTIMER_MODE_ABS);
  470. alarm_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP].u.alrm,
  471. ALARM_BOOTTIME, devalarm_alarmhandler);
  472. hrtimer_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME].u.hrt,
  473. CLOCK_BOOTTIME, HRTIMER_MODE_ABS);
  474. hrtimer_init(&alarms[ANDROID_ALARM_SYSTEMTIME].u.hrt,
  475. CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
  476. for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) {
  477. alarms[i].type = i;
  478. if (!is_wakeup(i))
  479. alarms[i].u.hrt.function = devalarm_hrthandler;
  480. }
  481. wakeup_source_init(&alarm_wake_lock, "alarm");
  482. return 0;
  483. }
  484. static void __exit alarm_dev_exit(void)
  485. {
  486. misc_deregister(&alarm_device);
  487. wakeup_source_trash(&alarm_wake_lock);
  488. }
  489. module_init(alarm_dev_init);
  490. module_exit(alarm_dev_exit);