]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branch 'fortglx/3.12/time' into fortglx/3.13/time
authorJohn Stultz <john.stultz@linaro.org>
Tue, 17 Sep 2013 01:54:07 +0000 (18:54 -0700)
committerJohn Stultz <john.stultz@linaro.org>
Tue, 17 Sep 2013 01:54:07 +0000 (18:54 -0700)
Merge in the timekeeping changes that missed 3.12

Signed-off-by: John Stultz <john.stultz@linaro.org>
drivers/rtc/interface.c
kernel/time/clocksource.c
kernel/time/ntp.c

index 72c5cdbe0791afd2fed9a4779e5769c82c6b6ba3..544be722937cb5676c604ee1f586d289df09611c 100644 (file)
@@ -72,6 +72,7 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
        } else
                err = -EINVAL;
 
+       pm_stay_awake(rtc->dev.parent);
        mutex_unlock(&rtc->ops_lock);
        /* A timer might have just expired */
        schedule_work(&rtc->irqwork);
@@ -113,6 +114,7 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
                err = -EINVAL;
        }
 
+       pm_stay_awake(rtc->dev.parent);
        mutex_unlock(&rtc->ops_lock);
        /* A timer might have just expired */
        schedule_work(&rtc->irqwork);
@@ -771,9 +773,10 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
                alarm.time = rtc_ktime_to_tm(timer->node.expires);
                alarm.enabled = 1;
                err = __rtc_set_alarm(rtc, &alarm);
-               if (err == -ETIME)
+               if (err == -ETIME) {
+                       pm_stay_awake(rtc->dev.parent);
                        schedule_work(&rtc->irqwork);
-               else if (err) {
+               else if (err) {
                        timerqueue_del(&rtc->timerqueue, &timer->node);
                        timer->enabled = 0;
                        return err;
@@ -818,8 +821,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
                alarm.time = rtc_ktime_to_tm(next->expires);
                alarm.enabled = 1;
                err = __rtc_set_alarm(rtc, &alarm);
-               if (err == -ETIME)
+               if (err == -ETIME) {
+                       pm_stay_awake(rtc->dev.parent);
                        schedule_work(&rtc->irqwork);
+               }
        }
 }
 
@@ -845,7 +850,6 @@ void rtc_timer_do_work(struct work_struct *work)
 
        mutex_lock(&rtc->ops_lock);
 again:
-       pm_relax(rtc->dev.parent);
        __rtc_read_time(rtc, &tm);
        now = rtc_tm_to_ktime(tm);
        while ((next = timerqueue_getnext(&rtc->timerqueue))) {
@@ -880,6 +884,7 @@ again:
        } else
                rtc_alarm_disable(rtc);
 
+       pm_relax(rtc->dev.parent);
        mutex_unlock(&rtc->ops_lock);
 }
 
index 637a14af6c21ec32655bf7c1f84e55c411dcafb6..64cf63ca09cc58be75bcba8dd03f6133705d94fc 100644 (file)
@@ -479,6 +479,7 @@ static inline void clocksource_dequeue_watchdog(struct clocksource *cs) { }
 static inline void clocksource_resume_watchdog(void) { }
 static inline int __clocksource_watchdog_kthread(void) { return 0; }
 static bool clocksource_is_watchdog(struct clocksource *cs) { return false; }
+void clocksource_mark_unstable(struct clocksource *cs) { }
 
 #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */
 
index 8f5b3b98577b797663f8057762b6248d0fae1823..ab1fa7cb8912d3f682b82ad52520f82ec8dee0b8 100644 (file)
@@ -475,6 +475,7 @@ static void sync_cmos_clock(struct work_struct *work)
         * called as close as possible to 500 ms before the new second starts.
         * This code is run on a timer.  If the clock is set, that timer
         * may not expire at the correct time.  Thus, we adjust...
+        * We want the clock to be within a couple of ticks from the target.
         */
        if (!ntp_synced()) {
                /*
@@ -485,7 +486,7 @@ static void sync_cmos_clock(struct work_struct *work)
        }
 
        getnstimeofday(&now);
-       if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) {
+       if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec * 5) {
                struct timespec adjust = now;
 
                fail = -ENODEV;