Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[PATCH] ARM: orion: provide C-style interrupt handler for MULTI_IRQ_HANDLER

7 views
Skip to first unread message

Sebastian Hesselbarth

unread,
Jan 16, 2014, 3:20:02 AM1/16/14
to
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 <sebastian....@gmail.com>
Tested-by: Ian Campbell <i...@hellion.org.uk>
Reported-by: Ian Campbell <i...@hellion.org.uk>
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 <ja...@lakedaemon.net>
Cc: Andrew Lunn <and...@lunn.ch>
Cc: Sebastian Hesselbarth <sebastian....@gmail.com>
Cc: Russell King <li...@arm.linux.org.uk>
Cc: Ian Campbell <i...@hellion.org.uk>
Cc: linux-ar...@lists.infradead.org
Cc: linux-...@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 <linux/io.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
+#include <asm/exception.h>
#include <plat/irq.h>
#include <plat/orion-gpio.h>
+#include <mach/bridge-regs.h>
+
+#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

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Andrew Lunn

unread,
Jan 16, 2014, 10:30:03 AM1/16/14
to
On Thu, Jan 16, 2014 at 09:10:31AM +0100, Sebastian Hesselbarth wrote:
> 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 <sebastian....@gmail.com>
> Tested-by: Ian Campbell <i...@hellion.org.uk>
> Reported-by: Ian Campbell <i...@hellion.org.uk>
> Fixes: 2326f04321a9 ("ARM: kirkwood: convert to DT irqchip and clocksource")
> Fixes: f07d73e33d0e ("ARM: dove: convert to DT irqchip and clocksource")

Hi Sebastian

Makes sense and this version is much better than the previous.

Acked-by: Andrew Lunn <and...@lunn.ch>

Andrew
> _______________________________________________
> linux-arm-kernel mailing list
> linux-ar...@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Jason Cooper

unread,
Jan 16, 2014, 11:50:02 AM1/16/14
to
Sebastian,

On Thu, Jan 16, 2014 at 09:10:31AM +0100, Sebastian Hesselbarth wrote:
Applied to mvebu/fixes with Andrew's Ack. It's too late for v3.13, so
it'll be the first thing sent for v3.14.

thx,

Jason.

Jason Cooper

unread,
Jan 16, 2014, 12:00:02 PM1/16/14
to
On Thu, Jan 16, 2014 at 04:51:27PM +0000, Ian Campbell wrote:
> Please can it also be tagged for stable backport to 3.12+3.13.

Yes, I forgot to mention it, but that is already done. ;-)

Ian Campbell

unread,
Jan 16, 2014, 12:20:02 PM1/16/14
to
On Thu, 2014-01-16 at 11:48 -0500, Jason Cooper wrote:
Please can it also be tagged for stable backport to 3.12+3.13.

Thanks,
Ian.

Sebastian Hesselbarth

unread,
Jan 16, 2014, 1:50:02 PM1/16/14
to
Ok, thanks!

Out of curiosity, does that adding the Cc tag to the commit queue
it automatically as soon as it will be pulled by Linus?

@Ian: Thanks for hunting this down, please keep bothering us with
bug reports :)

Sebastian

Jason Cooper

unread,
Jan 16, 2014, 2:00:02 PM1/16/14
to
On Thu, Jan 16, 2014 at 07:42:10PM +0100, Sebastian Hesselbarth wrote:
...
> Out of curiosity, does that adding the Cc tag to the commit queue
> it automatically as soon as it will be pulled by Linus?

Yes. The -stable team scans commits as they are added to Linus' tree.
If it has that tag, then they cherrypick it for the appropriate trees.
As do many vendors and distros.

There's no need to actually "email Cc" stable, they won't take it until
it's landed in mainline. iirc, this generates a form letter from Greg
:)

> @Ian: Thanks for hunting this down, please keep bothering us with
> bug reports :)

Yes, please!

thx,

Jason.

Ian Campbell

unread,
Jan 20, 2014, 5:00:02 PM1/20/14
to
On Thu, 2014-01-16 at 13:49 -0500, Jason Cooper wrote:
> > @Ian: Thanks for hunting this down, please keep bothering us with
> > bug reports :)
>
> Yes, please!

No worries there -- it seem Debian has quite a few people who use
kirkwood based systems and will report bugs when they find them...

Thanks (again?) for the quick fix.

Ian.
0 new messages