linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv2 0/10] Remove ARM local timer API
@ 2013-03-07  0:03 Stephen Boyd
  2013-03-07  0:03 ` [PATCH 01/10] clocksource: add generic dummy timer driver Stephen Boyd
                   ` (9 more replies)
  0 siblings, 10 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:03 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, linux-arm-msm, Mark Rutland, Marc Zyngier,
	Kukjin Kim, Barry Song, Daniel Walker, Bryan Huntsman,
	Gregory CLEMENT, Santosh Shilimkar, Tony Lindgren, John Stultz,
	Thomas Gleixner

In light of Mark Rutland's recent work on divorcing the ARM architected
timers from the ARM local timer API and introducing a generic arch hook for
broadcast it seems that we should remove the local timer API entirely.
Doing so will reduce the architecture dependencies of our timer drivers,
reduce code in ARM core, and simplify timer drivers because they no longer
go through an architecture layer that is essentially a hotplug notifier.

Previous attempts have been made[1] unsuccessfully. I'm hoping this can
be accepted now so that we can clean up the timer drivers that are
used in both UP and SMP situations. Right now these drivers have to ignore
the timer setup callback on the boot CPU to avoid registering clockevents
twice. This is not very symmetric and causes convuluted code that does
the same thing in two places.

Patches based on v3.9-rc1. Mostly compile tested as I don't
have access to the hardware.

[1] http://article.gmane.org/gmane.linux.ports.arm.kernel/145705

Note: A hotplug notifier is used by both x86 for the apb_timer (see 
apbt_cpuhp_notify) and by metag (see arch_timer_cpu_notify in
metag_generic.c) so this is not new.

Changes since v1:
 * Picked up Mark's generic dummy timer driver
 * Split out omap changes into new patch

Mark Rutland (1):
  clocksource: add generic dummy timer driver

Stephen Boyd (9):
  ARM: smp: Remove duplicate dummy timer implementation
  ARM: smp_twd: Divorce smp_twd from local timer API
  ARM: OMAP2+: Divorce from local timer API
  ARM: EXYNOS4: Divorce mct from local timer API
  ARM: PRIMA2: Divorce timer-marco from local timer API
  ARM: msm: Divorce msm_timer from local timer API
  clocksource: time-armada-370-xp: Fix sparse warning
  clocksource: time-armada-370-xp: Divorce from local timer API
  ARM: smp: Remove local timer API

 arch/arm/Kconfig                         |  12 +--
 arch/arm/include/asm/localtimer.h        |  34 ---------
 arch/arm/kernel/smp.c                    |  87 ---------------------
 arch/arm/kernel/smp_twd.c                |  48 ++++++++----
 arch/arm/mach-exynos/mct.c               |  53 +++++++++----
 arch/arm/mach-msm/timer.c                | 125 +++++++++++++++++--------------
 arch/arm/mach-omap2/Kconfig              |   1 -
 arch/arm/mach-omap2/timer.c              |   7 --
 arch/arm/mach-prima2/timer-marco.c       |  98 ++++++++++++------------
 drivers/clocksource/Makefile             |   1 +
 drivers/clocksource/dummy_timer.c        |  67 +++++++++++++++++
 drivers/clocksource/time-armada-370-xp.c |  88 ++++++++++------------
 include/linux/time-armada-370-xp.h       |   4 +-
 13 files changed, 298 insertions(+), 327 deletions(-)
 delete mode 100644 arch/arm/include/asm/localtimer.h
 create mode 100644 drivers/clocksource/dummy_timer.c

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 01/10] clocksource: add generic dummy timer driver
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
@ 2013-03-07  0:03 ` Stephen Boyd
  2013-03-07 14:00   ` Thomas Gleixner
  2013-03-07  0:03 ` [PATCH 02/10] ARM: smp: Remove duplicate dummy timer implementation Stephen Boyd
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:03 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Mark Rutland, linux-kernel, linux-arm-msm, John Stultz, Thomas Gleixner

From: Mark Rutland <mark.rutland@arm.com>

Several architectures have a dummy timer driver tightly coupled with
their broadcast code to support machines without cpu-local timers (or
where there is a lack of driver support).

Since 12ad100046: "clockevents: Add generic timer broadcast function"
it's been possible to write broadcast-capable timer drivers decoupled
from the broadcast mechanism. We can use this functionality to implement
a generic dummy timer driver that can be shared by all architectures
with generic tick broadcast (ARCH_HAS_TICK_BROADCAST).

This patch implements a generic dummy timer using this facility.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
[sboyd: Make percpu data static, use __this_cpu_ptr(), s/dummy/dummy_timer/]
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 drivers/clocksource/Makefile      |  1 +
 drivers/clocksource/dummy_timer.c | 67 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)
 create mode 100644 drivers/clocksource/dummy_timer.c

diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile
index 4d8283a..655d718 100644
--- a/drivers/clocksource/Makefile
+++ b/drivers/clocksource/Makefile
@@ -22,3 +22,4 @@ obj-$(CONFIG_VT8500_TIMER)	+= vt8500_timer.o
 
 obj-$(CONFIG_ARM_ARCH_TIMER)		+= arm_arch_timer.o
 obj-$(CONFIG_CLKSRC_METAG_GENERIC)	+= metag_generic.o
+obj-$(CONFIG_ARCH_HAS_TICK_BROADCAST)	+= dummy_timer.o
diff --git a/drivers/clocksource/dummy_timer.c b/drivers/clocksource/dummy_timer.c
new file mode 100644
index 0000000..7e1ce45
--- /dev/null
+++ b/drivers/clocksource/dummy_timer.c
@@ -0,0 +1,67 @@
+/*
+ *  linux/drivers/clocksource/dummy_timer.c
+ *
+ *  Copyright (C) 2013 ARM Ltd.
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/clockchips.h>
+#include <linux/cpu.h>
+#include <linux/init.h>
+#include <linux/percpu.h>
+
+static DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt);
+
+static void dummy_timer_set_mode(enum clock_event_mode mode,
+			   struct clock_event_device *evt)
+{
+	/*
+	 * Core clockevents code will call this when exchanging timer devices.
+	 * We don't need to do anything here.
+	 */
+}
+
+static void __cpuinit dummy_timer_setup(void)
+{
+	int cpu = smp_processor_id();
+	struct clock_event_device *evt = __this_cpu_ptr(&dummy_timer_evt);
+
+	evt->name	= "dummy_timer";
+	evt->features	= CLOCK_EVT_FEAT_PERIODIC |
+			  CLOCK_EVT_FEAT_ONESHOT |
+			  CLOCK_EVT_FEAT_DUMMY;
+	evt->rating	= 100;
+	evt->set_mode	= dummy_timer_set_mode;
+	evt->cpumask	= cpumask_of(cpu);
+
+	clockevents_register_device(evt);
+}
+
+static int __cpuinit dummy_timer_cpu_notify(struct notifier_block *self,
+				      unsigned long action, void *hcpu)
+{
+	if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING)
+		dummy_timer_setup();
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block dummy_timer_cpu_nb __cpuinitdata = {
+	.notifier_call = dummy_timer_cpu_notify,
+};
+
+static int __init dummy_timer_register(void)
+{
+	int err = register_cpu_notifier(&dummy_timer_cpu_nb);
+	if (err)
+		return err;
+
+	/* We won't get a call on the boot CPU, so register immediately */
+	dummy_timer_setup();
+
+	return 0;
+}
+device_initcall(dummy_timer_register);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 02/10] ARM: smp: Remove duplicate dummy timer implementation
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
  2013-03-07  0:03 ` [PATCH 01/10] clocksource: add generic dummy timer driver Stephen Boyd
@ 2013-03-07  0:03 ` Stephen Boyd
  2013-03-07  0:03 ` [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API Stephen Boyd
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:03 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Russell King

Drop ARM's version of the dummy timer now that we have a generic
implementation in drivers/clocksource.

Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/kernel/smp.c | 22 ++--------------------
 1 file changed, 2 insertions(+), 20 deletions(-)

diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 1bdfd87..e4f3669 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -468,24 +468,6 @@ void tick_broadcast(const struct cpumask *mask)
 }
 #endif
 
-static void broadcast_timer_set_mode(enum clock_event_mode mode,
-	struct clock_event_device *evt)
-{
-}
-
-static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt)
-{
-	evt->name	= "dummy_timer";
-	evt->features	= CLOCK_EVT_FEAT_ONESHOT |
-			  CLOCK_EVT_FEAT_PERIODIC |
-			  CLOCK_EVT_FEAT_DUMMY;
-	evt->rating	= 400;
-	evt->mult	= 1;
-	evt->set_mode	= broadcast_timer_set_mode;
-
-	clockevents_register_device(evt);
-}
-
 static struct local_timer_ops *lt_ops;
 
 #ifdef CONFIG_LOCAL_TIMERS
@@ -509,8 +491,8 @@ static void __cpuinit percpu_timer_setup(void)
 
 	evt->cpumask = cpumask_of(cpu);
 
-	if (!lt_ops || lt_ops->setup(evt))
-		broadcast_timer_setup(evt);
+	if (lt_ops)
+		lt_ops->setup(evt);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
  2013-03-07  0:03 ` [PATCH 01/10] clocksource: add generic dummy timer driver Stephen Boyd
  2013-03-07  0:03 ` [PATCH 02/10] ARM: smp: Remove duplicate dummy timer implementation Stephen Boyd
