mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 1ab161ea3c7f9bdb2c414044f32ff2eae9c88988 Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <phil@raspberrypi.org>
 | 
						|
Date: Thu, 14 Jun 2018 11:21:04 +0100
 | 
						|
Subject: [PATCH 132/432] irqchip: irq-bcm2835: Calc. FIQ_START at boot-time
 | 
						|
 | 
						|
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(-)
 | 
						|
 | 
						|
diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
 | 
						|
index ecb014728974..72abca2bac3a 100644
 | 
						|
--- 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 device_node *node,
 | 
						|
 				  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 device_node *node,
 | 
						|
 		}
 | 
						|
 	}
 | 
						|
 
 | 
						|
+	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 device_node *node,
 | 
						|
 		}
 | 
						|
 	}
 | 
						|
 #ifndef CONFIG_ARM64
 | 
						|
-	init_FIQ(FIQ_START);
 | 
						|
+	init_FIQ(irq - last_irq);
 | 
						|
 #endif
 | 
						|
 
 | 
						|
 	return 0;
 | 
						|
-- 
 | 
						|
2.19.1
 | 
						|
 |