diff --git a/debian/changelog b/debian/changelog index 9a5d28abe..ee6bcc6f2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -94,6 +94,9 @@ linux (3.12.7-1) UNRELEASED; urgency=low - timers: do not raise softirq unconditionally - rcutree/rcu_bh_qs: disable irq while calling rcu_preempt_qs() + [ Ian Campbell ] + * [armel/kirkwood] Fix interrupt handling on non-DT platforms (Closes: #735172) + -- Ben Hutchings Thu, 02 Jan 2014 01:26:59 +0000 linux (3.12.6-2) unstable; urgency=medium diff --git a/debian/patches/bugfix/arm/ARM-orion-provide-C-style-interrupt-handler-for-MULTI_IRQ_HANDLER.patch b/debian/patches/bugfix/arm/ARM-orion-provide-C-style-interrupt-handler-for-MULTI_IRQ_HANDLER.patch new file mode 100644 index 000000000..5ca0fa483 --- /dev/null +++ b/debian/patches/bugfix/arm/ARM-orion-provide-C-style-interrupt-handler-for-MULTI_IRQ_HANDLER.patch @@ -0,0 +1,119 @@ +From: Sebastian Hesselbarth +Subject: [PATCH] ARM: orion: provide C-style interrupt handler for + MULTI_IRQ_HANDLER +Date: Thu, 16 Jan 2014 09:10:31 +0100 +Message-Id: <1389859831-9883-1-git-send-email-sebastian.hesselbarth@gmail.com> + +DT-enabled Marvell Kirkwood and Dove SoCs make use of an irqchip +driver. As expected for irqchip drivers, it uses a C-style +interrupt handler and therefore selects MULTI_IRQ_HANDLER. + +Now, compiling a kernel with both non-DT and DT support enabled, +selecting MULTI_IRQ_HANDLER will break ASM irq handler used by +non-DT boards. + +Therefore, we provide a C-style irq handler even for non-DT boards, +if MULTI_IRQ_HANDLER is set. By installing the C-style irq handler +in orion_irq_init this is transparent to all non-DT board files. + +While the regression report was filed on Marvell Kirkwood, also +Marvell Dove non-DT boards are affected and fixed by this patch. + +Signed-off-by: Sebastian Hesselbarth +Tested-by: Ian Campbell +Reported-by: Ian Campbell +Fixes: 2326f04321a9 ("ARM: kirkwood: convert to DT irqchip and clocksource") +Fixes: f07d73e33d0e ("ARM: dove: convert to DT irqchip and clocksource") +--- +Compared to the two patch version sent on Ian's regression report, +I cooked this down to a single patch only touching plat-orion/irq.c. +I also dropped Orion5x and MV78x00, as they not yet select MULTI_IRQ_HANDLER +at all. Instead I added a comment about taking care of them, as soon as +they move over to an irqchip driver themselves. + +I have not yet Cc'ed this patch to -stable to get some discussion and +an Acked-by from Jason or Andrew, too. + +Cc: Jason Cooper +Cc: Andrew Lunn +Cc: Sebastian Hesselbarth +Cc: Russell King +Cc: Ian Campbell +Cc: linux-arm-kernel@lists.infradead.org +Cc: linux-kernel@vger.kernel.org +--- + arch/arm/plat-orion/irq.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 47 insertions(+) + +diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c +index c492e1b3dfdb..807df142444b 100644 +--- a/arch/arm/plat-orion/irq.c ++++ b/arch/arm/plat-orion/irq.c +@@ -15,8 +15,51 @@ + #include + #include + #include ++#include + #include + #include ++#include ++ ++#ifdef CONFIG_MULTI_IRQ_HANDLER ++/* ++ * Compiling with both non-DT and DT support enabled, will ++ * break asm irq handler used by non-DT boards. Therefore, ++ * we provide a C-style irq handler even for non-DT boards, ++ * if MULTI_IRQ_HANDLER is set. ++ * ++ * Notes: ++ * - this is prepared for Kirkwood and Dove only, update ++ * accordingly if you add Orion5x or MV78x00. ++ * - Orion5x uses different macro names and has only one ++ * set of CAUSE/MASK registers. ++ * - MV78x00 uses the same macro names but has a third ++ * set of CAUSE/MASK registers. ++ * ++ */ ++ ++static void __iomem *orion_irq_base = IRQ_VIRT_BASE; ++ ++asmlinkage void ++__exception_irq_entry orion_legacy_handle_irq(struct pt_regs *regs) ++{ ++ u32 stat; ++ ++ stat = readl_relaxed(orion_irq_base + IRQ_CAUSE_LOW_OFF); ++ stat &= readl_relaxed(orion_irq_base + IRQ_MASK_LOW_OFF); ++ if (stat) { ++ unsigned int hwirq = __fls(stat); ++ handle_IRQ(hwirq, regs); ++ return; ++ } ++ stat = readl_relaxed(orion_irq_base + IRQ_CAUSE_HIGH_OFF); ++ stat &= readl_relaxed(orion_irq_base + IRQ_MASK_HIGH_OFF); ++ if (stat) { ++ unsigned int hwirq = 32 + __fls(stat); ++ handle_IRQ(hwirq, regs); ++ return; ++ } ++} ++#endif + + void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) + { +@@ -35,6 +78,10 @@ void __init orion_irq_init(unsigned int irq_start, void __iomem *maskaddr) + ct->chip.irq_unmask = irq_gc_mask_set_bit; + irq_setup_generic_chip(gc, IRQ_MSK(32), IRQ_GC_INIT_MASK_CACHE, + IRQ_NOREQUEST, IRQ_LEVEL | IRQ_NOPROBE); ++ ++#ifdef CONFIG_MULTI_IRQ_HANDLER ++ set_handle_irq(orion_legacy_handle_irq); ++#endif + } + + #ifdef CONFIG_OF +-- +1.8.5.2 + + + diff --git a/debian/patches/series b/debian/patches/series index a509b5ca1..fa371cfec 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -80,6 +80,7 @@ bugfix/all/rds-prevent-bug_on-triggered-by-congestion-update-to-loopback.patch bugfix/all/disable-some-marvell-phys.patch features/all/media-az6007-support-Technisat-Cablestar-Combo-HDCI-.patch bugfix/all/alpha-Prevent-a-NULL-ptr-dereference-in-csum_partial.patch +bugfix/arm/ARM-orion-provide-C-style-interrupt-handler-for-MULTI_IRQ_HANDLER.patch # Temporary ABI hacks for 3.12-1 debian/remove-at_hwcap2-from-auxv.patch