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 f11d83b1294..eec50fcef9e 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -199,6 +199,13 @@ static enum hrtimer_restart alarmtimer_fired(struct hrtimer *timer)  } +ktime_t alarm_expires_remaining(const struct alarm *alarm) +{ +	struct alarm_base *base = &alarm_bases[alarm->type]; +	return ktime_sub(alarm->node.expires, base->gettime()); +} +EXPORT_SYMBOL_GPL(alarm_expires_remaining); +  #ifdef CONFIG_RTC_CLASS  /**   * alarmtimer_suspend - Suspend time callback @@ -303,9 +310,10 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type,  	alarm->type = type;  	alarm->state = ALARMTIMER_STATE_INACTIVE;  } +EXPORT_SYMBOL_GPL(alarm_init);  /** - * alarm_start - Sets an alarm to fire + * alarm_start - Sets an absolute alarm to fire   * @alarm: ptr to alarm to set   * @start: time to run the alarm   */ @@ -323,6 +331,34 @@ int alarm_start(struct alarm *alarm, ktime_t start)  	spin_unlock_irqrestore(&base->lock, flags);  	return ret;  } +EXPORT_SYMBOL_GPL(alarm_start); + +/** + * alarm_start_relative - Sets a relative alarm to fire + * @alarm: ptr to alarm to set + * @start: time relative to now to run the alarm + */ +int alarm_start_relative(struct alarm *alarm, ktime_t start) +{ +	struct alarm_base *base = &alarm_bases[alarm->type]; + +	start = ktime_add(start, base->gettime()); +	return alarm_start(alarm, start); +} +EXPORT_SYMBOL_GPL(alarm_start_relative); + +void alarm_restart(struct alarm *alarm) +{ +	struct alarm_base *base = &alarm_bases[alarm->type]; +	unsigned long flags; + +	spin_lock_irqsave(&base->lock, flags); +	hrtimer_set_expires(&alarm->timer, alarm->node.expires); +	hrtimer_restart(&alarm->timer); +	alarmtimer_enqueue(base, alarm); +	spin_unlock_irqrestore(&base->lock, flags); +} +EXPORT_SYMBOL_GPL(alarm_restart);  /**   * alarm_try_to_cancel - Tries to cancel an alarm timer @@ -344,6 +380,7 @@ int alarm_try_to_cancel(struct alarm *alarm)  	spin_unlock_irqrestore(&base->lock, flags);  	return ret;  } +EXPORT_SYMBOL_GPL(alarm_try_to_cancel);  /** @@ -361,6 +398,7 @@ int alarm_cancel(struct alarm *alarm)  		cpu_relax();  	}  } +EXPORT_SYMBOL_GPL(alarm_cancel);  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)  	alarm->node.expires = ktime_add(alarm->node.expires, interval);  	return overrun;  } +EXPORT_SYMBOL_GPL(alarm_forward); +u64 alarm_forward_now(struct alarm *alarm, ktime_t interval) +{ +	struct alarm_base *base = &alarm_bases[alarm->type]; +	return alarm_forward(alarm, base->gettime(), interval); +} +EXPORT_SYMBOL_GPL(alarm_forward_now);  /** | 
