|
@@ -199,6 +199,12 @@ 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());
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_RTC_CLASS
|
|
|
/**
|
|
|
* alarmtimer_suspend - Suspend time callback
|
|
@@ -305,7 +311,7 @@ void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 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
|
|
|
*/
|
|
@@ -324,6 +330,31 @@ int alarm_start(struct alarm *alarm, ktime_t start)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 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);
|
|
|
+}
|
|
|
+
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* alarm_try_to_cancel - Tries to cancel an alarm timer
|
|
|
* @alarm: ptr to alarm to be canceled
|
|
@@ -394,6 +425,12 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval)
|
|
|
return overrun;
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
|
|
|
|
|
|
|