Merge branch 'fortglx/3.9/time' of git://git.linaro.org/people/jstultz/linux into...
authorThomas Gleixner <tglx@linutronix.de>
Thu, 14 Feb 2013 18:46:10 +0000 (19:46 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 14 Feb 2013 18:46:10 +0000 (19:46 +0100)
include/linux/time.h
kernel/time.c
kernel/time/ntp.c

index 476e1d7b2c3755a728ce538e0ed31137481f47c5..a3ab6a814a9cb0d6093875b36d0e62207fefb09e 100644 (file)
@@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void)
 
 extern void read_persistent_clock(struct timespec *ts);
 extern void read_boot_clock(struct timespec *ts);
+extern int persistent_clock_is_local;
 extern int update_persistent_clock(struct timespec now);
 void timekeeping_init(void);
 extern int timekeeping_suspended;
index d226c6a3fd28933d02edd485a9c8353db2212c02..c2a27dd93142545369abefa1d2ee2a41a5eb8f09 100644 (file)
@@ -114,6 +114,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
        return 0;
 }
 
+/*
+ * Indicates if there is an offset between the system clock and the hardware
+ * clock/persistent clock/rtc.
+ */
+int persistent_clock_is_local;
+
 /*
  * Adjust the time obtained from the CMOS to be UTC time instead of
  * local time.
@@ -135,6 +141,8 @@ static inline void warp_clock(void)
        struct timespec adjust;
 
        adjust = current_kernel_time();
+       if (sys_tz.tz_minuteswest != 0)
+               persistent_clock_is_local = 1;
        adjust.tv_sec += sys_tz.tz_minuteswest * 60;
        do_settimeofday(&adjust);
 }
index 313b161504b7fab416558193367991aeb06477c6..b10a42bb0165a40a9398fd639a2da2dc0c5acd4e 100644 (file)
@@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work)
 
        getnstimeofday(&now);
        if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) {
+               struct timespec adjust = now;
+
                fail = -ENODEV;
+               if (persistent_clock_is_local)
+                       adjust.tv_sec -= (sys_tz.tz_minuteswest * 60);
 #ifdef CONFIG_GENERIC_CMOS_UPDATE
-               fail = update_persistent_clock(now);
+               fail = update_persistent_clock(adjust);
 #endif
 #ifdef CONFIG_RTC_SYSTOHC
                if (fail == -ENODEV)
-                       fail = rtc_set_ntp_time(now);
+                       fail = rtc_set_ntp_time(adjust);
 #endif
        }