forked from luck/tmp_suning_uos_patched
ARM: OMAP: Fix spinlock recursion for dyntick
Fix spinlock recursion for dyntick. Modified version based on Imre Deak's earlier patch. Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
e4d5ee8109
commit
14188b3a4c
@ -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,
|
|||||||
* 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 = {
|
|||||||
.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 */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user