linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
@ 2009-12-23  3:59 john stultz
  2009-12-23  4:00 ` [RFC][PATCH 1/14] Convert alpha " john stultz
  2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
  0 siblings, 2 replies; 26+ messages in thread
From: john stultz @ 2009-12-23  3:59 UTC (permalink / raw)
  To: lkml
  Cc: Richard Henderson, linux-alpha, Russell King, Haavard Skinnemoen,
	Mike Frysinger, Mikael Starvik, David Howells, Yoshinori Sato,
	Tony Luck, Hirokazu Takata, Geert Uytterhoeven, Koichi Yasutake,
	Kyle McMartin, Paul Mundt, David S. Miller

So as the timekeeping system has become more and more generic, folks
have been careful to allow a slow and steady evolution without breaking
all the arches at once, allowing each arch maintainer to convert over to
generic code when they're ready.

However, this slow conversion has forced us to keep multiple methods for
various functionality around, cluttering up the code and making
maintenance more difficult. Further, there's no central road-map or
notification to maintainers on when these new generic functions appear,
so its likely folks wouldn't notice until the old interfaces were
removed.

In this case the generic read_persistent_clock() and
update_persistent_clock() methods have been provided to allow the
generic timekeeping code to initialize xtime and set the persistent
clock when NTP is synced. However many arches haven't converted, so the
generic code has to handle the case where the arch is doing this
management itself.

This patch series tries to convert the following 14 architectures over
to use read_persistent_clock() and update_persistent_clock() as
applicable, killing off about 200 lines of arch specific code.

I'm posting this tonight in somewhat rough form (none of the code has
been compiled or tested) so I can get feedback tomorrow before I'm off
on vacation until the new year. I'd like to get these changes into
2.6.34 so further generic cleanups can be made.

Let me know what you think.

thanks
-john





^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 1/14] Convert alpha to read/update_persistent_clock
  2009-12-23  3:59 [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock john stultz
@ 2009-12-23  4:00 ` john stultz
  2009-12-23  4:01   ` [RFC][PATCH 2/14] Convert arm " john stultz
  2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
  1 sibling, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:00 UTC (permalink / raw)
  To: lkml; +Cc: Richard Henderson, linux-alpha

This patch converts the alpha architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 Kconfig       |    3 +
 kernel/time.c |  101 ++++++++++++++++++++++++++--------------------------------
 2 files changed, 50 insertions(+), 54 deletions(-)

Index: gettimeoffset/arch/alpha/Kconfig
===================================================================
--- gettimeoffset.orig/arch/alpha/Kconfig	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/alpha/Kconfig	2009-12-22 18:51:01.000000000 -0800
@@ -54,6 +54,9 @@ config ARCH_USES_GETTIMEOFFSET
 	bool
 	default y
 
+config GENERIC_CMOS_UPDATE
+        def_bool y
+
 config ZONE_DMA
 	bool
 	default y
Index: gettimeoffset/arch/alpha/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/alpha/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/alpha/kernel/time.c	2009-12-22 18:51:01.000000000 -0800
@@ -75,8 +75,6 @@ static struct {
 	__u32 last_time;
 	/* ticks/cycle * 2^48 */
 	unsigned long scaled_ticks_per_cycle;
-	/* last time the CMOS clock got updated */
-	time_t last_rtc_update;
 	/* partial unused tick */
 	unsigned long partial_tick;
 } state;
@@ -91,6 +89,52 @@ static inline __u32 rpcc(void)
     return result;
 }
 
+int update_persistent_clock(struct timespec now)
+{
+	return set_rtc_mmss(now.tv_sec);
+}
+
+void read_persistent_clock(struct timespec *ts)
+{
+	unsigned int year, mon, day, hour, min, sec, epoch;
+
+	sec = CMOS_READ(RTC_SECONDS);
+	min = CMOS_READ(RTC_MINUTES);
+	hour = CMOS_READ(RTC_HOURS);
+	day = CMOS_READ(RTC_DAY_OF_MONTH);
+	mon = CMOS_READ(RTC_MONTH);
+	year = CMOS_READ(RTC_YEAR);
+
+	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
+		sec = bcd2bin(sec);
+		min = bcd2bin(min);
+		hour = bcd2bin(hour);
+		day = bcd2bin(day);
+		mon = bcd2bin(mon);
+		year = bcd2bin(year);
+	}
+
+	/* PC-like is standard; used for year >= 70 */
+	epoch = 1900;
+	if (year < 20)
+		epoch = 2000;
+	else if (year >= 20 && year < 48)
+		/* NT epoch */
+		epoch = 1980;
+	else if (year >= 48 && year < 70)
+		/* Digital UNIX epoch */
+		epoch = 1952;
+
+	printk(KERN_INFO "Using epoch = %d\n", epoch);
+
+	if ((year += epoch) < 1970)
+		year += 100;
+
+	ts->tv_sec = mktime(year, mon, day, hour, min, sec);
+}
+
+
+
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
@@ -123,19 +167,6 @@ irqreturn_t timer_interrupt(int irq, voi
 	if (nticks)
 		do_timer(nticks);
 
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 */
-	if (ntp_synced()
-	    && xtime.tv_sec > state.last_rtc_update + 660
-	    && xtime.tv_nsec >= 500000 - ((unsigned) TICK_SIZE) / 2
-	    && xtime.tv_nsec <= 500000 + ((unsigned) TICK_SIZE) / 2) {
-		int tmp = set_rtc_mmss(xtime.tv_sec);
-		state.last_rtc_update = xtime.tv_sec - (tmp ? 600 : 0);
-	}
-
 	write_sequnlock(&xtime_lock);
 
 #ifndef CONFIG_SMP
@@ -304,7 +335,7 @@ rpcc_after_update_in_progress(void)
 void __init
 time_init(void)
 {
-	unsigned int year, mon, day, hour, min, sec, cc1, cc2, epoch;
+	unsigned int cc1, cc2;
 	unsigned long cycle_freq, tolerance;
 	long diff;
 
@@ -348,43 +379,6 @@ time_init(void)
 	   bogomips yet, but this is close on a 500Mhz box.  */
 	__delay(1000000);
 
-	sec = CMOS_READ(RTC_SECONDS);
-	min = CMOS_READ(RTC_MINUTES);
-	hour = CMOS_READ(RTC_HOURS);
-	day = CMOS_READ(RTC_DAY_OF_MONTH);
-	mon = CMOS_READ(RTC_MONTH);
-	year = CMOS_READ(RTC_YEAR);
-
-	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-		sec = bcd2bin(sec);
-		min = bcd2bin(min);
-		hour = bcd2bin(hour);
-		day = bcd2bin(day);
-		mon = bcd2bin(mon);
-		year = bcd2bin(year);
-	}
-
-	/* PC-like is standard; used for year >= 70 */
-	epoch = 1900;
-	if (year < 20)
-		epoch = 2000;
-	else if (year >= 20 && year < 48)
-		/* NT epoch */
-		epoch = 1980;
-	else if (year >= 48 && year < 70)
-		/* Digital UNIX epoch */
-		epoch = 1952;
-
-	printk(KERN_INFO "Using epoch = %d\n", epoch);
-
-	if ((year += epoch) < 1970)
-		year += 100;
-
-	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-	xtime.tv_nsec = 0;
-
-        wall_to_monotonic.tv_sec -= xtime.tv_sec;
-        wall_to_monotonic.tv_nsec = 0;
 
 	if (HZ > (1<<16)) {
 		extern void __you_loose (void);
@@ -394,7 +388,6 @@ time_init(void)
 	state.last_time = cc1;
 	state.scaled_ticks_per_cycle
 		= ((unsigned long) HZ << FIX_SHIFT) / cycle_freq;
-	state.last_rtc_update = 0;
 	state.partial_tick = 0L;
 
 	/* Startup the timer source. */



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 2/14] Convert arm to read/update_persistent_clock
  2009-12-23  4:00 ` [RFC][PATCH 1/14] Convert alpha " john stultz
