summaryrefslogtreecommitdiffstats
path: root/arch/blackfin
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2009-06-15 12:22:08 +0200
committerMike Frysinger <vapier@gentoo.org>2009-06-23 03:15:46 +0200
commit81b79c213d0200fdd16951a9fb18748fd511d810 (patch)
tree892c7c5dd8485b31943b16b1c85095fdeb2b2940 /arch/blackfin
parentBlackfin: simplify irq stack overflow checking (diff)
downloadlinux-81b79c213d0200fdd16951a9fb18748fd511d810.tar.xz
linux-81b79c213d0200fdd16951a9fb18748fd511d810.zip
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>
Diffstat (limited to 'arch/blackfin')
-rw-r--r--arch/blackfin/kernel/irqchip.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c
index 7378440792a4..4b5fd36187d9 100644
--- a/arch/blackfin/kernel/irqchip.c
+++ b/arch/blackfin/kernel/irqchip.c
@@ -104,6 +104,29 @@ static void check_stack_overflow(int irq)
static inline void check_stack_overflow(int irq) { }
#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
* come via this function. Instead, they should provide their
@@ -114,9 +137,6 @@ __attribute__((l1_text))
#endif
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);
irq_enter();
@@ -132,21 +152,8 @@ asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
else
generic_handle_irq(irq);
-#ifndef CONFIG_IPIPE
- /*
- * 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 */
+ maybe_lower_to_irq14();
+
irq_exit();
set_irq_regs(old_regs);