Merge branch 'fortglx/3.9/time' of git://git.linaro.org/people/jstultz/linux into timers/core
diff --git a/include/linux/time.h b/include/linux/time.h index 476e1d7..a3ab6a8 100644 --- a/include/linux/time.h +++ b/include/linux/time.h
@@ -128,6 +128,7 @@ 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;
diff --git a/kernel/time.c b/kernel/time.c index d226c6a..c2a27dd 100644 --- a/kernel/time.c +++ b/kernel/time.c
@@ -115,6 +115,12 @@ } /* + * 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 @@ 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); }
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 313b161..b10a42b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c
@@ -511,13 +511,17 @@ 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 }