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>
This commit is contained in:
parent
3565184ed0
commit
6cffe00f7d
@ -44,10 +44,14 @@ struct alarm {
|
|||||||
void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
|
void alarm_init(struct alarm *alarm, enum alarmtimer_type type,
|
||||||
enum alarmtimer_restart (*function)(struct alarm *, ktime_t));
|
enum alarmtimer_restart (*function)(struct alarm *, ktime_t));
|
||||||
int alarm_start(struct alarm *alarm, ktime_t start);
|
int alarm_start(struct alarm *alarm, ktime_t start);
|
||||||
|
int alarm_start_relative(struct alarm *alarm, ktime_t start);
|
||||||
|
void alarm_restart(struct alarm *alarm);
|
||||||
int alarm_try_to_cancel(struct alarm *alarm);
|
int alarm_try_to_cancel(struct alarm *alarm);
|
||||||
int alarm_cancel(struct alarm *alarm);
|
int alarm_cancel(struct alarm *alarm);
|
||||||
|
|
||||||
u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
|
u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval);
|
||||||
|
u64 alarm_forward_now(struct alarm *alarm, ktime_t interval);
|
||||||
|
ktime_t alarm_expires_remaining(const struct alarm *alarm);
|
||||||
|
|
||||||
/* Provide way to access the rtc device being used by alarmtimers */
|
/* Provide way to access the rtc device being used by alarmtimers */
|
||||||
struct rtc_device *alarmtimer_get_rtcdev(void);
|
struct rtc_device *alarmtimer_get_rtcdev(void);
|
||||||
|
@ -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
|
#ifdef CONFIG_RTC_CLASS
|
||||||
/**
|
/**
|
||||||
* alarmtimer_suspend - Suspend time callback
|
* 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
|
* @alarm: ptr to alarm to set
|
||||||
* @start: time to run the alarm
|
* @start: time to run the alarm
|
||||||
*/
|
*/
|
||||||
@ -324,6 +330,31 @@ int alarm_start(struct alarm *alarm, ktime_t start)
|
|||||||
return ret;
|
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_try_to_cancel - Tries to cancel an alarm timer
|
||||||
* @alarm: ptr to alarm to be canceled
|
* @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;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user