| .. | .. |
|---|
| 71 | 71 | arm_pm_idle(); |
|---|
| 72 | 72 | else |
|---|
| 73 | 73 | cpu_do_idle(); |
|---|
| 74 | + hard_cond_local_irq_enable(); |
|---|
| 74 | 75 | raw_local_irq_enable(); |
|---|
| 75 | 76 | } |
|---|
| 76 | 77 | |
|---|
| .. | .. |
|---|
| 448 | 449 | return ret; |
|---|
| 449 | 450 | } |
|---|
| 450 | 451 | #endif |
|---|
| 452 | + |
|---|
| 453 | +#ifdef CONFIG_IRQ_PIPELINE |
|---|
| 454 | + |
|---|
| 455 | +/* |
|---|
| 456 | + * When pipelining interrupts, we have to reconcile the hardware and |
|---|
| 457 | + * the virtual states. Hard irqs are off on entry while the current |
|---|
| 458 | + * stage has to be unstalled: fix this up by stalling the in-band |
|---|
| 459 | + * stage on entry, unstalling on exit. |
|---|
| 460 | + */ |
|---|
| 461 | +asmlinkage void __sched arm_preempt_schedule_irq(void) |
|---|
| 462 | +{ |
|---|
| 463 | + WARN_ON_ONCE(irq_pipeline_debug() && test_inband_stall()); |
|---|
| 464 | + stall_inband_nocheck(); |
|---|
| 465 | + preempt_schedule_irq(); |
|---|
| 466 | + unstall_inband_nocheck(); |
|---|
| 467 | +} |
|---|
| 468 | + |
|---|
| 469 | +#else |
|---|
| 470 | + |
|---|
| 471 | +asmlinkage void __sched arm_preempt_schedule_irq(void) |
|---|
| 472 | +{ |
|---|
| 473 | + preempt_schedule_irq(); |
|---|
| 474 | +} |
|---|
| 475 | + |
|---|
| 476 | +#endif |
|---|