|
@@ -66,7 +66,7 @@ static int rtc_suspend(struct device *dev, pm_message_t mesg)
|
|
*/
|
|
*/
|
|
delta = timespec_sub(old_system, old_rtc);
|
|
delta = timespec_sub(old_system, old_rtc);
|
|
delta_delta = timespec_sub(delta, old_delta);
|
|
delta_delta = timespec_sub(delta, old_delta);
|
|
- if (abs(delta_delta.tv_sec) >= 2) {
|
|
|
|
|
|
+ if (delta_delta.tv_sec < -2 || delta_delta.tv_sec >= 2) {
|
|
/*
|
|
/*
|
|
* if delta_delta is too large, assume time correction
|
|
* if delta_delta is too large, assume time correction
|
|
* has occured and set old_delta to the current delta.
|
|
* has occured and set old_delta to the current delta.
|
|
@@ -100,9 +100,8 @@ static int rtc_resume(struct device *dev)
|
|
rtc_tm_to_time(&tm, &new_rtc.tv_sec);
|
|
rtc_tm_to_time(&tm, &new_rtc.tv_sec);
|
|
new_rtc.tv_nsec = 0;
|
|
new_rtc.tv_nsec = 0;
|
|
|
|
|
|
- if (new_rtc.tv_sec <= old_rtc.tv_sec) {
|
|
|
|
- if (new_rtc.tv_sec < old_rtc.tv_sec)
|
|
|
|
- pr_debug("%s: time travel!\n", dev_name(&rtc->dev));
|
|
|
|
|
|
+ if (new_rtc.tv_sec < old_rtc.tv_sec) {
|
|
|
|
+ pr_debug("%s: time travel!\n", dev_name(&rtc->dev));
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -119,7 +118,8 @@ static int rtc_resume(struct device *dev)
|
|
sleep_time = timespec_sub(sleep_time,
|
|
sleep_time = timespec_sub(sleep_time,
|
|
timespec_sub(new_system, old_system));
|
|
timespec_sub(new_system, old_system));
|
|
|
|
|
|
- timekeeping_inject_sleeptime(&sleep_time);
|
|
|
|
|
|
+ if (sleep_time.tv_sec >= 0)
|
|
|
|
+ timekeeping_inject_sleeptime(&sleep_time);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|