From 887708f0ac7641e7d5131409cedf6774f26f0cb6 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Sat, 2 Mar 2013 11:10:13 +0100 Subject: ARM: timer-sp: Set dynamic irq affinity When a cpu goes to a deep idle state where its local timer is shutdown, it notifies the time frame work to use the broadcast timer instead. Unfortunately, the broadcast device could wake up any CPU, including an idle one which is not concerned by the wake up at all. This implies, in the worst case, an idle CPU will wake up to send an IPI to another idle cpu. This patch fixes this for ARM platforms using timer-sp, by setting CLOCK_EVT_FEAT_DYNIRQ feature. Signed-off-by: Viresh Kumar Signed-off-by: Daniel Lezcano --- arch/arm/common/timer-sp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'arch/arm') diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index 023ee63827a2..e901d0f3e0bb 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c @@ -166,7 +166,8 @@ static int sp804_set_next_event(unsigned long next, } static struct clock_event_device sp804_clockevent = { - .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, + .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT | + CLOCK_EVT_FEAT_DYNIRQ, .set_mode = sp804_set_mode, .set_next_event = sp804_set_next_event, .rating = 300, -- cgit v1.2.3-58-ga151 From 573145f08c2b92c45498468afbbba909f6ce6135 Mon Sep 17 00:00:00 2001 From: Ezequiel Garcia Date: Tue, 13 Aug 2013 11:43:12 -0300 Subject: clocksource: armada-370-xp: Use CLOCKSOURCE_OF_DECLARE This is almost cosmetic: we achieve a bit of consistency with other clocksource drivers by using the CLOCKSOURCE_OF_DECLARE macro for the boilerplate code. Signed-off-by: Ezequiel Garcia Signed-off-by: Daniel Lezcano Reviewed-by: Andrew Lunn --- arch/arm/mach-mvebu/armada-370-xp.c | 4 ++-- drivers/clocksource/time-armada-370-xp.c | 6 +++--- include/linux/time-armada-370-xp.h | 18 ------------------ 3 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 include/linux/time-armada-370-xp.h (limited to 'arch/arm') diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c index 97cbb8021919..4ea03ad41179 100644 --- a/arch/arm/mach-mvebu/armada-370-xp.c +++ b/arch/arm/mach-mvebu/armada-370-xp.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include #include @@ -69,7 +69,7 @@ static void __init armada_370_xp_mbus_init(void) static void __init armada_370_xp_timer_and_clk_init(void) { of_clk_init(NULL); - armada_370_xp_timer_init(); + clocksource_of_init(); coherency_init(); armada_370_xp_mbus_init(); #ifdef CONFIG_CACHE_L2X0 diff --git a/drivers/clocksource/time-armada-370-xp.c b/drivers/clocksource/time-armada-370-xp.c index abc2c9f04821..1e4b523f27c1 100644 --- a/drivers/clocksource/time-armada-370-xp.c +++ b/drivers/clocksource/time-armada-370-xp.c @@ -212,13 +212,11 @@ static struct local_timer_ops armada_370_xp_local_timer_ops = { .stop = armada_370_xp_timer_stop, }; -void __init armada_370_xp_timer_init(void) +static void __init armada_370_xp_timer_init(struct device_node *np) { u32 clr = 0, set = 0; - struct device_node *np; int res; - np = of_find_compatible_node(NULL, NULL, "marvell,armada-370-xp-timer"); timer_base = of_iomap(np, 0); WARN_ON(!timer_base); local_base = of_iomap(np, 1); @@ -290,3 +288,5 @@ void __init armada_370_xp_timer_init(void) #endif } } +CLOCKSOURCE_OF_DECLARE(armada_370_xp, "marvell,armada-370-xp-timer", + armada_370_xp_timer_init); diff --git a/include/linux/time-armada-370-xp.h b/include/linux/time-armada-370-xp.h deleted file mode 100644 index dfdfdc03115b..000000000000 --- a/include/linux/time-armada-370-xp.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Marvell Armada 370/XP SoC timer handling. - * - * Copyright (C) 2012 Marvell - * - * Lior Amsalem - * Gregory CLEMENT - * Thomas Petazzoni - * - */ -#ifndef __TIME_ARMADA_370_XPPRCMU_H -#define __TIME_ARMADA_370_XPPRCMU_H - -#include - -void __init armada_370_xp_timer_init(void); - -#endif -- cgit v1.2.3-58-ga151