Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: android-alarm: Convert ALARM_ELAPSED_REALTIME to use CLOCK_BOOTTIME

The ALARM_ELAPSED_REALTIME clock domain in Android pointed
to the need for something similar in linux system-wide
(instead of limited to just the alarm interface).

Thus CLOCK_BOOTTIME was introduced into the upstream kernel
in 2.6.39.

This patch attempts to convert the android alarm timer to utilize
the kernel's CLOCK_BOOTTIME clockid for ALARM_ELAPSED_REALTIME,
instead of managing it itself.

CC: Colin Cross <ccross@android.com>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Android Kernel Team <kernel-team@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

John Stultz and committed by
Greg Kroah-Hartman
e2d8ccef 8f9064a8

+22 -58
+1 -2
drivers/staging/android/alarm-dev.c
··· 179 179 break; 180 180 case ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP: 181 181 case ANDROID_ALARM_ELAPSED_REALTIME: 182 - tmp_time = 183 - ktime_to_timespec(alarm_get_elapsed_realtime()); 182 + get_monotonic_boottime(&tmp_time); 184 183 break; 185 184 case ANDROID_ALARM_TYPE_COUNT: 186 185 case ANDROID_ALARM_SYSTEMTIME:
+15 -55
drivers/staging/android/alarm.c
··· 65 65 struct rb_root alarms; 66 66 struct rb_node *first; 67 67 struct hrtimer timer; 68 - ktime_t delta; 69 68 bool stopped; 70 69 ktime_t stopped_time; 71 70 }; ··· 106 107 } 107 108 108 109 hrtimer_try_to_cancel(&base->timer); 109 - base->timer.node.expires = ktime_add(base->delta, alarm->expires); 110 - base->timer._softexpires = ktime_add(base->delta, alarm->softexpires); 110 + base->timer.node.expires = alarm->expires; 111 + base->timer._softexpires = alarm->softexpires; 111 112 hrtimer_start_expires(&base->timer, HRTIMER_MODE_ABS); 112 113 } 113 114 ··· 278 279 alarms[i].stopped = true; 279 280 alarms[i].stopped_time = timespec_to_ktime(tmp_time); 280 281 } 281 - alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP].delta = 282 - alarms[ANDROID_ALARM_ELAPSED_REALTIME].delta = 283 - ktime_sub(alarms[ANDROID_ALARM_ELAPSED_REALTIME].delta, 284 - timespec_to_ktime(timespec_sub(tmp_time, new_time))); 285 282 spin_unlock_irqrestore(&alarm_slock, flags); 286 283 ret = do_settimeofday(&new_time); 287 284 spin_lock_irqsave(&alarm_slock, flags); ··· 305 310 return ret; 306 311 } 307 312 308 - /** 309 - * alarm_get_elapsed_realtime - get the elapsed real time in ktime_t format 310 - * 311 - * returns the time in ktime_t format 312 - */ 313 - ktime_t alarm_get_elapsed_realtime(void) 314 - { 315 - ktime_t now; 316 - unsigned long flags; 317 - struct alarm_queue *base = &alarms[ANDROID_ALARM_ELAPSED_REALTIME]; 318 - 319 - spin_lock_irqsave(&alarm_slock, flags); 320 - now = base->stopped ? base->stopped_time : ktime_get_real(); 321 - now = ktime_sub(now, base->delta); 322 - spin_unlock_irqrestore(&alarm_slock, flags); 323 - return now; 324 - } 325 - 326 313 static enum hrtimer_restart alarm_timer_triggered(struct hrtimer *timer) 327 314 { 328 315 struct alarm_queue *base; ··· 316 339 317 340 base = container_of(timer, struct alarm_queue, timer); 318 341 now = base->stopped ? base->stopped_time : hrtimer_cb_get_time(timer); 319 - now = ktime_sub(now, base->delta); 320 342 321 343 pr_alarm(INT, "alarm_timer_triggered type %td at %lld\n", 322 344 base - alarms, ktime_to_ns(now)); ··· 512 536 } 513 537 }; 514 538 515 - static int __init alarm_late_init(void) 516 - { 517 - unsigned long flags; 518 - struct timespec tmp_time, system_time; 519 - 520 - /* this needs to run after the rtc is read at boot */ 521 - spin_lock_irqsave(&alarm_slock, flags); 522 - /* We read the current rtc and system time so we can later calculate 523 - * elasped realtime to be (boot_systemtime + rtc - boot_rtc) == 524 - * (rtc - (boot_rtc - boot_systemtime)) 525 - */ 526 - getnstimeofday(&tmp_time); 527 - ktime_get_ts(&system_time); 528 - alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP].delta = 529 - alarms[ANDROID_ALARM_ELAPSED_REALTIME].delta = 530 - timespec_to_ktime(timespec_sub(tmp_time, system_time)); 531 - 532 - spin_unlock_irqrestore(&alarm_slock, flags); 533 - return 0; 534 - } 535 - 536 539 static int __init alarm_driver_init(void) 537 540 { 538 541 int err; 539 542 int i; 540 543 541 - for (i = 0; i < ANDROID_ALARM_SYSTEMTIME; i++) { 542 - hrtimer_init(&alarms[i].timer, 543 - CLOCK_REALTIME, HRTIMER_MODE_ABS); 544 - alarms[i].timer.function = alarm_timer_triggered; 545 - } 544 + hrtimer_init(&alarms[ANDROID_ALARM_RTC_WAKEUP].timer, 545 + CLOCK_REALTIME, HRTIMER_MODE_ABS); 546 + hrtimer_init(&alarms[ANDROID_ALARM_RTC].timer, 547 + CLOCK_REALTIME, HRTIMER_MODE_ABS); 548 + hrtimer_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP].timer, 549 + CLOCK_BOOTTIME, HRTIMER_MODE_ABS); 550 + hrtimer_init(&alarms[ANDROID_ALARM_ELAPSED_REALTIME].timer, 551 + CLOCK_BOOTTIME, HRTIMER_MODE_ABS); 546 552 hrtimer_init(&alarms[ANDROID_ALARM_SYSTEMTIME].timer, 547 - CLOCK_MONOTONIC, HRTIMER_MODE_ABS); 548 - alarms[ANDROID_ALARM_SYSTEMTIME].timer.function = alarm_timer_triggered; 553 + CLOCK_MONOTONIC, HRTIMER_MODE_ABS); 554 + 555 + for (i = 0; i < ANDROID_ALARM_TYPE_COUNT; i++) 556 + alarms[i].timer.function = alarm_timer_triggered; 557 + 549 558 err = platform_driver_register(&alarm_driver); 550 559 if (err < 0) 551 560 goto err1; ··· 556 595 platform_driver_unregister(&alarm_driver); 557 596 } 558 597 559 - late_initcall(alarm_late_init); 560 598 module_init(alarm_driver_init); 561 599 module_exit(alarm_exit); 562 600
+6 -1
drivers/staging/android/android_alarm.h
··· 37 37 38 38 #include <linux/ktime.h> 39 39 #include <linux/rbtree.h> 40 + #include <linux/hrtimer.h> 40 41 41 42 /* 42 43 * The alarm interface is similar to the hrtimer interface but adds support ··· 72 71 ktime_t end); 73 72 int android_alarm_try_to_cancel(struct android_alarm *alarm); 74 73 int android_alarm_cancel(struct android_alarm *alarm); 75 - ktime_t alarm_get_elapsed_realtime(void); 74 + 75 + static inline ktime_t alarm_get_elapsed_realtime(void) 76 + { 77 + return ktime_get_boottime(); 78 + } 76 79 77 80 /* set rtc while preserving elapsed realtime */ 78 81 int android_alarm_set_rtc(const struct timespec ts);