@ 2009-12-23  4:01   ` john stultz
  2009-12-23  4:03     ` [RFC][PATCH 3/14] Convert avr32 " john stultz
  2009-12-24 11:09     ` [RFC][PATCH 2/14] Convert arm " Uwe Kleine-König
  0 siblings, 2 replies; 26+ messages in thread
From: john stultz @ 2009-12-23  4:01 UTC (permalink / raw)
  To: lkml; +Cc: Russell King, linux-arm-kernel

This patch converts the arm architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

Also removes a direct xtime access, replacing it with
current_kernel_time()

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 Kconfig                 |    3 +++
 include/asm/mach/time.h |    2 +-
 kernel/time.c           |   39 ++++++++-------------------------------
 mach-footbridge/time.c  |    4 ++--
 4 files changed, 14 insertions(+), 34 deletions(-)

Index: gettimeoffset/arch/arm/Kconfig
===================================================================
--- gettimeoffset.orig/arch/arm/Kconfig	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/arm/Kconfig	2009-12-22 18:51:20.000000000 -0800
@@ -38,6 +38,9 @@ config GENERIC_GPIO
 config GENERIC_TIME
 	bool
 
+config GENERIC_CMOS_UPDATE
+        def_bool y
+
 config GENERIC_CLOCKEVENTS
 	bool
 
Index: gettimeoffset/arch/arm/include/asm/mach/time.h
===================================================================
--- gettimeoffset.orig/arch/arm/include/asm/mach/time.h	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/arm/include/asm/mach/time.h	2009-12-22 18:51:20.000000000 -0800
@@ -50,7 +50,7 @@ extern void timer_tick(void);
  * Kernel time keeping support.
  */
 struct timespec;
-extern int (*set_rtc)(void);
+extern int (*set_rtc)(struct timespec now);
 extern void save_time_delta(struct timespec *delta, struct timespec *rtc);
 extern void restore_time_delta(struct timespec *delta, struct timespec *rtc);
 
Index: gettimeoffset/arch/arm/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/arm/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/arm/kernel/time.c	2009-12-22 18:51:20.000000000 -0800
@@ -80,7 +80,7 @@ EXPORT_SYMBOL(profile_pc);
 /*
  * hook for setting the RTC's idea of the current time.
  */
-int (*set_rtc)(void);
+int (*set_rtc)(struct timespec now);
 
 #ifndef CONFIG_GENERIC_TIME
 static unsigned long dummy_gettimeoffset(void)
@@ -89,34 +89,11 @@ static unsigned long dummy_gettimeoffset
 }
 #endif
 
-static unsigned long next_rtc_update;
-
-/*
- * If we have an externally synchronized linux clock, then update
- * CMOS clock accordingly every ~11 minutes.  set_rtc() has to be
- * called as close as possible to 500 ms before the new second
- * starts.
- */
-static inline void do_set_rtc(void)
+int update_persistent_clock(struct timespec now)
 {
-	if (!ntp_synced() || set_rtc == NULL)
-		return;
-
-	if (next_rtc_update &&
-	    time_before((unsigned long)xtime.tv_sec, next_rtc_update))
-		return;
-
-	if (xtime.tv_nsec < 500000000 - ((unsigned) tick_nsec >> 1) &&
-	    xtime.tv_nsec >= 500000000 + ((unsigned) tick_nsec >> 1))
-		return;
-
-	if (set_rtc())
-		/*
-		 * rtc update failed.  Try again in 60s
-		 */
-		next_rtc_update = xtime.tv_sec + 60;
-	else
-		next_rtc_update = xtime.tv_sec + 660;
+	if (set_rtc == NULL)
+		return -1;
+	return set_rtc(now);
 }
 
 #ifdef CONFIG_LEDS
@@ -305,9 +282,10 @@ EXPORT_SYMBOL(do_settimeofday);
  */
 void save_time_delta(struct timespec *delta, struct timespec *rtc)
 {
+	struct timespec now = current_kernel_time();
 	set_normalized_timespec(delta,
-				xtime.tv_sec - rtc->tv_sec,
-				xtime.tv_nsec - rtc->tv_nsec);
+				now.tv_sec - rtc->tv_sec,
+				now.tv_nsec - rtc->tv_nsec);
 }
 EXPORT_SYMBOL(save_time_delta);
 
@@ -336,7 +314,6 @@ void timer_tick(void)
 {
 	profile_tick(CPU_PROFILING);
 	do_leds();
-	do_set_rtc();
 	write_seqlock(&xtime_lock);
 	do_timer(1);
 	write_sequnlock(&xtime_lock);
Index: gettimeoffset/arch/arm/mach-footbridge/time.c
===================================================================
--- gettimeoffset.orig/arch/arm/mach-footbridge/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/arm/mach-footbridge/time.c	2009-12-22 18:51:20.000000000 -0800
@@ -61,12 +61,12 @@ static unsigned long __init get_isa_cmos
 	return mktime(year, mon, day, hour, min, sec);
 }
 
-static int set_isa_cmos_time(void)
+static int set_isa_cmos_time(struct timespec now)
 {
 	int retval = 0;
 	int real_seconds, real_minutes, cmos_minutes;
 	unsigned char save_control, save_freq_select;
-	unsigned long nowtime = xtime.tv_sec;
+	unsigned long nowtime = now.tv_sec;
 
 	save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
 	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 3/14] Convert avr32 to read/update_persistent_clock
  2009-12-23  4:01   ` [RFC][PATCH 2/14] Convert arm " john stultz
@ 2009-12-23  4:03     ` john stultz
  2009-12-23  4:04       ` [RFC][PATCH 4/14] Convert blackfin " john stultz
  2009-12-24 11:09     ` [RFC][PATCH 2/14] Convert arm " Uwe Kleine-König
  1 sibling, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:03 UTC (permalink / raw)
  To: lkml; +Cc: Haavard Skinnemoen

This patch converts the avr32 architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

Index: gettimeoffset/arch/avr32/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/avr32/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/avr32/kernel/time.c	2009-12-22 18:51:09.000000000 -0800
@@ -110,17 +110,17 @@ static struct clock_event_device compara
 	.set_mode	= comparator_mode,
 };
 
+void read_persistent_clock(struct timespec *ts)
+{
+	ts->tv.sec = mktime(2007, 1, 1, 0, 0, 0);
+	ts->tv_nsec = 0;
+}
+
 void __init time_init(void)
 {
 	unsigned long counter_hz;
 	int ret;
 
-	xtime.tv_sec = mktime(2007, 1, 1, 0, 0, 0);
-	xtime.tv_nsec = 0;
-
-	set_normalized_timespec(&wall_to_monotonic,
-				-xtime.tv_sec, -xtime.tv_nsec);
-
 	/* figure rate for counter */
 	counter_hz = clk_get_rate(boot_cpu_data.clk);
 	counter.mult = clocksource_hz2mult(counter_hz, counter.shift);



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 4/14] Convert blackfin to read/update_persistent_clock
  2009-12-23  4:03     ` [RFC][PATCH 3/14] Convert avr32 " john stultz
@ 2009-12-23  4:04       ` john stultz
  2009-12-23  4:05         ` [RFC][PATCH 5/14] Convert cris " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:04 UTC (permalink / raw)
  To: lkml; +Cc: Mike Frysinger, uclinux-dist-devel

This patch converts the blackfin architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time-ts.c |   13 +++++++------
 time.c    |   39 ++++++---------------------------------
 2 files changed, 13 insertions(+), 39 deletions(-)

Index: gettimeoffset/arch/blackfin/kernel/time-ts.c
===================================================================
--- gettimeoffset.orig/arch/blackfin/kernel/time-ts.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/blackfin/kernel/time-ts.c	2009-12-22 18:51:13.000000000 -0800
@@ -348,9 +348,15 @@ static int __init bfin_clockevent_init(v
 	return 0;
 }
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	time_t secs_since_1970 = (365 * 37 + 9) * 24 * 60 * 60;	/* 1 Jan 2007 */
+	ts->tv_sec = secs_since_1970;
+	ts->tv_nsec = 0;
+}
+
+void __init time_init(void)
+{
 
 #ifdef CONFIG_RTC_DRV_BFIN
 	/* [#2663] hack to filter junk RTC values that would cause
@@ -363,11 +369,6 @@ void __init time_init(void)
 	}
 #endif
 
-	/* Initialize xtime. From now on, xtime is updated with timer interrupts */
-	xtime.tv_sec = secs_since_1970;
-	xtime.tv_nsec = 0;
-	set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
-
 	bfin_cs_cycles_init();
 	bfin_cs_gptimer0_init();
 	bfin_clockevent_init();
Index: gettimeoffset/arch/blackfin/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/blackfin/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/blackfin/kernel/time.c	2009-12-22 18:51:13.000000000 -0800
@@ -112,11 +112,6 @@ u32 arch_gettimeoffset(void)
 }
 #endif
 
-static inline int set_rtc_mmss(unsigned long nowtime)
-{
-	return 0;
-}
-
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
@@ -126,29 +121,8 @@ __attribute__((l1_text))
 #endif
 irqreturn_t timer_interrupt(int irq, void *dummy)
 {
-	/* last time the cmos clock got updated */
-	static long last_rtc_update;
-
 	write_seqlock(&xtime_lock);
 	do_timer(1);
-
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 */
-	if (ntp_synced() &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / NSEC_PER_USEC) >=
-	    500000 - ((unsigned)TICK_SIZE) / 2
-	    && (xtime.tv_nsec / NSEC_PER_USEC) <=
-	    500000 + ((unsigned)TICK_SIZE) / 2) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else
-			/* Do it again in 60s. */
-			last_rtc_update = xtime.tv_sec - 600;
-	}
 	write_sequnlock(&xtime_lock);
 
 #ifdef CONFIG_IPIPE
