summaryrefslogtreecommitdiff
path: root/kernel/time/alarmtimer.c
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2014-07-22 09:17:18 -0700
committerOlof Johansson <olof@lixom.net>2014-07-22 09:17:18 -0700
commite9a86d96be0dff611156ea89fbb6eb91478bddab (patch)
treead38c21c76e1c275264cb20482a7f2bdd54618ba /kernel/time/alarmtimer.c
parentfc3791f3a95df5b76ecbda6952c13ff67251fd10 (diff)
parentad8adbf2c7d6269d0100f7f460f4837ece060977 (diff)
Merge tag 'sti-defconfig-for-v3.17-1' of git://git.stlinux.com/devel/kernel/linux-sti into next/defconfig
Merge "ARM: STi: defconfig changes for v3.17" from Maxime Coquelin: STi defconfig updates for v3.17 - Enable ST's Thermal controller driver - Enable ST's Keyscan driver - Enable ST's MiPHY365 Phy driver for STiH416 SATA & PCIe - Enable ST's AHCI driver. * tag 'sti-defconfig-for-v3.17-1' of git://git.stlinux.com/devel/kernel/linux-sti: ARM: multi_v7_defconfig: Enable MiPHY365x - ST's Generic (SATA & PCIe) PHY ARM: multi_v7_defconfig: Enable ST's (S)ATA driver ARM: multi_v7_defconfig: add ST Keyscan driver ARM: update multi_v7_defconfig for STI ARM: multi_v7_defconfig: Configure in ST's Thermal Controller + Linux 3.16-rc6 Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'kernel/time/alarmtimer.c')
-rw-r--r--kernel/time/alarmtimer.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 88c9c65a430d..fe75444ae7ec 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -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;