diff options
Diffstat (limited to 'kernel/time/alarmtimer.c')
| -rw-r--r-- | kernel/time/alarmtimer.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index f11d83b12949..eec50fcef9e4 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c | |||
| @@ -199,6 +199,13 @@ 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 | EXPORT_SYMBOL_GPL(alarm_expires_remaining); | ||
| 208 | |||
| 202 | #ifdef CONFIG_RTC_CLASS | 209 | #ifdef CONFIG_RTC_CLASS |
| 203 | /** | 210 | /** |
| 204 | * alarmtimer_suspend - Suspend time callback | 211 | * alarmtimer_suspend - Suspend time callback |
| @@ -303,9 +310,10 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type, | |||
| 303 | alarm->type = type; | 310 | alarm->type = type; |
| 304 | alarm->state = ALARMTIMER_STATE_INACTIVE; | 311 | alarm->state = ALARMTIMER_STATE_INACTIVE; |
| 305 | } | 312 | } |
| 313 | EXPORT_SYMBOL_GPL(alarm_init); | ||
| 306 | 314 | ||
| 307 | /** | 315 | /** |
| 308 | * alarm_start - Sets an alarm to fire | 316 | * alarm_start - Sets an absolute alarm to fire |
| 309 | * @alarm: ptr to alarm to set | 317 | * @alarm: ptr to alarm to set |
| 310 | * @start: time to run the alarm | 318 | * @start: time to run the alarm |
| 311 | */ | 319 | */ |
| @@ -323,6 +331,34 @@ int alarm_start(struct alarm *alarm, ktime_t start) | |||
| 323 | spin_unlock_irqrestore(&base->lock, flags); | 331 | spin_unlock_irqrestore(&base->lock, flags); |
| 324 | return ret; | 332 | return ret; |
| 325 | } | 333 | } |
| 334 | EXPORT_SYMBOL_GPL(alarm_start); | ||
| 335 | |||
| 336 | /** | ||
| 337 | * alarm_start_relative - Sets a relative alarm to fire | ||
| 338 | * @alarm: ptr to alarm to set | ||
| 339 | * @start: time relative to now to run the alarm | ||
| 340 | */ | ||
| 341 | int alarm_start_relative(struct alarm *alarm, ktime_t start) | ||
| 342 | { | ||
| 343 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
| 344 | |||
| 345 | start = ktime_add(start, base->gettime()); | ||
| 346 | return alarm_start(alarm, start); | ||
| 347 | } | ||
| 348 | EXPORT_SYMBOL_GPL(alarm_start_relative); | ||
| 349 | |||
| 350 | void alarm_restart(struct alarm *alarm) | ||
| 351 | { | ||
| 352 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
| 353 | unsigned long flags; | ||
| 354 | |||
| 355 | spin_lock_irqsave(&base->lock, flags); | ||
| 356 | hrtimer_set_expires(&alarm->timer, alarm->node.expires); | ||
| 357 | hrtimer_restart(&alarm->timer); | ||
| 358 | alarmtimer_enqueue(base, alarm); | ||
| 359 | spin_unlock_irqrestore(&base->lock, flags); | ||
| 360 | } | ||
| 361 | EXPORT_SYMBOL_GPL(alarm_restart); | ||
| 326 | 362 | ||
| 327 | /** | 363 | /** |
| 328 | * alarm_try_to_cancel - Tries to cancel an alarm timer | 364 | * alarm_try_to_cancel - Tries to cancel an alarm timer |
| @@ -344,6 +380,7 @@ int alarm_try_to_cancel(struct alarm *alarm) | |||
| 344 | spin_unlock_irqrestore(&base->lock, flags); | 380 | spin_unlock_irqrestore(&base->lock, flags); |
| 345 | return ret; | 381 | return ret; |
| 346 | } | 382 | } |
| 383 | EXPORT_SYMBOL_GPL(alarm_try_to_cancel); | ||
| 347 | 384 | ||
| 348 | 385 | ||
| 349 | /** | 386 | /** |
| @@ -361,6 +398,7 @@ int alarm_cancel(struct alarm *alarm) | |||
| 361 | cpu_relax(); | 398 | cpu_relax(); |
| 362 | } | 399 | } |
| 363 | } | 400 | } |
| 401 | EXPORT_SYMBOL_GPL(alarm_cancel); | ||
| 364 | 402 | ||
| 365 | 403 | ||
| 366 | u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval) | 404 | u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval) |
| @@ -393,8 +431,15 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval) | |||
| 393 | alarm->node.expires = ktime_add(alarm->node.expires, interval); | 431 | alarm->node.expires = ktime_add(alarm->node.expires, interval); |
| 394 | return overrun; | 432 | return overrun; |
| 395 | } | 433 | } |
| 434 | EXPORT_SYMBOL_GPL(alarm_forward); | ||
| 396 | 435 | ||
| 436 | u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) | ||
| 437 | { | ||
| 438 | struct alarm_base *base = &alarm_bases[alarm->type]; | ||
| 397 | 439 | ||
| 440 | return alarm_forward(alarm, base->gettime(), interval); | ||
| 441 | } | ||
| 442 | EXPORT_SYMBOL_GPL(alarm_forward_now); | ||
| 398 | 443 | ||
| 399 | 444 | ||
| 400 | /** | 445 | /** |