@@ -161,10 +135,15 @@ irqreturn_t timer_interrupt(int irq, voi
 	return IRQ_HANDLED;
 }
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	time_t secs_since_1970 = (365 * 37 + 9) * 24 * 60 * 60;	/* 1 Jan 2007 */
+	ts->tv_sec = secs_since_1970;
+	ts->tv_nsec = 0;
+}
 
+void __init time_init(void)
+{
 #ifdef CONFIG_RTC_DRV_BFIN
 	/* [#2663] hack to filter junk RTC values that would cause
 	 * userspace to have to deal with time values greater than
@@ -176,11 +155,5 @@ void __init time_init(void)
 	}
 #endif
 
-	/* Initialize xtime. From now on, xtime is updated with timer interrupts */
-	xtime.tv_sec = secs_since_1970;
-	xtime.tv_nsec = 0;
-
-	wall_to_monotonic.tv_sec = -xtime.tv_sec;
-
 	time_sched_init(timer_interrupt);
 }



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 5/14] Convert cris to read/update_persistent_clock
  2009-12-23  4:04       ` [RFC][PATCH 4/14] Convert blackfin " john stultz
@ 2009-12-23  4:05         ` john stultz
  2009-12-23  4:06           ` [RFC][PATCH 6/14] Convert frv " john stultz
  2010-01-05 16:47           ` [RFC][PATCH 6/14] Convert frv " David Howells
  0 siblings, 2 replies; 26+ messages in thread
From: john stultz @ 2009-12-23  4:05 UTC (permalink / raw)
  To: lkml; +Cc: Mikael Starvik, Jesper Nilsson, linux-cris-kernel

This patch converts the cris architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.


Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 Kconfig                |    3 +++
 arch-v10/kernel/time.c |   37 ++-----------------------------------
 arch-v32/kernel/time.c |   40 ++--------------------------------------
 kernel/time.c          |   20 +++++++++++---------
 4 files changed, 18 insertions(+), 82 deletions(-)

Index: gettimeoffset/arch/cris/Kconfig
===================================================================
--- gettimeoffset.orig/arch/cris/Kconfig	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/cris/Kconfig	2009-12-22 18:51:26.000000000 -0800
@@ -20,6 +20,9 @@ config RWSEM_GENERIC_SPINLOCK
 config RWSEM_XCHGADD_ALGORITHM
 	bool
 
+config GENERIC_CMOS_UPDATE
+	def_bool y
+
 config GENERIC_IOMAP
        bool
        default y
Index: gettimeoffset/arch/cris/arch-v10/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/cris/arch-v10/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/cris/arch-v10/kernel/time.c	2009-12-22 18:51:26.000000000 -0800
@@ -26,7 +26,6 @@
 /* it will make jiffies at 96 hz instead of 100 hz though */
 #undef USE_CASCADE_TIMERS
 
-extern void update_xtime_from_cmos(void);
 extern int set_rtc_mmss(unsigned long nowtime);
 extern int have_rtc;
 
@@ -188,8 +187,6 @@ stop_watchdog(void)
 #endif	
 }
 
-/* last time the cmos clock got updated */
-static long last_rtc_update = 0;
 
 /*
  * timer_interrupt() needs to keep up the real-time clock,
@@ -232,24 +229,6 @@ timer_interrupt(int irq, void *dev_id)
 	do_timer(1);
 	
         cris_do_profile(regs); /* Save profiling information */
-
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 *
-	 * The division here is not time critical since it will run once in 
-	 * 11 minutes
-	 */
-	if (ntp_synced() &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / 1000) >= 500000 - (tick_nsec / 1000) / 2 &&
-	    (xtime.tv_nsec / 1000) <= 500000 + (tick_nsec / 1000) / 2) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else
-			last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
-	}
         return IRQ_HANDLED;
 }
 
@@ -274,22 +253,10 @@ time_init(void)
 	 */
 	loops_per_usec = 50;
 
-	if(RTC_INIT() < 0) {
-		/* no RTC, start at 1980 */
-		xtime.tv_sec = 0;
-		xtime.tv_nsec = 0;
+	if(RTC_INIT() < 0)
 		have_rtc = 0;
-	} else {		
-		/* get the current time */
+	else
 		have_rtc = 1;
-		update_xtime_from_cmos();
-	}
-
-	/*
-	 * Initialize wall_to_monotonic such that adding it to xtime will yield zero, the
-	 * tv_nsec field must be normalized (i.e., 0 <= nsec < NSEC_PER_SEC).
-	 */
-	set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
 
 	/* Setup the etrax timers
 	 * Base frequency is 25000 hz, divider 250 -> 100 HZ
Index: gettimeoffset/arch/cris/arch-v32/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/cris/arch-v32/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/cris/arch-v32/kernel/time.c	2009-12-22 18:51:27.000000000 -0800
@@ -44,7 +44,6 @@ unsigned long timer_regs[NR_CPUS] =
 #endif
 };
 
-extern void update_xtime_from_cmos(void);
 extern int set_rtc_mmss(unsigned long nowtime);
 extern int have_rtc;
 
@@ -198,9 +197,6 @@ handle_watchdog_bite(struct pt_regs* reg
 #endif
 }
 
-/* Last time the cmos clock got updated. */
-static long last_rtc_update = 0;
-
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick.
@@ -238,25 +234,6 @@ timer_interrupt(int irq, void *dev_id)
 
 	/* Call the real timer interrupt handler */
 	do_timer(1);
-
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 *
-	 * The division here is not time critical since it will run once in
-	 * 11 minutes
-	 */
-	if ((time_status & STA_UNSYNC) == 0 &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / 1000) >= 500000 - (tick_nsec / 1000) / 2 &&
-	    (xtime.tv_nsec / 1000) <= 500000 + (tick_nsec / 1000) / 2) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else
-			/* Do it again in 60 s */
-			last_rtc_update = xtime.tv_sec - 600;
-	}
         return IRQ_HANDLED;
 }
 
@@ -309,23 +286,10 @@ time_init(void)
 	 */
 	loops_per_usec = 50;
 
-	if(RTC_INIT() < 0) {
-		/* No RTC, start at 1980 */
-		xtime.tv_sec = 0;
-		xtime.tv_nsec = 0;
+	if(RTC_INIT() < 0)
 		have_rtc = 0;
-	} else {
-		/* Get the current time */
+	else
 		have_rtc = 1;
-		update_xtime_from_cmos();
-	}
-
-	/*
-	 * Initialize wall_to_monotonic such that adding it to
-	 * xtime will yield zero, the tv_nsec field must be normalized
-	 * (i.e., 0 <= nsec < NSEC_PER_SEC).
-	 */
-	set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
 
 	/* Start CPU local timer. */
 	cris_timer_init();
Index: gettimeoffset/arch/cris/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/cris/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/cris/kernel/time.c	2009-12-22 18:51:27.000000000 -0800
@@ -162,6 +162,8 @@ unsigned long
 get_cmos_time(void)
 {
 	unsigned int year, mon, day, hour, min, sec;
+	if(!have_rtc)
+		return 0;
 
 	sec = CMOS_READ(RTC_SECONDS);
 	min = CMOS_READ(RTC_MINUTES);
@@ -183,19 +185,19 @@ get_cmos_time(void)
 	return mktime(year, mon, day, hour, min, sec);
 }
 
-/* update xtime from the CMOS settings. used when /dev/rtc gets a SET_TIME.
- * TODO: this doesn't reset the fancy NTP phase stuff as do_settimeofday does.
- */
 
-void
-update_xtime_from_cmos(void)
+int update_persistent_clock(struct timespec now)
 {
-	if(have_rtc) {
-		xtime.tv_sec = get_cmos_time();
-		xtime.tv_nsec = 0;
-	}
+	return set_rtc_mmss(now.tv_sec);
 }
 
+void read_persistent_clock(struct timespec *ts)
+{
+	ts->tv_sec = get_cmos_time();
+	ts->tv_nsec = 0;
+}
+
+
 extern void cris_profile_sample(struct pt_regs* regs);
 
 void



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 6/14] Convert frv to read/update_persistent_clock
  2009-12-23  4:05         ` [RFC][PATCH 5/14] Convert cris " john stultz
@ 2009-12-23  4:06           ` john stultz
  2009-12-23  4:08             ` [RFC][PATCH 7/14] Convert h8300 " john stultz
  2010-01-05 16:47           ` [RFC][PATCH 6/14] Convert frv " David Howells
  1 sibling, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:06 UTC (permalink / raw)
  To: lkml; +Cc: David Howells

This patch converts the frv architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   34 +++++++---------------------------
 1 file changed, 7 insertions(+), 27 deletions(-)

Index: gettimeoffset/arch/frv/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/frv/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/frv/kernel/time.c	2009-12-22 18:51:05.000000000 -0800
@@ -48,20 +48,12 @@ static struct irqaction timer_irq  = {
 	.name = "timer",
 };
 
-static inline int set_rtc_mmss(unsigned long nowtime)
-{
-	return -1;
-}
-
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
  */
 static irqreturn_t timer_interrupt(int irq, void *dummy)
 {
-	/* last time the cmos clock got updated */
-	static long last_rtc_update = 0;
-
 	profile_tick(CPU_PROFILING);
 	/*
 	 * Here we are in the timer irq handler. We just have irqs locally
@@ -74,22 +66,6 @@ static irqreturn_t timer_interrupt(int i
 
 	do_timer(1);
 
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 */
-	if (ntp_synced() &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
-	    (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2
-	    ) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else
-			last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
-	}
-
 #ifdef CONFIG_HEARTBEAT
 	static unsigned short n;
 	n++;
@@ -119,7 +95,8 @@ void time_divisor_init(void)
 	__set_TCSR_DATA(0, base >> 8);
 }
 
-void time_init(void)
+
+void read_persistent_clock(struct timespec *ts)
 {
 	unsigned int year, mon, day, hour, min, sec;
 
@@ -135,9 +112,12 @@ void time_init(void)
 
 	if ((year += 1900) < 1970)
 		year += 100;
-	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-	xtime.tv_nsec = 0;
+	ts->tv_sec = mktime(year, mon, day, hour, min, sec);
+	ts->tv_nsec = 0;
+}
 
+void time_init(void)
+{
 	/* install scheduling interrupt handler */
 	setup_irq(IRQ_CPU_TIMER0, &timer_irq);
 



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 7/14] Convert h8300 to read/update_persistent_clock
  2009-12-23  4:06           ` [RFC][PATCH 6/14] Convert frv " john stultz
@ 2009-12-23  4:08             ` john stultz
  2009-12-23  4:09               ` [RFC][PATCH 8/14] Convert ia64 " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:08 UTC (permalink / raw)
  To: lkml; +Cc: Yoshinori Sato

This patch converts the h8300  architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
time.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Index: gettimeoffset/arch/h8300/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/h8300/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/h8300/kernel/time.c	2009-12-22 18:51:08.000000000 -0800
@@ -41,7 +41,7 @@ void h8300_timer_tick(void)
 	update_process_times(user_mode(get_irq_regs()));
 }
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	unsigned int year, mon, day, hour, min, sec;
 
@@ -56,8 +56,12 @@ void __init time_init(void)
 #endif
 	if ((year += 1900) < 1970)
 		year += 100;
-	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-	xtime.tv_nsec = 0;
+	ts->tv_sec = mktime(year, mon, day, hour, min, sec);
+	ts->tv_nsec = 0;
+}
+
+void __init time_init(void)
+{
 
 	h8300_timer_setup();
 }



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 8/14] Convert ia64 to read/update_persistent_clock
  2009-12-23  4:08             ` [RFC][PATCH 7/14] Convert h8300 " john stultz
@ 2009-12-23  4:09               ` john stultz
  2009-12-23  4:10                 ` [RFC][PATCH 9/14] Convert m32r " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:09 UTC (permalink / raw)
  To: lkml; +Cc: Tony Luck, Fenghua Yu, linux-ia64

This patch converts the ia64  architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

Index: gettimeoffset/arch/ia64/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/ia64/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/ia64/kernel/time.c	2009-12-22 18:51:10.000000000 -0800
@@ -430,18 +430,16 @@ static int __init rtc_init(void)
 }
 module_init(rtc_init);
 
+void read_persistent_clock(struct timespec *ts)
+{
+	efi_gettimeofday(ts);
+}
+
 void __init
 time_init (void)
 {
 	register_percpu_irq(IA64_TIMER_VECTOR, &timer_irqaction);
-	efi_gettimeofday(&xtime);
 	ia64_init_itm();
-
-	/*
-	 * Initialize wall_to_monotonic such that adding it to xtime will yield zero, the
-	 * tv_nsec field must be normalized (i.e., 0 <= nsec < NSEC_PER_SEC).
-	 */
-	set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
 }
 
 /*



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 9/14] Convert m32r to read/update_persistent_clock
  2009-12-23  4:09               ` [RFC][PATCH 8/14] Convert ia64 " john stultz
@ 2009-12-23  4:10                 ` john stultz
  2009-12-23  4:11                   ` [RFC][PATCH 10/14] Convert m68k " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:10 UTC (permalink / raw)
  To: lkml; +Cc: Hirokazu Takata, linux-m32r

This patch converts the m32r  architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   47 +++++++----------------------------------------
 1 file changed, 7 insertions(+), 40 deletions(-)

Index: gettimeoffset/arch/m32r/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/m32r/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/m32r/kernel/time.c	2009-12-22 18:51:15.000000000 -0800
@@ -106,24 +106,6 @@ u32 arch_gettimeoffset(void)
 }
 
 /*
- * In order to set the CMOS clock precisely, set_rtc_mmss has to be
- * called 500 ms after the second nowtime has started, because when
- * nowtime is written into the registers of the CMOS clock, it will
- * jump to the next second precisely 500 ms later. Check the Motorola
- * MC146818A or Dallas DS12887 data sheet for details.
- *
- * BUG: This routine does not handle hour overflow properly; it just
- *      sets the minutes. Usually you won't notice until after reboot!
- */
-static inline int set_rtc_mmss(unsigned long nowtime)
-{
-	return 0;
-}
-
-/* last time the cmos clock got updated */
-static long last_rtc_update = 0;
-
-/*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
  */
@@ -138,23 +120,6 @@ static irqreturn_t timer_interrupt(int i
 #ifndef CONFIG_SMP
 	update_process_times(user_mode(get_irq_regs()));
 #endif
-	/*
-	 * If we have an externally synchronized Linux clock, then update
-	 * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-	 * called as close as possible to 500 ms before the new second starts.
-	 */
-	write_seqlock(&xtime_lock);
-	if (ntp_synced()
-		&& xtime.tv_sec > last_rtc_update + 660
-		&& (xtime.tv_nsec / 1000) >= 500000 - ((unsigned)TICK_SIZE) / 2
-		&& (xtime.tv_nsec / 1000) <= 500000 + ((unsigned)TICK_SIZE) / 2)
-	{
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else	/* do it again in 60 s */
-			last_rtc_update = xtime.tv_sec - 600;
-	}
-	write_sequnlock(&xtime_lock);
 	/* As we return to user mode fire off the other CPU schedulers..
 	   this is basically because we don't yet share IRQ's around.
 	   This message is rigged to be safe on the 386 - basically it's
@@ -174,7 +139,7 @@ static struct irqaction irq0 = {
 	.name = "MFT2",
 };
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	unsigned int epoch, year, mon, day, hour, min, sec;
 
@@ -194,11 +159,13 @@ void __init time_init(void)
 		epoch = 1952;
 	year += epoch;
 
-	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
-	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-	set_normalized_timespec(&wall_to_monotonic,
-		-xtime.tv_sec, -xtime.tv_nsec);
+	ts->tv_sec = mktime(year, mon, day, hour, min, sec);
+	ts->tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
+}
+
 
+void __init time_init(void)
+{
 #if defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_XNUX2) \
 	|| defined(CONFIG_CHIP_VDEC2) || defined(CONFIG_CHIP_M32700) \
 	|| defined(CONFIG_CHIP_OPSP) || defined(CONFIG_CHIP_M32104)



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 10/14] Convert m68k to read/update_persistent_clock
  2009-12-23  4:10                 ` [RFC][PATCH 9/14] Convert m32r " john stultz
@ 2009-12-23  4:11                   ` john stultz
  2009-12-23  4:12                     ` [RFC][PATCH 11/14] Convert mn10300 " john stultz
  2010-01-05 17:08                     ` [RFC][PATCH 11/14] Convert mn10300 " David Howells
  0 siblings, 2 replies; 26+ messages in thread
From: john stultz @ 2009-12-23  4:11 UTC (permalink / raw)
  To: lkml; +Cc: Geert Uytterhoeven, linux-m68k

This patch converts the m68k architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)


Index: gettimeoffset/arch/m68k/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/m68k/kernel/time.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/m68k/kernel/time.c	2009-12-22 18:51:18.000000000 -0800
@@ -73,21 +73,24 @@ static irqreturn_t timer_interrupt(int i
 	return IRQ_HANDLED;
 }
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	struct rtc_time time;
+	ts->tv_sec = 0;
+	ts->tv_nsec = 0;
 
 	if (mach_hwclk) {
 		mach_hwclk(0, &time);
 
 		if ((time.tm_year += 1900) < 1970)
 			time.tm_year += 100;
-		xtime.tv_sec = mktime(time.tm_year, time.tm_mon, time.tm_mday,
+		ts->tv_sec = mktime(time.tm_year, time.tm_mon, time.tm_mday,
 				      time.tm_hour, time.tm_min, time.tm_sec);
-		xtime.tv_nsec = 0;
 	}
-	wall_to_monotonic.tv_sec = -xtime.tv_sec;
+}
 
+void __init time_init(void)
+{
 	mach_sched_init(timer_interrupt);
 }
 



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 11/14] Convert mn10300 to read/update_persistent_clock
  2009-12-23  4:11                   ` [RFC][PATCH 10/14] Convert m68k " john stultz
@ 2009-12-23  4:12                     ` john stultz
  2009-12-23  4:14                       ` [RFC][PATCH 12/14] Convert parisc " john stultz
  2010-01-05 17:08                     ` [RFC][PATCH 11/14] Convert mn10300 " David Howells
  1 sibling, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:12 UTC (permalink / raw)
  To: lkml; +Cc: David Howells, Koichi Yasutake, linux-am33-list

This patch converts the mn10300 architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 Kconfig       |    3 +++
 kernel/rtc.c  |   27 +++++----------------------
 kernel/time.c |    4 ----
 3 files changed, 8 insertions(+), 26 deletions(-)

Index: gettimeoffset/arch/mn10300/Kconfig
===================================================================
--- gettimeoffset.orig/arch/mn10300/Kconfig	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/mn10300/Kconfig	2009-12-22 18:51:03.000000000 -0800
@@ -37,6 +37,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ
 config GENERIC_CALIBRATE_DELAY
 	def_bool y
 
+config GENERIC_CMOS_UPDATE
+        def_bool y
+
 config GENERIC_FIND_NEXT_BIT
 	def_bool y
 
Index: gettimeoffset/arch/mn10300/kernel/rtc.c
===================================================================
--- gettimeoffset.orig/arch/mn10300/kernel/rtc.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/mn10300/kernel/rtc.c	2009-12-22 18:51:03.000000000 -0800
@@ -26,17 +26,15 @@ static long last_rtc_update;
 /* time for RTC to update itself in ioclks */
 static unsigned long mn10300_rtc_update_period;
 
-/*
- * read the current RTC time
- */
-unsigned long __init get_initial_rtc_time(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	struct rtc_time tm;
 
 	get_rtc_time(&tm);
 
-	return mktime(tm.tm_year, tm.tm_mon, tm.tm_mday,
+	ts->tv_sec = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday,
 		      tm.tm_hour, tm.tm_min, tm.tm_sec);
+	ts->tv_nsec = 0;
 }
 
 /*
@@ -110,24 +108,9 @@ static int set_rtc_mmss(unsigned long no
 	return retval;
 }
 
-void check_rtc_time(void)
+int update_persistent_clock(struct timespec now)
 {
-	/* the RTC clock just finished ticking over again this second
-	 * - if we have an externally synchronized Linux clock, then update
-	 *   RTC clock accordingly every ~11 minutes. set_rtc_mmss() has to be
-	 *   called as close as possible to 500 ms before the new second starts.
-	 */
-	if ((time_status & STA_UNSYNC) == 0 &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    xtime.tv_nsec / 1000 >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
-	    xtime.tv_nsec / 1000 <= 500000 + ((unsigned) TICK_SIZE) / 2
-	    ) {
-		if (set_rtc_mmss(xtime.tv_sec) == 0)
-			last_rtc_update = xtime.tv_sec;
-		else
-			/* do it again in 60s */
-			last_rtc_update = xtime.tv_sec - 600;
-	}
+	return set_rtc_mms(now.tv_sec);
 }
 
 /*
Index: gettimeoffset/arch/mn10300/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/mn10300/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/mn10300/kernel/time.c	2009-12-22 18:51:03.000000000 -0800
@@ -111,7 +111,6 @@ static irqreturn_t timer_interrupt(int i
 		/* advance the kernel's time tracking system */
 		profile_tick(CPU_PROFILING);
 		do_timer(1);
-		check_rtc_time();
 	}
 
 	write_sequnlock(&xtime_lock);
@@ -139,9 +138,6 @@ void __init time_init(void)
 	       " (calibrated against RTC)\n",
 	       MN10300_TSCCLK / 1000000, (MN10300_TSCCLK / 10000) % 100);
 
-	xtime.tv_sec = get_initial_rtc_time();
-	xtime.tv_nsec = 0;
-
 	mn10300_last_tsc = TMTSCBC;
 
 	/* use timer 0 & 1 cascaded to tick at as close to HZ as possible */



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 12/14] Convert parisc to read/update_persistent_clock
  2009-12-23  4:12                     ` [RFC][PATCH 11/14] Convert mn10300 " john stultz
@ 2009-12-23  4:14                       ` john stultz
  2009-12-23  4:15                         ` [RFC][PATCH 13/14] Convert sh " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:14 UTC (permalink / raw)
  To: lkml; +Cc: Kyle McMartin, Helge Deller, James E.J. Bottomley, linux-parisc

This patch converts the parisc architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |   29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

Index: gettimeoffset/arch/parisc/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/parisc/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/parisc/kernel/time.c	2009-12-22 18:51:06.000000000 -0800
@@ -250,9 +250,21 @@ static int __init rtc_init(void)
 }
 module_init(rtc_init);
 
-void __init time_init(void)
+void read_persistent_clock(struct timespec *ts)
 {
 	static struct pdc_tod tod_data;
+	if (pdc_tod_read(&tod_data) == 0) {
+		ts->tv_sec = tod_data.tod_sec;
+		ts->tv_nsec = tod_data.tod_usec * 1000;
+	} else {
+		printk(KERN_ERR "Error reading tod clock\n");
+	        ts->tv_sec = 0;
+		ts->tv_nsec = 0;
+	}
+}
+
+void __init time_init(void)
+{
 	unsigned long current_cr16_khz;
 
 	clocktick = (100 * PAGE0->mem_10msec) / HZ;
@@ -264,19 +276,4 @@ void __init time_init(void)
 	clocksource_cr16.mult = clocksource_khz2mult(current_cr16_khz,
 						clocksource_cr16.shift);
 	clocksource_register(&clocksource_cr16);
-
-	if (pdc_tod_read(&tod_data) == 0) {
-		unsigned long flags;
-
-		write_seqlock_irqsave(&xtime_lock, flags);
-		xtime.tv_sec = tod_data.tod_sec;
-		xtime.tv_nsec = tod_data.tod_usec * 1000;
-		set_normalized_timespec(&wall_to_monotonic,
-		                        -xtime.tv_sec, -xtime.tv_nsec);
-		write_sequnlock_irqrestore(&xtime_lock, flags);
-	} else {
-		printk(KERN_ERR "Error reading tod clock\n");
-	        xtime.tv_sec = 0;
-		xtime.tv_nsec = 0;
-	}
 }



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 13/14] Convert sh to read/update_persistent_clock
  2009-12-23  4:14                       ` [RFC][PATCH 12/14] Convert parisc " john stultz
@ 2009-12-23  4:15                         ` john stultz
  2009-12-23  4:16                           ` [RFC][PATCH 14/14] Convert sparc " john stultz
  0 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23  4:15 UTC (permalink / raw)
  To: lkml; +Cc: Paul Mundt, linux-sh

This patch converts the sh architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 time.c |    6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)


