Commit 9f4646d2 authored by Thomas Gleixner's avatar Thomas Gleixner

Merge branch 'fortglx/3.9/time' of git://git.linaro.org/people/jstultz/linux into timers/core

parents 86c8ead5 84e345e4
...@@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void) ...@@ -128,6 +128,7 @@ static inline bool has_persistent_clock(void)
extern void read_persistent_clock(struct timespec *ts); extern void read_persistent_clock(struct timespec *ts);
extern void read_boot_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); extern int update_persistent_clock(struct timespec now);
void timekeeping_init(void); void timekeeping_init(void);
extern int timekeeping_suspended; extern int timekeeping_suspended;
......
...@@ -114,6 +114,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv, ...@@ -114,6 +114,12 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
return 0; 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 * Adjust the time obtained from the CMOS to be UTC time instead of
* local time. * local time.
...@@ -135,6 +141,8 @@ static inline void warp_clock(void) ...@@ -135,6 +141,8 @@ static inline void warp_clock(void)
struct timespec adjust; struct timespec adjust;
adjust = current_kernel_time(); adjust = current_kernel_time();
if (sys_tz.tz_minuteswest != 0)
persistent_clock_is_local = 1;
adjust.tv_sec += sys_tz.tz_minuteswest * 60; adjust.tv_sec += sys_tz.tz_minuteswest * 60;
do_settimeofday(&adjust); do_settimeofday(&adjust);
} }
......
...@@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work) ...@@ -511,13 +511,17 @@ static void sync_cmos_clock(struct work_struct *work)
getnstimeofday(&now); 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 / 2) {
struct timespec adjust = now;
fail = -ENODEV; fail = -ENODEV;
if (persistent_clock_is_local)
adjust.tv_sec -= (sys_tz.tz_minuteswest * 60);
#ifdef CONFIG_GENERIC_CMOS_UPDATE #ifdef CONFIG_GENERIC_CMOS_UPDATE
fail = update_persistent_clock(now); fail = update_persistent_clock(adjust);
#endif #endif
#ifdef CONFIG_RTC_SYSTOHC #ifdef CONFIG_RTC_SYSTOHC
if (fail == -ENODEV) if (fail == -ENODEV)
fail = rtc_set_ntp_time(now); fail = rtc_set_ntp_time(adjust);
#endif #endif
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment