From 01363220f5d23ef68276db8974e46a502e43d01d Mon Sep 17 00:00:00 2001
From: Kyle McMartin <kyle@mako.i.cabal.ca>
Date: Mon, 26 Feb 2007 22:21:22 -0500
Subject: [PATCH] [PARISC] clocksource: Move update_cr16_clocksource later in
 boot

smp_cpus_done is too early for us... before we even do a device
inventory! Move update_cr16_clocksource into the tail end of
processor_probe() and stub it out on CONFIG_SMP=n builds.

Verified that clocksource0 is properly updated to use jiffies
on an SMP build.

Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
---
 arch/parisc/kernel/processor.c | 8 ++++++++
 arch/parisc/kernel/smp.c       | 4 ----
 arch/parisc/kernel/time.c      | 5 +++++
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c
index 7c056dcebf553..dd5d0cb6b3473 100644
--- a/arch/parisc/kernel/processor.c
+++ b/arch/parisc/kernel/processor.c
@@ -48,6 +48,8 @@ EXPORT_SYMBOL(boot_cpu_data);
 
 struct cpuinfo_parisc cpu_data[NR_CPUS] __read_mostly;
 
+extern int update_cr16_clocksource(void);	/* from time.c */
+
 /*
 **  	PARISC CPU driver - claim "device" and initialize CPU data structures.
 **
@@ -198,6 +200,12 @@ static int __init processor_probe(struct parisc_device *dev)
 	}
 #endif
 
+	/* If we've registered more than one cpu,
+	 * we'll use the jiffies clocksource since cr16
+	 * is not synchronized between CPUs.
+	 */
+	update_cr16_clocksource();
+
 	return 0;
 }
 
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c
index bb6e6a38e9119..6ba9257fdb7f1 100644
--- a/arch/parisc/kernel/smp.c
+++ b/arch/parisc/kernel/smp.c
@@ -567,10 +567,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 
 void smp_cpus_done(unsigned int cpu_max)
 {
-	extern int update_cr16_clocksource(void);
-
-	update_cr16_clocksource();
-
 	return;
 }
 
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c
index 9b14066d693c2..07a991aa9b0c2 100644
--- a/arch/parisc/kernel/time.c
+++ b/arch/parisc/kernel/time.c
@@ -200,6 +200,11 @@ int update_cr16_clocksource(void)
 
 	return change;
 }
+#else
+int update_cr16_clocksource(void)
+{
+	return 0; /* no change */
+}
 #endif /*CONFIG_SMP*/
 
 void __init start_cpu_itimer(void)
-- 
GitLab