Index: gettimeoffset/arch/sh/kernel/time.c
===================================================================
--- gettimeoffset.orig/arch/sh/kernel/time.c	2009-12-22 18:50:55.000000000 -0800
+++ gettimeoffset/arch/sh/kernel/time.c	2009-12-22 18:51:12.000000000 -0800
@@ -39,12 +39,12 @@ static int null_rtc_set_time(const time_
 void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
 int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
 
-#ifdef CONFIG_GENERIC_CMOS_UPDATE
 void read_persistent_clock(struct timespec *ts)
 {
 	rtc_sh_get_time(ts);
 }
 
+#ifdef CONFIG_GENERIC_CMOS_UPDATE
 int update_persistent_clock(struct timespec now)
 {
 	return rtc_sh_set_time(now.tv_sec);
@@ -113,9 +113,5 @@ void __init time_init(void)
 	hwblk_init();
 	clk_init();
 
-	rtc_sh_get_time(&xtime);
-	set_normalized_timespec(&wall_to_monotonic,
-				-xtime.tv_sec, -xtime.tv_nsec);
-
 	late_time_init = sh_late_time_init;
 }



^ permalink raw reply	[flat|nested] 26+ messages in thread

* [RFC][PATCH 14/14] Convert sparc to read/update_persistent_clock
  2009-12-23  4:15                         ` [RFC][PATCH 13/14] Convert sh " john stultz
@ 2009-12-23  4:16                           ` john stultz
  2009-12-24  4:52                             ` David Miller
  2010-01-05 16:41                             ` Kristoffer Glembo
  0 siblings, 2 replies; 26+ messages in thread
From: john stultz @ 2009-12-23  4:16 UTC (permalink / raw)
  To: lkml; +Cc: David S. Miller, sparclinux

This patch converts the sparc architecture to use the generic
read_persistent_clock and update_persistent_clock interfaces, reducing
the amount of arch specific code we have to maintain, and allowing for
further cleanups in the future.

I have not built or tested this patch, so help from arch maintainers
would be appreciated.

Signed-off-by: John Stultz <johnstul@us.ibm.com>
---
 Kconfig          |    2 +-
 kernel/time_32.c |   15 +++++----------
 2 files changed, 6 insertions(+), 11 deletions(-)


Index: gettimeoffset/arch/sparc/Kconfig
===================================================================
--- gettimeoffset.orig/arch/sparc/Kconfig	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/sparc/Kconfig	2009-12-22 18:51:25.000000000 -0800
@@ -69,7 +69,7 @@ config GENERIC_TIME
 
 config GENERIC_CMOS_UPDATE
 	bool
-	default y if SPARC64
+	default y
 
 config GENERIC_CLOCKEVENTS
 	bool
Index: gettimeoffset/arch/sparc/kernel/time_32.c
===================================================================
--- gettimeoffset.orig/arch/sparc/kernel/time_32.c	2009-12-22 18:50:54.000000000 -0800
+++ gettimeoffset/arch/sparc/kernel/time_32.c	2009-12-22 18:51:25.000000000 -0800
@@ -76,6 +76,11 @@ EXPORT_SYMBOL(profile_pc);
 
 __volatile__ unsigned int *master_l10_counter;
 
+int update_persistent_clock(struct timespec now)
+{
+	return set_rtc_mmss(now.tv_sec);
+}
+
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
@@ -99,16 +104,6 @@ static irqreturn_t timer_interrupt(int d
 
 	do_timer(1);
 
-	/* Determine when to update the Mostek clock. */
-	if (ntp_synced() &&
-	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
-	    (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
-	  if (set_rtc_mmss(xtime.tv_sec) == 0)
-	    last_rtc_update = xtime.tv_sec;
-	  else
-	    last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
-	}
 	write_sequnlock(&xtime_lock);
 
 #ifndef CONFIG_SMP



^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
  2009-12-23  3:59 [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock john stultz
  2009-12-23  4:00 ` [RFC][PATCH 1/14] Convert alpha " john stultz
@ 2009-12-23  5:08 ` Paul Mundt
  2009-12-23 10:08   ` Geert Uytterhoeven
                     ` (2 more replies)
  1 sibling, 3 replies; 26+ messages in thread
From: Paul Mundt @ 2009-12-23  5:08 UTC (permalink / raw)
  To: john stultz
  Cc: lkml, Richard Henderson, linux-alpha, linux-sh, Russell King,
	Haavard Skinnemoen, Mike Frysinger, Mikael Starvik,
	David Howells, Yoshinori Sato, Tony Luck, Hirokazu Takata,
	Geert Uytterhoeven, Koichi Yasutake, Kyle McMartin,
	David S. Miller

On Tue, Dec 22, 2009 at 07:59:22PM -0800, john stultz wrote:
> In this case the generic read_persistent_clock() and
> update_persistent_clock() methods have been provided to allow the
> generic timekeeping code to initialize xtime and set the persistent
> clock when NTP is synced. However many arches haven't converted, so the
> generic code has to handle the case where the arch is doing this
> management itself.
> 
> This patch series tries to convert the following 14 architectures over
> to use read_persistent_clock() and update_persistent_clock() as
> applicable, killing off about 200 lines of arch specific code.
> 
While I think that this is a good goal, many of the underlying
architectures have veered pretty far away from having meaningful
persistent clock interfaces after having moved entirely to generic
timekeeping and the RTC subsystem.

In the case of SH at least that interface along with the generic CMOS
stuff is largely a stop-gap for antiquated platforms that don't have
proper RTC drivers and likely never will, while the default for all of
the rest of the platforms effectively returns a fixed dummy value. I
copied this approach from MIPS originally, so there are at least a few
architectures that this will apply to.

In any event, I wonder if it might make more sense to take something like
the SPARC implementation that is simply a wrapper around the RTC, move
that out in to a more generic place, and permit architectures to select
an RTC class backed persistent clock instead (it seems to be only
platforms that haven't caught up yet in terms of generic time and RTC
migration that would want to define this interface on their own at all at
this point)?

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to  read/update_persistent_clock
  2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
@ 2009-12-23 10:08   ` Geert Uytterhoeven
  2009-12-23 22:04   ` john stultz
  2009-12-24  4:54   ` David Miller
  2 siblings, 0 replies; 26+ messages in thread
From: Geert Uytterhoeven @ 2009-12-23 10:08 UTC (permalink / raw)
  To: Paul Mundt
  Cc: john stultz, lkml, Richard Henderson, linux-alpha, linux-sh,
	Russell King, Haavard Skinnemoen, Mike Frysinger, Mikael Starvik,
	David Howells, Yoshinori Sato, Tony Luck, Hirokazu Takata,
	Koichi Yasutake, Kyle McMartin, David S. Miller

On Wed, Dec 23, 2009 at 06:08, Paul Mundt <lethal@linux-sh.org> wrote:
> On Tue, Dec 22, 2009 at 07:59:22PM -0800, john stultz wrote:
>> In this case the generic read_persistent_clock() and
>> update_persistent_clock() methods have been provided to allow the
>> generic timekeeping code to initialize xtime and set the persistent
>> clock when NTP is synced. However many arches haven't converted, so the
>> generic code has to handle the case where the arch is doing this
>> management itself.
>>
>> This patch series tries to convert the following 14 architectures over
>> to use read_persistent_clock() and update_persistent_clock() as
>> applicable, killing off about 200 lines of arch specific code.
>>
> While I think that this is a good goal, many of the underlying
> architectures have veered pretty far away from having meaningful
> persistent clock interfaces after having moved entirely to generic
> timekeeping and the RTC subsystem.

Indeed. When moving to the RTC subsystem, you loose the persistent
clock at boot;
i.e. on m68k, mach_hwclk() can no longer be set, as the RTC driver is
in a separate
(possible loadable) module.

> In the case of SH at least that interface along with the generic CMOS
> stuff is largely a stop-gap for antiquated platforms that don't have
> proper RTC drivers and likely never will, while the default for all of
> the rest of the platforms effectively returns a fixed dummy value. I
> copied this approach from MIPS originally, so there are at least a few
> architectures that this will apply to.
>
> In any event, I wonder if it might make more sense to take something like
> the SPARC implementation that is simply a wrapper around the RTC, move
> that out in to a more generic place, and permit architectures to select
> an RTC class backed persistent clock instead (it seems to be only
> platforms that haven't caught up yet in terms of generic time and RTC
> migration that would want to define this interface on their own at all at
> this point)?

Hmm, haven't looked into how SPARC handles this yet...
Yes, looks like a good idea to me. Any disadvantages with this approach?

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
  2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
  2009-12-23 10:08   ` Geert Uytterhoeven
@ 2009-12-23 22:04   ` john stultz
  2009-12-24  0:27     ` Dialup Jon Norstog
  2009-12-24  4:54   ` David Miller
  2 siblings, 1 reply; 26+ messages in thread
From: john stultz @ 2009-12-23 22:04 UTC (permalink / raw)
  To: Paul Mundt
  Cc: lkml, Richard Henderson, linux-alpha, linux-sh, Russell King,
	Haavard Skinnemoen, Mike Frysinger, Mikael Starvik,
	David Howells, Yoshinori Sato, Tony Luck, Hirokazu Takata,
	Geert Uytterhoeven, Koichi Yasutake, Kyle McMartin,
	David S. Miller, David Brownell

On Wed, 2009-12-23 at 14:08 +0900, Paul Mundt wrote:
> On Tue, Dec 22, 2009 at 07:59:22PM -0800, john stultz wrote:
> > In this case the generic read_persistent_clock() and
> > update_persistent_clock() methods have been provided to allow the
> > generic timekeeping code to initialize xtime and set the persistent
> > clock when NTP is synced. However many arches haven't converted, so the
> > generic code has to handle the case where the arch is doing this
> > management itself.
> > 
> > This patch series tries to convert the following 14 architectures over
> > to use read_persistent_clock() and update_persistent_clock() as
> > applicable, killing off about 200 lines of arch specific code.
> > 
> While I think that this is a good goal, many of the underlying
> architectures have veered pretty far away from having meaningful
> persistent clock interfaces after having moved entirely to generic
> timekeeping and the RTC subsystem.
> 
> In the case of SH at least that interface along with the generic CMOS
> stuff is largely a stop-gap for antiquated platforms that don't have
> proper RTC drivers and likely never will, while the default for all of
> the rest of the platforms effectively returns a fixed dummy value. I
> copied this approach from MIPS originally, so there are at least a few
> architectures that this will apply to.
> 
> In any event, I wonder if it might make more sense to take something like
> the SPARC implementation that is simply a wrapper around the RTC, move
> that out in to a more generic place, and permit architectures to select
> an RTC class backed persistent clock instead (it seems to be only
> platforms that haven't caught up yet in terms of generic time and RTC
> migration that would want to define this interface on their own at all at
> this point)?

Yea, there's some additional complications with the RTC interface via
read_persistent_clock, as some RTC clocks require irqs enabled to be
able to read. This keeps them from being used via
read_persistent_clock() as it is used prior to irqs being enabled, and
then again with irqs disabled in the suspend and resume path.

This has a bit of a trade-off, as we can better handle timekeeping
around a suspend/resume with read_persistent_clock(), but for some
hardware we just can't use the RTC for that.

Anyway, if we can improve the timekeeping/RTC interface used for
initialization and suspend/resume, I'm all for it (maybe having the RTC
code to tell the timekeeping code if it can be accessed with irqs off?).
But for hardware that needs irqs, i'm not sure how we can handle resumes
correctly there. So suggestions would be welcome.

Anyway, the main point of this patch set is to remove the direct access
to timekeeping internals (xtime, wall_to_monotonic). Those need to go
soon, as they're limiting changes in the timekeeping code.
read_persistent_clock() is the current way to avoid it, but if systems
are fine doing a settimeofday() at init that's ok too (although some
oddities may be seen wrt boot time with the direct settimeofday, I need
to refresh my head on how the varying default boot times between arches
may be effected).

thanks
-john


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
  2009-12-23 22:04   ` john stultz
@ 2009-12-24  0:27     ` Dialup Jon Norstog
  0 siblings, 0 replies; 26+ messages in thread
From: Dialup Jon Norstog @ 2009-12-24  0:27 UTC (permalink / raw)
  To: john stultz, Paul Mundt
  Cc: lkml, Richard Henderson, linux-alpha, linux-sh, Russell King,
	Haavard Skinnemoen, Mike Frysinger, Mikael Starvik,
	David Howells, Yoshinori Sato, Tony Luck, Hirokazu Takata,
	Geert Uytterhoeven, Koichi Yasutake, Kyle McMartin,
	David S. Miller, David Brownell

john,

IMO the biggest clock problem on Alpha is that dual booting Tru64 and Linux 
whacks the clock every time you go from one OS to the other.  Allowing Linux 
to decouple from SRM's TOY clock would be a signal advance.

jon norstog


---------- Original Message -----------
From: john stultz <johnstul@us.ibm.com>
To: Paul Mundt <lethal@linux-sh.org>
Cc: lkml <linux-kernel@vger.kernel.org>, Richard Henderson 
<rth@twiddle.net>, linux-alpha@vger.kernel.org, linux-sh@vger.kernel.org, 
Russell King <linux@arm.linux.org.uk>, Haavard Skinnemoen 
<hskinnemoen@atmel.com>, Mike Frysinger <vapier@gentoo.org>, Mikael Starvik 
<starvik@axis.com>, David Howells <dhowells@redhat.com>, Yoshinori Sato 
<ysato@users.sourceforge.jp>, Tony Luck <tony.luck@intel.com>, Hirokazu 
Takata <takata@linux-m32r.org>, Geert Uytterhoeven <geert@linux-m68k.org>, 
Koichi Yasutake <yasutake.koichi@jp.panasonic.com>, Kyle McMartin 
<kyle@mcmartin.ca>, "David S. Miller" <davem@davemloft.net>, David Brownell 
<dbrownell@users.sourceforge.net>
Sent: Wed, 23 Dec 2009 14:04:59 -0800
Subject: Re: [RFC][PATCH 0/14] Convert remaining arches to 
read/update_persistent_clock

> On Wed, 2009-12-23 at 14:08 +0900, Paul Mundt wrote:
> > On Tue, Dec 22, 2009 at 07:59:22PM -0800, john stultz wrote:
> > > In this case the generic read_persistent_clock() and
> > > update_persistent_clock() methods have been provided to allow the
> > > generic timekeeping code to initialize xtime and set the persistent
> > > clock when NTP is synced. However many arches haven't converted, so the
> > > generic code has to handle the case where the arch is doing this
> > > management itself.
> > > 
> > > This patch series tries to convert the following 14 architectures over
> > > to use read_persistent_clock() and update_persistent_clock() as
> > > applicable, killing off about 200 lines of arch specific code.
> > > 
> > While I think that this is a good goal, many of the underlying
> > architectures have veered pretty far away from having meaningful
> > persistent clock interfaces after having moved entirely to generic
> > timekeeping and the RTC subsystem.
> > 
> > In the case of SH at least that interface along with the generic CMOS
> > stuff is largely a stop-gap for antiquated platforms that don't have
> > proper RTC drivers and likely never will, while the default for all of
> > the rest of the platforms effectively returns a fixed dummy value. I
> > copied this approach from MIPS originally, so there are at least a few
> > architectures that this will apply to.
> > 
> > In any event, I wonder if it might make more sense to take something like
> > the SPARC implementation that is simply a wrapper around the RTC, move
> > that out in to a more generic place, and permit architectures to select
> > an RTC class backed persistent clock instead (it seems to be only
> > platforms that haven't caught up yet in terms of generic time and RTC
> > migration that would want to define this interface on their own at all at
> > this point)?
> 
> Yea, there's some additional complications with the RTC interface via
> read_persistent_clock, as some RTC clocks require irqs enabled to be
> able to read. This keeps them from being used via
> read_persistent_clock() as it is used prior to irqs being enabled, 
> and then again with irqs disabled in the suspend and resume path.
> 
> This has a bit of a trade-off, as we can better handle timekeeping
> around a suspend/resume with read_persistent_clock(), but for some
> hardware we just can't use the RTC for that.
> 
> Anyway, if we can improve the timekeeping/RTC interface used for
> initialization and suspend/resume, I'm all for it (maybe having the RTC
> code to tell the timekeeping code if it can be accessed with irqs 
> off?). But for hardware that needs irqs, i'm not sure how we can 
> handle resumes correctly there. So suggestions would be welcome.
> 
> Anyway, the main point of this patch set is to remove the direct access
> to timekeeping internals (xtime, wall_to_monotonic). Those need to go
> soon, as they're limiting changes in the timekeeping code.
> read_persistent_clock() is the current way to avoid it, but if 
> systems are fine doing a settimeofday() at init that's ok too 
> (although some oddities may be seen wrt boot time with the direct 
> settimeofday, I need to refresh my head on how the varying default 
> boot times between arches may be effected).
> 
> thanks
> -john
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-
> alpha" in the body of a message to majordomo@vger.kernel.org More 
> majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> -- 
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
------- End of Original Message -------


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 14/14] Convert sparc to read/update_persistent_clock
  2009-12-23  4:16                           ` [RFC][PATCH 14/14] Convert sparc " john stultz
@ 2009-12-24  4:52                             ` David Miller
  2010-01-05 16:41                             ` Kristoffer Glembo
  1 sibling, 0 replies; 26+ messages in thread
From: David Miller @ 2009-12-24  4:52 UTC (permalink / raw)
  To: johnstul; +Cc: linux-kernel, sparclinux

From: john stultz <johnstul@us.ibm.com>
Date: Tue, 22 Dec 2009 20:16:11 -0800

> This patch converts the sparc architecture to use the generic
> read_persistent_clock and update_persistent_clock interfaces, reducing
> the amount of arch specific code we have to maintain, and allowing for
> further cleanups in the future.
> 
> I have not built or tested this patch, so help from arch maintainers
> would be appreciated.
> 
> Signed-off-by: John Stultz <johnstul@us.ibm.com>

This looks fine to me:

Acked-by: David S. Miller <davem@davemloft.net>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
  2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
  2009-12-23 10:08   ` Geert Uytterhoeven
  2009-12-23 22:04   ` john stultz
@ 2009-12-24  4:54   ` David Miller
  2009-12-24  5:10     ` Paul Mundt
  2 siblings, 1 reply; 26+ messages in thread
From: David Miller @ 2009-12-24  4:54 UTC (permalink / raw)
  To: lethal
  Cc: johnstul, linux-kernel, rth, linux-alpha, linux-sh, linux,
	hskinnemoen, vapier, starvik, dhowells, ysato, tony.luck, takata,
	geert, yasutake.koichi, kyle

From: Paul Mundt <lethal@linux-sh.org>
Date: Wed, 23 Dec 2009 14:08:10 +0900

> In any event, I wonder if it might make more sense to take something like
> the SPARC implementation that is simply a wrapper around the RTC, move
> that out in to a more generic place, and permit architectures to select
> an RTC class backed persistent clock instead (it seems to be only
> platforms that haven't caught up yet in terms of generic time and RTC
> migration that would want to define this interface on their own at all at
> this point)?

This sounds nice but don't we have a slew of RTC types that need
to be accessed over I2C and thus you can't touch them without
sleeping?

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock
  2009-12-24  4:54   ` David Miller
@ 2009-12-24  5:10     ` Paul Mundt
  0 siblings, 0 replies; 26+ messages in thread
From: Paul Mundt @ 2009-12-24  5:10 UTC (permalink / raw)
  To: David Miller
  Cc: johnstul, linux-kernel, rth, linux-alpha, linux-sh, linux,
	hskinnemoen, vapier, starvik, dhowells, ysato, tony.luck, takata,
	geert, yasutake.koichi, kyle

On Wed, Dec 23, 2009 at 08:54:15PM -0800, David Miller wrote:
> From: Paul Mundt <lethal@linux-sh.org>
> Date: Wed, 23 Dec 2009 14:08:10 +0900
> 
> > In any event, I wonder if it might make more sense to take something like
> > the SPARC implementation that is simply a wrapper around the RTC, move
> > that out in to a more generic place, and permit architectures to select
> > an RTC class backed persistent clock instead (it seems to be only
> > platforms that haven't caught up yet in terms of generic time and RTC
> > migration that would want to define this interface on their own at all at
> > this point)?
> 
> This sounds nice but don't we have a slew of RTC types that need
> to be accessed over I2C and thus you can't touch them without
> sleeping?

Yes, and SPI and so on. We do however have plenty of available room for
adding a valid-for-persistent-clock flag to permit drivers to opt-in, so
we can certainly still do better than the status quo. I'll hack something
up and see how it goes.

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 2/14] Convert arm to read/update_persistent_clock
  2009-12-23  4:01   ` [RFC][PATCH 2/14] Convert arm " john stultz
  2009-12-23  4:03     ` [RFC][PATCH 3/14] Convert avr32 " john stultz
@ 2009-12-24 11:09     ` Uwe Kleine-König
  1 sibling, 0 replies; 26+ messages in thread
From: Uwe Kleine-König @ 2009-12-24 11:09 UTC (permalink / raw)
  To: john stultz; +Cc: lkml, Russell King, linux-arm-kernel

Hello,

On Tue, Dec 22, 2009 at 08:01:42PM -0800, john stultz wrote:
> This patch converts the arm architecture to use the generic
> read_persistent_clock and update_persistent_clock interfaces, reducing
> the amount of arch specific code we have to maintain, and allowing for
> further cleanups in the future.
> 
> Also removes a direct xtime access, replacing it with
> current_kernel_time()
> 
> I have not built or tested this patch, so help from arch maintainers
> would be appreciated.
I havn't tested either, but built footbridge_defconfig successfully.
bloat-o-meter reports:

add/remove: 4/1 grow/shrink: 2/2 up/down: 388/-196 (192)
function                                     old     new   delta
sync_cmos_clock                                -     240    +240
update_persistent_clock                        -      52     +52
sync_cmos_work                                 -      40     +40
do_adjtimex                                 1924    1956     +32
save_time_delta                               56      76     +20
no_sync_cmos_clock                             -       4      +4
next_rtc_update                                4       -      -4
set_isa_cmos_time                            372     364      -8
timer_tick                                   324     140    -184

Best regards
Uwe

-- 
Pengutronix e.K.                              | Uwe Kleine-König            |
Industrial Linux Solutions                    | http://www.pengutronix.de/  |

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 14/14] Convert sparc to read/update_persistent_clock
  2009-12-23  4:16                           ` [RFC][PATCH 14/14] Convert sparc " john stultz
  2009-12-24  4:52                             ` David Miller
@ 2010-01-05 16:41                             ` Kristoffer Glembo
  1 sibling, 0 replies; 26+ messages in thread
From: Kristoffer Glembo @ 2010-01-05 16:41 UTC (permalink / raw)
  To: john stultz; +Cc: lkml, David S. Miller, sparclinux

Hi,

john stultz wrote:
> This patch converts the sparc architecture to use the generic
> read_persistent_clock and update_persistent_clock interfaces, reducing
> the amount of arch specific code we have to maintain, and allowing for
> further cleanups in the future.
>
> I have not built or tested this patch, so help from arch maintainers
> would be appreciated.
>
>   
> Signed-off-by: John Stultz <johnstul@us.ibm.com>
>   

The sparc32 patch does not build because you forgot to remove the
last_rtc_update variable declaration:

arch/sparc/kernel/time_32.c: In function 'timer_interrupt':
arch/sparc/kernel/time_32.c:94: warning: unused variable 'last_rtc_update'

Best regards,
Kristoffer Glembo


^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 6/14] Convert frv to read/update_persistent_clock
  2009-12-23  4:05         ` [RFC][PATCH 5/14] Convert cris " john stultz
  2009-12-23  4:06           ` [RFC][PATCH 6/14] Convert frv " john stultz
@ 2010-01-05 16:47           ` David Howells
  1 sibling, 0 replies; 26+ messages in thread
From: David Howells @ 2010-01-05 16:47 UTC (permalink / raw)
  To: john stultz; +Cc: dhowells, lkml

john stultz <johnstul@us.ibm.com> wrote:

> This patch converts the frv architecture to use the generic
> read_persistent_clock and update_persistent_clock interfaces, reducing
> the amount of arch specific code we have to maintain, and allowing for
> further cleanups in the future.
> 
> I have not built or tested this patch, so help from arch maintainers
> would be appreciated.
> 
> Signed-off-by: John Stultz <johnstul@us.ibm.com>

Acked-by: David Howells <dhowells@redhat.com>

^ permalink raw reply	[flat|nested] 26+ messages in thread

* Re: [RFC][PATCH 11/14] Convert mn10300 to read/update_persistent_clock
  2009-12-23  4:11                   ` [RFC][PATCH 10/14] Convert m68k " john stultz
  2009-12-23  4:12                     ` [RFC][PATCH 11/14] Convert mn10300 " john stultz
@ 2010-01-05 17:08                     ` David Howells
  1 sibling, 0 replies; 26+ messages in thread
From: David Howells @ 2010-01-05 17:08 UTC (permalink / raw)
  To: john stultz; +Cc: dhowells, lkml, Koichi Yasutake, linux-am33-list

john stultz <johnstul@us.ibm.com> wrote:

> This patch converts the mn10300 architecture to use the generic
> read_persistent_clock and update_persistent_clock interfaces, reducing
> the amount of arch specific code we have to maintain, and allowing for
> further cleanups in the future.
> 
> I have not built or tested this patch, so help from arch maintainers
> would be appreciated.
> 
> Signed-off-by: John Stultz <johnstul@us.ibm.com>

arch/mn10300/kernel/rtc.c: In function `update_persistent_clock':
arch/mn10300/kernel/rtc.c:113: error: implicit declaration of function 'set_rtc_mms'
arch/mn10300/kernel/rtc.c: At top level:
arch/mn10300/kernel/rtc.c:24: warning: unused variable `last_rtc_update'
arch/mn10300/kernel/rtc.c:24: warning: 'last_rtc_update' defined but not used
arch/mn10300/kernel/rtc.c:51: warning: 'set_rtc_mmss' defined but not used

set_rtc_mms should be set_rtc_mmss in update_persistent_clock().  In fact,
set_rtc_mmss() should probably just be rolled into update_persistent_clock().

Furthermore, last_rtc_update and its comment should be deleted.

Apart from that, it seems to work.

David

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2010-01-05 17:20 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-12-23  3:59 [RFC][PATCH 0/14] Convert remaining arches to read/update_persistent_clock john stultz
2009-12-23  4:00 ` [RFC][PATCH 1/14] Convert alpha " john stultz
2009-12-23  4:01   ` [RFC][PATCH 2/14] Convert arm " john stultz
2009-12-23  4:03     ` [RFC][PATCH 3/14] Convert avr32 " john stultz
2009-12-23  4:04       ` [RFC][PATCH 4/14] Convert blackfin " john stultz
2009-12-23  4:05         ` [RFC][PATCH 5/14] Convert cris " john stultz
2009-12-23  4:06           ` [RFC][PATCH 6/14] Convert frv " john stultz
2009-12-23  4:08             ` [RFC][PATCH 7/14] Convert h8300 " john stultz
2009-12-23  4:09               ` [RFC][PATCH 8/14] Convert ia64 " john stultz
2009-12-23  4:10                 ` [RFC][PATCH 9/14] Convert m32r " john stultz
2009-12-23  4:11                   ` [RFC][PATCH 10/14] Convert m68k " john stultz
2009-12-23  4:12                     ` [RFC][PATCH 11/14] Convert mn10300 " john stultz
2009-12-23  4:14                       ` [RFC][PATCH 12/14] Convert parisc " john stultz
2009-12-23  4:15                         ` [RFC][PATCH 13/14] Convert sh " john stultz
2009-12-23  4:16                           ` [RFC][PATCH 14/14] Convert sparc " john stultz
2009-12-24  4:52                             ` David Miller
2010-01-05 16:41                             ` Kristoffer Glembo
2010-01-05 17:08                     ` [RFC][PATCH 11/14] Convert mn10300 " David Howells
2010-01-05 16:47           ` [RFC][PATCH 6/14] Convert frv " David Howells
2009-12-24 11:09     ` [RFC][PATCH 2/14] Convert arm " Uwe Kleine-König
2009-12-23  5:08 ` [RFC][PATCH 0/14] Convert remaining arches " Paul Mundt
2009-12-23 10:08   ` Geert Uytterhoeven
2009-12-23 22:04   ` john stultz
2009-12-24  0:27     ` Dialup Jon Norstog
2009-12-24  4:54   ` David Miller
2009-12-24  5:10     ` Paul Mundt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).