|
@@ -585,9 +585,14 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
|
|
|
struct itimerspec *new_setting,
|
|
|
struct itimerspec *old_setting)
|
|
|
{
|
|
|
+ ktime_t exp;
|
|
|
+
|
|
|
if (!rtcdev)
|
|
|
return -ENOTSUPP;
|
|
|
|
|
|
+ if (flags & ~TIMER_ABSTIME)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
if (old_setting)
|
|
|
alarm_timer_get(timr, old_setting);
|
|
|
|
|
@@ -597,8 +602,16 @@ static int alarm_timer_set(struct k_itimer *timr, int flags,
|
|
|
|
|
|
/* start the timer */
|
|
|
timr->it.alarm.interval = timespec_to_ktime(new_setting->it_interval);
|
|
|
- alarm_start(&timr->it.alarm.alarmtimer,
|
|
|
- timespec_to_ktime(new_setting->it_value));
|
|
|
+ exp = timespec_to_ktime(new_setting->it_value);
|
|
|
+ /* Convert (if necessary) to absolute time */
|
|
|
+ if (flags != TIMER_ABSTIME) {
|
|
|
+ ktime_t now;
|
|
|
+
|
|
|
+ now = alarm_bases[timr->it.alarm.alarmtimer.type].gettime();
|
|
|
+ exp = ktime_add(now, exp);
|
|
|
+ }
|
|
|
+
|
|
|
+ alarm_start(&timr->it.alarm.alarmtimer, exp);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -730,6 +743,9 @@ static int alarm_timer_nsleep(const clockid_t which_clock, int flags,
|
|
|
if (!alarmtimer_get_rtcdev())
|
|
|
return -ENOTSUPP;
|
|
|
|
|
|
+ if (flags & ~TIMER_ABSTIME)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
if (!capable(CAP_WAKE_ALARM))
|
|
|
return -EPERM;
|
|
|
|