diff options
author | Todd Poynor <toddpoynor@google.com> | 2013-05-15 17:38:11 -0400 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2013-05-29 15:57:34 -0400 |
commit | 6cffe00f7d4e24679eae6b7aae4caaf915288256 (patch) | |
tree | 3613480b8eefec8b865ba9d3acbb8ecb7ffe4def /kernel | |
parent | 3565184ed0c1ea46bea5b792da5f72a83c43e49b (diff) |
alarmtimer: Add functions for timerfd support
Add functions needed for hooking up alarmtimer to timerfd:
* alarm_restart: Similar to hrtimer_restart, restart an alarmtimer after
the expires time has already been updated (as with alarm_forward).
* alarm_forward_now: Similar to hrtimer_forward_now, move the expires
time forward to an interval from the current time of the associated clock.
* alarm_start_relative: Start an alarmtimer with an expires time relative to
the current time of the associated clock.
* alarm_expires_remaining: Similar to hrtimer_expires_remaining, return the
amount of time remaining until alarm expiry.
Signed-off-by: Todd Poynor <toddpoynor@google.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/alarmtimer.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index f11d83b12949..3e5cba274475 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c | |||
@@ -199,6 +199,12 @@ static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer) | |||
199 | 199 | ||
200 | } | 200 | } |
201 | 201 | ||
202 | ktime_t alarm_expires_remaining(const struct alarm *alarm) | ||
203 | { | ||
204 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
205 | return ktime_sub(alarm->node.expires, base->gettime()); | ||
206 | } | ||
207 | |||
202 | #ifdef CONFIG_RTC_CLASS | 208 | #ifdef CONFIG_RTC_CLASS |
203 | /** | 209 | /** |
204 | * alarmtimer_suspend - Suspend time callback | 210 | * alarmtimer_suspend - Suspend time callback |
@@ -305,7 +311,7 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type, | |||
305 | } | 311 | } |
306 | 312 | ||
307 | /** | 313 | /** |
308 | * alarm_start - Sets an alarm to fire | 314 | * alarm_start - Sets an absolute alarm to fire |
309 | * @alarm: ptr to alarm to set | 315 | * @alarm: ptr to alarm to set |
310 | * @start: time to run the alarm | 316 | * @start: time to run the alarm |
311 | */ | 317 | */ |
@@ -325,6 +331,31 @@ int alarm_start(struct alarm *alarm, ktime_t start) | |||
325 | } | 331 | } |
326 | 332 | ||
327 | /** | 333 | /** |
334 | * alarm_start_relative - Sets a relative alarm to fire | ||
335 | * @alarm: ptr to alarm to set | ||
336 | * @start: time relative to now to run the alarm | ||
337 | */ | ||
338 | int alarm_start_relative(struct alarm *alarm, ktime_t start) | ||
339 | { | ||
340 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
341 | |||
342 | start = ktime_add(start, base->gettime()); | ||
343 | return alarm_start(alarm, start); | ||
344 | } | ||
345 | |||
346 | void alarm_restart(struct alarm *alarm) | ||
347 | { | ||
348 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
349 | unsigned long flags; | ||
350 | |||
351 | spin_lock_irqsave(&base->lock, flags); | ||
352 | hrtimer_set_expires(&alarm->timer, alarm->node.expires); | ||
353 | hrtimer_restart(&alarm->timer); | ||
354 | alarmtimer_enqueue(base, alarm); | ||
355 | spin_unlock_irqrestore(&base->lock, flags); | ||
356 | } | ||
357 | |||
358 | /** | ||
328 | * alarm_try_to_cancel - Tries to cancel an alarm timer | 359 | * alarm_try_to_cancel - Tries to cancel an alarm timer |
329 | * @alarm: ptr to alarm to be canceled | 360 | * @alarm: ptr to alarm to be canceled |
330 | * | 361 | * |
@@ -394,6 +425,12 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval) | |||
394 | return overrun; | 425 | return overrun; |
395 | } | 426 | } |
396 | 427 | ||
428 | u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) | ||
429 | { | ||
430 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
431 | |||
432 | return alarm_forward(alarm, base->gettime(), interval); | ||
433 | } | ||
397 | 434 | ||
398 | 435 | ||
399 | 436 | ||