diff options
Diffstat (limited to 'kernel/time/alarmtimer.c')
| -rw-r--r-- | kernel/time/alarmtimer.c | 24 | 
1 files changed, 20 insertions, 4 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index eec50fcef9e..fe75444ae7e 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -490,7 +490,7 @@ static int alarm_clock_getres(const clockid_t which_clock, struct timespec *tp)  	clockid_t baseid = alarm_bases[clock2alarm(which_clock)].base_clockid;  	if (!alarmtimer_get_rtcdev()) -		return -ENOTSUPP; +		return -EINVAL;  	return hrtimer_get_res(baseid, tp);  } @@ -507,7 +507,7 @@ static int alarm_clock_get(clockid_t which_clock, struct timespec *tp)  	struct alarm_base *base = &alarm_bases[clock2alarm(which_clock)];  	if (!alarmtimer_get_rtcdev()) -		return -ENOTSUPP; +		return -EINVAL;  	*tp = ktime_to_timespec(base->gettime());  	return 0; @@ -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;  | 