@ 2013-03-07  0:03 ` Stephen Boyd
  2013-03-08  0:40   ` Tony Lindgren
  2013-03-07  0:04 ` [PATCH 04/10] ARM: OMAP2+: Divorce " Stephen Boyd
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:03 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Russell King

Separate the smp_twd timers from the local timer API. This will
allow us to remove ARM local timer support in the near future and
gets us closer to moving this driver to drivers/clocksource.

Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/Kconfig          |  2 +-
 arch/arm/kernel/smp_twd.c | 48 +++++++++++++++++++++++++++++++----------------
 2 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 5b71469..5ad2ccf 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1527,6 +1527,7 @@ config SMP
 	depends on HAVE_SMP
 	depends on MMU
 	select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
+	select HAVE_ARM_TWD if (!ARCH_MSM_SCORPIONMP && !EXYNOS4_MCT)
 	select USE_GENERIC_SMP_HELPERS
 	help
 	  This enables support for systems with more than one CPU. If you have
@@ -1650,7 +1651,6 @@ config LOCAL_TIMERS
 	bool "Use local timer interrupts"
 	depends on SMP
 	default y
-	select HAVE_ARM_TWD if (!ARCH_MSM_SCORPIONMP && !EXYNOS4_MCT)
 	help
 	  Enable support for local timers on SMP platforms, rather then the
 	  legacy IPI broadcast method.  Local timers allows the system
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index c092115..2439843 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/clk.h>
+#include <linux/cpu.h>
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/err.h>
@@ -23,7 +24,6 @@
 #include <linux/of_address.h>
 
 #include <asm/smp_twd.h>
-#include <asm/localtimer.h>
 
 /* set up by the platform code */
 static void __iomem *twd_base;
@@ -32,7 +32,7 @@ static struct clk *twd_clk;
 static unsigned long twd_timer_rate;
 static DEFINE_PER_CPU(bool, percpu_setup_called);
 
-static struct clock_event_device __percpu **twd_evt;
+static struct clock_event_device __percpu *twd_evt;
 static int twd_ppi;
 
 static void twd_set_mode(enum clock_event_mode mode,
@@ -105,7 +105,7 @@ static void twd_update_frequency(void *new_rate)
 {
 	twd_timer_rate = *((unsigned long *) new_rate);
 
-	clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate);
+	clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate);
 }
 
 static int twd_rate_change(struct notifier_block *nb,
@@ -131,7 +131,7 @@ static struct notifier_block twd_clk_nb = {
 
 static int twd_clk_init(void)
 {
-	if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
+	if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
 		return clk_notifier_register(twd_clk, &twd_clk_nb);
 
 	return 0;
@@ -150,7 +150,7 @@ static void twd_update_frequency(void *data)
 {
 	twd_timer_rate = clk_get_rate(twd_clk);
 
-	clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate);
+	clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate);
 }
 
 static int twd_cpufreq_transition(struct notifier_block *nb,
@@ -176,7 +176,7 @@ static struct notifier_block twd_cpufreq_nb = {
 
 static int twd_cpufreq_init(void)
 {
-	if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
+	if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
 		return cpufreq_register_notifier(&twd_cpufreq_nb,
 			CPUFREQ_TRANSITION_NOTIFIER);
 
@@ -266,7 +266,6 @@ static void twd_get_clock(struct device_node *np)
  */
 static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 {
-	struct clock_event_device **this_cpu_clk;
 	int cpu = smp_processor_id();
 
 	/*
@@ -275,7 +274,7 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 	 */
 	if (per_cpu(percpu_setup_called, cpu)) {
 		__raw_writel(0, twd_base + TWD_TIMER_CONTROL);
-		clockevents_register_device(*__this_cpu_ptr(twd_evt));
+		clockevents_register_device(__this_cpu_ptr(twd_evt));
 		enable_percpu_irq(clk->irq, 0);
 		return 0;
 	}
@@ -296,9 +295,7 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 	clk->set_mode = twd_set_mode;
 	clk->set_next_event = twd_set_next_event;
 	clk->irq = twd_ppi;
-
-	this_cpu_clk = __this_cpu_ptr(twd_evt);
-	*this_cpu_clk = clk;
+	clk->cpumask = cpumask_of(cpu);
 
 	clockevents_config_and_register(clk, twd_timer_rate,
 					0xf, 0xffffffff);
@@ -307,16 +304,32 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 	return 0;
 }
 
-static struct local_timer_ops twd_lt_ops __cpuinitdata = {
-	.setup	= twd_timer_setup,
-	.stop	= twd_timer_stop,
+static int __cpuinit twd_timer_cpu_notify(struct notifier_block *self,
+					   unsigned long action, void *hcpu)
+{
+	struct clock_event_device *evt = this_cpu_ptr(twd_evt);
+
+	switch (action & ~CPU_TASKS_FROZEN) {
+	case CPU_STARTING:
+		twd_timer_setup(evt);
+		break;
+	case CPU_DYING:
+		twd_timer_stop(evt);
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block twd_timer_cpu_nb __cpuinitdata = {
+	.notifier_call = twd_timer_cpu_notify,
 };
 
 static int __init twd_local_timer_common_register(struct device_node *np)
 {
 	int err;
 
-	twd_evt = alloc_percpu(struct clock_event_device *);
+	twd_evt = alloc_percpu(struct clock_event_device);
 	if (!twd_evt) {
 		err = -ENOMEM;
 		goto out_free;
@@ -328,10 +341,13 @@ static int __init twd_local_timer_common_register(struct device_node *np)
 		goto out_free;
 	}
 
-	err = local_timer_register(&twd_lt_ops);
+	err = register_cpu_notifier(&twd_timer_cpu_nb);
 	if (err)
 		goto out_irq;
 
+	/* Immediately configure the timer on the boot CPU */
+	twd_timer_setup(this_cpu_ptr(twd_evt));
+
 	twd_get_clock(np);
 
 	return 0;
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 04/10] ARM: OMAP2+: Divorce from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (2 preceding siblings ...)
  2013-03-07  0:03 ` [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-08 19:50   ` Tony Lindgren
  2013-03-07  0:04 ` [PATCH 05/10] ARM: EXYNOS4: Divorce mct " Stephen Boyd
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, linux-arm-msm, Santosh Shilimkar, Tony Lindgren

Now that the TWD doesn't rely on the local timer API, OMAP can
stop selecting it in Kconfig and relying on the config option to
decide if it should call smp_twd functions.

Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: Tony Lindgren <tony@atomide.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-omap2/Kconfig | 1 -
 arch/arm/mach-omap2/timer.c | 7 -------
 2 files changed, 8 deletions(-)

diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 49ac3df..6e1f871 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -88,7 +88,6 @@ config ARCH_OMAP4
 	select CACHE_L2X0
 	select CPU_V7
 	select HAVE_SMP
-	select LOCAL_TIMERS if SMP
 	select OMAP_INTERCONNECT
 	select PL310_ERRATA_588369
 	select PL310_ERRATA_727915
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index 2bdd4cf..c00a8f8 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -587,7 +587,6 @@ OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon",
 #ifdef CONFIG_ARCH_OMAP4
 OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
 			2, OMAP4_MPU_SOURCE);
-#ifdef CONFIG_LOCAL_TIMERS
 static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29);
 void __init omap4_local_timer_init(void)
 {
@@ -606,12 +605,6 @@ void __init omap4_local_timer_init(void)
 			pr_err("twd_local_timer_register failed %d\n", err);
 	}
 }
-#else /* CONFIG_LOCAL_TIMERS */
-void __init omap4_local_timer_init(void)
-{
-	omap4_sync32k_timer_init();
-}
-#endif /* CONFIG_LOCAL_TIMERS */
 #endif /* CONFIG_ARCH_OMAP4 */
 
 #ifdef CONFIG_SOC_OMAP5
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 05/10] ARM: EXYNOS4: Divorce mct from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (3 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 04/10] ARM: OMAP2+: Divorce " Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-07  0:04 ` [PATCH 06/10] ARM: PRIMA2: Divorce timer-marco " Stephen Boyd
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Kukjin Kim

Separate the mct local timers from the local timer API. This will
allow us to remove ARM local timer support in the near future and
gets us closer to moving this driver to drivers/clocksource.

Cc: Kukjin Kim <kgene.kim@samsung.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-exynos/mct.c | 53 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 16 deletions(-)

diff --git a/arch/arm/mach-exynos/mct.c b/arch/arm/mach-exynos/mct.c
index c9d6650..5a9a73f 100644
--- a/arch/arm/mach-exynos/mct.c
+++ b/arch/arm/mach-exynos/mct.c
@@ -16,13 +16,13 @@
 #include <linux/err.h>
 #include <linux/clk.h>
 #include <linux/clockchips.h>
+#include <linux/cpu.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/percpu.h>
 #include <linux/of.h>
 
 #include <asm/arch_timer.h>
-#include <asm/localtimer.h>
 
 #include <plat/cpu.h>
 
@@ -42,7 +42,7 @@ static unsigned long clk_rate;
 static unsigned int mct_int_type;
 
 struct mct_clock_event_device {
-	struct clock_event_device *evt;
+	struct clock_event_device evt;
 	void __iomem *base;
 	char name[10];
 };
@@ -264,8 +264,6 @@ static void exynos4_clockevent_init(void)
 		setup_irq(EXYNOS4_IRQ_MCT_G0, &mct_comp_event_irq);
 }
 
-#ifdef CONFIG_LOCAL_TIMERS
-
 static DEFINE_PER_CPU(struct mct_clock_event_device, percpu_mct_tick);
 
 /* Clock event handling */
@@ -338,7 +336,7 @@ static inline void exynos4_tick_set_mode(enum clock_event_mode mode,
 
 static int exynos4_mct_tick_clear(struct mct_clock_event_device *mevt)
 {
-	struct clock_event_device *evt = mevt->evt;
+	struct clock_event_device *evt = &mevt->evt;
 
 	/*
 	 * This is for supporting oneshot mode.
@@ -360,7 +358,7 @@ static int exynos4_mct_tick_clear(struct mct_clock_event_device *mevt)
 static irqreturn_t exynos4_mct_tick_isr(int irq, void *dev_id)
 {
 	struct mct_clock_event_device *mevt = dev_id;
-	struct clock_event_device *evt = mevt->evt;
+	struct clock_event_device *evt = &mevt->evt;
 
 	exynos4_mct_tick_clear(mevt);
 
@@ -388,7 +386,6 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)
 	int mct_lx_irq;
 
 	mevt = this_cpu_ptr(&percpu_mct_tick);
-	mevt->evt = evt;
 
 	mevt->base = EXYNOS4_MCT_L_BASE(cpu);
 	sprintf(mevt->name, "mct_tick%d", cpu);
@@ -426,7 +423,7 @@ static int __cpuinit exynos4_local_timer_setup(struct clock_event_device *evt)
 	return 0;
 }
 
-static void exynos4_local_timer_stop(struct clock_event_device *evt)
+static void __cpuinit exynos4_local_timer_stop(struct clock_event_device *evt)
 {
 	unsigned int cpu = smp_processor_id();
 	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
@@ -439,22 +436,38 @@ static void exynos4_local_timer_stop(struct clock_event_device *evt)
 		disable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER);
 }
 
-static struct local_timer_ops exynos4_mct_tick_ops __cpuinitdata = {
-	.setup	= exynos4_local_timer_setup,
-	.stop	= exynos4_local_timer_stop,
+static int __cpuinit exynos4_mct_cpu_notify(struct notifier_block *self,
+					   unsigned long action, void *hcpu)
+{
+	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
+	struct clock_event_device *evt = &mevt->evt;
+
+	switch (action & ~CPU_TASKS_FROZEN) {
+	case CPU_STARTING:
+		exynos4_local_timer_setup(evt);
+		break;
+	case CPU_DYING:
+		exynos4_local_timer_stop(evt);
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block exynos4_mct_cpu_nb __cpuinitdata = {
+	.notifier_call = exynos4_mct_cpu_notify,
 };
-#endif /* CONFIG_LOCAL_TIMERS */
 
 static void __init exynos4_timer_resources(void)
 {
+	int err;
+	struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
 	struct clk *mct_clk;
 	mct_clk = clk_get(NULL, "xtal");
 
 	clk_rate = clk_get_rate(mct_clk);
 
-#ifdef CONFIG_LOCAL_TIMERS
 	if (mct_int_type == MCT_INT_PPI) {
-		int err;
 
 		err = request_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER,
 					 exynos4_mct_tick_isr, "MCT",
@@ -463,8 +476,16 @@ static void __init exynos4_timer_resources(void)
 		     EXYNOS_IRQ_MCT_LOCALTIMER, err);
 	}
 
-	local_timer_register(&exynos4_mct_tick_ops);
-#endif /* CONFIG_LOCAL_TIMERS */
+	err = register_cpu_notifier(&exynos4_mct_cpu_nb);
+	if (err)
+		goto out_irq;
+
+	/* Immediately configure the timer on the boot CPU */
+	exynos4_local_timer_setup(&mevt->evt);
+	return;
+
+out_irq:
+	free_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, &percpu_mct_tick);
 }
 
 void __init exynos4_timer_init(void)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 06/10] ARM: PRIMA2: Divorce timer-marco from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (4 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 05/10] ARM: EXYNOS4: Divorce mct " Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-07  0:04 ` [PATCH 07/10] ARM: msm: Divorce msm_timer " Stephen Boyd
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Barry Song

Separate the marco local timers from the local timer API. This
will allow us to remove ARM local timer support in the near future
and gets us closer to moving this driver to drivers/clocksource.

Cc: Barry Song <baohua.song@csr.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-prima2/timer-marco.c | 98 ++++++++++++++++++++------------------
 1 file changed, 52 insertions(+), 46 deletions(-)

diff --git a/arch/arm/mach-prima2/timer-marco.c b/arch/arm/mach-prima2/timer-marco.c
index f4eea2e..d54aac2 100644
--- a/arch/arm/mach-prima2/timer-marco.c
+++ b/arch/arm/mach-prima2/timer-marco.c
@@ -10,6 +10,7 @@
 #include <linux/interrupt.h>
 #include <linux/clockchips.h>
 #include <linux/clocksource.h>
+#include <linux/cpu.h>
 #include <linux/bitops.h>
 #include <linux/irq.h>
 #include <linux/clk.h>
@@ -18,7 +19,6 @@
 #include <linux/of_irq.h>
 #include <linux/of_address.h>
 #include <asm/sched_clock.h>
-#include <asm/localtimer.h>
 #include <asm/mach/time.h>
 
 #include "common.h"
@@ -154,13 +154,7 @@ static void sirfsoc_clocksource_resume(struct clocksource *cs)
 		BIT(1) | BIT(0), sirfsoc_timer_base + SIRFSOC_TIMER_64COUNTER_CTRL);
 }
 
