Commit 14188b3a authored by Tony Lindgren's avatar Tony Lindgren

ARM: OMAP: Fix spinlock recursion for dyntick

Fix spinlock recursion for dyntick. Modified version based
on Imre Deak's earlier patch.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent e4d5ee81
...@@ -194,14 +194,11 @@ unsigned long long sched_clock(void) ...@@ -194,14 +194,11 @@ unsigned long long sched_clock(void)
* issues with dynamic tick. In the dynamic tick case, we need to lock * issues with dynamic tick. In the dynamic tick case, we need to lock
* with irqsave. * with irqsave.
*/ */
static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id, static inline irqreturn_t _omap_32k_timer_interrupt(int irq, void *dev_id,
struct pt_regs *regs) struct pt_regs *regs)
{ {
unsigned long flags;
unsigned long now; unsigned long now;
write_seqlock_irqsave(&xtime_lock, flags);
omap_32k_timer_ack_irq(); omap_32k_timer_ack_irq();
now = omap_32k_sync_timer_read(); now = omap_32k_sync_timer_read();
...@@ -217,6 +214,23 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id, ...@@ -217,6 +214,23 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
* continuous timer can be overridden from pm_idle to be longer. * continuous timer can be overridden from pm_idle to be longer.
*/ */
omap_32k_timer_start(omap_32k_last_tick + OMAP_32K_TICKS_PER_HZ - now); omap_32k_timer_start(omap_32k_last_tick + OMAP_32K_TICKS_PER_HZ - now);
return IRQ_HANDLED;
}
static irqreturn_t omap_32k_timer_handler(int irq, void *dev_id,
struct pt_regs *regs)
{
return _omap_32k_timer_interrupt(irq, dev_id, regs);
}
static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
struct pt_regs *regs)
{
unsigned long flags;
write_seqlock_irqsave(&xtime_lock, flags);
_omap_32k_timer_interrupt(irq, dev_id, regs);
write_sequnlock_irqrestore(&xtime_lock, flags); write_sequnlock_irqrestore(&xtime_lock, flags);
return IRQ_HANDLED; return IRQ_HANDLED;
...@@ -262,7 +276,7 @@ static struct dyn_tick_timer omap_dyn_tick_timer = { ...@@ -262,7 +276,7 @@ static struct dyn_tick_timer omap_dyn_tick_timer = {
.enable = omap_32k_timer_enable_dyn_tick, .enable = omap_32k_timer_enable_dyn_tick,
.disable = omap_32k_timer_disable_dyn_tick, .disable = omap_32k_timer_disable_dyn_tick,
.reprogram = omap_32k_timer_reprogram, .reprogram = omap_32k_timer_reprogram,
.handler = omap_32k_timer_interrupt, .handler = omap_32k_timer_handler,
}; };
#endif /* CONFIG_NO_IDLE_HZ */ #endif /* CONFIG_NO_IDLE_HZ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment