diff options
Diffstat (limited to 'kernel/time/ntp.c')
| -rw-r--r-- | kernel/time/ntp.c | 22 | 
1 files changed, 17 insertions, 5 deletions
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 24174b4d669..b10a42bb016 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c @@ -15,6 +15,7 @@  #include <linux/time.h>  #include <linux/mm.h>  #include <linux/module.h> +#include <linux/rtc.h>  #include "tick-internal.h" @@ -483,8 +484,7 @@ out:  	return leap;  } -#ifdef CONFIG_GENERIC_CMOS_UPDATE - +#if defined(CONFIG_GENERIC_CMOS_UPDATE) || defined(CONFIG_RTC_SYSTOHC)  static void sync_cmos_clock(struct work_struct *work);  static DECLARE_DELAYED_WORK(sync_cmos_work, sync_cmos_clock); @@ -510,14 +510,26 @@ static void sync_cmos_clock(struct work_struct *work)  	}  	getnstimeofday(&now); -	if (abs(now.tv_nsec - (NSEC_PER_SEC / 2)) <= tick_nsec / 2) -		fail = update_persistent_clock(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(adjust); +#endif +#ifdef CONFIG_RTC_SYSTOHC +		if (fail == -ENODEV) +			fail = rtc_set_ntp_time(adjust); +#endif +	}  	next.tv_nsec = (NSEC_PER_SEC / 2) - now.tv_nsec - (TICK_NSEC / 2);  	if (next.tv_nsec <= 0)  		next.tv_nsec += NSEC_PER_SEC; -	if (!fail) +	if (!fail || fail == -ENODEV)  		next.tv_sec = 659;  	else  		next.tv_sec = 0;  |