-static struct clock_event_device sirfsoc_clockevent = {
-	.name = "sirfsoc_clockevent",
-	.rating = 200,
-	.features = CLOCK_EVT_FEAT_ONESHOT,
-	.set_mode = sirfsoc_timer_set_mode,
-	.set_next_event = sirfsoc_timer_set_next_event,
-};
+static struct clock_event_device __percpu *sirfsoc_clockevent;
 
 static struct clocksource sirfsoc_clocksource = {
 	.name = "sirfsoc_clocksource",
@@ -176,11 +170,8 @@ static struct irqaction sirfsoc_timer_irq = {
 	.name = "sirfsoc_timer0",
 	.flags = IRQF_TIMER | IRQF_NOBALANCING,
 	.handler = sirfsoc_timer_interrupt,
-	.dev_id = &sirfsoc_clockevent,
 };
 
-#ifdef CONFIG_LOCAL_TIMERS
-
 static struct irqaction sirfsoc_timer1_irq = {
 	.name = "sirfsoc_timer1",
 	.flags = IRQF_TIMER | IRQF_NOBALANCING,
@@ -189,56 +180,75 @@ static struct irqaction sirfsoc_timer1_irq = {
 
 static int __cpuinit sirfsoc_local_timer_setup(struct clock_event_device *ce)
 {
-	/* Use existing clock_event for cpu 0 */
-	if (!smp_processor_id())
-		return 0;
+	int cpu = smp_processor_id();
+	struct irqaction *action;
+
+	if (cpu == 0)
+		action = &sirfsoc_timer_irq;
+	else
+		action = &sirfsoc_timer1_irq;
 
-	ce->irq = sirfsoc_timer1_irq.irq;
+	ce->irq = action->irq;
 	ce->name = "local_timer";
-	ce->features = sirfsoc_clockevent.features;
-	ce->rating = sirfsoc_clockevent.rating;
+	ce->features = CLOCK_EVT_FEAT_ONESHOT;
+	ce->rating = 200;
 	ce->set_mode = sirfsoc_timer_set_mode;
 	ce->set_next_event = sirfsoc_timer_set_next_event;
-	ce->shift = sirfsoc_clockevent.shift;
-	ce->mult = sirfsoc_clockevent.mult;
-	ce->max_delta_ns = sirfsoc_clockevent.max_delta_ns;
-	ce->min_delta_ns = sirfsoc_clockevent.min_delta_ns;
+	clockevents_calc_mult_shift(ce, CLOCK_TICK_RATE, 60);
+	ce->max_delta_ns = clockevent_delta2ns(-2, ce);
+	ce->min_delta_ns = clockevent_delta2ns(2, ce);
+	ce->cpumask = cpumask_of(cpu);
 
-	sirfsoc_timer1_irq.dev_id = ce;
-	BUG_ON(setup_irq(ce->irq, &sirfsoc_timer1_irq));
-	irq_set_affinity(sirfsoc_timer1_irq.irq, cpumask_of(1));
+	action->dev_id = ce;
+	BUG_ON(setup_irq(ce->irq, action));
+	irq_set_affinity(action->irq, cpumask_of(cpu));
 
 	clockevents_register_device(ce);
 	return 0;
 }
 
-static void sirfsoc_local_timer_stop(struct clock_event_device *ce)
+static void __cpuinit sirfsoc_local_timer_stop(struct clock_event_device *ce)
 {
+	int cpu = smp_processor_id();
+
 	sirfsoc_timer_count_disable(1);
 
-	remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq);
+	if (cpu == 0)
+		remove_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq);
+	else
+		remove_irq(sirfsoc_timer1_irq.irq, &sirfsoc_timer1_irq);
+}
+
+static int __cpuinit sirfsoc_cpu_notify(struct notifier_block *self,
+					   unsigned long action, void *hcpu)
+{
+	struct clock_event_device *evt = this_cpu_ptr(sirfsoc_clockevent);
+
+	switch (action & ~CPU_TASKS_FROZEN) {
+	case CPU_STARTING:
+		sirfsoc_local_timer_setup(evt);
+		break;
+	case CPU_DYING:
+		sirfsoc_local_timer_stop(evt);
+		break;
+	}
+
+	return NOTIFY_OK;
 }
 
-static struct local_timer_ops sirfsoc_local_timer_ops __cpuinitdata = {
-	.setup	= sirfsoc_local_timer_setup,
-	.stop	= sirfsoc_local_timer_stop,
+static struct notifier_block sirfsoc_cpu_nb __cpuinitdata = {
+	.notifier_call = sirfsoc_cpu_notify,
 };
-#endif /* CONFIG_LOCAL_TIMERS */
 
 static void __init sirfsoc_clockevent_init(void)
 {
-	clockevents_calc_mult_shift(&sirfsoc_clockevent, CLOCK_TICK_RATE, 60);
-
-	sirfsoc_clockevent.max_delta_ns =
-		clockevent_delta2ns(-2, &sirfsoc_clockevent);
-	sirfsoc_clockevent.min_delta_ns =
-		clockevent_delta2ns(2, &sirfsoc_clockevent);
-
-	sirfsoc_clockevent.cpumask = cpumask_of(0);
-	clockevents_register_device(&sirfsoc_clockevent);
-#ifdef CONFIG_LOCAL_TIMERS
-	local_timer_register(&sirfsoc_local_timer_ops);
-#endif
+	sirfsoc_clockevent = alloc_percpu(struct clock_event_device);
+	BUG_ON(!sirfsoc_clockevent);
+
+	BUG_ON(register_cpu_notifier(&sirfsoc_cpu_nb));
+
+	/* Immediately configure the timer on the boot CPU */
+	sirfsoc_local_timer_setup(this_cpu_ptr(sirfsoc_clockevent));
 }
 
 /* initialize the kernel jiffy timer source */
@@ -281,8 +291,6 @@ void __init sirfsoc_marco_timer_init(void)
 
 	BUG_ON(clocksource_register_hz(&sirfsoc_clocksource, CLOCK_TICK_RATE));
 
-	BUG_ON(setup_irq(sirfsoc_timer_irq.irq, &sirfsoc_timer_irq));
-
 	sirfsoc_clockevent_init();
 }
 
@@ -306,11 +314,9 @@ static void __init sirfsoc_of_timer_map(void)
 	if (!sirfsoc_timer_irq.irq)
 		panic("No irq passed for timer0 via DT\n");
 
-#ifdef CONFIG_LOCAL_TIMERS
 	sirfsoc_timer1_irq.irq = irq_of_parse_and_map(np, 1);
 	if (!sirfsoc_timer1_irq.irq)
 		panic("No irq passed for timer1 via DT\n");
-#endif
 
 	of_node_put(np);
 }
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 07/10] ARM: msm: Divorce msm_timer from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (5 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 06/10] ARM: PRIMA2: Divorce timer-marco " Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-07  0:04 ` [PATCH 08/10] clocksource: time-armada-370-xp: Fix sparse warning Stephen Boyd
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, linux-arm-msm, Daniel Walker, Bryan Huntsman

Separate the msm_timer from the local timer API. This will allow
us to remove ARM local timer support in the near future and gets
us closer to moving this driver to drivers/clocksource.

Acked-by: David Brown <davidb@codeaurora.org>
Cc: Daniel Walker <dwalker@fifo99.com>
Cc: Bryan Huntsman <bryanh@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-msm/timer.c | 125 +++++++++++++++++++++++++---------------------
 1 file changed, 67 insertions(+), 58 deletions(-)

diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c
index 2969027..4675c5e 100644
--- a/arch/arm/mach-msm/timer.c
+++ b/arch/arm/mach-msm/timer.c
@@ -16,6 +16,7 @@
 
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
+#include <linux/cpu.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
@@ -25,7 +26,6 @@
 #include <linux/of_irq.h>
 
 #include <asm/mach/time.h>
-#include <asm/localtimer.h>
 #include <asm/sched_clock.h>
 
 #include "common.h"
@@ -46,7 +46,7 @@ static void __iomem *event_base;
 
 static irqreturn_t msm_timer_interrupt(int irq, void *dev_id)
 {
-	struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
+	struct clock_event_device *evt = dev_id;
 	/* Stop the timer tick */
 	if (evt->mode == CLOCK_EVT_MODE_ONESHOT) {
 		u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
@@ -90,18 +90,7 @@ static void msm_timer_set_mode(enum clock_event_mode mode,
 	writel_relaxed(ctrl, event_base + TIMER_ENABLE);
 }
 
-static struct clock_event_device msm_clockevent = {
-	.name		= "gp_timer",
-	.features	= CLOCK_EVT_FEAT_ONESHOT,
-	.rating		= 200,
-	.set_next_event	= msm_timer_set_next_event,
-	.set_mode	= msm_timer_set_mode,
-};
-
-static union {
-	struct clock_event_device *evt;
-	struct clock_event_device * __percpu *percpu_evt;
-} msm_evt;
+static struct clock_event_device __percpu *msm_evt;
 
 static void __iomem *source_base;
 
@@ -127,40 +116,66 @@ static struct clocksource msm_clocksource = {
 	.flags	= CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
-#ifdef CONFIG_LOCAL_TIMERS
+static int msm_timer_irq;
+static int msm_timer_has_ppi;
+
 static int __cpuinit msm_local_timer_setup(struct clock_event_device *evt)
 {
-	/* Use existing clock_event for cpu 0 */
-	if (!smp_processor_id())
-		return 0;
+	int cpu = smp_processor_id();
+	int err;
 
 	writel_relaxed(0, event_base + TIMER_ENABLE);
 	writel_relaxed(0, event_base + TIMER_CLEAR);
 	writel_relaxed(~0, event_base + TIMER_MATCH_VAL);
-	evt->irq = msm_clockevent.irq;
+	evt->irq = msm_timer_irq;
 	evt->name = "local_timer";
-	evt->features = msm_clockevent.features;
-	evt->rating = msm_clockevent.rating;
+	evt->features = CLOCK_EVT_FEAT_ONESHOT;
+	evt->rating = 200;
 	evt->set_mode = msm_timer_set_mode;
 	evt->set_next_event = msm_timer_set_next_event;
+	evt->cpumask = cpumask_of(cpu);
+
+	clockevents_config_and_register(evt, GPT_HZ, 4, 0xffffffff);
+
+	if (msm_timer_has_ppi) {
+		enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);
+	} else {
+		err = request_irq(evt->irq, msm_timer_interrupt,
+				IRQF_TIMER | IRQF_NOBALANCING |
+				IRQF_TRIGGER_RISING, "gp_timer", evt);
+		if (err)
+			pr_err("request_irq failed\n");
+	}
 
-	*__this_cpu_ptr(msm_evt.percpu_evt) = evt;
-	clockevents_config_and_register(evt, GPT_HZ, 4, 0xf0000000);
-	enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);
 	return 0;
 }
 
-static void msm_local_timer_stop(struct clock_event_device *evt)
+static void __cpuinit msm_local_timer_stop(struct clock_event_device *evt)
 {
 	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
 	disable_percpu_irq(evt->irq);
 }
 
-static struct local_timer_ops msm_local_timer_ops __cpuinitdata = {
-	.setup	= msm_local_timer_setup,
-	.stop	= msm_local_timer_stop,
+static int __cpuinit msm_timer_cpu_notify(struct notifier_block *self,
+					   unsigned long action, void *hcpu)
+{
+	struct clock_event_device *evt = this_cpu_ptr(msm_evt);
+
+	switch (action & ~CPU_TASKS_FROZEN) {
+	case CPU_STARTING:
+		msm_local_timer_setup(evt);
+		break;
+	case CPU_DYING:
+		msm_local_timer_stop(evt);
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block msm_timer_cpu_nb __cpuinitdata = {
+	.notifier_call = msm_timer_cpu_notify,
 };
-#endif /* CONFIG_LOCAL_TIMERS */
 
 static notrace u32 msm_sched_clock_read(void)
 {
@@ -170,41 +185,35 @@ static notrace u32 msm_sched_clock_read(void)
 static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq,
 				  bool percpu)
 {
-	struct clock_event_device *ce = &msm_clockevent;
 	struct clocksource *cs = &msm_clocksource;
-	int res;
+	int res = 0;
 
-	writel_relaxed(0, event_base + TIMER_ENABLE);
-	writel_relaxed(0, event_base + TIMER_CLEAR);
-	writel_relaxed(~0, event_base + TIMER_MATCH_VAL);
-	ce->cpumask = cpumask_of(0);
-	ce->irq = irq;
-
-	clockevents_config_and_register(ce, GPT_HZ, 4, 0xffffffff);
-	if (percpu) {
-		msm_evt.percpu_evt = alloc_percpu(struct clock_event_device *);
-		if (!msm_evt.percpu_evt) {
-			pr_err("memory allocation failed for %s\n", ce->name);
+	msm_timer_irq = irq;
+	msm_timer_has_ppi = percpu;
+
+	msm_evt = alloc_percpu(struct clock_event_device);
+	if (!msm_evt) {
+		pr_err("memory allocation failed for clockevents\n");
+		goto err;
+	}
+
+	if (percpu)
+		res = request_percpu_irq(irq, msm_timer_interrupt,
+					 "gp_timer", msm_evt);
+
+	if (res) {
+		pr_err("request_percpu_irq failed\n");
+	} else {
+		res = register_cpu_notifier(&msm_timer_cpu_nb);
+		if (res) {
+			free_percpu_irq(irq, msm_evt);
 			goto err;
 		}
-		*__this_cpu_ptr(msm_evt.percpu_evt) = ce;
-		res = request_percpu_irq(ce->irq, msm_timer_interrupt,
-					 ce->name, msm_evt.percpu_evt);
-		if (!res) {
-			enable_percpu_irq(ce->irq, IRQ_TYPE_EDGE_RISING);
-#ifdef CONFIG_LOCAL_TIMERS
-			local_timer_register(&msm_local_timer_ops);
-#endif
-		}
-	} else {
-		msm_evt.evt = ce;
-		res = request_irq(ce->irq, msm_timer_interrupt,
-				  IRQF_TIMER | IRQF_NOBALANCING |
-				  IRQF_TRIGGER_RISING, ce->name, &msm_evt.evt);
+
+		/* Immediately configure the timer on the boot CPU */
+		msm_local_timer_setup(this_cpu_ptr(msm_evt));
 	}
 
-	if (res)
-		pr_err("request_irq failed for %s\n", ce->name);
 err:
 	writel_relaxed(TIMER_ENABLE_EN, source_base + TIMER_ENABLE);
 	res = clocksource_register_hz(cs, dgt_hz);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 08/10] clocksource: time-armada-370-xp: Fix sparse warning
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (6 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 07/10] ARM: msm: Divorce msm_timer " Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-07  0:04 ` [PATCH 09/10] clocksource: time-armada-370-xp: Divorce from local timer API Stephen Boyd
  2013-03-07  0:04 ` [PATCH 10/10] ARM: smp: Remove " Stephen Boyd
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Gregory CLEMENT

drivers/clocksource/time-armada-370-xp.c:217:13: warning: symbol
'armada_370_xp_timer_init' was not declared. Should it be static?

Also remove the __init marking in the prototype as it's
unnecessary and drop the init.h file.

Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 drivers/clocksource/time-armada-370-xp.c | 3 ++-
 include/linux/time-armada-370-xp.h       | 4 +---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c
index 47a6730..efe4aef 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -27,10 +27,11 @@
 #include <linux/of_address.h>
 #include <linux/irq.h>
 #include <linux/module.h>
+#include <linux/percpu.h>
+#include <linux/time-armada-370-xp.h>
 
 #include <asm/sched_clock.h>
 #include <asm/localtimer.h>
-#include <linux/percpu.h>
 /*
  * Timer block registers.
  */
diff --git a/include/linux/time-armada-370-xp.h b/include/linux/time-armada-370-xp.h
index dfdfdc0..6fb0856 100644
--- a/include/linux/time-armada-370-xp.h
+++ b/include/linux/time-armada-370-xp.h
@@ -11,8 +11,6 @@
 #ifndef __TIME_ARMADA_370_XPPRCMU_H
 #define __TIME_ARMADA_370_XPPRCMU_H
 
-#include <linux/init.h>
-
-void __init armada_370_xp_timer_init(void);
+void armada_370_xp_timer_init(void);
 
 #endif
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 09/10] clocksource: time-armada-370-xp: Divorce from local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (7 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 08/10] clocksource: time-armada-370-xp: Fix sparse warning Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-07  0:04 ` [PATCH 10/10] ARM: smp: Remove " Stephen Boyd
  9 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Gregory CLEMENT

Separate the armada 370xp local timers from the local timer API.
This will allow us to remove ARM local timer support in the near
future and makes this driver multi-architecture friendly.

Cc: Gregory CLEMENT <gregory.clement@free-electrons.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 drivers/clocksource/time-armada-370-xp.c | 85 ++++++++++++++------------------
 1 file changed, 38 insertions(+), 47 deletions(-)

diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c
index efe4aef..ee2e50c5 100644
--- a/drivers/clocksource/time-armada-370-xp.c
+++ b/drivers/clocksource/time-armada-370-xp.c
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/kernel.h>
 #include <linux/clk.h>
+#include <linux/cpu.h>
 #include <linux/timer.h>
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
@@ -31,7 +32,6 @@
 #include <linux/time-armada-370-xp.h>
 
 #include <asm/sched_clock.h>
-#include <asm/localtimer.h>
 /*
  * Timer block registers.
  */
@@ -70,7 +70,7 @@ static bool timer25Mhz = true;
  */
 static u32 ticks_per_jiffy;
 
-static struct clock_event_device __percpu **percpu_armada_370_xp_evt;
+static struct clock_event_device __percpu *armada_370_xp_evt;
 
 static u32 notrace armada_370_xp_read_sched_clock(void)
 {
@@ -143,14 +143,7 @@ armada_370_xp_clkevt_mode(enum clock_event_mode mode,
 	}
 }
 
-static struct clock_event_device armada_370_xp_clkevt = {
-	.name		= "armada_370_xp_per_cpu_tick",
-	.features	= CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
-	.shift		= 32,
-	.rating		= 300,
-	.set_next_event	= armada_370_xp_clkevt_next_event,
-	.set_mode	= armada_370_xp_clkevt_mode,
-};
+static int armada_370_xp_clkevt_irq;
 
 static irqreturn_t armada_370_xp_timer_interrupt(int irq, void *dev_id)
 {
@@ -173,42 +166,53 @@ static int __cpuinit armada_370_xp_timer_setup(struct clock_event_device *evt)
 	u32 u;
 	int cpu = smp_processor_id();
 
-	/* Use existing clock_event for cpu 0 */
-	if (!smp_processor_id())
-		return 0;
-
 	u = readl(local_base + TIMER_CTRL_OFF);
 	if (timer25Mhz)
 		writel(u | TIMER0_25MHZ, local_base + TIMER_CTRL_OFF);
 	else
 		writel(u & ~TIMER0_25MHZ, local_base + TIMER_CTRL_OFF);
 
-	evt->name		= armada_370_xp_clkevt.name;
-	evt->irq		= armada_370_xp_clkevt.irq;
-	evt->features		= armada_370_xp_clkevt.features;
-	evt->shift		= armada_370_xp_clkevt.shift;
-	evt->rating		= armada_370_xp_clkevt.rating,
+	evt->name		= "armada_370_xp_per_cpu_tick",
+	evt->features		= CLOCK_EVT_FEAT_ONESHOT |
+				  CLOCK_EVT_FEAT_PERIODIC;
+	evt->shift		= 32,
+	evt->rating		= 300,
 	evt->set_next_event	= armada_370_xp_clkevt_next_event,
 	evt->set_mode		= armada_370_xp_clkevt_mode,
+	evt->irq		= armada_370_xp_clkevt_irq;
 	evt->cpumask		= cpumask_of(cpu);
 
-	*__this_cpu_ptr(percpu_armada_370_xp_evt) = evt;
-
 	clockevents_config_and_register(evt, timer_clk, 1, 0xfffffffe);
 	enable_percpu_irq(evt->irq, 0);
 
 	return 0;
 }
 
-static void  armada_370_xp_timer_stop(struct clock_event_device *evt)
+static void __cpuinit armada_370_xp_timer_stop(struct clock_event_device *evt)
 {
 	evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
 	disable_percpu_irq(evt->irq);
 }
 
-static struct local_timer_ops armada_370_xp_local_timer_ops __cpuinitdata = {
-	.setup	= armada_370_xp_timer_setup,
-	.stop	=  armada_370_xp_timer_stop,
+static int __cpuinit armada_370_xp_timer_cpu_notify(struct notifier_block *self,
+					   unsigned long action, void *hcpu)
+{
+	struct clock_event_device *evt = this_cpu_ptr(armada_370_xp_evt);
+
+	switch (action & ~CPU_TASKS_FROZEN) {
+	case CPU_STARTING:
+		armada_370_xp_timer_setup(evt);
+		break;
+	case CPU_DYING:
+		armada_370_xp_timer_stop(evt);
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+static struct notifier_block armada_370_xp_timer_cpu_nb __cpuinitdata = {
+	.notifier_call = armada_370_xp_timer_cpu_notify,
 };
 
 void __init armada_370_xp_timer_init(void)
@@ -224,9 +228,6 @@ void __init armada_370_xp_timer_init(void)
 
 	if (of_find_property(np, "marvell,timer-25Mhz", NULL)) {
 		/* The fixed 25MHz timer is available so let's use it */
-		u = readl(local_base + TIMER_CTRL_OFF);
-		writel(u | TIMER0_25MHZ,
-		       local_base + TIMER_CTRL_OFF);
 		u = readl(timer_base + TIMER_CTRL_OFF);
 		writel(u | TIMER0_25MHZ,
 		       timer_base + TIMER_CTRL_OFF);
@@ -236,9 +237,6 @@ void __init armada_370_xp_timer_init(void)
 		struct clk *clk = of_clk_get(np, 0);
 		WARN_ON(IS_ERR(clk));
 		rate =  clk_get_rate(clk);
-		u = readl(local_base + TIMER_CTRL_OFF);
-		writel(u & ~(TIMER0_25MHZ),
-		       local_base + TIMER_CTRL_OFF);
 
 		u = readl(timer_base + TIMER_CTRL_OFF);
 		writel(u & ~(TIMER0_25MHZ),
@@ -252,7 +250,7 @@ void __init armada_370_xp_timer_init(void)
 	 * We use timer 0 as clocksource, and private(local) timer 0
 	 * for clockevents
 	 */
-	armada_370_xp_clkevt.irq = irq_of_parse_and_map(np, 4);
+	armada_370_xp_clkevt_irq = irq_of_parse_and_map(np, 4);
 
 	ticks_per_jiffy = (timer_clk + HZ / 2) / HZ;
 
@@ -277,26 +275,19 @@ void __init armada_370_xp_timer_init(void)
 			      "armada_370_xp_clocksource",
 			      timer_clk, 300, 32, clocksource_mmio_readl_down);
 
-	/* Register the clockevent on the private timer of CPU 0 */
-	armada_370_xp_clkevt.cpumask = cpumask_of(0);
-	clockevents_config_and_register(&armada_370_xp_clkevt,
-					timer_clk, 1, 0xfffffffe);
+	register_cpu_notifier(&armada_370_xp_timer_cpu_nb);
 
-	percpu_armada_370_xp_evt = alloc_percpu(struct clock_event_device *);
+	armada_370_xp_evt = alloc_percpu(struct clock_event_device);
 
 
 	/*
 	 * Setup clockevent timer (interrupt-driven).
 	 */
-	*__this_cpu_ptr(percpu_armada_370_xp_evt) = &armada_370_xp_clkevt;
-	res = request_percpu_irq(armada_370_xp_clkevt.irq,
+	res = request_percpu_irq(armada_370_xp_clkevt_irq,
 				armada_370_xp_timer_interrupt,
-				armada_370_xp_clkevt.name,
-				percpu_armada_370_xp_evt);
-	if (!res) {
-		enable_percpu_irq(armada_370_xp_clkevt.irq, 0);
-#ifdef CONFIG_LOCAL_TIMERS
-		local_timer_register(&armada_370_xp_local_timer_ops);
-#endif
-	}
+				"armada_370_xp_per_cpu_tick",
+				armada_370_xp_evt);
+	/* Immediately configure the timer on the boot CPU */
+	if (!res)
+		armada_370_xp_timer_setup(this_cpu_ptr(armada_370_xp_evt));
 }
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* [PATCH 10/10] ARM: smp: Remove local timer API
  2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
                   ` (8 preceding siblings ...)
  2013-03-07  0:04 ` [PATCH 09/10] clocksource: time-armada-370-xp: Divorce from local timer API Stephen Boyd
@ 2013-03-07  0:04 ` Stephen Boyd
  2013-03-08 19:55   ` Tony Lindgren
  9 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07  0:04 UTC (permalink / raw)
  To: linux-arm-kernel; +Cc: linux-kernel, linux-arm-msm, Russell King

There are no more users of this API, remove it.

Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/Kconfig                  | 10 ------
 arch/arm/include/asm/localtimer.h | 34 -------------------
 arch/arm/kernel/smp.c             | 69 ---------------------------------------
 3 files changed, 113 deletions(-)
 delete mode 100644 arch/arm/include/asm/localtimer.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 5ad2ccf..f1a4c57 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1647,16 +1647,6 @@ config ARM_PSCI
 	  0022A ("Power State Coordination Interface System Software on
 	  ARM processors").
 
-config LOCAL_TIMERS
-	bool "Use local timer interrupts"
-	depends on SMP
-	default y
-	help
-	  Enable support for local timers on SMP platforms, rather then the
-	  legacy IPI broadcast method.  Local timers allows the system
-	  accounting to be spread across the timer interval, preventing a
-	  "thundering herd" at every timer tick.
-
 config ARCH_NR_GPIO
 	int
 	default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h
deleted file mode 100644
index f77ffc1..0000000
--- a/arch/arm/include/asm/localtimer.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  arch/arm/include/asm/localtimer.h
- *
- *  Copyright (C) 2004-2005 ARM Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#ifndef __ASM_ARM_LOCALTIMER_H
-#define __ASM_ARM_LOCALTIMER_H
-
-#include <linux/errno.h>
-
-struct clock_event_device;
-
-struct local_timer_ops {
-	int  (*setup)(struct clock_event_device *);
-	void (*stop)(struct clock_event_device *);
-};
-
-#ifdef CONFIG_LOCAL_TIMERS
-/*
- * Register a local timer driver
- */
-int local_timer_register(struct local_timer_ops *);
-#else
-static inline int local_timer_register(struct local_timer_ops *ops)
-{
-	return -ENXIO;
-}
-#endif
-
-#endif
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index e4f3669..a6a07ff 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -41,7 +41,6 @@
 #include <asm/sections.h>
 #include <asm/tlbflush.h>
 #include <asm/ptrace.h>
-#include <asm/localtimer.h>
 #include <asm/smp_plat.h>
 #include <asm/virt.h>
 #include <asm/mach/arch.h>
@@ -133,8 +132,6 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-static void percpu_timer_stop(void);
-
 static int platform_cpu_kill(unsigned int cpu)
 {
 	if (smp_ops.cpu_kill)
@@ -178,11 +175,6 @@ int __cpuinit __cpu_disable(void)
 	migrate_irqs();
 
 	/*
-	 * Stop the local timer for this CPU.
-	 */
-	percpu_timer_stop();
-
-	/*
 	 * Flush user cache and TLB mappings, and then remove this CPU
 	 * from the vm mask set of all processes.
 	 *
@@ -269,8 +261,6 @@ static void __cpuinit smp_store_cpu_info(unsigned int cpuid)
 	store_cpu_topology(cpuid);
 }
 
-static void percpu_timer_setup(void);
-
 /*
  * This is the secondary CPU boot entry.  We're using this CPUs
  * idle thread stack, but a set of temporary page tables.
@@ -324,11 +314,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
 	set_cpu_online(cpu, true);
 	complete(&cpu_running);
 
-	/*
-	 * Setup the percpu timer for this CPU.
-	 */
-	percpu_timer_setup();
-
 	local_irq_enable();
 	local_fiq_enable();
 
@@ -375,12 +360,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 		max_cpus = ncores;
 	if (ncores > 1 && max_cpus) {
 		/*
-		 * Enable the local timer or broadcast device for the
-		 * boot CPU, but only if we have more than one CPU.
-		 */
-		percpu_timer_setup();
-
-		/*
 		 * Initialise the present map, which describes the set of CPUs
 		 * actually populated at the present time. A platform should
 		 * re-initialize the map in the platforms smp_prepare_cpus()
@@ -456,11 +435,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu)
 	return sum;
 }
 
-/*
- * Timer (local or broadcast) support
- */
-static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent);
-
 #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
 void tick_broadcast(const struct cpumask *mask)
 {
@@ -468,49 +442,6 @@ void tick_broadcast(const struct cpumask *mask)
 }
 #endif
 
-static struct local_timer_ops *lt_ops;
-
-#ifdef CONFIG_LOCAL_TIMERS
-int local_timer_register(struct local_timer_ops *ops)
-{
-	if (!is_smp() || !setup_max_cpus)
-		return -ENXIO;
-
-	if (lt_ops)
-		return -EBUSY;
-
-	lt_ops = ops;
-	return 0;
-}
-#endif
-
-static void __cpuinit percpu_timer_setup(void)
-{
-	unsigned int cpu = smp_processor_id();
-	struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);
-
-	evt->cpumask = cpumask_of(cpu);
-
-	if (lt_ops)
-		lt_ops->setup(evt);
-}
-
-#ifdef CONFIG_HOTPLUG_CPU
-/*
- * The generic clock events code purposely does not stop the local timer
- * on CPU_DEAD/CPU_DEAD_FROZEN hotplug events, so we have to do it
- * manually here.
- */
-static void percpu_timer_stop(void)
-{
-	unsigned int cpu = smp_processor_id();
-	struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);
-
-	if (lt_ops)
-		lt_ops->stop(evt);
-}
-#endif
-
 static DEFINE_RAW_SPINLOCK(stop_lock);
 
 /*
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 01/10] clocksource: add generic dummy timer driver
  2013-03-07  0:03 ` [PATCH 01/10] clocksource: add generic dummy timer driver Stephen Boyd
@ 2013-03-07 14:00   ` Thomas Gleixner
  2013-03-07 21:41     ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Thomas Gleixner @ 2013-03-07 14:00 UTC (permalink / raw)
  To: Stephen Boyd
  Cc: linux-arm-kernel, Mark Rutland, linux-kernel, linux-arm-msm, John Stultz

On Wed, 6 Mar 2013, Stephen Boyd wrote:

> +static int __init dummy_timer_register(void)
> +{
> +	int err = register_cpu_notifier(&dummy_timer_cpu_nb);
> +	if (err)
> +		return err;
> +
> +	/* We won't get a call on the boot CPU, so register immediately */
> +	dummy_timer_setup();
> +
> +	return 0;
> +}
> +device_initcall(dummy_timer_register);

Are you sure that you want that to be installed unconditionally? What
about multi-platform kernels?

Thanks,

	tglx

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

* Re: [PATCH 01/10] clocksource: add generic dummy timer driver
  2013-03-07 14:00   ` Thomas Gleixner
@ 2013-03-07 21:41     ` Stephen Boyd
  0 siblings, 0 replies; 31+ messages in thread
From: Stephen Boyd @ 2013-03-07 21:41 UTC (permalink / raw)
  To: Thomas Gleixner
  Cc: linux-arm-kernel, Mark Rutland, linux-kernel, linux-arm-msm, John Stultz

On 03/07/13 06:00, Thomas Gleixner wrote:
> On Wed, 6 Mar 2013, Stephen Boyd wrote:
>
>> +static int __init dummy_timer_register(void)
>> +{
>> +	int err = register_cpu_notifier(&dummy_timer_cpu_nb);
>> +	if (err)
>> +		return err;
>> +
>> +	/* We won't get a call on the boot CPU, so register immediately */
>> +	dummy_timer_setup();
>> +
>> +	return 0;
>> +}
>> +device_initcall(dummy_timer_register);
> Are you sure that you want that to be installed unconditionally? What
> about multi-platform kernels?
>

A dummy timer is already installed unconditionally on devices with an
arm architected timer, so if this is breaking something then those
devices have been broken in the 3.9 merge window. I suppose we may need
to make the rating even lower if there is somebody using a clockevent
with a rating below 100. My grep of the tree shows 125 as the lowest,
but perhaps we want to set the rating to 1 to be safe?

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-07  0:03 ` [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API Stephen Boyd
@ 2013-03-08  0:40   ` Tony Lindgren
  2013-03-08  1:14     ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08  0:40 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

Hi,

* Stephen Boyd <sboyd@codeaurora.org> [130306 17:53]:
> Separate the smp_twd timers from the local timer API. This will
> allow us to remove ARM local timer support in the near future and
> gets us closer to moving this driver to drivers/clocksource.

Looks like applying this patch makes omap4 to stop booting for
some reason.

Regards,

Tony

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08  0:40   ` Tony Lindgren
@ 2013-03-08  1:14     ` Stephen Boyd
  2013-03-08 18:07       ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-08  1:14 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/07/13 16:40, Tony Lindgren wrote:
> Hi,
>
> * Stephen Boyd <sboyd@codeaurora.org> [130306 17:53]:
>> Separate the smp_twd timers from the local timer API. This will
>> allow us to remove ARM local timer support in the near future and
>> gets us closer to moving this driver to drivers/clocksource.
> Looks like applying this patch makes omap4 to stop booting for
> some reason.
>
>

Hm... Perhaps you need the clock?

diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index 2439843..081de6f 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -345,11 +345,11 @@ static int __init twd_local_timer_common_register(struct device_node *np)
        if (err)
                goto out_irq;
 
+       twd_get_clock(np);
+
        /* Immediately configure the timer on the boot CPU */
        twd_timer_setup(this_cpu_ptr(twd_evt));
 
-       twd_get_clock(np);
-
        return 0;
 
 out_irq:

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08  1:14     ` Stephen Boyd
@ 2013-03-08 18:07       ` Tony Lindgren
  2013-03-08 18:17         ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 18:07 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

Stephen Boyd <sboyd@codeaurora.org> [130307 17:18]:
> On 03/07/13 16:40, Tony Lindgren wrote:
> > Hi,
> >
> > Stephen Boyd <sboyd@codeaurora.org> [130306 17:53]:
> >> Separate the smp_twd timers from the local timer APIThis will
> >> allow us to remove ARM local timer support in the near future and
> >> gets us closer to moving this driver to drivers/clocksource.
> > Looks like applying this patch makes omap4 to stop booting for
> > some reason.
> >
> >
> 
> Hm..Perhaps you need the clock?

Something is missing as the interrupts don't happen and it hangs:

...
OMAP clockevent source: GPTIMER1 at 32768 Hz
sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
OMAP clocksource: 32k_counter at 32768 Hz
Calibrating local timer...
 
> --- a/arch/arm/kernel/smp_twd.c
> +++ b/arch/arm/kernel/smp_twd.c
> @@ -345,11 +345,11 @@ static int __init twd_local_timer_common_register(struct device_node *np)
>         if (err)
>                 goto out_irq;
>  
> +       twd_get_clock(np);
> +
>         /Immediately configure the timer on the boot CPU */
>         twd_timer_setup(this_cpu_ptr(twd_evt));
>  
> -       twd_get_clock(np);
> -
>         return 0;
>  
>  out_irq:

Adding that produces the following:

...
OMAP clockevent source: GPTIMER1 at 32768 Hz
sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
OMAP clocksource: 32k_counter at 32768 Hz
Console: colour dummy device 80x30
Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
Unable to handle kernel NULL pointer dereference at virtual address 0000001d
pgd = c0004000
[0000001d] *pgd=00000000
Internal error: Oops: 5 [#1] SMP ARM
Modules linked in:
CPU: 0    Not tainted  (3.9.0-rc1-12182-g90ac757-dirty #42)
PC is at 0xe7d7f0a0
LR is at twd_handler+0x34/0x40
pc : [<e7d7f0a0>]    lr : [<c001a650>]    psr: 200001d3
sp : c0791ea0  ip : c0790000  fp : 00000004
r10: ed806780  r9 : c0805840  r8 : 00e0c000
r7 : c07919c0  r6 : ed801900  r5 : 0000001d  r4 : 00000001
r3 : fa240600  r2 : fa24060c  r1 : c0090d28  r0 : c0090d28
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
Control: 10c53c7d  Table: 8000404a  DAC: 00000017
Process swapper/0 (pid: 0, stack limit = 0xc0790240)
Stack: (0xc0791ea0 to 0xc0792000)
1ea0: c07997a8 c00ac80c 0000001d c078e248 c0790000 00000000 c07997a8 00000000
1ec0: c0790000 c00a9e2c 0000001d c00152a8 fa24010c c0791f00 c0799904 fa240110
1ee0: c082b260 c000868c 200001d3 c004901c 20000153 ffffffff c0791f34 c052db64
1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
1f40: 20000153 ffffffff 00000000 00000000 00000000 00000000 c082b260 00000048
1f60: 00000000 00000000 00000000 60000153 c033e2ec c0791fac c08292bc c0829240
1f80: c076f678 ffffffff 411fc092 c07988c0 00000000 c0529c88 c068460c c0791fac
1fa0: c082924c c07515b4 c068460c c080bb1c 00000011 c0829258 bfffffff c0736884
1fc0: ffffffff ffffffff c0736474 00000000 00000000 c076f678 00000000 10c53c7d
1fe0: c0798934 c076fa7c c079d16c 8000406a 00000000 80008074 00000000 00000000
[<c001a650>] (twd_handler+0x34/0x40) from [<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128)
[<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128) from [<c00a9e2c>] (generic_handle_irq+0x30/0x3c)
[<c00a9e2c>] (generic_handle_irq+0x30/0x3c) from [<c00152a8>] (handle_IRQ+0x48/0xa8)
[<c00152a8>] (handle_IRQ+0x48/0xa8) from [<c000868c>] (gic_handle_irq+0x30/0x6c)
[<c000868c>] (gic_handle_irq+0x30/0x6c) from [<c052db64>] (__irq_svc+0x44/0x5c)
Exception stack(0xc0791f00 to 0xc0791f48)
1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
1f40: 20000153 ffffffff
[<c052db64>] (__irq_svc+0x44/0x5c) from [<c004901c>] (vprintk_emit+0x1f8/0x544)
[<c004901c>] (vprintk_emit+0x1f8/0x544) from [<c0529c88>] (printk+0x30/0x40)
[<c0529c88>] (printk+0x30/0x40) from [<c07515b4>] (lockdep_info+0x10/0xb4)
[<c07515b4>] (lockdep_info+0x10/0xb4) from [<c0736884>] (start_kernel+0x1dc/0x328)
[<c0736884>] (start_kernel+0x1dc/0x328) from [<80008074>] (0x80008074)
Code: 57555555 55755154 557d5554 55d55655 (54555575) 

Regards,

Tony

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 18:07       ` Tony Lindgren
@ 2013-03-08 18:17         ` Stephen Boyd
  2013-03-08 19:48           ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-08 18:17 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/08/13 10:07, Tony Lindgren wrote:
>
> Adding that produces the following:
>
> ...
> OMAP clockevent source: GPTIMER1 at 32768 Hz
> sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
> OMAP clocksource: 32k_counter at 32768 Hz
> Console: colour dummy device 80x30
> Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
> Unable to handle kernel NULL pointer dereference at virtual address 0000001d
> pgd = c0004000
> [0000001d] *pgd=00000000
> Internal error: Oops: 5 [#1] SMP ARM
> Modules linked in:
> CPU: 0    Not tainted  (3.9.0-rc1-12182-g90ac757-dirty #42)
> PC is at 0xe7d7f0a0
> LR is at twd_handler+0x34/0x40
> pc : [<e7d7f0a0>]    lr : [<c001a650>]    psr: 200001d3
> sp : c0791ea0  ip : c0790000  fp : 00000004
> r10: ed806780  r9 : c0805840  r8 : 00e0c000
> r7 : c07919c0  r6 : ed801900  r5 : 0000001d  r4 : 00000001
> r3 : fa240600  r2 : fa24060c  r1 : c0090d28  r0 : c0090d28
> Flags: nzCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
> Control: 10c53c7d  Table: 8000404a  DAC: 00000017
> Process swapper/0 (pid: 0, stack limit = 0xc0790240)
> Stack: (0xc0791ea0 to 0xc0792000)
> 1ea0: c07997a8 c00ac80c 0000001d c078e248 c0790000 00000000 c07997a8 00000000
> 1ec0: c0790000 c00a9e2c 0000001d c00152a8 fa24010c c0791f00 c0799904 fa240110
> 1ee0: c082b260 c000868c 200001d3 c004901c 20000153 ffffffff c0791f34 c052db64
> 1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
> 1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
> 1f40: 20000153 ffffffff 00000000 00000000 00000000 00000000 c082b260 00000048
> 1f60: 00000000 00000000 00000000 60000153 c033e2ec c0791fac c08292bc c0829240
> 1f80: c076f678 ffffffff 411fc092 c07988c0 00000000 c0529c88 c068460c c0791fac
> 1fa0: c082924c c07515b4 c068460c c080bb1c 00000011 c0829258 bfffffff c0736884
> 1fc0: ffffffff ffffffff c0736474 00000000 00000000 c076f678 00000000 10c53c7d
> 1fe0: c0798934 c076fa7c c079d16c 8000406a 00000000 80008074 00000000 00000000
> [<c001a650>] (twd_handler+0x34/0x40) from [<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128)
> [<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128) from [<c00a9e2c>] (generic_handle_irq+0x30/0x3c)
> [<c00a9e2c>] (generic_handle_irq+0x30/0x3c) from [<c00152a8>] (handle_IRQ+0x48/0xa8)
> [<c00152a8>] (handle_IRQ+0x48/0xa8) from [<c000868c>] (gic_handle_irq+0x30/0x6c)
> [<c000868c>] (gic_handle_irq+0x30/0x6c) from [<c052db64>] (__irq_svc+0x44/0x5c)
> Exception stack(0xc0791f00 to 0xc0791f48)
> 1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
> 1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
> 1f40: 20000153 ffffffff
> [<c052db64>] (__irq_svc+0x44/0x5c) from [<c004901c>] (vprintk_emit+0x1f8/0x544)
> [<c004901c>] (vprintk_emit+0x1f8/0x544) from [<c0529c88>] (printk+0x30/0x40)
> [<c0529c88>] (printk+0x30/0x40) from [<c07515b4>] (lockdep_info+0x10/0xb4)
> [<c07515b4>] (lockdep_info+0x10/0xb4) from [<c0736884>] (start_kernel+0x1dc/0x328)
> [<c0736884>] (start_kernel+0x1dc/0x328) from [<80008074>] (0x80008074)
> Code: 57555555 55755154 557d5554 55d55655 (54555575) 
>

Ah. Two bugs :-(

----8<-----

diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index 081de6f..4ea3e9d 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
 
 static irqreturn_t twd_handler(int irq, void *dev_id)
 {
-       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
+       struct clock_event_device *evt = dev_id;
 
        if (twd_timer_ack()) {
                evt->event_handler(evt);


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 18:17         ` Stephen Boyd
@ 2013-03-08 19:48           ` Tony Lindgren
  2013-03-08 19:50             ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 19:48 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130308 10:21]:
> On 03/08/13 10:07, Tony Lindgren wrote:
> >
> > Adding that produces the following:
> >
> > ...
> > OMAP clockevent source: GPTIMER1 at 32768 Hz
> > sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
> > OMAP clocksource: 32k_counter at 32768 Hz
> > Console: colour dummy device 80x30
> > Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
> > Unable to handle kernel NULL pointer dereference at virtual address 0000001d
> > pgd = c0004000
> > [0000001d] *pgd=00000000
> > Internal error: Oops: 5 [#1] SMP ARM
> > Modules linked in:
> > CPU: 0    Not tainted  (3.9.0-rc1-12182-g90ac757-dirty #42)
> > PC is at 0xe7d7f0a0
> > LR is at twd_handler+0x34/0x40
> > pc : [<e7d7f0a0>]    lr : [<c001a650>]    psr: 200001d3
> > sp : c0791ea0  ip : c0790000  fp : 00000004
> > r10: ed806780  r9 : c0805840  r8 : 00e0c000
> > r7 : c07919c0  r6 : ed801900  r5 : 0000001d  r4 : 00000001
> > r3 : fa240600  r2 : fa24060c  r1 : c0090d28  r0 : c0090d28
> > Flags: nzCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
> > Control: 10c53c7d  Table: 8000404a  DAC: 00000017
> > Process swapper/0 (pid: 0, stack limit = 0xc0790240)
> > Stack: (0xc0791ea0 to 0xc0792000)
> > 1ea0: c07997a8 c00ac80c 0000001d c078e248 c0790000 00000000 c07997a8 00000000
> > 1ec0: c0790000 c00a9e2c 0000001d c00152a8 fa24010c c0791f00 c0799904 fa240110
> > 1ee0: c082b260 c000868c 200001d3 c004901c 20000153 ffffffff c0791f34 c052db64
> > 1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
> > 1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
> > 1f40: 20000153 ffffffff 00000000 00000000 00000000 00000000 c082b260 00000048
> > 1f60: 00000000 00000000 00000000 60000153 c033e2ec c0791fac c08292bc c0829240
> > 1f80: c076f678 ffffffff 411fc092 c07988c0 00000000 c0529c88 c068460c c0791fac
> > 1fa0: c082924c c07515b4 c068460c c080bb1c 00000011 c0829258 bfffffff c0736884
> > 1fc0: ffffffff ffffffff c0736474 00000000 00000000 c076f678 00000000 10c53c7d
> > 1fe0: c0798934 c076fa7c c079d16c 8000406a 00000000 80008074 00000000 00000000
> > [<c001a650>] (twd_handler+0x34/0x40) from [<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128)
> > [<c00ac80c>] (handle_percpu_devid_irq+0xb8/0x128) from [<c00a9e2c>] (generic_handle_irq+0x30/0x3c)
> > [<c00a9e2c>] (generic_handle_irq+0x30/0x3c) from [<c00152a8>] (handle_IRQ+0x48/0xa8)
> > [<c00152a8>] (handle_IRQ+0x48/0xa8) from [<c000868c>] (gic_handle_irq+0x30/0x6c)
> > [<c000868c>] (gic_handle_irq+0x30/0x6c) from [<c052db64>] (__irq_svc+0x44/0x5c)
> > Exception stack(0xc0791f00 to 0xc0791f48)
> > 1f00: 00000001 00000001 c079bc90 00000000 00000000 00000000 00000048 00000048
> > 1f20: c082b260 00000000 c0790000 00000004 00000000 c0791f48 60000153 c004901c
> > 1f40: 20000153 ffffffff
> > [<c052db64>] (__irq_svc+0x44/0x5c) from [<c004901c>] (vprintk_emit+0x1f8/0x544)
> > [<c004901c>] (vprintk_emit+0x1f8/0x544) from [<c0529c88>] (printk+0x30/0x40)
> > [<c0529c88>] (printk+0x30/0x40) from [<c07515b4>] (lockdep_info+0x10/0xb4)
> > [<c07515b4>] (lockdep_info+0x10/0xb4) from [<c0736884>] (start_kernel+0x1dc/0x328)
> > [<c0736884>] (start_kernel+0x1dc/0x328) from [<80008074>] (0x80008074)
> > Code: 57555555 55755154 557d5554 55d55655 (54555575) 
> >
> 
> Ah. Two bugs :-(
> 
> ----8<-----
> 
> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
> index 081de6f..4ea3e9d 100644
> --- a/arch/arm/kernel/smp_twd.c
> +++ b/arch/arm/kernel/smp_twd.c
> @@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
>  
>  static irqreturn_t twd_handler(int irq, void *dev_id)
>  {
> -       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
> +       struct clock_event_device *evt = dev_id;
>  
>         if (twd_timer_ack()) {
>                 evt->event_handler(evt);
> 

Yup thanks that fixes it, both fixes are needed. So for this patch + the
two fixes please feel free to add:

Acked-by: Tony Lindgren <tony@atomide.com>

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 19:48           ` Tony Lindgren
@ 2013-03-08 19:50             ` Stephen Boyd
  2013-03-08 20:08               ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-08 19:50 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/08/13 11:48, Tony Lindgren wrote:
> * Stephen Boyd <sboyd@codeaurora.org> [130308 10:21]:
>>
>> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
>> index 081de6f..4ea3e9d 100644
>> --- a/arch/arm/kernel/smp_twd.c
>> +++ b/arch/arm/kernel/smp_twd.c
>> @@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
>>  
>>  static irqreturn_t twd_handler(int irq, void *dev_id)
>>  {
>> -       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
>> +       struct clock_event_device *evt = dev_id;
>>  
>>         if (twd_timer_ack()) {
>>                 evt->event_handler(evt);
>>
> Yup thanks that fixes it, both fixes are needed. So for this patch + the
> two fixes please feel free to add:
>
> Acked-by: Tony Lindgren <tony@atomide.com>

Great. Thanks for testing.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 04/10] ARM: OMAP2+: Divorce from local timer API
  2013-03-07  0:04 ` [PATCH 04/10] ARM: OMAP2+: Divorce " Stephen Boyd
@ 2013-03-08 19:50   ` Tony Lindgren
  2013-03-11 15:29     ` Santosh Shilimkar
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 19:50 UTC (permalink / raw)
  To: Stephen Boyd
  Cc: linux-arm-kernel, linux-arm-msm, Santosh Shilimkar, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130306 16:22]:
> Now that the TWD doesn't rely on the local timer API, OMAP can
> stop selecting it in Kconfig and relying on the config option to
> decide if it should call smp_twd functions.
> 
> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>

Acked-by: Tony Lindgren <tony@atomide.com>

> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
> ---
>  arch/arm/mach-omap2/Kconfig | 1 -
>  arch/arm/mach-omap2/timer.c | 7 -------
>  2 files changed, 8 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
> index 49ac3df..6e1f871 100644
> --- a/arch/arm/mach-omap2/Kconfig
> +++ b/arch/arm/mach-omap2/Kconfig
> @@ -88,7 +88,6 @@ config ARCH_OMAP4
>  	select CACHE_L2X0
>  	select CPU_V7
>  	select HAVE_SMP
> -	select LOCAL_TIMERS if SMP
>  	select OMAP_INTERCONNECT
>  	select PL310_ERRATA_588369
>  	select PL310_ERRATA_727915
> diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
> index 2bdd4cf..c00a8f8 100644
> --- a/arch/arm/mach-omap2/timer.c
> +++ b/arch/arm/mach-omap2/timer.c
> @@ -587,7 +587,6 @@ OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon",
>  #ifdef CONFIG_ARCH_OMAP4
>  OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
>  			2, OMAP4_MPU_SOURCE);
> -#ifdef CONFIG_LOCAL_TIMERS
>  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29);
>  void __init omap4_local_timer_init(void)
>  {
> @@ -606,12 +605,6 @@ void __init omap4_local_timer_init(void)
>  			pr_err("twd_local_timer_register failed %d\n", err);
>  	}
>  }
> -#else /* CONFIG_LOCAL_TIMERS */
> -void __init omap4_local_timer_init(void)
> -{
> -	omap4_sync32k_timer_init();
> -}
> -#endif /* CONFIG_LOCAL_TIMERS */
>  #endif /* CONFIG_ARCH_OMAP4 */
>  
>  #ifdef CONFIG_SOC_OMAP5
> -- 
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
> hosted by The Linux Foundation
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

* Re: [PATCH 10/10] ARM: smp: Remove local timer API
  2013-03-07  0:04 ` [PATCH 10/10] ARM: smp: Remove " Stephen Boyd
@ 2013-03-08 19:55   ` Tony Lindgren
  0 siblings, 0 replies; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 19:55 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130306 16:23]:
> There are no more users of this API, remove it.
> 
> Cc: Russell King <linux@arm.linux.org.uk>
> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>

Acked-by: Tony Lindgren <tony@atomide.com>

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 19:50             ` Stephen Boyd
@ 2013-03-08 20:08               ` Tony Lindgren
  2013-03-08 20:17                 ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 20:08 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130308 11:54]:
> On 03/08/13 11:48, Tony Lindgren wrote:
> > * Stephen Boyd <sboyd@codeaurora.org> [130308 10:21]:
> >>
> >> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
> >> index 081de6f..4ea3e9d 100644
> >> --- a/arch/arm/kernel/smp_twd.c
> >> +++ b/arch/arm/kernel/smp_twd.c
> >> @@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
> >>  
> >>  static irqreturn_t twd_handler(int irq, void *dev_id)
> >>  {
> >> -       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
> >> +       struct clock_event_device *evt = dev_id;
> >>  
> >>         if (twd_timer_ack()) {
> >>                 evt->event_handler(evt);
> >>
> > Yup thanks that fixes it, both fixes are needed. So for this patch + the
> > two fixes please feel free to add:
> >
> > Acked-by: Tony Lindgren <tony@atomide.com>
> 
> Great. Thanks for testing.

Hmm noticed one more thing: vexpress no longer boots in qemu for
me after applying this. Sorry did not get any debug_ll output, but
maybe you can take a look at it. I tested with omap2plus_defconfig +
linaro-qemu:

$ qemu-system-arm -machine vexpress-a9 -m 1024 -curses -net nic -net \
user -serial stdio -append console=ttyAMA0,115200n8 rw \
root=/dev/mmcblk0p2 rootwait physmap.enabled=0 -kernel zImage \
-initrd initrd.img -sd rootfs.img

Regards,

Tony

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 20:08               ` Tony Lindgren
@ 2013-03-08 20:17                 ` Stephen Boyd
  2013-03-08 20:29                   ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-08 20:17 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/08/13 12:08, Tony Lindgren wrote:
> * Stephen Boyd <sboyd@codeaurora.org> [130308 11:54]:
>> On 03/08/13 11:48, Tony Lindgren wrote:
>>> * Stephen Boyd <sboyd@codeaurora.org> [130308 10:21]:
>>>> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
>>>> index 081de6f..4ea3e9d 100644
>>>> --- a/arch/arm/kernel/smp_twd.c
>>>> +++ b/arch/arm/kernel/smp_twd.c
>>>> @@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
>>>>  
>>>>  static irqreturn_t twd_handler(int irq, void *dev_id)
>>>>  {
>>>> -       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
>>>> +       struct clock_event_device *evt = dev_id;
>>>>  
>>>>         if (twd_timer_ack()) {
>>>>                 evt->event_handler(evt);
>>>>
>>> Yup thanks that fixes it, both fixes are needed. So for this patch + the
>>> two fixes please feel free to add:
>>>
>>> Acked-by: Tony Lindgren <tony@atomide.com>
>> Great. Thanks for testing.
> Hmm noticed one more thing: vexpress no longer boots in qemu for
> me after applying this. Sorry did not get any debug_ll output, but
> maybe you can take a look at it. I tested with omap2plus_defconfig +
> linaro-qemu:
>
> $ qemu-system-arm -machine vexpress-a9 -m 1024 -curses -net nic -net \
> user -serial stdio -append console=ttyAMA0,115200n8 rw \
> root=/dev/mmcblk0p2 rootwait physmap.enabled=0 -kernel zImage \
> -initrd initrd.img -sd rootfs.img
>
>

I wonder if you're hitting something similar to this issue on versatile
boards [1]. Can you try that patch? Otherwise I will try to get qemu
running (something I've never done, do you have instructions?).

[1] http://article.gmane.org/gmane.linux.ports.arm.kernel/221539

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 20:17                 ` Stephen Boyd
@ 2013-03-08 20:29                   ` Tony Lindgren
  2013-03-09  1:06                     ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-08 20:29 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130308 12:22]:
> On 03/08/13 12:08, Tony Lindgren wrote:
> > * Stephen Boyd <sboyd@codeaurora.org> [130308 11:54]:
> >> On 03/08/13 11:48, Tony Lindgren wrote:
> >>> * Stephen Boyd <sboyd@codeaurora.org> [130308 10:21]:
> >>>> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
> >>>> index 081de6f..4ea3e9d 100644
> >>>> --- a/arch/arm/kernel/smp_twd.c
> >>>> +++ b/arch/arm/kernel/smp_twd.c
> >>>> @@ -227,7 +227,7 @@ static void __cpuinit twd_calibrate_rate(void)
> >>>>  
> >>>>  static irqreturn_t twd_handler(int irq, void *dev_id)
> >>>>  {
> >>>> -       struct clock_event_device *evt = *(struct clock_event_device **)dev_id;
> >>>> +       struct clock_event_device *evt = dev_id;
> >>>>  
> >>>>         if (twd_timer_ack()) {
> >>>>                 evt->event_handler(evt);
> >>>>
> >>> Yup thanks that fixes it, both fixes are needed. So for this patch + the
> >>> two fixes please feel free to add:
> >>>
> >>> Acked-by: Tony Lindgren <tony@atomide.com>
> >> Great. Thanks for testing.
> > Hmm noticed one more thing: vexpress no longer boots in qemu for
> > me after applying this. Sorry did not get any debug_ll output, but
> > maybe you can take a look at it. I tested with omap2plus_defconfig +
> > linaro-qemu:
> >
> > $ qemu-system-arm -machine vexpress-a9 -m 1024 -curses -net nic -net \
> > user -serial stdio -append console=ttyAMA0,115200n8 rw \
> > root=/dev/mmcblk0p2 rootwait physmap.enabled=0 -kernel zImage \
> > -initrd initrd.img -sd rootfs.img
> >
> >
> 
> I wonder if you're hitting something similar to this issue on versatile
> boards [1]. Can you try that patch? Otherwise I will try to get qemu
> running (something I've never done, do you have instructions?).

Applying that does not seem to help, but you might want to get vexpress
running anyways for some multiplatform sanity checks.

I just built and installed qemu-linaro from their git, then ran the
command above. Looks like stock qemu does not work for vexpress for some
reason. You can probably use a dummy initrd and rootfs to debug this
though :)

More info on qemu-linaro at:

https://launchpad.net/qemu-linaro

Regards,

Tony
 
> [1] http://article.gmane.org/gmane.linux.ports.arm.kernel/221539

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-08 20:29                   ` Tony Lindgren
@ 2013-03-09  1:06                     ` Stephen Boyd
  2013-03-11 17:28                       ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-09  1:06 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/08/13 12:29, Tony Lindgren wrote:
> Applying that does not seem to help, but you might want to get vexpress
> running anyways for some multiplatform sanity checks.
>
> I just built and installed qemu-linaro from their git, then ran the
> command above. Looks like stock qemu does not work for vexpress for some
> reason. You can probably use a dummy initrd and rootfs to debug this
> though :)

So my patchset didn't break qemu?

>
> More info on qemu-linaro at:
>
> https://launchpad.net/qemu-linaro

Thanks for the link.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 04/10] ARM: OMAP2+: Divorce from local timer API
  2013-03-08 19:50   ` Tony Lindgren
@ 2013-03-11 15:29     ` Santosh Shilimkar
  0 siblings, 0 replies; 31+ messages in thread
From: Santosh Shilimkar @ 2013-03-11 15:29 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: Stephen Boyd, linux-arm-kernel, linux-arm-msm, linux-kernel

On Saturday 09 March 2013 01:20 AM, Tony Lindgren wrote:
> * Stephen Boyd <sboyd@codeaurora.org> [130306 16:22]:
>> Now that the TWD doesn't rely on the local timer API, OMAP can
>> stop selecting it in Kconfig and relying on the config option to
>> decide if it should call smp_twd functions.
>>

> 
> Acked-by: Tony Lindgren <tony@atomide.com>
> 

Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-09  1:06                     ` Stephen Boyd
@ 2013-03-11 17:28                       ` Tony Lindgren
  2013-03-11 22:17                         ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-11 17:28 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130308 17:10]:
> On 03/08/13 12:29, Tony Lindgren wrote:
> > Applying that does not seem to help, but you might want to get vexpress
> > running anyways for some multiplatform sanity checks.
> >
> > I just built and installed qemu-linaro from their git, then ran the
> > command above. Looks like stock qemu does not work for vexpress for some
> > reason. You can probably use a dummy initrd and rootfs to debug this
> > though :)
> 
> So my patchset didn't break qemu?

Sorry if that was unclear: Yes your patchset breaks booting vexpress
in qemu.

What I meant earlier is that I've ever gotten the qemu-linaro to boot
vexpress and the unpatches qemu did not seem to boot vexpress at all
the last time I tried few months back.

Regards,

Tony

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-11 17:28                       ` Tony Lindgren
@ 2013-03-11 22:17                         ` Stephen Boyd
  2013-03-11 22:50                           ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-11 22:17 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/11/13 10:28, Tony Lindgren wrote:
> * Stephen Boyd <sboyd@codeaurora.org> [130308 17:10]:
>> On 03/08/13 12:29, Tony Lindgren wrote:
>>> Applying that does not seem to help, but you might want to get vexpress
>>> running anyways for some multiplatform sanity checks.
>>>
>>> I just built and installed qemu-linaro from their git, then ran the
>>> command above. Looks like stock qemu does not work for vexpress for some
>>> reason. You can probably use a dummy initrd and rootfs to debug this
>>> though :)
>> So my patchset didn't break qemu?
> Sorry if that was unclear: Yes your patchset breaks booting vexpress
> in qemu.
>
>

Ok. qemu works for me before applying my patches. I've added this into
the series before this patch to fix the boot issue.

-----8<-----

Subject: [PATCH] ARM: vexpress: Move smp_twd setup to time_late_init hook

On devices without a clock describing the rate of the twd we
detect the rate at runtime via twd_calibrate_rate(). Currently
this happens when smp_prepare_cpus() calls the localtimer start
callback, after the sp804 timer has been registered and when
jiffies have started incrementing.

In the next patch we're going to make twd_local_timer_register()
register the twd clockevent on the boot CPU. In the case of
vexpress, this will hang the system at boot because jiffies
haven't started incrementing when twd_calibrate_rate() is called.
Register the smp_twd during time_late_init() on vexpress to avoid
this problem.

Based on a patch by Marc Zyngier <marc.zyngier@arm.com>.

Reported-by: Tony Lindgren <tony@atomide.com>
Cc: Pawel Moll <pawel.moll@arm.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
---
 arch/arm/mach-vexpress/ct-ca9x4.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c
index 6f34497..a9f39bf 100644
--- a/arch/arm/mach-vexpress/ct-ca9x4.c
+++ b/arch/arm/mach-vexpress/ct-ca9x4.c
@@ -62,7 +62,7 @@ static void __init ct_ca9x4_init_irq(void)
 {
 	gic_init(0, 29, ioremap(A9_MPCORE_GIC_DIST, SZ_4K),
 		 ioremap(A9_MPCORE_GIC_CPU, SZ_256));
-	ca9x4_twd_init();
+	late_time_init = ca9x4_twd_init;
 }
 
 static int ct_ca9x4_clcd_setup(struct clcd_fb *fb)

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-11 22:17                         ` Stephen Boyd
@ 2013-03-11 22:50                           ` Tony Lindgren
  2013-03-12  1:20                             ` Stephen Boyd
  0 siblings, 1 reply; 31+ messages in thread
From: Tony Lindgren @ 2013-03-11 22:50 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130311 15:22]:
> On 03/11/13 10:28, Tony Lindgren wrote:
> > * Stephen Boyd <sboyd@codeaurora.org> [130308 17:10]:
> >> On 03/08/13 12:29, Tony Lindgren wrote:
> >>> Applying that does not seem to help, but you might want to get vexpress
> >>> running anyways for some multiplatform sanity checks.
> >>>
> >>> I just built and installed qemu-linaro from their git, then ran the
> >>> command above. Looks like stock qemu does not work for vexpress for some
> >>> reason. You can probably use a dummy initrd and rootfs to debug this
> >>> though :)
> >> So my patchset didn't break qemu?
> > Sorry if that was unclear: Yes your patchset breaks booting vexpress
> > in qemu.
> >
> >
> 
> Ok. qemu works for me before applying my patches. I've added this into
> the series before this patch to fix the boot issue.

OK thanks:

Acked-by: Tony Lindgren <tony@atomide.com>

 
> -----8<-----
> 
> Subject: [PATCH] ARM: vexpress: Move smp_twd setup to time_late_init hook
> 
> On devices without a clock describing the rate of the twd we
> detect the rate at runtime via twd_calibrate_rate(). Currently
> this happens when smp_prepare_cpus() calls the localtimer start
> callback, after the sp804 timer has been registered and when
> jiffies have started incrementing.
> 
> In the next patch we're going to make twd_local_timer_register()
> register the twd clockevent on the boot CPU. In the case of
> vexpress, this will hang the system at boot because jiffies
> haven't started incrementing when twd_calibrate_rate() is called.
> Register the smp_twd during time_late_init() on vexpress to avoid
> this problem.
> 
> Based on a patch by Marc Zyngier <marc.zyngier@arm.com>.
> 
> Reported-by: Tony Lindgren <tony@atomide.com>
> Cc: Pawel Moll <pawel.moll@arm.com>
> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
> ---
>  arch/arm/mach-vexpress/ct-ca9x4.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c
> index 6f34497..a9f39bf 100644
> --- a/arch/arm/mach-vexpress/ct-ca9x4.c
> +++ b/arch/arm/mach-vexpress/ct-ca9x4.c
> @@ -62,7 +62,7 @@ static void __init ct_ca9x4_init_irq(void)
>  {
>  	gic_init(0, 29, ioremap(A9_MPCORE_GIC_DIST, SZ_4K),
>  		 ioremap(A9_MPCORE_GIC_CPU, SZ_256));
> -	ca9x4_twd_init();
> +	late_time_init = ca9x4_twd_init;
>  }
>  
>  static int ct_ca9x4_clcd_setup(struct clcd_fb *fb)
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
> 

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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-11 22:50                           ` Tony Lindgren
@ 2013-03-12  1:20                             ` Stephen Boyd
  2013-03-12 17:06                               ` Tony Lindgren
  0 siblings, 1 reply; 31+ messages in thread
From: Stephen Boyd @ 2013-03-12  1:20 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

On 03/11/13 15:50, Tony Lindgren wrote:
> * Stephen Boyd <sboyd@codeaurora.org> [130311 15:22]:
>> Ok. qemu works for me before applying my patches. I've added this into
>> the series before this patch to fix the boot issue.
> OK thanks:
>
>

Actually, it's worse. From reading the code it looks like quite a few
other machines register a clockevent and get jiffies going so they can
calibrate the twd. I also see that Rob Herring's pull request to move
smp_twd to CLKSRC_OF_DECLARE is going to conflict with any changes I
make in the board files. I think we need to make the twd use the
late_time_init callback if there is no clock rate and ignore the other
patch I sent out a few hours ago. Basically, squash this into this 3/10
patch.

----8<-----

diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index a1185d3..c58918f 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -90,8 +90,10 @@ static int twd_timer_ack(void)
 	return 0;
 }
 
-static void twd_timer_stop(struct clock_event_device *clk)
+static void twd_timer_stop(void)
 {
+	struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
+
 	twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk);
 	disable_percpu_irq(clk->irq);
 }
@@ -265,8 +267,9 @@ static void twd_get_clock(struct device_node *np)
 /*
  * Setup the local clock events for a CPU.
  */
-static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
+static void __cpuinit twd_timer_setup(void)
 {
+	struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
 	int cpu = smp_processor_id();
 
 	/*
@@ -275,9 +278,9 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 	 */
 	if (per_cpu(percpu_setup_called, cpu)) {
 		__raw_writel(0, twd_base + TWD_TIMER_CONTROL);
-		clockevents_register_device(__this_cpu_ptr(twd_evt));
+		clockevents_register_device(clk);
 		enable_percpu_irq(clk->irq, 0);
-		return 0;
+		return;
 	}
 	per_cpu(percpu_setup_called, cpu) = true;
 
@@ -302,20 +305,18 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
 					0xf, 0xffffffff);
 	enable_percpu_irq(clk->irq, 0);
 
-	return 0;
+	return;
 }
 
 static int __cpuinit twd_timer_cpu_notify(struct notifier_block *self,
 					   unsigned long action, void *hcpu)
 {
-	struct clock_event_device *evt = this_cpu_ptr(twd_evt);
-
 	switch (action & ~CPU_TASKS_FROZEN) {
 	case CPU_STARTING:
-		twd_timer_setup(evt);
+		twd_timer_setup();
 		break;
 	case CPU_DYING:
-		twd_timer_stop(evt);
+		twd_timer_stop();
 		break;
 	}
 
@@ -348,8 +349,15 @@ static int __init twd_local_timer_common_register(struct device_node *np)
 
 	twd_get_clock(np);
 
-	/* Immediately configure the timer on the boot CPU */
-	twd_timer_setup(this_cpu_ptr(twd_evt));
+	/*
+	 * Immediately configure the timer on the boot CPU, unless we need
+	 * jiffies to be incrementing to calibrate the rate in which case
+	 * setup the timer in late_time_init.
+	 */
+	if (twd_timer_rate)
+		twd_timer_setup();
+	else
+		late_time_init = twd_timer_setup;
 
 	return 0;
 

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation


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

* Re: [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API
  2013-03-12  1:20                             ` Stephen Boyd
@ 2013-03-12 17:06                               ` Tony Lindgren
  0 siblings, 0 replies; 31+ messages in thread
From: Tony Lindgren @ 2013-03-12 17:06 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: linux-arm-kernel, linux-arm-msm, Russell King, linux-kernel

* Stephen Boyd <sboyd@codeaurora.org> [130311 18:25]:
> On 03/11/13 15:50, Tony Lindgren wrote:
> > * Stephen Boyd <sboyd@codeaurora.org> [130311 15:22]:
> >> Ok. qemu works for me before applying my patches. I've added this into
> >> the series before this patch to fix the boot issue.
> > OK thanks:
> >
> >
> 
> Actually, it's worse. From reading the code it looks like quite a few
> other machines register a clockevent and get jiffies going so they can
> calibrate the twd. I also see that Rob Herring's pull request to move
> smp_twd to CLKSRC_OF_DECLARE is going to conflict with any changes I
> make in the board files. I think we need to make the twd use the
> late_time_init callback if there is no clock rate and ignore the other
> patch I sent out a few hours ago. Basically, squash this into this 3/10
> patch.

Looks reasonable to me to keep things working.

Regards,

Tony
 
> ----8<-----
> 
> diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
> index a1185d3..c58918f 100644
> --- a/arch/arm/kernel/smp_twd.c
> +++ b/arch/arm/kernel/smp_twd.c
> @@ -90,8 +90,10 @@ static int twd_timer_ack(void)
>  	return 0;
>  }
>  
> -static void twd_timer_stop(struct clock_event_device *clk)
> +static void twd_timer_stop(void)
>  {
> +	struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
> +
>  	twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk);
>  	disable_percpu_irq(clk->irq);
>  }
> @@ -265,8 +267,9 @@ static void twd_get_clock(struct device_node *np)
>  /*
>   * Setup the local clock events for a CPU.
>   */
> -static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
> +static void __cpuinit twd_timer_setup(void)
>  {
> +	struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
>  	int cpu = smp_processor_id();
>  
>  	/*
> @@ -275,9 +278,9 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
>  	 */
>  	if (per_cpu(percpu_setup_called, cpu)) {
>  		__raw_writel(0, twd_base + TWD_TIMER_CONTROL);
> -		clockevents_register_device(__this_cpu_ptr(twd_evt));
> +		clockevents_register_device(clk);
>  		enable_percpu_irq(clk->irq, 0);
> -		return 0;
> +		return;
>  	}
>  	per_cpu(percpu_setup_called, cpu) = true;
>  
> @@ -302,20 +305,18 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk)
>  					0xf, 0xffffffff);
>  	enable_percpu_irq(clk->irq, 0);
>  
> -	return 0;
> +	return;
>  }
>  
>  static int __cpuinit twd_timer_cpu_notify(struct notifier_block *self,
>  					   unsigned long action, void *hcpu)
>  {
> -	struct clock_event_device *evt = this_cpu_ptr(twd_evt);
> -
>  	switch (action & ~CPU_TASKS_FROZEN) {
>  	case CPU_STARTING:
> -		twd_timer_setup(evt);
> +		twd_timer_setup();
>  		break;
>  	case CPU_DYING:
> -		twd_timer_stop(evt);
> +		twd_timer_stop();
>  		break;
>  	}
>  
> @@ -348,8 +349,15 @@ static int __init twd_local_timer_common_register(struct device_node *np)
>  
>  	twd_get_clock(np);
>  
> -	/* Immediately configure the timer on the boot CPU */
> -	twd_timer_setup(this_cpu_ptr(twd_evt));
> +	/*
> +	 * Immediately configure the timer on the boot CPU, unless we need
> +	 * jiffies to be incrementing to calibrate the rate in which case
> +	 * setup the timer in late_time_init.
> +	 */
> +	if (twd_timer_rate)
> +		twd_timer_setup();
> +	else
> +		late_time_init = twd_timer_setup;
>  
>  	return 0;
>  
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

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

end of thread, other threads:[~2013-03-12 17:06 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-07  0:03 [PATCHv2 0/10] Remove ARM local timer API Stephen Boyd
2013-03-07  0:03 ` [PATCH 01/10] clocksource: add generic dummy timer driver Stephen Boyd
2013-03-07 14:00   ` Thomas Gleixner
2013-03-07 21:41     ` Stephen Boyd
2013-03-07  0:03 ` [PATCH 02/10] ARM: smp: Remove duplicate dummy timer implementation Stephen Boyd
2013-03-07  0:03 ` [PATCH 03/10] ARM: smp_twd: Divorce smp_twd from local timer API Stephen Boyd
2013-03-08  0:40   ` Tony Lindgren
2013-03-08  1:14     ` Stephen Boyd
2013-03-08 18:07       ` Tony Lindgren
2013-03-08 18:17         ` Stephen Boyd
2013-03-08 19:48           ` Tony Lindgren
2013-03-08 19:50             ` Stephen Boyd
2013-03-08 20:08               ` Tony Lindgren
2013-03-08 20:17                 ` Stephen Boyd
2013-03-08 20:29                   ` Tony Lindgren
2013-03-09  1:06                     ` Stephen Boyd
2013-03-11 17:28                       ` Tony Lindgren
2013-03-11 22:17                         ` Stephen Boyd
2013-03-11 22:50                           ` Tony Lindgren
2013-03-12  1:20                             ` Stephen Boyd
2013-03-12 17:06                               ` Tony Lindgren
2013-03-07  0:04 ` [PATCH 04/10] ARM: OMAP2+: Divorce " Stephen Boyd
2013-03-08 19:50   ` Tony Lindgren
2013-03-11 15:29     ` Santosh Shilimkar
2013-03-07  0:04 ` [PATCH 05/10] ARM: EXYNOS4: Divorce mct " Stephen Boyd
2013-03-07  0:04 ` [PATCH 06/10] ARM: PRIMA2: Divorce timer-marco " Stephen Boyd
2013-03-07  0:04 ` [PATCH 07/10] ARM: msm: Divorce msm_timer " Stephen Boyd
2013-03-07  0:04 ` [PATCH 08/10] clocksource: time-armada-370-xp: Fix sparse warning Stephen Boyd
2013-03-07  0:04 ` [PATCH 09/10] clocksource: time-armada-370-xp: Divorce from local timer API Stephen Boyd
2013-03-07  0:04 ` [PATCH 10/10] ARM: smp: Remove " Stephen Boyd
2013-03-08 19:55   ` Tony Lindgren

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).