2019-09-19 14:43:19 +00:00
|
|
|
From 3166f055a568c4fe127b70b81a878ab59070a6f5 Mon Sep 17 00:00:00 2001
|
2019-07-09 18:32:28 +00:00
|
|
|
From: Phil Elwell <phil@raspberrypi.org>
|
|
|
|
Date: Thu, 14 Jun 2018 11:21:04 +0100
|
2019-12-23 12:42:55 +00:00
|
|
|
Subject: [PATCH] irqchip: irq-bcm2835: Calc. FIQ_START at boot-time
|
2019-07-09 18:32:28 +00:00
|
|
|
|
|
|
|
ad83c7cb2f37 ("irqchip/irq-bcm2836: Add support for DT interrupt polarity")
|
|
|
|
changed the way that the BCM2836/7 local interrupts are mapped; instead
|
|
|
|
of being pre-mapped they are now mapped on-demand. A side effect of this
|
|
|
|
change is that the call to irq_of_parse_and_map from armctrl_of_init
|
|
|
|
creates a new mapping, forming a gap between the IRQs and the FIQs. This
|
|
|
|
gap breaks the FIQ<->IRQ mapping which up to now has been done by assuming:
|
|
|
|
|
|
|
|
1) that the value of FIQ_START is the same as the number of normal IRQs
|
|
|
|
that will be mapped (still true), and
|
|
|
|
|
|
|
|
2) that this value is also the offset between an IRQ and its equivalent
|
|
|
|
FIQ (which is no longer the case).
|
|
|
|
|
|
|
|
Remove both assumptions by measuring the interval between the last IRQ
|
|
|
|
and the last FIQ, passing it as the parameter to init_FIQ().
|
|
|
|
|
|
|
|
Fixes: https://github.com/raspberrypi/linux/issues/2432
|
|
|
|
|
|
|
|
Signed-off-by: Phil Elwell <phil@raspberrypi.org>
|
|
|
|
---
|
|
|
|
drivers/irqchip/irq-bcm2835.c | 8 ++++----
|
|
|
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/irqchip/irq-bcm2835.c
|
|
|
|
+++ b/drivers/irqchip/irq-bcm2835.c
|
|
|
|
@@ -82,8 +82,6 @@
|
|
|
|
#define NR_BANKS 3
|
|
|
|
#define IRQS_PER_BANK 32
|
|
|
|
#define NUMBER_IRQS MAKE_HWIRQ(NR_BANKS, 0)
|
|
|
|
-#undef FIQ_START
|
|
|
|
-#define FIQ_START (NR_IRQS_BANK0 + MAKE_HWIRQ(NR_BANKS - 1, 0))
|
|
|
|
|
|
|
|
static const int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
|
|
|
|
static const int reg_enable[] __initconst = { 0x18, 0x10, 0x14 };
|
|
|
|
@@ -211,7 +209,7 @@ static int __init armctrl_of_init(struct
|
|
|
|
bool is_2836)
|
|
|
|
{
|
|
|
|
void __iomem *base;
|
|
|
|
- int irq, b, i;
|
|
|
|
+ int irq = 0, last_irq, b, i;
|
|
|
|
|
|
|
|
base = of_iomap(node, 0);
|
|
|
|
if (!base)
|
|
|
|
@@ -237,6 +235,8 @@ static int __init armctrl_of_init(struct
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ last_irq = irq;
|
|
|
|
+
|
|
|
|
if (is_2836) {
|
|
|
|
int parent_irq = irq_of_parse_and_map(node, 0);
|
|
|
|
|
|
|
|
@@ -267,7 +267,7 @@ static int __init armctrl_of_init(struct
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#ifndef CONFIG_ARM64
|
|
|
|
- init_FIQ(FIQ_START);
|
|
|
|
+ init_FIQ(irq - last_irq);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return 0;
|