Blackfin: abstract irq14 lowering in do_irq
Split out the optional IRQ14 lowering code to further simplify the asm_do_IRQ() function and keep the ifdef nest under control. Signed-off-by: Mike Frysinger <vapier@gentoo.org>
This commit is contained in:
parent
6f10fdabdc
commit
81b79c213d
@ -104,6 +104,29 @@ static void check_stack_overflow(int irq)
|
|||||||
static inline void check_stack_overflow(int irq) { }
|
static inline void check_stack_overflow(int irq) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_IPIPE
|
||||||
|
static void maybe_lower_to_irq14(void)
|
||||||
|
{
|
||||||
|
unsigned short pending, other_ints;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're the only interrupt running (ignoring IRQ15 which
|
||||||
|
* is for syscalls), lower our priority to IRQ14 so that
|
||||||
|
* softirqs run at that level. If there's another,
|
||||||
|
* lower-level interrupt, irq_exit will defer softirqs to
|
||||||
|
* that. If the interrupt pipeline is enabled, we are already
|
||||||
|
* running at IRQ14 priority, so we don't need this code.
|
||||||
|
*/
|
||||||
|
CSYNC();
|
||||||
|
pending = bfin_read_IPEND() & ~0x8000;
|
||||||
|
other_ints = pending & (pending - 1);
|
||||||
|
if (other_ints == 0)
|
||||||
|
lower_to_irq14();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void maybe_lower_to_irq14(void) { }
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do_IRQ handles all hardware IRQs. Decoded IRQs should not
|
* do_IRQ handles all hardware IRQs. Decoded IRQs should not
|
||||||
* come via this function. Instead, they should provide their
|
* come via this function. Instead, they should provide their
|
||||||
@ -114,9 +137,6 @@ __attribute__((l1_text))
|
|||||||
#endif
|
#endif
|
||||||
asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_IPIPE
|
|
||||||
unsigned short pending, other_ints;
|
|
||||||
#endif
|
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
@ -132,21 +152,8 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|||||||
else
|
else
|
||||||
generic_handle_irq(irq);
|
generic_handle_irq(irq);
|
||||||
|
|
||||||
#ifndef CONFIG_IPIPE
|
maybe_lower_to_irq14();
|
||||||
/*
|
|
||||||
* If we're the only interrupt running (ignoring IRQ15 which
|
|
||||||
* is for syscalls), lower our priority to IRQ14 so that
|
|
||||||
* softirqs run at that level. If there's another,
|
|
||||||
* lower-level interrupt, irq_exit will defer softirqs to
|
|
||||||
* that. If the interrupt pipeline is enabled, we are already
|
|
||||||
* running at IRQ14 priority, so we don't need this code.
|
|
||||||
*/
|
|
||||||
CSYNC();
|
|
||||||
pending = bfin_read_IPEND() & ~0x8000;
|
|
||||||
other_ints = pending & (pending - 1);
|
|
||||||
if (other_ints == 0)
|
|
||||||
lower_to_irq14();
|
|
||||||
#endif /* !CONFIG_IPIPE */
|
|
||||||
irq_exit();
|
irq_exit();
|
||||||
|
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user