Skip to content

Commit

Permalink
ARM: 6759/1: smp: Select local timers vs broadcast timer support runtime
Browse files Browse the repository at this point in the history
The current code support of dummy timers in absence of local
timer is compile time. This is an attempt to convert it to runtime
so that on few SOC version if the local timers aren't supported
kernel can switch to dummy timers. OMAP4430 ES1.0 does suffer from
this limitation.

This patch should not have any functional impact on affected
files.

Cc: Daniel Walker <dwalker@codeaurora.org>
Cc: Bryan Huntsman <bryanh@codeaurora.org>
Cc: Tony Lindgren <tony@atomide.com>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Magnus Damm <magnus.damm@gmail.com>
Cc: Colin Cross <ccross@android.com>
Cc: Erik Gilling <konkers@android.com>
Cc: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Cc: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: David Brown <davidb@codeaurora.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Santosh Shilimkar authored and Russell King committed Feb 23, 2011
1 parent d77e270 commit af90f10
Show file tree
Hide file tree
Showing 9 changed files with 24 additions and 12 deletions.
8 changes: 7 additions & 1 deletion arch/arm/include/asm/localtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,14 @@ int local_timer_ack(void);
/*
* Setup a local timer interrupt for a CPU.
*/
void local_timer_setup(struct clock_event_device *);
int local_timer_setup(struct clock_event_device *);

#else

static inline int local_timer_setup(struct clock_event_device *evt)
{
return -ENXIO;
}
#endif

#endif
7 changes: 3 additions & 4 deletions arch/arm/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,13 +474,12 @@ static void smp_timer_broadcast(const struct cpumask *mask)
#define smp_timer_broadcast NULL
#endif

#ifndef CONFIG_LOCAL_TIMERS
static void broadcast_timer_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt)
{
}

static void local_timer_setup(struct clock_event_device *evt)
static void broadcast_timer_setup(struct clock_event_device *evt)
{
evt->name = "dummy_timer";
evt->features = CLOCK_EVT_FEAT_ONESHOT |
Expand All @@ -492,7 +491,6 @@ static void local_timer_setup(struct clock_event_device *evt)

clockevents_register_device(evt);
}
#endif

void __cpuinit percpu_timer_setup(void)
{
Expand All @@ -502,7 +500,8 @@ void __cpuinit percpu_timer_setup(void)
evt->cpumask = cpumask_of(cpu);
evt->broadcast = smp_timer_broadcast;

local_timer_setup(evt);
if (local_timer_setup(evt))
broadcast_timer_setup(evt);
}

#ifdef CONFIG_HOTPLUG_CPU
Expand Down
3 changes: 2 additions & 1 deletion arch/arm/mach-msm/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ static void __init msm_timer_init(void)
}

#ifdef CONFIG_SMP
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
struct msm_clock *clock = &msm_clocks[MSM_GLOBAL_TIMER];

Expand Down Expand Up @@ -287,6 +287,7 @@ void __cpuinit local_timer_setup(struct clock_event_device *evt)
gic_enable_ppi(clock->irq.irq);

clockevents_register_device(evt);
return 0;
}

inline int local_timer_ack(void)
Expand Down
3 changes: 2 additions & 1 deletion arch/arm/mach-omap2/timer-mpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = OMAP44XX_IRQ_LOCALTIMER;
twd_timer_setup(evt);
return 0;
}

3 changes: 2 additions & 1 deletion arch/arm/mach-s5pv310/localtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = IRQ_LOCALTIMER;
twd_timer_setup(evt);
return 0;
}
3 changes: 2 additions & 1 deletion arch/arm/mach-shmobile/localtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = 29;
twd_timer_setup(evt);
return 0;
}
3 changes: 2 additions & 1 deletion arch/arm/mach-tegra/localtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = IRQ_LOCALTIMER;
twd_timer_setup(evt);
return 0;
}
3 changes: 2 additions & 1 deletion arch/arm/mach-ux500/localtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = IRQ_LOCALTIMER;
twd_timer_setup(evt);
return 0;
}
3 changes: 2 additions & 1 deletion arch/arm/plat-versatile/localtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
/*
* Setup the local clock events for a CPU.
*/
void __cpuinit local_timer_setup(struct clock_event_device *evt)
int __cpuinit local_timer_setup(struct clock_event_device *evt)
{
evt->irq = IRQ_LOCALTIMER;
twd_timer_setup(evt);
return 0;
}

0 comments on commit af90f10

Please sign in to comment.