All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5
@ 2012-06-15  9:09 Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 1/7] ARM: at91: aic add dt support for external irqs Ludovic Desroches
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:09 UTC (permalink / raw)
  To: linux-arm-kernel

This set of patches introduces AIC5 support with the goal to have only one
kernel image for all SOCs. That's why sparse irq support was added.
AIC5 can manage up to 128 irq lines. It introduces a new register map and
a source select register to select the IRQ line we want to configure.

v2 changes:
- add Jean-Christophe patches since my patches are based on abd there have
not been submitted yet
- I missed some machine descriptors in the first version, it
is corrected with this new one.
- correct sparse irq support and remove mach/irqs.h.
- correct issue on AIC5 support (missing allocation).

Jean-Christophe PLAGNIOL-VILLARD (2):
  ARM: at91: aic add dt support for external irqs
  ARM: at91: add of default irq priorities support

Ludovic Desroches (5):
  ARM: at91: at91 based machines specify their own irq handler at run
    time
  ARM: at91: fix irq_alloc_descs parameters for sparse irq
  ARM: at91: sparse irq support
  ARM: at91: remove mach/irqs.h
  ARM: at91: add AIC5 support

 .../devicetree/bindings/arm/atmel-aic.txt          |    3 +
 arch/arm/boot/dts/at91sam9260.dtsi                 |   35 ++
 arch/arm/boot/dts/at91sam9263.dtsi                 |   35 ++
 arch/arm/boot/dts/at91sam9g45.dtsi                 |   35 ++
 arch/arm/boot/dts/at91sam9x5.dtsi                  |   35 ++
 arch/arm/mach-at91/Kconfig                         |    2 +
 arch/arm/mach-at91/at91rm9200.c                    |    1 +
 arch/arm/mach-at91/at91sam9260.c                   |    1 +
 arch/arm/mach-at91/at91sam9261.c                   |    1 +
 arch/arm/mach-at91/at91sam9263.c                   |    1 +
 arch/arm/mach-at91/at91sam9g45.c                   |    1 +
 arch/arm/mach-at91/at91sam9rl.c                    |    1 +
 arch/arm/mach-at91/at91sam9x5.c                    |   44 ---
 arch/arm/mach-at91/at91x40.c                       |    1 +
 arch/arm/mach-at91/board-1arm.c                    |    3 +
 arch/arm/mach-at91/board-afeb-9260v1.c             |    3 +
 arch/arm/mach-at91/board-cam60.c                   |    3 +
 arch/arm/mach-at91/board-carmeva.c                 |    3 +
 arch/arm/mach-at91/board-cpu9krea.c                |    3 +
 arch/arm/mach-at91/board-cpuat91.c                 |    3 +
 arch/arm/mach-at91/board-csb337.c                  |    3 +
 arch/arm/mach-at91/board-csb637.c                  |    3 +
 arch/arm/mach-at91/board-dt.c                      |    2 +
 arch/arm/mach-at91/board-eb01.c                    |    3 +
 arch/arm/mach-at91/board-eb9200.c                  |    3 +
 arch/arm/mach-at91/board-ecbat91.c                 |    3 +
 arch/arm/mach-at91/board-eco920.c                  |    3 +
 arch/arm/mach-at91/board-flexibity.c               |    3 +
 arch/arm/mach-at91/board-foxg20.c                  |    3 +
 arch/arm/mach-at91/board-gsia18s.c                 |    3 +
 arch/arm/mach-at91/board-kafa.c                    |    3 +
 arch/arm/mach-at91/board-kb9202.c                  |    3 +
 arch/arm/mach-at91/board-neocore926.c              |    3 +
 arch/arm/mach-at91/board-pcontrol-g20.c            |    3 +
 arch/arm/mach-at91/board-picotux200.c              |    3 +
 arch/arm/mach-at91/board-qil-a9260.c               |    3 +
 arch/arm/mach-at91/board-rm9200dk.c                |    3 +
 arch/arm/mach-at91/board-rm9200ek.c                |    3 +
 arch/arm/mach-at91/board-rsi-ews.c                 |    3 +
 arch/arm/mach-at91/board-sam9-l9260.c              |    3 +
 arch/arm/mach-at91/board-sam9260ek.c               |    3 +
 arch/arm/mach-at91/board-sam9261ek.c               |    3 +
 arch/arm/mach-at91/board-sam9263ek.c               |    3 +
 arch/arm/mach-at91/board-sam9g20ek.c               |    5 +
 arch/arm/mach-at91/board-sam9m10g45ek.c            |    3 +
 arch/arm/mach-at91/board-sam9rlek.c                |    3 +
 arch/arm/mach-at91/board-snapper9260.c             |    3 +
 arch/arm/mach-at91/board-stamp9g20.c               |    5 +
 arch/arm/mach-at91/board-usb-a926x.c               |    7 +
 arch/arm/mach-at91/board-yl-9200.c                 |    3 +
 arch/arm/mach-at91/generic.h                       |    2 +
 arch/arm/mach-at91/gpio.c                          |    1 +
 arch/arm/mach-at91/include/mach/at91_aic.h         |   30 ++
 arch/arm/mach-at91/include/mach/entry-macro.S      |   27 --
 arch/arm/mach-at91/include/mach/irqs.h             |   41 --
 arch/arm/mach-at91/irq.c                           |  404 +++++++++++++++++---
 arch/arm/mach-at91/pm.c                            |    1 +
 57 files changed, 655 insertions(+), 162 deletions(-)
 delete mode 100644 arch/arm/mach-at91/include/mach/entry-macro.S
 delete mode 100644 arch/arm/mach-at91/include/mach/irqs.h

-- 
1.7.5.4

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 1/7] ARM: at91: aic add dt support for external irqs
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
@ 2012-06-15  9:09 ` Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 2/7] ARM: at91: add of default irq priorities support Ludovic Desroches
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:09 UTC (permalink / raw)
  To: linux-arm-kernel

From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 .../devicetree/bindings/arm/atmel-aic.txt          |    1 +
 arch/arm/boot/dts/at91sam9260.dtsi                 |    1 +
 arch/arm/boot/dts/at91sam9263.dtsi                 |    1 +
 arch/arm/boot/dts/at91sam9g45.dtsi                 |    1 +
 arch/arm/boot/dts/at91sam9x5.dtsi                  |    1 +
 arch/arm/mach-at91/at91sam9x5.c                    |    2 --
 arch/arm/mach-at91/irq.c                           |   12 ++++++++++++
 7 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt b/Documentation/devicetree/bindings/arm/atmel-aic.txt
index aabca4f..1953b0c 100644
--- a/Documentation/devicetree/bindings/arm/atmel-aic.txt
+++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt
@@ -15,6 +15,7 @@ Required properties:
       Valid combinations are 1, 2, 3, 4, 8.
       Default flag for internal sources should be set to 4 (active high).
 - reg: Should contain AIC registers location and length
+- atmel,external-irqs: u32 array of external irqs.
 
 Examples:
 	/*
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
index f449efc..f2c9643 100644
--- a/arch/arm/boot/dts/at91sam9260.dtsi
+++ b/arch/arm/boot/dts/at91sam9260.dtsi
@@ -56,6 +56,7 @@
 				compatible = "atmel,at91rm9200-aic";
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
+				atmel,external-irqs = <29 30 31>;
 			};
 
 			ramc0: ramc at ffffea00 {
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi
index 0209913..c803636 100644
--- a/arch/arm/boot/dts/at91sam9263.dtsi
+++ b/arch/arm/boot/dts/at91sam9263.dtsi
@@ -52,6 +52,7 @@
 				compatible = "atmel,at91rm9200-aic";
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
+				atmel,external-irqs = <30 31>;
 			};
 
 			pmc: pmc at fffffc00 {
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
index 7dbccaf..2d01ce2 100644
--- a/arch/arm/boot/dts/at91sam9g45.dtsi
+++ b/arch/arm/boot/dts/at91sam9g45.dtsi
@@ -57,6 +57,7 @@
 				compatible = "atmel,at91rm9200-aic";
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
+				atmel,external-irqs = <31>;
 			};
 
 			ramc0: ramc at ffffe400 {
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 6b3ef43..6a0a0fb 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -55,6 +55,7 @@
 				compatible = "atmel,at91rm9200-aic";
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
+				atmel,external-irqs = <31>;
 			};
 
 			ramc0: ramc at ffffe800 {
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
index 1b144b4..537710b 100644
--- a/arch/arm/mach-at91/at91sam9x5.c
+++ b/arch/arm/mach-at91/at91sam9x5.c
@@ -312,8 +312,6 @@ static void __init at91sam9x5_map_io(void)
 
 void __init at91sam9x5_initialize(void)
 {
-	at91_extern_irq = (1 << AT91SAM9X5_ID_IRQ0);
-
 	/* Register GPIO subsystem (using DT) */
 	at91_gpio_init(NULL, 0);
 }
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index 2d5d4c8..df8605f 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -194,6 +194,10 @@ static struct irq_domain_ops at91_aic_irq_ops = {
 int __init at91_aic_of_init(struct device_node *node,
 				     struct device_node *parent)
 {
+	struct property *prop;
+	const __be32 *p;
+	u32 val;
+
 	at91_aic_base = of_iomap(node, 0);
 	at91_aic_np = node;
 
@@ -202,6 +206,14 @@ int __init at91_aic_of_init(struct device_node *node,
 	if (!at91_aic_domain)
 		panic("Unable to add AIC irq domain (DT)\n");
 
+	at91_extern_irq = 0;
+	of_property_for_each_u32(node, "atmel,external-irqs", prop, p, val) {
+		if (val > 31)
+			pr_warn("AIC: external irq %d > 31 skip it\n", val);
+		else
+			at91_extern_irq |= (1 << val);
+	}
+
 	irq_set_default_host(at91_aic_domain);
 
 	at91_aic_hw_init(NR_AIC_IRQS);
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 2/7] ARM: at91: add of default irq priorities support
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 1/7] ARM: at91: aic add dt support for external irqs Ludovic Desroches
@ 2012-06-15  9:09 ` Ludovic Desroches
  2012-06-18  2:24   ` Rob Herring
  2012-06-15  9:09 ` [PATCH v2 3/7] ARM: at91: at91 based machines specify their own irq handler at run time Ludovic Desroches
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:09 UTC (permalink / raw)
  To: linux-arm-kernel

From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>

You will have to set the default priority for all the irq.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---
 .../devicetree/bindings/arm/atmel-aic.txt          |    2 +
 arch/arm/boot/dts/at91sam9260.dtsi                 |   34 ++++++++++++++++
 arch/arm/boot/dts/at91sam9263.dtsi                 |   34 ++++++++++++++++
 arch/arm/boot/dts/at91sam9g45.dtsi                 |   34 ++++++++++++++++
 arch/arm/boot/dts/at91sam9x5.dtsi                  |   34 ++++++++++++++++
 arch/arm/mach-at91/at91sam9x5.c                    |   42 --------------------
 arch/arm/mach-at91/irq.c                           |   21 ++++++++++
 7 files changed, 159 insertions(+), 42 deletions(-)

diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt b/Documentation/devicetree/bindings/arm/atmel-aic.txt
index 1953b0c..66aa53d 100644
--- a/Documentation/devicetree/bindings/arm/atmel-aic.txt
+++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt
@@ -16,6 +16,8 @@ Required properties:
       Default flag for internal sources should be set to 4 (active high).
 - reg: Should contain AIC registers location and length
 - atmel,external-irqs: u32 array of external irqs.
+- atmel,default-irq-priorities: u32 array of default irq priorities. This need
+  to contain all the irq.
 
 Examples:
 	/*
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
index f2c9643..791ef87 100644
--- a/arch/arm/boot/dts/at91sam9260.dtsi
+++ b/arch/arm/boot/dts/at91sam9260.dtsi
@@ -57,6 +57,40 @@
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
 				atmel,external-irqs = <29 30 31>;
+				atmel,default-irq-priorities = <
+					7	/* Advanced Interrupt Controller */
+					7	/* System Peripherals */
+					1	/* Parallel IO Controller A */
+					1	/* Parallel IO Controller B */
+					1	/* Parallel IO Controller C */
+					0	/* Analog-to-Digital Converter */
+					5	/* USART 0 */
+					5	/* USART 1 */
+					5	/* USART 2 */
+					0	/* Multimedia Card Interface */
+					2	/* USB Device Port */
+					6	/* Two-Wire Interface */
+					5	/* Serial Peripheral Interface 0 */
+					5	/* Serial Peripheral Interface 1 */
+					5	/* Serial Synchronous Controller */
+					0
+					0
+					0	/* Timer Counter 0 */
+					0	/* Timer Counter 1 */
+					0	/* Timer Counter 2 */
+					2	/* USB Host port */
+					3	/* Ethernet */
+					0	/* Image Sensor Interface */
+					5	/* USART 3 */
+					5	/* USART 4 */
+					5	/* USART 5 */
+					0	/* Timer Counter 3 */
+					0	/* Timer Counter 4 */
+					0	/* Timer Counter 5 */
+					0	/* Advanced Interrupt Controller */
+					0	/* Advanced Interrupt Controller */
+					0	/* Advanced Interrupt Controller */
+				>;
 			};
 
 			ramc0: ramc at ffffea00 {
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi
index c803636..8a5923a 100644
--- a/arch/arm/boot/dts/at91sam9263.dtsi
+++ b/arch/arm/boot/dts/at91sam9263.dtsi
@@ -53,6 +53,40 @@
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
 				atmel,external-irqs = <30 31>;
+				atmel,default-irq-priorities = <
+					7	/* Advanced Interrupt Controller (FIQ) */
+					7	/* System Peripherals */
+					1	/* Parallel IO Controller A */
+					1	/* Parallel IO Controller B */
+					1	/* Parallel IO Controller C, D and E */
+					0
+					0
+					5	/* USART 0 */
+					5	/* USART 1 */
+					5	/* USART 2 */
+					0	/* Multimedia Card Interface 0 */
+					0	/* Multimedia Card Interface 1 */
+					3	/* CAN */
+					6	/* Two-Wire Interface */
+					5	/* Serial Peripheral Interface 0 */
+					5	/* Serial Peripheral Interface 1 */
+					4	/* Serial Synchronous Controller 0 */
+					4	/* Serial Synchronous Controller 1 */
+					5	/* AC97 Controller */
+					0	/* Timer Counter 0, 1 and 2 */
+					0	/* Pulse Width Modulation Controller */
+					3	/* Ethernet */
+					0
+					0	/* 2D Graphic Engine */
+					2	/* USB Device Port */
+					0	/* Image Sensor Interface */
+					3	/* LDC Controller */
+					0	/* DMA Controller */
+					0
+					2	/* USB Host port */
+					0	/* Advanced Interrupt Controller (IRQ0) */
+					0	/* Advanced Interrupt Controller (IRQ1) */
+				>;
 			};
 
 			pmc: pmc at fffffc00 {
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
index 2d01ce2..d70e4f0 100644
--- a/arch/arm/boot/dts/at91sam9g45.dtsi
+++ b/arch/arm/boot/dts/at91sam9g45.dtsi
@@ -58,6 +58,40 @@
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
 				atmel,external-irqs = <31>;
+				atmel,default-irq-priorities = <
+					7	/* Advanced Interrupt Controller (FIQ) */
+					7	/* System Peripherals */
+					1	/* Parallel IO Controller A */
+					1	/* Parallel IO Controller B */
+					1	/* Parallel IO Controller C */
+					1	/* Parallel IO Controller D and E */
+					0
+					5	/* USART 0 */
+					5	/* USART 1 */
+					5	/* USART 2 */
+					5	/* USART 3 */
+					0	/* Multimedia Card Interface 0 */
+					6	/* Two-Wire Interface 0 */
+					6	/* Two-Wire Interface 1 */
+					5	/* Serial Peripheral Interface 0 */
+					5	/* Serial Peripheral Interface 1 */
+					4	/* Serial Synchronous Controller 0 */
+					4	/* Serial Synchronous Controller 1 */
+					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
+					0	/* Pulse Width Modulation Controller */
+					0	/* Touch Screen Controller */
+					0	/* DMA Controller */
+					2	/* USB Host High Speed port */
+					3	/* LDC Controller */
+					5	/* AC97 Controller */
+					3	/* Ethernet */
+					0	/* Image Sensor Interface */
+					2	/* USB Device High speed port */
+					0
+					0	/* Multimedia Card Interface 1 */
+					0
+					0	/* Advanced Interrupt Controller (IRQ0) */
+				>;
 			};
 
 			ramc0: ramc at ffffe400 {
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 6a0a0fb..fcd9d43 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -56,6 +56,40 @@
 				interrupt-controller;
 				reg = <0xfffff000 0x200>;
 				atmel,external-irqs = <31>;
+				atmel,default-irq-priorities = <
+					7	/* Advanced Interrupt Controller (FIQ) */
+					7	/* System Peripherals */
+					1	/* Parallel IO Controller A and B */
+					1	/* Parallel IO Controller C and D */
+					4	/* Soft Modem */
+					5	/* USART 0 */
+					5	/* USART 1 */
+					5	/* USART 2 */
+					5	/* USART 3 */
+					6	/* Two-Wire Interface 0 */
+					6	/* Two-Wire Interface 1 */
+					6	/* Two-Wire Interface 2 */
+					0	/* Multimedia Card Interface 0 */
+					5	/* Serial Peripheral Interface 0 */
+					5	/* Serial Peripheral Interface 1 */
+					5	/* UART 0 */
+					5	/* UART 1 */
+					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
+					0	/* Pulse Width Modulation Controller */
+					0	/* ADC Controller */
+					0	/* DMA Controller 0 */
+					0	/* DMA Controller 1 */
+					2	/* USB Host High Speed port */
+					2	/* USB Device High speed port */
+					3	/* Ethernet MAC 0 */
+					3	/* LDC Controller or Image Sensor Interface */
+					0	/* Multimedia Card Interface 1 */
+					3	/* Ethernet MAC 1 */
+					4	/* Synchronous Serial Interface */
+					4	/* CAN Controller 0 */
+					4	/* CAN Controller 1 */
+					0	/* Advanced Interrupt Controller (IRQ0) */
+				>;
 			};
 
 			ramc0: ramc at ffffe800 {
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
index 537710b..1e7ef56 100644
--- a/arch/arm/mach-at91/at91sam9x5.c
+++ b/arch/arm/mach-at91/at91sam9x5.c
@@ -316,50 +316,8 @@ void __init at91sam9x5_initialize(void)
 	at91_gpio_init(NULL, 0);
 }
 
-/* --------------------------------------------------------------------
- *  Interrupt initialization
- * -------------------------------------------------------------------- */
-/*
- * The default interrupt priority levels (0 = lowest, 7 = highest).
- */
-static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = {
-	7,	/* Advanced Interrupt Controller (FIQ) */
-	7,	/* System Peripherals */
-	1,	/* Parallel IO Controller A and B */
-	1,	/* Parallel IO Controller C and D */
-	4,	/* Soft Modem */
-	5,	/* USART 0 */
-	5,	/* USART 1 */
-	5,	/* USART 2 */
-	5,	/* USART 3 */
-	6,	/* Two-Wire Interface 0 */
-	6,	/* Two-Wire Interface 1 */
-	6,	/* Two-Wire Interface 2 */
-	0,	/* Multimedia Card Interface 0 */
-	5,	/* Serial Peripheral Interface 0 */
-	5,	/* Serial Peripheral Interface 1 */
-	5,	/* UART 0 */
-	5,	/* UART 1 */
-	0,	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
-	0,	/* Pulse Width Modulation Controller */
-	0,	/* ADC Controller */
-	0,	/* DMA Controller 0 */
-	0,	/* DMA Controller 1 */
-	2,	/* USB Host High Speed port */
-	2,	/* USB Device High speed port */
-	3,	/* Ethernet MAC 0 */
-	3,	/* LDC Controller or Image Sensor Interface */
-	0,	/* Multimedia Card Interface 1 */
-	3,	/* Ethernet MAC 1 */
-	4,	/* Synchronous Serial Interface */
-	4,	/* CAN Controller 0 */
-	4,	/* CAN Controller 1 */
-	0,	/* Advanced Interrupt Controller (IRQ0) */
-};
-
 struct at91_init_soc __initdata at91sam9x5_soc = {
 	.map_io = at91sam9x5_map_io,
-	.default_irq_priority = at91sam9x5_default_irq_priority,
 	.register_clocks = at91sam9x5_register_clocks,
 	.init = at91sam9x5_initialize,
 };
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index df8605f..8e6ac53 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -191,6 +191,25 @@ static struct irq_domain_ops at91_aic_irq_ops = {
 	.xlate	= irq_domain_xlate_twocell,
 };
 
+static void __init at91_aic_of_priority(struct device_node *node)
+{
+	struct property *prop;
+	const __be32 *p;
+	u32 val;
+	int i = 0;
+
+	of_property_for_each_u32(node, "atmel,default-irq-priorities", prop, p, val) {
+		/* Put hardware irq number in Source Vector Register: */
+		at91_aic_write(AT91_AIC_SVR(i), i);
+		/* Active Low interrupt, with the specified priority */
+		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | val);
+		i++;
+	}
+
+	if (i < 1)
+		pr_warn("AIC: no valid default irqs priorities\n");
+}
+
 int __init at91_aic_of_init(struct device_node *node,
 				     struct device_node *parent)
 {
@@ -214,6 +233,8 @@ int __init at91_aic_of_init(struct device_node *node,
 			at91_extern_irq |= (1 << val);
 	}
 
+	at91_aic_of_priority(node);
+
 	irq_set_default_host(at91_aic_domain);
 
 	at91_aic_hw_init(NR_AIC_IRQS);
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 3/7] ARM: at91: at91 based machines specify their own irq handler at run time
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 1/7] ARM: at91: aic add dt support for external irqs Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 2/7] ARM: at91: add of default irq priorities support Ludovic Desroches
@ 2012-06-15  9:09 ` Ludovic Desroches
  2012-06-15  9:09 ` [PATCH v2 4/7] ARM: at91: fix irq_alloc_descs parameters for sparse irq Ludovic Desroches
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:09 UTC (permalink / raw)
  To: linux-arm-kernel

SOC_AT91SAM9 selects MULTI_IRQ_HANDLER in order to let machines specify their
own IRQ handler at run time.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/Kconfig                    |    1 +
 arch/arm/mach-at91/board-1arm.c               |    2 +
 arch/arm/mach-at91/board-afeb-9260v1.c        |    2 +
 arch/arm/mach-at91/board-cam60.c              |    2 +
 arch/arm/mach-at91/board-carmeva.c            |    2 +
 arch/arm/mach-at91/board-cpu9krea.c           |    2 +
 arch/arm/mach-at91/board-cpuat91.c            |    2 +
 arch/arm/mach-at91/board-csb337.c             |    2 +
 arch/arm/mach-at91/board-csb637.c             |    2 +
 arch/arm/mach-at91/board-dt.c                 |    2 +
 arch/arm/mach-at91/board-eb01.c               |    2 +
 arch/arm/mach-at91/board-eb9200.c             |    2 +
 arch/arm/mach-at91/board-ecbat91.c            |    2 +
 arch/arm/mach-at91/board-eco920.c             |    2 +
 arch/arm/mach-at91/board-flexibity.c          |    2 +
 arch/arm/mach-at91/board-foxg20.c             |    2 +
 arch/arm/mach-at91/board-gsia18s.c            |    2 +
 arch/arm/mach-at91/board-kafa.c               |    2 +
 arch/arm/mach-at91/board-kb9202.c             |    2 +
 arch/arm/mach-at91/board-neocore926.c         |    2 +
 arch/arm/mach-at91/board-pcontrol-g20.c       |    2 +
 arch/arm/mach-at91/board-picotux200.c         |    2 +
 arch/arm/mach-at91/board-qil-a9260.c          |    2 +
 arch/arm/mach-at91/board-rm9200dk.c           |    2 +
 arch/arm/mach-at91/board-rm9200ek.c           |    2 +
 arch/arm/mach-at91/board-rsi-ews.c            |    2 +
 arch/arm/mach-at91/board-sam9-l9260.c         |    2 +
 arch/arm/mach-at91/board-sam9260ek.c          |    2 +
 arch/arm/mach-at91/board-sam9261ek.c          |    2 +
 arch/arm/mach-at91/board-sam9263ek.c          |    2 +
 arch/arm/mach-at91/board-sam9g20ek.c          |    3 ++
 arch/arm/mach-at91/board-sam9m10g45ek.c       |    2 +
 arch/arm/mach-at91/board-sam9rlek.c           |    2 +
 arch/arm/mach-at91/board-snapper9260.c        |    2 +
 arch/arm/mach-at91/board-stamp9g20.c          |    3 ++
 arch/arm/mach-at91/board-usb-a926x.c          |    4 +++
 arch/arm/mach-at91/board-yl-9200.c            |    2 +
 arch/arm/mach-at91/include/mach/at91_aic.h    |    2 +
 arch/arm/mach-at91/include/mach/entry-macro.S |   27 -------------------------
 arch/arm/mach-at91/irq.c                      |   19 +++++++++++++++++
 40 files changed, 98 insertions(+), 27 deletions(-)
 delete mode 100644 arch/arm/mach-at91/include/mach/entry-macro.S

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 19505c0..e401dea 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -29,6 +29,7 @@ comment "Atmel AT91 Processor"
 config SOC_AT91SAM9
 	bool
 	select CPU_ARM926T
+	select MULTI_IRQ_HANDLER
 	select AT91_SAM9_TIME
 	select AT91_SAM9_SMC
 
diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c
index 271f994..22d8856 100644
--- a/arch/arm/mach-at91/board-1arm.c
+++ b/arch/arm/mach-at91/board-1arm.c
@@ -36,6 +36,7 @@
 
 #include <mach/board.h>
 #include <mach/cpu.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -91,6 +92,7 @@ MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")
 	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= onearm_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= onearm_board_init,
diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c
index b7d8aa7..de7be19 100644
--- a/arch/arm/mach-at91/board-afeb-9260v1.c
+++ b/arch/arm/mach-at91/board-afeb-9260v1.c
@@ -44,6 +44,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -212,6 +213,7 @@ MACHINE_START(AFEB9260, "Custom afeb9260 board")
 	/* Maintainer: Sergey Lapin <slapin@ossfans.org> */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= afeb9260_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= afeb9260_board_init,
diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c
index 29d3ef0..477e708 100644
--- a/arch/arm/mach-at91/board-cam60.c
+++ b/arch/arm/mach-at91/board-cam60.c
@@ -39,6 +39,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -188,6 +189,7 @@ MACHINE_START(CAM60, "KwikByte CAM60")
 	/* Maintainer: KwikByte */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cam60_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= cam60_board_init,
diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c
index 44328a6..a5b002f 100644
--- a/arch/arm/mach-at91/board-carmeva.c
+++ b/arch/arm/mach-at91/board-carmeva.c
@@ -36,6 +36,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -158,6 +159,7 @@ MACHINE_START(CARMEVA, "Carmeva")
 	/* Maintainer: Conitec Datasystems */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= carmeva_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= carmeva_board_init,
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c
index 69951ec..ecbc13b 100644
--- a/arch/arm/mach-at91/board-cpu9krea.c
+++ b/arch/arm/mach-at91/board-cpu9krea.c
@@ -41,6 +41,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91sam9260_matrix.h>
 #include <mach/at91_matrix.h>
@@ -376,6 +377,7 @@ MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")
 	/* Maintainer: Eric Benard - EUKREA Electromatique */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cpu9krea_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= cpu9krea_board_init,
diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c
index 895cf2d..2e6d043 100644
--- a/arch/arm/mach-at91/board-cpuat91.c
+++ b/arch/arm/mach-at91/board-cpuat91.c
@@ -37,6 +37,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 #include <mach/cpu.h>
@@ -178,6 +179,7 @@ MACHINE_START(CPUAT91, "Eukrea")
 	/* Maintainer: Eric Benard - EUKREA Electromatique */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cpuat91_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= cpuat91_board_init,
diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c
index cd81336..462bc31 100644
--- a/arch/arm/mach-at91/board-csb337.c
+++ b/arch/arm/mach-at91/board-csb337.c
@@ -39,6 +39,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -252,6 +253,7 @@ MACHINE_START(CSB337, "Cogent CSB337")
 	/* Maintainer: Bill Gatliff */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= csb337_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= csb337_board_init,
diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c
index 7c8b05a..872871a 100644
--- a/arch/arm/mach-at91/board-csb637.c
+++ b/arch/arm/mach-at91/board-csb637.c
@@ -36,6 +36,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -133,6 +134,7 @@ MACHINE_START(CSB637, "Cogent CSB637")
 	/* Maintainer: Bill Gatliff */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= csb637_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= csb637_board_init,
diff --git a/arch/arm/mach-at91/board-dt.c b/arch/arm/mach-at91/board-dt.c
index a1fce05..e8f45c4 100644
--- a/arch/arm/mach-at91/board-dt.c
+++ b/arch/arm/mach-at91/board-dt.c
@@ -16,6 +16,7 @@
 #include <linux/of_platform.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include <asm/setup.h>
 #include <asm/irq.h>
@@ -53,6 +54,7 @@ DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM (Device Tree)")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= at91_dt_initialize,
 	.init_irq	= at91_dt_init_irq,
 	.init_machine	= at91_dt_device_init,
diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c
index d2023f2..01f66e9 100644
--- a/arch/arm/mach-at91/board-eb01.c
+++ b/arch/arm/mach-at91/board-eb01.c
@@ -28,6 +28,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include "generic.h"
 
 static void __init at91eb01_init_irq(void)
@@ -43,6 +44,7 @@ static void __init at91eb01_init_early(void)
 MACHINE_START(AT91EB01, "Atmel AT91 EB01")
 	/* Maintainer: Greg Ungerer <gerg@snapgear.com> */
 	.timer		= &at91x40_timer,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= at91eb01_init_early,
 	.init_irq	= at91eb01_init_irq,
 MACHINE_END
diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c
index bd10172..d1e1f3f 100644
--- a/arch/arm/mach-at91/board-eb9200.c
+++ b/arch/arm/mach-at91/board-eb9200.c
@@ -36,6 +36,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -118,6 +119,7 @@ static void __init eb9200_board_init(void)
 MACHINE_START(ATEB9200, "Embest ATEB9200")
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= eb9200_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= eb9200_board_init,
diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c
index 89cc372..9c24cb2 100644
--- a/arch/arm/mach-at91/board-ecbat91.c
+++ b/arch/arm/mach-at91/board-ecbat91.c
@@ -39,6 +39,7 @@
 
 #include <mach/board.h>
 #include <mach/cpu.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -170,6 +171,7 @@ MACHINE_START(ECBAT91, "emQbit's ECB_AT91")
 	/* Maintainer: emQbit.com */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ecb_at91init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ecb_at91board_init,
diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c
index 558546c..82bdfde 100644
--- a/arch/arm/mach-at91/board-eco920.c
+++ b/arch/arm/mach-at91/board-eco920.c
@@ -25,6 +25,7 @@
 #include <asm/mach/map.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 #include <mach/cpu.h>
@@ -132,6 +133,7 @@ MACHINE_START(ECO920, "eco920")
 	/* Maintainer: Sascha Hauer */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= eco920_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= eco920_board_init,
diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c
index 47658f7..6cc83a8 100644
--- a/arch/arm/mach-at91/board-flexibity.c
+++ b/arch/arm/mach-at91/board-flexibity.c
@@ -34,6 +34,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include "generic.h"
 
@@ -160,6 +161,7 @@ MACHINE_START(FLEXIBITY, "Flexibity Connect")
 	/* Maintainer: Maxim Osipov */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= flexibity_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= flexibity_board_init,
diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c
index 33411e6..69ab124 100644
--- a/arch/arm/mach-at91/board-foxg20.c
+++ b/arch/arm/mach-at91/board-foxg20.c
@@ -42,6 +42,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -262,6 +263,7 @@ MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20")
 	/* Maintainer: Sergio Tanzilli */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= foxg20_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= foxg20_board_init,
diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c
index 3e0dfa6..a9d5e78 100644
--- a/arch/arm/mach-at91/board-gsia18s.c
+++ b/arch/arm/mach-at91/board-gsia18s.c
@@ -31,6 +31,7 @@
 #include <asm/mach/arch.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/gsia18s.h>
 #include <mach/stamp9g20.h>
@@ -575,6 +576,7 @@ static void __init gsia18s_board_init(void)
 MACHINE_START(GSIA18S, "GS_IA18_S")
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= gsia18s_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= gsia18s_board_init,
diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c
index f260657..64c1dbf 100644
--- a/arch/arm/mach-at91/board-kafa.c
+++ b/arch/arm/mach-at91/board-kafa.c
@@ -35,6 +35,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/cpu.h>
 
 #include "generic.h"
@@ -93,6 +94,7 @@ MACHINE_START(KAFA, "Sperry-Sun KAFA")
 	/* Maintainer: Sergei Sharonov */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= kafa_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= kafa_board_init,
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c
index ba39db5..5d96cb8 100644
--- a/arch/arm/mach-at91/board-kb9202.c
+++ b/arch/arm/mach-at91/board-kb9202.c
@@ -37,6 +37,7 @@
 
 #include <mach/board.h>
 #include <mach/cpu.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 
@@ -133,6 +134,7 @@ MACHINE_START(KB9200, "KB920x")
 	/* Maintainer: KwikByte, Inc. */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= kb9202_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= kb9202_board_init,
diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c
index d2f4cc1..18103c5d 100644
--- a/arch/arm/mach-at91/board-neocore926.c
+++ b/arch/arm/mach-at91/board-neocore926.c
@@ -45,6 +45,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -378,6 +379,7 @@ MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926")
 	/* Maintainer: ADENEO */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= neocore926_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= neocore926_board_init,
diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c
index 7fe6383..9ca3e32 100644
--- a/arch/arm/mach-at91/board-pcontrol-g20.c
+++ b/arch/arm/mach-at91/board-pcontrol-g20.c
@@ -30,6 +30,7 @@
 #include <asm/mach/arch.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/stamp9g20.h>
 
@@ -218,6 +219,7 @@ MACHINE_START(PCONTROL_G20, "PControl G20")
 	/* Maintainer: pgsellmann at portner-elektronik.at */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= pcontrol_g20_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= pcontrol_g20_board_init,
diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c
index b45c0a5..1270655 100644
--- a/arch/arm/mach-at91/board-picotux200.c
+++ b/arch/arm/mach-at91/board-picotux200.c
@@ -38,6 +38,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 
@@ -120,6 +121,7 @@ MACHINE_START(PICOTUX2XX, "picotux 200")
 	/* Maintainer: Kleinhenz Elektronik GmbH */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= picotux200_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= picotux200_board_init,
diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c
index 0c61bf0..bf351e2 100644
--- a/arch/arm/mach-at91/board-qil-a9260.c
+++ b/arch/arm/mach-at91/board-qil-a9260.c
@@ -41,6 +41,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 
@@ -258,6 +259,7 @@ MACHINE_START(QIL_A9260, "CALAO QIL_A9260")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c
index afd7a47..cc2bf97 100644
--- a/arch/arm/mach-at91/board-rm9200dk.c
+++ b/arch/arm/mach-at91/board-rm9200dk.c
@@ -40,6 +40,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 
@@ -223,6 +224,7 @@ MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
 	/* Maintainer: SAN People/Atmel */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= dk_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= dk_board_init,
diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c
index 2b15b8a..62e19e6 100644
--- a/arch/arm/mach-at91/board-rm9200ek.c
+++ b/arch/arm/mach-at91/board-rm9200ek.c
@@ -40,6 +40,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 
@@ -190,6 +191,7 @@ MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")
 	/* Maintainer: SAN People/Atmel */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-rsi-ews.c b/arch/arm/mach-at91/board-rsi-ews.c
index 24ab9be..c3b43ae 100644
--- a/arch/arm/mach-at91/board-rsi-ews.c
+++ b/arch/arm/mach-at91/board-rsi-ews.c
@@ -26,6 +26,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 
 #include <linux/gpio.h>
 
@@ -225,6 +226,7 @@ MACHINE_START(RSI_EWS, "RSI EWS")
 	/* Maintainer: Josef Holzmayr <holzmayr@rsi-elektrotechnik.de> */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= rsi_ews_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= rsi_ews_board_init,
diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c
index cdd21f2..7bf6da7 100644
--- a/arch/arm/mach-at91/board-sam9-l9260.c
+++ b/arch/arm/mach-at91/board-sam9-l9260.c
@@ -38,6 +38,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -202,6 +203,7 @@ MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
 	/* Maintainer: Olimex */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c
index 7b3c391..889c1bf 100644
--- a/arch/arm/mach-at91/board-sam9260ek.c
+++ b/arch/arm/mach-at91/board-sam9260ek.c
@@ -42,6 +42,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 #include <mach/system_rev.h>
@@ -344,6 +345,7 @@ MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c
index 2736453..2269be5 100644
--- a/arch/arm/mach-at91/board-sam9261ek.c
+++ b/arch/arm/mach-at91/board-sam9261ek.c
@@ -46,6 +46,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 #include <mach/system_rev.h>
@@ -615,6 +616,7 @@ MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c
index 983cb98..82adf58 100644
--- a/arch/arm/mach-at91/board-sam9263ek.c
+++ b/arch/arm/mach-at91/board-sam9263ek.c
@@ -45,6 +45,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 #include <mach/system_rev.h>
@@ -443,6 +444,7 @@ MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c
index 6860d34..4ea4ee0 100644
--- a/arch/arm/mach-at91/board-sam9g20ek.c
+++ b/arch/arm/mach-at91/board-sam9g20ek.c
@@ -44,6 +44,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/system_rev.h>
 
@@ -413,6 +414,7 @@ MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
@@ -422,6 +424,7 @@ MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c
index 63163dc..3d48ec1 100644
--- a/arch/arm/mach-at91/board-sam9m10g45ek.c
+++ b/arch/arm/mach-at91/board-sam9m10g45ek.c
@@ -43,6 +43,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 #include <mach/system_rev.h>
@@ -503,6 +504,7 @@ MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c
index be3239f..e7dc3ea 100644
--- a/arch/arm/mach-at91/board-sam9rlek.c
+++ b/arch/arm/mach-at91/board-sam9rlek.c
@@ -31,6 +31,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 
@@ -319,6 +320,7 @@ MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c
index 9d446f1..a4e031a 100644
--- a/arch/arm/mach-at91/board-snapper9260.c
+++ b/arch/arm/mach-at91/board-snapper9260.c
@@ -33,6 +33,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -178,6 +179,7 @@ static void __init snapper9260_board_init(void)
 MACHINE_START(SNAPPER_9260, "Bluewater Systems Snapper 9260/9G20 module")
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= snapper9260_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= snapper9260_board_init,
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c
index ee86f9d..29eae16 100644
--- a/arch/arm/mach-at91/board-stamp9g20.c
+++ b/arch/arm/mach-at91/board-stamp9g20.c
@@ -26,6 +26,7 @@
 #include <asm/mach/arch.h>
 
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 
 #include "sam9_smc.h"
@@ -287,6 +288,7 @@ MACHINE_START(PORTUXG20, "taskit PortuxG20")
 	/* Maintainer: taskit GmbH */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= stamp9g20_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= portuxg20_board_init,
@@ -296,6 +298,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")
 	/* Maintainer: taskit GmbH */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= stamp9g20_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= stamp9g20evb_board_init,
diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c
index 95393fc..c1476b9 100644
--- a/arch/arm/mach-at91/board-usb-a926x.c
+++ b/arch/arm/mach-at91/board-usb-a926x.c
@@ -42,6 +42,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91sam9_smc.h>
 #include <mach/at91_shdwc.h>
 
@@ -358,6 +359,7 @@ MACHINE_START(USB_A9263, "CALAO USB_A9263")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
@@ -367,6 +369,7 @@ MACHINE_START(USB_A9260, "CALAO USB_A9260")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
@@ -376,6 +379,7 @@ MACHINE_START(USB_A9G20, "CALAO USB_A92G0")
 	/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= ek_board_init,
diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c
index d56665e..516d340 100644
--- a/arch/arm/mach-at91/board-yl-9200.c
+++ b/arch/arm/mach-at91/board-yl-9200.c
@@ -44,6 +44,7 @@
 
 #include <mach/hardware.h>
 #include <mach/board.h>
+#include <mach/at91_aic.h>
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 #include <mach/cpu.h>
@@ -590,6 +591,7 @@ MACHINE_START(YL9200, "uCdragon YL-9200")
 	/* Maintainer: S.Birtles */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= yl9200_init_early,
 	.init_irq	= at91_init_irq_default,
 	.init_machine	= yl9200_board_init,
diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/include/mach/at91_aic.h
index c1413ed..3510e35 100644
--- a/arch/arm/mach-at91/include/mach/at91_aic.h
+++ b/arch/arm/mach-at91/include/mach/at91_aic.h
@@ -62,4 +62,6 @@ extern void __iomem *at91_aic_base;
 #define AT91_AIC_FFDR		0x144			/* Fast Forcing Disable Register [SAM9 only] */
 #define AT91_AIC_FFSR		0x148			/* Fast Forcing Status Register [SAM9 only] */
 
+void at91_aic_handle_irq(struct pt_regs *regs);
+
 #endif
diff --git a/arch/arm/mach-at91/include/mach/entry-macro.S b/arch/arm/mach-at91/include/mach/entry-macro.S
deleted file mode 100644
index 903bf20..0000000
--- a/arch/arm/mach-at91/include/mach/entry-macro.S
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * arch/arm/mach-at91/include/mach/entry-macro.S
- *
- *  Copyright (C) 2003-2005 SAN People
- *
- * Low-level IRQ helper macros for AT91RM9200 platforms
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2. This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <mach/hardware.h>
-#include <mach/at91_aic.h>
-
-	.macro  get_irqnr_preamble, base, tmp
-	ldr	\base, =at91_aic_base		@ base virtual address of AIC peripheral
-	ldr	\base, [\base]
-	.endm
-
-	.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp
-	ldr	\irqnr, [\base, #AT91_AIC_IVR]		@ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt)
-	ldr	\irqstat, [\base, #AT91_AIC_ISR]	@ read interrupt source number
-	teq	\irqstat, #0				@ ISR is 0 when no current interrupt, or spurious interrupt
-	streq	\tmp, [\base, #AT91_AIC_EOICR]		@ not going to be handled further, then ACK it now.
-	.endm
-
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index 8e6ac53..cabfba2 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -35,6 +35,7 @@
 #include <asm/irq.h>
 #include <asm/setup.h>
 
+#include <asm/exception.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
@@ -43,6 +44,24 @@ void __iomem *at91_aic_base;
 static struct irq_domain *at91_aic_domain;
 static struct device_node *at91_aic_np;
 
+asmlinkage void __exception_irq_entry at91_aic_handle_irq(struct pt_regs *regs)
+{
+	u32 irqnr;
+	u32 irqstat;
+
+	irqnr = at91_aic_read(AT91_AIC_IVR);
+	irqstat = at91_aic_read(AT91_AIC_ISR);
+
+	/*
+	 * ISR value is 0 when there is no current interrupt or when there is
+	 * a spurious interrupt
+	 */
+	if (!irqstat)
+		at91_aic_write(AT91_AIC_EOICR, 0);
+	else
+		handle_IRQ(irqnr, regs);
+}
+
 static void at91_aic_mask_irq(struct irq_data *d)
 {
 	/* Disable interrupt on AIC */
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 4/7] ARM: at91: fix irq_alloc_descs parameters for sparse irq
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
                   ` (2 preceding siblings ...)
  2012-06-15  9:09 ` [PATCH v2 3/7] ARM: at91: at91 based machines specify their own irq handler at run time Ludovic Desroches
@ 2012-06-15  9:09 ` Ludovic Desroches
  2012-06-15  9:11 ` Ludovic Desroches
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:09 UTC (permalink / raw)
  To: linux-arm-kernel

When SPARSE_IRQ is enabled, all NR_IRQS or mach_desc->nr_irqs will be allocated
by arch_probe_nr_irqs(). This caused irq_alloc_descs to allocate irq_descs
after the pre-allocated space. Make irq_alloc_descs search for an exact irq
range in order to get an error when it has been pre-allocated.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/irq.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index cabfba2..b0f83e2 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -32,6 +32,7 @@
 #include <linux/err.h>
 
 #include <mach/hardware.h>
+#include <mach/irqs.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 
@@ -275,9 +276,9 @@ void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
 		panic("Unable to ioremap AIC registers\n");
 
 	/* Add irq domain for AIC */
-	irq_base = irq_alloc_descs(-1, 0, NR_AIC_IRQS, 0);
+	irq_base = irq_alloc_descs(0, 0, NR_AIC_IRQS, 0);
 	if (irq_base < 0) {
-		WARN(1, "Cannot allocate irq_descs, assuming pre-allocated\n");
+		pr_warn("Cannot allocate irq_descs, assuming pre-allocated\n");
 		irq_base = 0;
 	}
 	at91_aic_domain = irq_domain_add_legacy(at91_aic_np, NR_AIC_IRQS,
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 4/7] ARM: at91: fix irq_alloc_descs parameters for sparse irq
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
                   ` (3 preceding siblings ...)
  2012-06-15  9:09 ` [PATCH v2 4/7] ARM: at91: fix irq_alloc_descs parameters for sparse irq Ludovic Desroches
@ 2012-06-15  9:11 ` Ludovic Desroches
  2012-06-15  9:12 ` [PATCH v2 5/7] ARM: at91: sparse irq support Ludovic Desroches
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:11 UTC (permalink / raw)
  To: linux-arm-kernel

When SPARSE_IRQ is enabled, all NR_IRQS or mach_desc->nr_irqs will be allocated
by arch_probe_nr_irqs(). This caused irq_alloc_descs to allocate irq_descs
after the pre-allocated space. Make irq_alloc_descs search for an exact irq
range in order to get an error when it has been pre-allocated.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/irq.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index cabfba2..b0f83e2 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -32,6 +32,7 @@
 #include <linux/err.h>
 
 #include <mach/hardware.h>
+#include <mach/irqs.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 
@@ -275,9 +276,9 @@ void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
 		panic("Unable to ioremap AIC registers\n");
 
 	/* Add irq domain for AIC */
-	irq_base = irq_alloc_descs(-1, 0, NR_AIC_IRQS, 0);
+	irq_base = irq_alloc_descs(0, 0, NR_AIC_IRQS, 0);
 	if (irq_base < 0) {
-		WARN(1, "Cannot allocate irq_descs, assuming pre-allocated\n");
+		pr_warn("Cannot allocate irq_descs, assuming pre-allocated\n");
 		irq_base = 0;
 	}
 	at91_aic_domain = irq_domain_add_legacy(at91_aic_np, NR_AIC_IRQS,
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 5/7] ARM: at91: sparse irq support
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
                   ` (4 preceding siblings ...)
  2012-06-15  9:11 ` Ludovic Desroches
@ 2012-06-15  9:12 ` Ludovic Desroches
  2012-06-15  9:12 ` [PATCH v2 6/7] ARM: at91: remove mach/irqs.h Ludovic Desroches
  2012-06-15  9:13 ` [PATCH v2 7/7] ARM: at91: add AIC5 support Ludovic Desroches
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:12 UTC (permalink / raw)
  To: linux-arm-kernel

Enable sparse irq support for multisoc image.
Move NR_AIC_IRQS macro to a more appropiate place with the purpose to
remove mach/irqs.h later.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/Kconfig                 |    1 +
 arch/arm/mach-at91/at91rm9200.c            |    1 +
 arch/arm/mach-at91/at91sam9260.c           |    1 +
 arch/arm/mach-at91/at91sam9261.c           |    1 +
 arch/arm/mach-at91/at91sam9263.c           |    1 +
 arch/arm/mach-at91/at91sam9g45.c           |    1 +
 arch/arm/mach-at91/at91sam9rl.c            |    1 +
 arch/arm/mach-at91/at91x40.c               |    1 +
 arch/arm/mach-at91/board-1arm.c            |    1 +
 arch/arm/mach-at91/board-afeb-9260v1.c     |    1 +
 arch/arm/mach-at91/board-cam60.c           |    1 +
 arch/arm/mach-at91/board-carmeva.c         |    1 +
 arch/arm/mach-at91/board-cpu9krea.c        |    1 +
 arch/arm/mach-at91/board-cpuat91.c         |    1 +
 arch/arm/mach-at91/board-csb337.c          |    1 +
 arch/arm/mach-at91/board-csb637.c          |    1 +
 arch/arm/mach-at91/board-eb01.c            |    1 +
 arch/arm/mach-at91/board-eb9200.c          |    1 +
 arch/arm/mach-at91/board-ecbat91.c         |    1 +
 arch/arm/mach-at91/board-eco920.c          |    1 +
 arch/arm/mach-at91/board-flexibity.c       |    1 +
 arch/arm/mach-at91/board-foxg20.c          |    1 +
 arch/arm/mach-at91/board-gsia18s.c         |    1 +
 arch/arm/mach-at91/board-kafa.c            |    1 +
 arch/arm/mach-at91/board-kb9202.c          |    1 +
 arch/arm/mach-at91/board-neocore926.c      |    1 +
 arch/arm/mach-at91/board-pcontrol-g20.c    |    1 +
 arch/arm/mach-at91/board-picotux200.c      |    1 +
 arch/arm/mach-at91/board-qil-a9260.c       |    1 +
 arch/arm/mach-at91/board-rm9200dk.c        |    1 +
 arch/arm/mach-at91/board-rm9200ek.c        |    1 +
 arch/arm/mach-at91/board-rsi-ews.c         |    1 +
 arch/arm/mach-at91/board-sam9-l9260.c      |    1 +
 arch/arm/mach-at91/board-sam9260ek.c       |    1 +
 arch/arm/mach-at91/board-sam9261ek.c       |    1 +
 arch/arm/mach-at91/board-sam9263ek.c       |    1 +
 arch/arm/mach-at91/board-sam9g20ek.c       |    2 ++
 arch/arm/mach-at91/board-sam9m10g45ek.c    |    1 +
 arch/arm/mach-at91/board-sam9rlek.c        |    1 +
 arch/arm/mach-at91/board-snapper9260.c     |    1 +
 arch/arm/mach-at91/board-stamp9g20.c       |    2 ++
 arch/arm/mach-at91/board-usb-a926x.c       |    3 +++
 arch/arm/mach-at91/board-yl-9200.c         |    1 +
 arch/arm/mach-at91/gpio.c                  |    1 +
 arch/arm/mach-at91/include/mach/at91_aic.h |    3 +++
 arch/arm/mach-at91/include/mach/irqs.h     |   10 ----------
 arch/arm/mach-at91/pm.c                    |    1 +
 47 files changed, 52 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index e401dea..7d0c40a 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -30,6 +30,7 @@ config SOC_AT91SAM9
 	bool
 	select CPU_ARM926T
 	select MULTI_IRQ_HANDLER
+	select SPARSE_IRQ
 	select AT91_SAM9_TIME
 	select AT91_SAM9_SMC
 
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c
index 2691768..6f50c67 100644
--- a/arch/arm/mach-at91/at91rm9200.c
+++ b/arch/arm/mach-at91/at91rm9200.c
@@ -17,6 +17,7 @@
 #include <asm/mach/map.h>
 #include <asm/system_misc.h>
 #include <mach/at91rm9200.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91_st.h>
 #include <mach/cpu.h>
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index 2b1e438..30c7f26 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -20,6 +20,7 @@
 #include <mach/cpu.h>
 #include <mach/at91_dbgu.h>
 #include <mach/at91sam9260.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91_rstc.h>
 
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
index c77d503..f40762c 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -19,6 +19,7 @@
 #include <asm/system_misc.h>
 #include <mach/cpu.h>
 #include <mach/at91sam9261.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91_rstc.h>
 
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index ed91c7e..84b3810 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -18,6 +18,7 @@
 #include <asm/mach/map.h>
 #include <asm/system_misc.h>
 #include <mach/at91sam9263.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91_rstc.h>
 
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
index 4792682..9771273 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -18,6 +18,7 @@
 #include <asm/mach/map.h>
 #include <asm/system_misc.h>
 #include <mach/at91sam9g45.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/cpu.h>
 
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
index e420085..e7d9e1e 100644
--- a/arch/arm/mach-at91/at91sam9rl.c
+++ b/arch/arm/mach-at91/at91sam9rl.c
@@ -17,6 +17,7 @@
 #include <asm/mach/map.h>
 #include <asm/system_misc.h>
 #include <mach/cpu.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_dbgu.h>
 #include <mach/at91sam9rl.h>
 #include <mach/at91_pmc.h>
diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c
index d62fe09..4c0f5fd 100644
--- a/arch/arm/mach-at91/at91x40.c
+++ b/arch/arm/mach-at91/at91x40.c
@@ -17,6 +17,7 @@
 #include <asm/system_misc.h>
 #include <asm/mach/arch.h>
 #include <mach/at91x40.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_st.h>
 #include <mach/timex.h>
 #include "generic.h"
diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c
index 22d8856..7a54904 100644
--- a/arch/arm/mach-at91/board-1arm.c
+++ b/arch/arm/mach-at91/board-1arm.c
@@ -92,6 +92,7 @@ MACHINE_START(ONEARM, "Ajeco 1ARM single board computer")
 	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= onearm_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c
index de7be19..24e45e1 100644
--- a/arch/arm/mach-at91/board-afeb-9260v1.c
+++ b/arch/arm/mach-at91/board-afeb-9260v1.c
@@ -213,6 +213,7 @@ MACHINE_START(AFEB9260, "Custom afeb9260 board")
 	/* Maintainer: Sergey Lapin <slapin@ossfans.org> */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= afeb9260_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c
index 477e708..3d239b4 100644
--- a/arch/arm/mach-at91/board-cam60.c
+++ b/arch/arm/mach-at91/board-cam60.c
@@ -189,6 +189,7 @@ MACHINE_START(CAM60, "KwikByte CAM60")
 	/* Maintainer: KwikByte */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cam60_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c
index a5b002f..7d5585b 100644
--- a/arch/arm/mach-at91/board-carmeva.c
+++ b/arch/arm/mach-at91/board-carmeva.c
@@ -159,6 +159,7 @@ MACHINE_START(CARMEVA, "Carmeva")
 	/* Maintainer: Conitec Datasystems */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= carmeva_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c
index ecbc13b..78a8cd7 100644
--- a/arch/arm/mach-at91/board-cpu9krea.c
+++ b/arch/arm/mach-at91/board-cpu9krea.c
@@ -377,6 +377,7 @@ MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")
 	/* Maintainer: Eric Benard - EUKREA Electromatique */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cpu9krea_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c
index 2e6d043..7334f9b 100644
--- a/arch/arm/mach-at91/board-cpuat91.c
+++ b/arch/arm/mach-at91/board-cpuat91.c
@@ -179,6 +179,7 @@ MACHINE_START(CPUAT91, "Eukrea")
 	/* Maintainer: Eric Benard - EUKREA Electromatique */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= cpuat91_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c
index 462bc31..ba4c577 100644
--- a/arch/arm/mach-at91/board-csb337.c
+++ b/arch/arm/mach-at91/board-csb337.c
@@ -253,6 +253,7 @@ MACHINE_START(CSB337, "Cogent CSB337")
 	/* Maintainer: Bill Gatliff */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= csb337_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c
index 872871a..bbca258 100644
--- a/arch/arm/mach-at91/board-csb637.c
+++ b/arch/arm/mach-at91/board-csb637.c
@@ -134,6 +134,7 @@ MACHINE_START(CSB637, "Cogent CSB637")
 	/* Maintainer: Bill Gatliff */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= csb637_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-eb01.c b/arch/arm/mach-at91/board-eb01.c
index 01f66e9..ab6b11c 100644
--- a/arch/arm/mach-at91/board-eb01.c
+++ b/arch/arm/mach-at91/board-eb01.c
@@ -44,6 +44,7 @@ static void __init at91eb01_init_early(void)
 MACHINE_START(AT91EB01, "Atmel AT91 EB01")
 	/* Maintainer: Greg Ungerer <gerg@snapgear.com> */
 	.timer		= &at91x40_timer,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= at91eb01_init_early,
 	.init_irq	= at91eb01_init_irq,
diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c
index d1e1f3f..2ab2b10 100644
--- a/arch/arm/mach-at91/board-eb9200.c
+++ b/arch/arm/mach-at91/board-eb9200.c
@@ -119,6 +119,7 @@ static void __init eb9200_board_init(void)
 MACHINE_START(ATEB9200, "Embest ATEB9200")
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= eb9200_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c
index 9c24cb2..dae983c 100644
--- a/arch/arm/mach-at91/board-ecbat91.c
+++ b/arch/arm/mach-at91/board-ecbat91.c
@@ -171,6 +171,7 @@ MACHINE_START(ECBAT91, "emQbit's ECB_AT91")
 	/* Maintainer: emQbit.com */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ecb_at91init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-eco920.c b/arch/arm/mach-at91/board-eco920.c
index 82bdfde..3216d68 100644
--- a/arch/arm/mach-at91/board-eco920.c
+++ b/arch/arm/mach-at91/board-eco920.c
@@ -133,6 +133,7 @@ MACHINE_START(ECO920, "eco920")
 	/* Maintainer: Sascha Hauer */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= eco920_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-flexibity.c b/arch/arm/mach-at91/board-flexibity.c
index 6cc83a8..9095fdb 100644
--- a/arch/arm/mach-at91/board-flexibity.c
+++ b/arch/arm/mach-at91/board-flexibity.c
@@ -160,6 +160,7 @@ static void __init flexibity_board_init(void)
 MACHINE_START(FLEXIBITY, "Flexibity Connect")
 	/* Maintainer: Maxim Osipov */
 	.timer		= &at91sam926x_timer,
+	.nr_irqs	= NR_AIC_IRQS,
 	.map_io		= at91_map_io,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= flexibity_init_early,
diff --git a/arch/arm/mach-at91/board-foxg20.c b/arch/arm/mach-at91/board-foxg20.c
index 69ab124..1b5fa55 100644
--- a/arch/arm/mach-at91/board-foxg20.c
+++ b/arch/arm/mach-at91/board-foxg20.c
@@ -263,6 +263,7 @@ MACHINE_START(ACMENETUSFOXG20, "Acme Systems srl FOX Board G20")
 	/* Maintainer: Sergio Tanzilli */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= foxg20_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c
index a9d5e78..ee18183 100644
--- a/arch/arm/mach-at91/board-gsia18s.c
+++ b/arch/arm/mach-at91/board-gsia18s.c
@@ -576,6 +576,7 @@ static void __init gsia18s_board_init(void)
 MACHINE_START(GSIA18S, "GS_IA18_S")
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= gsia18s_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c
index 64c1dbf..23eb5bd 100644
--- a/arch/arm/mach-at91/board-kafa.c
+++ b/arch/arm/mach-at91/board-kafa.c
@@ -94,6 +94,7 @@ MACHINE_START(KAFA, "Sperry-Sun KAFA")
 	/* Maintainer: Sergei Sharonov */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= kafa_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c
index 5d96cb8..dab34ef 100644
--- a/arch/arm/mach-at91/board-kb9202.c
+++ b/arch/arm/mach-at91/board-kb9202.c
@@ -134,6 +134,7 @@ MACHINE_START(KB9200, "KB920x")
 	/* Maintainer: KwikByte, Inc. */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= kb9202_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c
index 18103c5d..e11ced0 100644
--- a/arch/arm/mach-at91/board-neocore926.c
+++ b/arch/arm/mach-at91/board-neocore926.c
@@ -379,6 +379,7 @@ MACHINE_START(NEOCORE926, "ADENEO NEOCORE 926")
 	/* Maintainer: ADENEO */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= neocore926_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-pcontrol-g20.c b/arch/arm/mach-at91/board-pcontrol-g20.c
index 9ca3e32..cf35e39 100644
--- a/arch/arm/mach-at91/board-pcontrol-g20.c
+++ b/arch/arm/mach-at91/board-pcontrol-g20.c
@@ -219,6 +219,7 @@ MACHINE_START(PCONTROL_G20, "PControl G20")
 	/* Maintainer: pgsellmann at portner-elektronik.at */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= pcontrol_g20_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c
index 1270655..1328d0f 100644
--- a/arch/arm/mach-at91/board-picotux200.c
+++ b/arch/arm/mach-at91/board-picotux200.c
@@ -121,6 +121,7 @@ MACHINE_START(PICOTUX2XX, "picotux 200")
 	/* Maintainer: Kleinhenz Elektronik GmbH */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= picotux200_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c
index bf351e2..3100157 100644
--- a/arch/arm/mach-at91/board-qil-a9260.c
+++ b/arch/arm/mach-at91/board-qil-a9260.c
@@ -259,6 +259,7 @@ MACHINE_START(QIL_A9260, "CALAO QIL_A9260")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c
index cc2bf97..f9dba77 100644
--- a/arch/arm/mach-at91/board-rm9200dk.c
+++ b/arch/arm/mach-at91/board-rm9200dk.c
@@ -224,6 +224,7 @@ MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
 	/* Maintainer: SAN People/Atmel */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= dk_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c
index 62e19e6..29768f7 100644
--- a/arch/arm/mach-at91/board-rm9200ek.c
+++ b/arch/arm/mach-at91/board-rm9200ek.c
@@ -191,6 +191,7 @@ MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")
 	/* Maintainer: SAN People/Atmel */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-rsi-ews.c b/arch/arm/mach-at91/board-rsi-ews.c
index c3b43ae..d68e39f 100644
--- a/arch/arm/mach-at91/board-rsi-ews.c
+++ b/arch/arm/mach-at91/board-rsi-ews.c
@@ -226,6 +226,7 @@ MACHINE_START(RSI_EWS, "RSI EWS")
 	/* Maintainer: Josef Holzmayr <holzmayr@rsi-elektrotechnik.de> */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= rsi_ews_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c
index 7bf6da7..711a257 100644
--- a/arch/arm/mach-at91/board-sam9-l9260.c
+++ b/arch/arm/mach-at91/board-sam9-l9260.c
@@ -203,6 +203,7 @@ MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260")
 	/* Maintainer: Olimex */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c
index 889c1bf..028540b 100644
--- a/arch/arm/mach-at91/board-sam9260ek.c
+++ b/arch/arm/mach-at91/board-sam9260ek.c
@@ -345,6 +345,7 @@ MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c
index 2269be5..e09f759 100644
--- a/arch/arm/mach-at91/board-sam9261ek.c
+++ b/arch/arm/mach-at91/board-sam9261ek.c
@@ -616,6 +616,7 @@ MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c
index 82adf58..ae3a266 100644
--- a/arch/arm/mach-at91/board-sam9263ek.c
+++ b/arch/arm/mach-at91/board-sam9263ek.c
@@ -444,6 +444,7 @@ MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c
index 4ea4ee0..7a16f81 100644
--- a/arch/arm/mach-at91/board-sam9g20ek.c
+++ b/arch/arm/mach-at91/board-sam9g20ek.c
@@ -414,6 +414,7 @@ MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
@@ -424,6 +425,7 @@ MACHINE_START(AT91SAM9G20EK_2MMC, "Atmel AT91SAM9G20-EK 2 MMC Slot Mod")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c
index 3d48ec1..874d971 100644
--- a/arch/arm/mach-at91/board-sam9m10g45ek.c
+++ b/arch/arm/mach-at91/board-sam9m10g45ek.c
@@ -504,6 +504,7 @@ MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c
index e7dc3ea..4b561b4 100644
--- a/arch/arm/mach-at91/board-sam9rlek.c
+++ b/arch/arm/mach-at91/board-sam9rlek.c
@@ -320,6 +320,7 @@ MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
 	/* Maintainer: Atmel */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c
index a4e031a..21f4dac 100644
--- a/arch/arm/mach-at91/board-snapper9260.c
+++ b/arch/arm/mach-at91/board-snapper9260.c
@@ -179,6 +179,7 @@ static void __init snapper9260_board_init(void)
 MACHINE_START(SNAPPER_9260, "Bluewater Systems Snapper 9260/9G20 module")
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= snapper9260_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c
index 29eae16..dbc3488 100644
--- a/arch/arm/mach-at91/board-stamp9g20.c
+++ b/arch/arm/mach-at91/board-stamp9g20.c
@@ -288,6 +288,7 @@ MACHINE_START(PORTUXG20, "taskit PortuxG20")
 	/* Maintainer: taskit GmbH */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= stamp9g20_init_early,
 	.init_irq	= at91_init_irq_default,
@@ -298,6 +299,7 @@ MACHINE_START(STAMP9G20, "taskit Stamp9G20")
 	/* Maintainer: taskit GmbH */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= stamp9g20_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-usb-a926x.c b/arch/arm/mach-at91/board-usb-a926x.c
index c1476b9..791c953 100644
--- a/arch/arm/mach-at91/board-usb-a926x.c
+++ b/arch/arm/mach-at91/board-usb-a926x.c
@@ -359,6 +359,7 @@ MACHINE_START(USB_A9263, "CALAO USB_A9263")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
@@ -369,6 +370,7 @@ MACHINE_START(USB_A9260, "CALAO USB_A9260")
 	/* Maintainer: calao-systems */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
@@ -379,6 +381,7 @@ MACHINE_START(USB_A9G20, "CALAO USB_A92G0")
 	/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */
 	.timer		= &at91sam926x_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= ek_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c
index 516d340..1e94d76 100644
--- a/arch/arm/mach-at91/board-yl-9200.c
+++ b/arch/arm/mach-at91/board-yl-9200.c
@@ -591,6 +591,7 @@ MACHINE_START(YL9200, "uCdragon YL-9200")
 	/* Maintainer: S.Birtles */
 	.timer		= &at91rm9200_timer,
 	.map_io		= at91_map_io,
+	.nr_irqs	= NR_AIC_IRQS,
 	.handle_irq	= at91_aic_handle_irq,
 	.init_early	= yl9200_init_early,
 	.init_irq	= at91_init_irq_default,
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index be42cf0..650bf9a 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -29,6 +29,7 @@
 #include <asm/mach/irq.h>
 
 #include <mach/hardware.h>
+#include <mach/at91_aic.h>
 #include <mach/at91_pio.h>
 
 #include "generic.h"
diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/include/mach/at91_aic.h
index 3510e35..2678e75 100644
--- a/arch/arm/mach-at91/include/mach/at91_aic.h
+++ b/arch/arm/mach-at91/include/mach/at91_aic.h
@@ -28,6 +28,9 @@ extern void __iomem *at91_aic_base;
 .extern at91_aic_base
 #endif
 
+/* Number of irq lines managed by AIC */
+#define NR_AIC_IRQS	32
+
 #define AT91_AIC_SMR(n)		((n) * 4)		/* Source Mode Registers 0-31 */
 #define		AT91_AIC_PRIOR		(7 << 0)		/* Priority Level */
 #define		AT91_AIC_SRCTYPE	(3 << 5)		/* Interrupt Source Type */
diff --git a/arch/arm/mach-at91/include/mach/irqs.h b/arch/arm/mach-at91/include/mach/irqs.h
index 2d510ee..9223a1e 100644
--- a/arch/arm/mach-at91/include/mach/irqs.h
+++ b/arch/arm/mach-at91/include/mach/irqs.h
@@ -24,16 +24,6 @@
 #include <linux/io.h>
 #include <mach/at91_aic.h>
 
-#define NR_AIC_IRQS 32
-
-
-/*
- * IRQ interrupt symbols are the AT91xxx_ID_* symbols
- * for IRQs handled directly through the AIC, or else the AT91_PIN_*
- * symbols in gpio.h for ones handled indirectly as GPIOs.
- * We make provision for 5 banks of GPIO.
- */
-#define	NR_IRQS		(NR_AIC_IRQS + (5 * 32))
 
 /* FIQ is AIC source 0. */
 #define FIQ_START AT91_ID_FIQ
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c
index 1bfaad6..2c2d865 100644
--- a/arch/arm/mach-at91/pm.c
+++ b/arch/arm/mach-at91/pm.c
@@ -25,6 +25,7 @@
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
 
+#include <mach/at91_aic.h>
 #include <mach/at91_pmc.h>
 #include <mach/cpu.h>
 
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 6/7] ARM: at91: remove mach/irqs.h
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
                   ` (5 preceding siblings ...)
  2012-06-15  9:12 ` [PATCH v2 5/7] ARM: at91: sparse irq support Ludovic Desroches
@ 2012-06-15  9:12 ` Ludovic Desroches
  2012-06-15  9:13 ` [PATCH v2 7/7] ARM: at91: add AIC5 support Ludovic Desroches
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:12 UTC (permalink / raw)
  To: linux-arm-kernel

mach/irqs only defines FIQ_START which doesn't appear to be used anywhere
so remove it.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/include/mach/irqs.h |   31 -------------------------------
 arch/arm/mach-at91/irq.c               |    2 +-
 2 files changed, 1 insertions(+), 32 deletions(-)
 delete mode 100644 arch/arm/mach-at91/include/mach/irqs.h

diff --git a/arch/arm/mach-at91/include/mach/irqs.h b/arch/arm/mach-at91/include/mach/irqs.h
deleted file mode 100644
index 9223a1e..0000000
--- a/arch/arm/mach-at91/include/mach/irqs.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * arch/arm/mach-at91/include/mach/irqs.h
- *
- *  Copyright (C) 2004 SAN People
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ASM_ARCH_IRQS_H
-#define __ASM_ARCH_IRQS_H
-
-#include <linux/io.h>
-#include <mach/at91_aic.h>
-
-
-/* FIQ is AIC source 0. */
-#define FIQ_START AT91_ID_FIQ
-
-#endif
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index b0f83e2..a0b9dca 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -32,7 +32,7 @@
 #include <linux/err.h>
 
 #include <mach/hardware.h>
-#include <mach/irqs.h>
+#include <mach/at91_aic.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 7/7] ARM: at91: add AIC5 support
  2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
                   ` (6 preceding siblings ...)
  2012-06-15  9:12 ` [PATCH v2 6/7] ARM: at91: remove mach/irqs.h Ludovic Desroches
@ 2012-06-15  9:13 ` Ludovic Desroches
  7 siblings, 0 replies; 12+ messages in thread
From: Ludovic Desroches @ 2012-06-15  9:13 UTC (permalink / raw)
  To: linux-arm-kernel

The number of lines of AIC5 has increased from 32 to 128. Due to this
increase, a source select register has been introduced for the interrupt
line selection. Moreover, register mapping has been changed. For that reasons,
we need some dedicated callbacks for AIC5.
Power management is also concerned by these changes. On suspend, we can't get
the whole interrupt mask register as before, we have to read this register 128
times. To reduce this overhead, a snapshot of the whole IMR is maintained.

Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
 arch/arm/mach-at91/generic.h               |    2 +
 arch/arm/mach-at91/include/mach/at91_aic.h |   25 ++
 arch/arm/mach-at91/irq.c                   |  359 +++++++++++++++++++++++----
 3 files changed, 332 insertions(+), 54 deletions(-)

diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
index 0a60bf8..f496506 100644
--- a/arch/arm/mach-at91/generic.h
+++ b/arch/arm/mach-at91/generic.h
@@ -29,6 +29,8 @@ extern void __init at91x40_init_interrupts(unsigned int priority[]);
 extern void __init at91_aic_init(unsigned int priority[]);
 extern int  __init at91_aic_of_init(struct device_node *node,
 				    struct device_node *parent);
+extern int  __init at91_aic5_of_init(struct device_node *node,
+				    struct device_node *parent);
 
 
  /* Timer */
diff --git a/arch/arm/mach-at91/include/mach/at91_aic.h b/arch/arm/mach-at91/include/mach/at91_aic.h
index 2678e75..ec0a1f8 100644
--- a/arch/arm/mach-at91/include/mach/at91_aic.h
+++ b/arch/arm/mach-at91/include/mach/at91_aic.h
@@ -30,8 +30,13 @@ extern void __iomem *at91_aic_base;
 
 /* Number of irq lines managed by AIC */
 #define NR_AIC_IRQS	32
+#define NR_AIC5_IRQS	128
+
+#define AT91_AIC5_SSR		0x0			/* Source Select Register [AIC5] */
+#define 	AT91_AIC5_INTSEL_MSK	(0x7f << 0)		/* Interrupt Line Selection Mask */
 
 #define AT91_AIC_SMR(n)		((n) * 4)		/* Source Mode Registers 0-31 */
+#define AT91_AIC5_SMR		0x4			/* Source Mode Register [AIC5] */
 #define		AT91_AIC_PRIOR		(7 << 0)		/* Priority Level */
 #define		AT91_AIC_SRCTYPE	(3 << 5)		/* Interrupt Source Type */
 #define			AT91_AIC_SRCTYPE_LOW		(0 << 5)
@@ -40,30 +45,50 @@ extern void __iomem *at91_aic_base;
 #define			AT91_AIC_SRCTYPE_RISING		(3 << 5)
 
 #define AT91_AIC_SVR(n)		(0x80 + ((n) * 4))	/* Source Vector Registers 0-31 */
+#define AT91_AIC5_SVR		0x8			/* Source Vector Register [AIC5] */
 #define AT91_AIC_IVR		0x100			/* Interrupt Vector Register */
+#define AT91_AIC5_IVR		0x10			/* Interrupt Vector Register [AIC5] */
 #define AT91_AIC_FVR		0x104			/* Fast Interrupt Vector Register */
+#define AT91_AIC5_FVR		0x14			/* Fast Interrupt Vector Register [AIC5] */
 #define AT91_AIC_ISR		0x108			/* Interrupt Status Register */
+#define AT91_AIC5_ISR		0x18			/* Interrupt Status Register [AIC5] */
 #define		AT91_AIC_IRQID		(0x1f << 0)		/* Current Interrupt Identifier */
 
 #define AT91_AIC_IPR		0x10c			/* Interrupt Pending Register */
+#define AT91_AIC5_IPR0		0x20			/* Interrupt Pending Register 0 [AIC5] */
+#define AT91_AIC5_IPR1		0x24			/* Interrupt Pending Register 1 [AIC5] */
+#define AT91_AIC5_IPR2		0x28			/* Interrupt Pending Register 2 [AIC5] */
+#define AT91_AIC5_IPR3		0x2c			/* Interrupt Pending Register 3 [AIC5] */
 #define AT91_AIC_IMR		0x110			/* Interrupt Mask Register */
+#define AT91_AIC5_IMR		0x30			/* Interrupt Mask Register [AIC5] */
 #define AT91_AIC_CISR		0x114			/* Core Interrupt Status Register */
+#define AT91_AIC5_CISR		0x34			/* Core Interrupt Status Register [AIC5] */
 #define		AT91_AIC_NFIQ		(1 << 0)		/* nFIQ Status */
 #define		AT91_AIC_NIRQ		(1 << 1)		/* nIRQ Status */
 
 #define AT91_AIC_IECR		0x120			/* Interrupt Enable Command Register */
+#define AT91_AIC5_IECR		0x40			/* Interrupt Enable Command Register [AIC5] */
 #define AT91_AIC_IDCR		0x124			/* Interrupt Disable Command Register */
+#define AT91_AIC5_IDCR		0x44			/* Interrupt Disable Command Register [AIC5] */
 #define AT91_AIC_ICCR		0x128			/* Interrupt Clear Command Register */
+#define AT91_AIC5_ICCR		0x48			/* Interrupt Clear Command Register [AIC5] */
 #define AT91_AIC_ISCR		0x12c			/* Interrupt Set Command Register */
+#define AT91_AIC5_ISCR		0x4c			/* Interrupt Set Command Register [AIC5] */
 #define AT91_AIC_EOICR		0x130			/* End of Interrupt Command Register */
+#define AT91_AIC5_EOICR		0x38			/* End of Interrupt Command Register [AIC5] */
 #define AT91_AIC_SPU		0x134			/* Spurious Interrupt Vector Register */
+#define AT91_AIC5_SPU		0x3c			/* Spurious Interrupt Vector Register [AIC5] */
 #define AT91_AIC_DCR		0x138			/* Debug Control Register */
+#define AT91_AIC5_DCR		0x6c			/* Debug Control Register [AIC5] */
 #define		AT91_AIC_DCR_PROT	(1 << 0)		/* Protection Mode */
 #define		AT91_AIC_DCR_GMSK	(1 << 1)		/* General Mask */
 
 #define AT91_AIC_FFER		0x140			/* Fast Forcing Enable Register [SAM9 only] */
+#define AT91_AIC5_FFER		0x50			/* Fast Forcing Enable Register [AIC5] */
 #define AT91_AIC_FFDR		0x144			/* Fast Forcing Disable Register [SAM9 only] */
+#define AT91_AIC5_FFDR		0x54			/* Fast Forcing Disable Register [AIC5] */
 #define AT91_AIC_FFSR		0x148			/* Fast Forcing Status Register [SAM9 only] */
+#define AT91_AIC5_FFSR		0x58			/* Fast Forcing Status Register [AIC5] */
 
 void at91_aic_handle_irq(struct pt_regs *regs);
 
diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
index a0b9dca..20b0471 100644
--- a/arch/arm/mach-at91/irq.c
+++ b/arch/arm/mach-at91/irq.c
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/mm.h>
+#include <linux/bitmap.h>
 #include <linux/types.h>
 #include <linux/irq.h>
 #include <linux/of.h>
@@ -30,6 +31,7 @@
 #include <linux/of_irq.h>
 #include <linux/irqdomain.h>
 #include <linux/err.h>
+#include <linux/slab.h>
 
 #include <mach/hardware.h>
 #include <mach/at91_aic.h>
@@ -44,8 +46,115 @@
 void __iomem *at91_aic_base;
 static struct irq_domain *at91_aic_domain;
 static struct device_node *at91_aic_np;
+static unsigned int n_irqs = NR_AIC_IRQS;
+static unsigned long at91_aic_caps = 0;
 
-asmlinkage void __exception_irq_entry at91_aic_handle_irq(struct pt_regs *regs)
+/* AIC5 introduces a Source Select Register */
+#define AT91_AIC_CAP_AIC5	(1 << 0)
+#define has_aic5()		(at91_aic_caps & AT91_AIC_CAP_AIC5)
+
+#ifdef CONFIG_PM
+
+static unsigned long *wakeups;
+static unsigned long *backups;
+
+#define set_backup(bit) set_bit(bit, backups)
+#define clear_backup(bit) clear_bit(bit, backups)
+
+static int at91_aic_pm_init(void)
+{
+	backups = kzalloc(BITS_TO_LONGS(n_irqs) * sizeof(*backups), GFP_KERNEL);
+	if (!backups)
+		return -ENOMEM;
+
+	wakeups = kzalloc(BITS_TO_LONGS(n_irqs) * sizeof(*backups), GFP_KERNEL);
+	if (!wakeups) {
+		kfree(backups);
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static int at91_aic_set_wake(struct irq_data *d, unsigned value)
+{
+	if (unlikely(d->hwirq >= n_irqs))
+		return -EINVAL;
+
+	if (value)
+		set_bit(d->hwirq, wakeups);
+	else
+		clear_bit(d->hwirq, wakeups);
+
+	return 0;
+}
+
+void at91_irq_suspend(void)
+{
+	int i = 0, bit;
+
+	if (has_aic5()) {
+		/* disable enabled irqs */
+		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) {
+			at91_aic_write(AT91_AIC5_SSR,
+			               bit & AT91_AIC5_INTSEL_MSK);
+			at91_aic_write(AT91_AIC5_IDCR, 1);
+			i = bit;
+		}
+		/* enable wakeup irqs */
+		i = 0;
+		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) {
+			at91_aic_write(AT91_AIC5_SSR,
+			               bit & AT91_AIC5_INTSEL_MSK);
+			at91_aic_write(AT91_AIC5_IECR, 1);
+			i = bit;
+		}
+	} else {
+		at91_aic_write(AT91_AIC_IDCR, *backups);
+		at91_aic_write(AT91_AIC_IECR, *wakeups);
+	}
+}
+
+void at91_irq_resume(void)
+{
+	int i = 0, bit;
+
+	if (has_aic5()) {
+		/* disable wakeup irqs */
+		while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) {
+			at91_aic_write(AT91_AIC5_SSR,
+			               bit & AT91_AIC5_INTSEL_MSK);
+			at91_aic_write(AT91_AIC5_IDCR, 1);
+			i = bit;
+		}
+		/* enable irqs disabled for suspend */
+		i = 0;
+		while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) {
+			at91_aic_write(AT91_AIC5_SSR,
+			               bit & AT91_AIC5_INTSEL_MSK);
+			at91_aic_write(AT91_AIC5_IECR, 1);
+			i = bit;
+		}
+	} else {
+		at91_aic_write(AT91_AIC_IDCR, *wakeups);
+		at91_aic_write(AT91_AIC_IECR, *backups);
+	}
+}
+
+#else
+static inline int at91_aic_pm_init(void)
+{
+	return 0;
+}
+
+#define set_backup(bit)
+#define clear_backup(bit)
+#define at91_aic_set_wake	NULL
+
+#endif /* CONFIG_PM */
+
+asmlinkage void __exception_irq_entry
+at91_aic_handle_irq(struct pt_regs *regs)
 {
 	u32 irqnr;
 	u32 irqstat;
@@ -63,16 +172,53 @@ asmlinkage void __exception_irq_entry at91_aic_handle_irq(struct pt_regs *regs)
 		handle_IRQ(irqnr, regs);
 }
 
+asmlinkage void __exception_irq_entry
+at91_aic5_handle_irq(struct pt_regs *regs)
+{
+	u32 irqnr;
+	u32 irqstat;
+
+	irqnr = at91_aic_read(AT91_AIC5_IVR);
+	irqstat = at91_aic_read(AT91_AIC5_ISR);
+
+	if (!irqstat)
+		at91_aic_write(AT91_AIC5_EOICR, 0);
+	else
+		handle_IRQ(irqnr, regs);
+}
+
 static void at91_aic_mask_irq(struct irq_data *d)
 {
 	/* Disable interrupt on AIC */
 	at91_aic_write(AT91_AIC_IDCR, 1 << d->hwirq);
+	/* Update ISR cache */
+	clear_backup(d->hwirq);
+}
+
+static void at91_aic5_mask_irq(struct irq_data *d)
+{
+	/* Disable interrupt on AIC5 */
+	at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK);
+	at91_aic_write(AT91_AIC5_IDCR, 1);
+	/* Update ISR cache */
+	clear_backup(d->hwirq);
 }
 
 static void at91_aic_unmask_irq(struct irq_data *d)
 {
 	/* Enable interrupt on AIC */
 	at91_aic_write(AT91_AIC_IECR, 1 << d->hwirq);
+	/* Update ISR cache */
+	set_backup(d->hwirq);
+}
+
+static void at91_aic5_unmask_irq(struct irq_data *d)
+{
+	/* Enable interrupt on AIC5 */
+	at91_aic_write(AT91_AIC5_SSR, d->hwirq & AT91_AIC5_INTSEL_MSK);
+	at91_aic_write(AT91_AIC5_IECR, 1);
+	/* Update ISR cache */
+	set_backup(d->hwirq);
 }
 
 static void at91_aic_eoi(struct irq_data *d)
@@ -84,13 +230,18 @@ static void at91_aic_eoi(struct irq_data *d)
 	at91_aic_write(AT91_AIC_EOICR, 0);
 }
 
-unsigned int at91_extern_irq;
+static void at91_aic5_eoi(struct irq_data *d)
+{
+	at91_aic_write(AT91_AIC5_EOICR, 0);
+}
 
-#define is_extern_irq(hwirq) ((1 << (hwirq)) & at91_extern_irq)
+unsigned long *at91_extern_irq;
 
-static int at91_aic_set_type(struct irq_data *d, unsigned type)
+#define is_extern_irq(hwirq) test_bit(hwirq, at91_extern_irq)
+
+static int at91_aic_compute_srctype(struct irq_data *d, unsigned type)
 {
-	unsigned int smr, srctype;
+	int srctype;
 
 	switch (type) {
 	case IRQ_TYPE_LEVEL_HIGH:
@@ -103,58 +254,44 @@ static int at91_aic_set_type(struct irq_data *d, unsigned type)
 		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */
 			srctype = AT91_AIC_SRCTYPE_LOW;
 		else
-			return -EINVAL;
+			srctype = -EINVAL;
 		break;
 	case IRQ_TYPE_EDGE_FALLING:
 		if ((d->hwirq == AT91_ID_FIQ) || is_extern_irq(d->hwirq))		/* only supported on external interrupts */
 			srctype = AT91_AIC_SRCTYPE_FALLING;
 		else
-			return -EINVAL;
+			srctype = -EINVAL;
 		break;
 	default:
-		return -EINVAL;
+		srctype = -EINVAL;
 	}
 
-	smr = at91_aic_read(AT91_AIC_SMR(d->hwirq)) & ~AT91_AIC_SRCTYPE;
-	at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype);
-	return 0;
+	return srctype;
 }
 
-#ifdef CONFIG_PM
-
-static u32 wakeups;
-static u32 backups;
-
-static int at91_aic_set_wake(struct irq_data *d, unsigned value)
+static int at91_aic_set_type(struct irq_data *d, unsigned type)
 {
-	if (unlikely(d->hwirq >= NR_AIC_IRQS))
-		return -EINVAL;
-
-	if (value)
-		wakeups |= (1 << d->hwirq);
-	else
-		wakeups &= ~(1 << d->hwirq);
+	unsigned int smr;
+	int srctype;
+
+	srctype = at91_aic_compute_srctype(d, type);
+	if (srctype < 0)
+		return srctype;
+
+	if (has_aic5()) {
+		at91_aic_write(AT91_AIC5_SSR,
+		               d->hwirq & AT91_AIC5_INTSEL_MSK);
+		smr = at91_aic_read(AT91_AIC5_SMR) & ~AT91_AIC_SRCTYPE;
+		at91_aic_write(AT91_AIC5_SMR, smr | srctype);
+	} else {
+		smr = at91_aic_read(AT91_AIC_SMR(d->hwirq))
+		      & ~AT91_AIC_SRCTYPE;
+		at91_aic_write(AT91_AIC_SMR(d->hwirq), smr | srctype);
+	}
 
 	return 0;
 }
 
-void at91_irq_suspend(void)
-{
-	backups = at91_aic_read(AT91_AIC_IMR);
-	at91_aic_write(AT91_AIC_IDCR, backups);
-	at91_aic_write(AT91_AIC_IECR, wakeups);
-}
-
-void at91_irq_resume(void)
-{
-	at91_aic_write(AT91_AIC_IDCR, wakeups);
-	at91_aic_write(AT91_AIC_IECR, backups);
-}
-
-#else
-#define at91_aic_set_wake	NULL
-#endif
-
 static struct irq_chip at91_aic_chip = {
 	.name		= "AIC",
 	.irq_mask	= at91_aic_mask_irq,
@@ -190,6 +327,35 @@ static void __init at91_aic_hw_init(unsigned int spu_vector)
 	at91_aic_write(AT91_AIC_ICCR, 0xFFFFFFFF);
 }
 
+static void __init at91_aic5_hw_init(unsigned int spu_vector)
+{
+	int i;
+
+	/*
+	 * Perform 8 End Of Interrupt Command to make sure AIC
+	 * will not Lock out nIRQ
+	 */
+	for (i = 0; i < 8; i++)
+		at91_aic_write(AT91_AIC5_EOICR, 0);
+
+	/*
+	 * Spurious Interrupt ID in Spurious Vector Register.
+	 * When there is no current interrupt, the IRQ Vector Register
+	 * reads the value stored in AIC_SPU
+	 */
+	at91_aic_write(AT91_AIC5_SPU, spu_vector);
+
+	/* No debugging in AIC: Debug (Protect) Control Register */
+	at91_aic_write(AT91_AIC5_DCR, 0);
+
+	/* Disable and clear all interrupts initially */
+	for (i = 0; i < n_irqs; i++) {
+		at91_aic_write(AT91_AIC5_SSR, i & AT91_AIC5_INTSEL_MSK);
+		at91_aic_write(AT91_AIC5_IDCR, 1);
+		at91_aic_write(AT91_AIC5_ICCR, 1);
+	}
+}
+
 #if defined(CONFIG_OF)
 static int at91_aic_irq_map(struct irq_domain *h, unsigned int virq,
 							irq_hw_number_t hw)
@@ -206,6 +372,23 @@ static int at91_aic_irq_map(struct irq_domain *h, unsigned int virq,
 	return 0;
 }
 
+static int at91_aic5_irq_map(struct irq_domain *h, unsigned int virq,
+		irq_hw_number_t hw)
+{
+	at91_aic_write(AT91_AIC5_SSR, hw & AT91_AIC5_INTSEL_MSK);
+
+	/* Put virq number in Source Vector Register */
+	at91_aic_write(AT91_AIC5_SVR, virq);
+
+	/* Active Low interrupt, without priority */
+	at91_aic_write(AT91_AIC5_SMR, AT91_AIC_SRCTYPE_LOW);
+
+	irq_set_chip_and_handler(virq, &at91_aic_chip, handle_fasteoi_irq);
+	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE);
+
+	return 0;
+}
+
 static struct irq_domain_ops at91_aic_irq_ops = {
 	.map	= at91_aic_irq_map,
 	.xlate	= irq_domain_xlate_twocell,
@@ -230,34 +413,100 @@ static void __init at91_aic_of_priority(struct device_node *node)
 		pr_warn("AIC: no valid default irqs priorities\n");
 }
 
-int __init at91_aic_of_init(struct device_node *node,
-				     struct device_node *parent)
+static void __init at91_aic5_of_priority(struct device_node *node)
 {
 	struct property *prop;
 	const __be32 *p;
 	u32 val;
+	int i = 0;
+
+	of_property_for_each_u32(node, "atmel,default-irq-priorities", prop, p, val) {
+		at91_aic_write(AT91_AIC5_SSR, i & AT91_AIC5_INTSEL_MSK);
+		/* Put hardware irq number in Source Vector Register: */
+		at91_aic_write(AT91_AIC5_SVR, i);
+		/* Active Low interrupt, with the specified priority */
+		at91_aic_write(AT91_AIC5_SMR, AT91_AIC_SRCTYPE_LOW | val);
+		i++;
+	}
+
+	if (i < 1)
+		pr_warn("AIC: no valid default irqs priorities\n");
+}
+
+int __init at91_aic_of_common_init(struct device_node *node,
+                                   struct device_node *parent)
+{
+	struct property *prop;
+	const __be32 *p;
+	u32 val;
+
+	at91_extern_irq = kzalloc(BITS_TO_LONGS(n_irqs)
+	                          * sizeof(*at91_extern_irq), GFP_KERNEL);
+	if (!at91_extern_irq)
+		return -ENOMEM;
+
+	if (at91_aic_pm_init()) {
+		kfree(at91_extern_irq);
+		return -ENOMEM;
+	}
 
 	at91_aic_base = of_iomap(node, 0);
 	at91_aic_np = node;
 
-	at91_aic_domain = irq_domain_add_linear(at91_aic_np, NR_AIC_IRQS,
+	at91_aic_domain = irq_domain_add_linear(at91_aic_np, n_irqs,
 						&at91_aic_irq_ops, NULL);
 	if (!at91_aic_domain)
 		panic("Unable to add AIC irq domain (DT)\n");
 
-	at91_extern_irq = 0;
 	of_property_for_each_u32(node, "atmel,external-irqs", prop, p, val) {
-		if (val > 31)
-			pr_warn("AIC: external irq %d > 31 skip it\n", val);
+		if (val >= n_irqs)
+			pr_warn("AIC: external irq %d >= %d skip it\n",
+			        val, n_irqs);
 		else
-			at91_extern_irq |= (1 << val);
+			set_bit(val, at91_extern_irq);
 	}
 
+	irq_set_default_host(at91_aic_domain);
+
+	return 0;
+}
+
+int __init at91_aic_of_init(struct device_node *node,
+				     struct device_node *parent)
+{
+	int err;
+
+	err = at91_aic_of_common_init(node, parent);
+	if (err)
+		return err;
+
 	at91_aic_of_priority(node);
 
-	irq_set_default_host(at91_aic_domain);
+	at91_aic_hw_init(n_irqs);
 
-	at91_aic_hw_init(NR_AIC_IRQS);
+	return 0;
+}
+
+int __init at91_aic5_of_init(struct device_node *node,
+				     struct device_node *parent)
+{
+	int err;
+
+	at91_aic_caps |= AT91_AIC_CAP_AIC5;
+	n_irqs = NR_AIC5_IRQS;
+	at91_aic_chip.irq_ack           = at91_aic5_mask_irq;
+	at91_aic_chip.irq_mask		= at91_aic5_mask_irq;
+	at91_aic_chip.irq_unmask	= at91_aic5_unmask_irq;
+	at91_aic_chip.irq_eoi		= at91_aic5_eoi;
+	at91_aic_irq_ops.map		= at91_aic5_irq_map;
+
+	err = at91_aic_of_common_init(node, parent);
+	if (err)
+		return err;
+
+	at91_aic5_of_priority(node);
+
+	at91_aic5_hw_init(n_irqs);
 
 	return 0;
 }
@@ -266,11 +515,14 @@ int __init at91_aic_of_init(struct device_node *node,
 /*
  * Initialize the AIC interrupt controller.
  */
-void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
+void __init at91_aic_init(unsigned int *priority)
 {
 	unsigned int i;
 	int irq_base;
 
+	if (at91_aic_pm_init())
+		panic("Unable to allocate bit maps\n");
+
 	at91_aic_base = ioremap(AT91_AIC, 512);
 	if (!at91_aic_base)
 		panic("Unable to ioremap AIC registers\n");
@@ -294,15 +546,14 @@ void __init at91_aic_init(unsigned int priority[NR_AIC_IRQS])
 	 * The IVR is used by macro get_irqnr_and_base to read and verify.
 	 * The irq number is NR_AIC_IRQS when a spurious interrupt has occurred.
 	 */
-	for (i = 0; i < NR_AIC_IRQS; i++) {
+	for (i = 0; i < n_irqs; i++) {
 		/* Put hardware irq number in Source Vector Register: */
 		at91_aic_write(AT91_AIC_SVR(i), i);
 		/* Active Low interrupt, with the specified priority */
 		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | priority[i]);
-
 		irq_set_chip_and_handler(i, &at91_aic_chip, handle_fasteoi_irq);
 		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
 	}
 
-	at91_aic_hw_init(NR_AIC_IRQS);
+	at91_aic_hw_init(n_irqs);
 }
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 2/7] ARM: at91: add of default irq priorities support
  2012-06-15  9:09 ` [PATCH v2 2/7] ARM: at91: add of default irq priorities support Ludovic Desroches
@ 2012-06-18  2:24   ` Rob Herring
  2012-06-19  6:45     ` ludovic.desroches
  0 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2012-06-18  2:24 UTC (permalink / raw)
  To: linux-arm-kernel

On 06/15/2012 04:09 AM, Ludovic Desroches wrote:
> From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> 
> You will have to set the default priority for all the irq.
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
> ---
>  .../devicetree/bindings/arm/atmel-aic.txt          |    2 +
>  arch/arm/boot/dts/at91sam9260.dtsi                 |   34 ++++++++++++++++
>  arch/arm/boot/dts/at91sam9263.dtsi                 |   34 ++++++++++++++++
>  arch/arm/boot/dts/at91sam9g45.dtsi                 |   34 ++++++++++++++++
>  arch/arm/boot/dts/at91sam9x5.dtsi                  |   34 ++++++++++++++++
>  arch/arm/mach-at91/at91sam9x5.c                    |   42 --------------------
>  arch/arm/mach-at91/irq.c                           |   21 ++++++++++
>  7 files changed, 159 insertions(+), 42 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt b/Documentation/devicetree/bindings/arm/atmel-aic.txt
> index 1953b0c..66aa53d 100644
> --- a/Documentation/devicetree/bindings/arm/atmel-aic.txt
> +++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt
> @@ -16,6 +16,8 @@ Required properties:
>        Default flag for internal sources should be set to 4 (active high).
>  - reg: Should contain AIC registers location and length
>  - atmel,external-irqs: u32 array of external irqs.
> +- atmel,default-irq-priorities: u32 array of default irq priorities. This need
> +  to contain all the irq.
>  
>  Examples:
>  	/*
> diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
> index f2c9643..791ef87 100644
> --- a/arch/arm/boot/dts/at91sam9260.dtsi
> +++ b/arch/arm/boot/dts/at91sam9260.dtsi
> @@ -57,6 +57,40 @@
>  				interrupt-controller;
>  				reg = <0xfffff000 0x200>;
>  				atmel,external-irqs = <29 30 31>;
> +				atmel,default-irq-priorities = <
> +					7	/* Advanced Interrupt Controller */
> +					7	/* System Peripherals */
> +					1	/* Parallel IO Controller A */
> +					1	/* Parallel IO Controller B */
> +					1	/* Parallel IO Controller C */
> +					0	/* Analog-to-Digital Converter */
> +					5	/* USART 0 */
> +					5	/* USART 1 */
> +					5	/* USART 2 */
> +					0	/* Multimedia Card Interface */
> +					2	/* USB Device Port */
> +					6	/* Two-Wire Interface */
> +					5	/* Serial Peripheral Interface 0 */
> +					5	/* Serial Peripheral Interface 1 */
> +					5	/* Serial Synchronous Controller */
> +					0
> +					0
> +					0	/* Timer Counter 0 */
> +					0	/* Timer Counter 1 */
> +					0	/* Timer Counter 2 */
> +					2	/* USB Host port */
> +					3	/* Ethernet */
> +					0	/* Image Sensor Interface */
> +					5	/* USART 3 */
> +					5	/* USART 4 */
> +					5	/* USART 5 */
> +					0	/* Timer Counter 3 */
> +					0	/* Timer Counter 4 */
> +					0	/* Timer Counter 5 */
> +					0	/* Advanced Interrupt Controller */
> +					0	/* Advanced Interrupt Controller */
> +					0	/* Advanced Interrupt Controller */

I think this would be better as part of the interrupts property (i.e.
another cell). Priorities are a fairly common interrupt controller
feature, so we should support it in a common way.

Rob

> +				>;
>  			};
>  
>  			ramc0: ramc at ffffea00 {
> diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi
> index c803636..8a5923a 100644
> --- a/arch/arm/boot/dts/at91sam9263.dtsi
> +++ b/arch/arm/boot/dts/at91sam9263.dtsi
> @@ -53,6 +53,40 @@
>  				interrupt-controller;
>  				reg = <0xfffff000 0x200>;
>  				atmel,external-irqs = <30 31>;
> +				atmel,default-irq-priorities = <
> +					7	/* Advanced Interrupt Controller (FIQ) */
> +					7	/* System Peripherals */
> +					1	/* Parallel IO Controller A */
> +					1	/* Parallel IO Controller B */
> +					1	/* Parallel IO Controller C, D and E */
> +					0
> +					0
> +					5	/* USART 0 */
> +					5	/* USART 1 */
> +					5	/* USART 2 */
> +					0	/* Multimedia Card Interface 0 */
> +					0	/* Multimedia Card Interface 1 */
> +					3	/* CAN */
> +					6	/* Two-Wire Interface */
> +					5	/* Serial Peripheral Interface 0 */
> +					5	/* Serial Peripheral Interface 1 */
> +					4	/* Serial Synchronous Controller 0 */
> +					4	/* Serial Synchronous Controller 1 */
> +					5	/* AC97 Controller */
> +					0	/* Timer Counter 0, 1 and 2 */
> +					0	/* Pulse Width Modulation Controller */
> +					3	/* Ethernet */
> +					0
> +					0	/* 2D Graphic Engine */
> +					2	/* USB Device Port */
> +					0	/* Image Sensor Interface */
> +					3	/* LDC Controller */
> +					0	/* DMA Controller */
> +					0
> +					2	/* USB Host port */
> +					0	/* Advanced Interrupt Controller (IRQ0) */
> +					0	/* Advanced Interrupt Controller (IRQ1) */
> +				>;
>  			};
>  
>  			pmc: pmc at fffffc00 {
> diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
> index 2d01ce2..d70e4f0 100644
> --- a/arch/arm/boot/dts/at91sam9g45.dtsi
> +++ b/arch/arm/boot/dts/at91sam9g45.dtsi
> @@ -58,6 +58,40 @@
>  				interrupt-controller;
>  				reg = <0xfffff000 0x200>;
>  				atmel,external-irqs = <31>;
> +				atmel,default-irq-priorities = <
> +					7	/* Advanced Interrupt Controller (FIQ) */
> +					7	/* System Peripherals */
> +					1	/* Parallel IO Controller A */
> +					1	/* Parallel IO Controller B */
> +					1	/* Parallel IO Controller C */
> +					1	/* Parallel IO Controller D and E */
> +					0
> +					5	/* USART 0 */
> +					5	/* USART 1 */
> +					5	/* USART 2 */
> +					5	/* USART 3 */
> +					0	/* Multimedia Card Interface 0 */
> +					6	/* Two-Wire Interface 0 */
> +					6	/* Two-Wire Interface 1 */
> +					5	/* Serial Peripheral Interface 0 */
> +					5	/* Serial Peripheral Interface 1 */
> +					4	/* Serial Synchronous Controller 0 */
> +					4	/* Serial Synchronous Controller 1 */
> +					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
> +					0	/* Pulse Width Modulation Controller */
> +					0	/* Touch Screen Controller */
> +					0	/* DMA Controller */
> +					2	/* USB Host High Speed port */
> +					3	/* LDC Controller */
> +					5	/* AC97 Controller */
> +					3	/* Ethernet */
> +					0	/* Image Sensor Interface */
> +					2	/* USB Device High speed port */
> +					0
> +					0	/* Multimedia Card Interface 1 */
> +					0
> +					0	/* Advanced Interrupt Controller (IRQ0) */
> +				>;
>  			};
>  
>  			ramc0: ramc at ffffe400 {
> diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
> index 6a0a0fb..fcd9d43 100644
> --- a/arch/arm/boot/dts/at91sam9x5.dtsi
> +++ b/arch/arm/boot/dts/at91sam9x5.dtsi
> @@ -56,6 +56,40 @@
>  				interrupt-controller;
>  				reg = <0xfffff000 0x200>;
>  				atmel,external-irqs = <31>;
> +				atmel,default-irq-priorities = <
> +					7	/* Advanced Interrupt Controller (FIQ) */
> +					7	/* System Peripherals */
> +					1	/* Parallel IO Controller A and B */
> +					1	/* Parallel IO Controller C and D */
> +					4	/* Soft Modem */
> +					5	/* USART 0 */
> +					5	/* USART 1 */
> +					5	/* USART 2 */
> +					5	/* USART 3 */
> +					6	/* Two-Wire Interface 0 */
> +					6	/* Two-Wire Interface 1 */
> +					6	/* Two-Wire Interface 2 */
> +					0	/* Multimedia Card Interface 0 */
> +					5	/* Serial Peripheral Interface 0 */
> +					5	/* Serial Peripheral Interface 1 */
> +					5	/* UART 0 */
> +					5	/* UART 1 */
> +					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
> +					0	/* Pulse Width Modulation Controller */
> +					0	/* ADC Controller */
> +					0	/* DMA Controller 0 */
> +					0	/* DMA Controller 1 */
> +					2	/* USB Host High Speed port */
> +					2	/* USB Device High speed port */
> +					3	/* Ethernet MAC 0 */
> +					3	/* LDC Controller or Image Sensor Interface */
> +					0	/* Multimedia Card Interface 1 */
> +					3	/* Ethernet MAC 1 */
> +					4	/* Synchronous Serial Interface */
> +					4	/* CAN Controller 0 */
> +					4	/* CAN Controller 1 */
> +					0	/* Advanced Interrupt Controller (IRQ0) */
> +				>;
>  			};
>  
>  			ramc0: ramc at ffffe800 {
> diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
> index 537710b..1e7ef56 100644
> --- a/arch/arm/mach-at91/at91sam9x5.c
> +++ b/arch/arm/mach-at91/at91sam9x5.c
> @@ -316,50 +316,8 @@ void __init at91sam9x5_initialize(void)
>  	at91_gpio_init(NULL, 0);
>  }
>  
> -/* --------------------------------------------------------------------
> - *  Interrupt initialization
> - * -------------------------------------------------------------------- */
> -/*
> - * The default interrupt priority levels (0 = lowest, 7 = highest).
> - */
> -static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = {
> -	7,	/* Advanced Interrupt Controller (FIQ) */
> -	7,	/* System Peripherals */
> -	1,	/* Parallel IO Controller A and B */
> -	1,	/* Parallel IO Controller C and D */
> -	4,	/* Soft Modem */
> -	5,	/* USART 0 */
> -	5,	/* USART 1 */
> -	5,	/* USART 2 */
> -	5,	/* USART 3 */
> -	6,	/* Two-Wire Interface 0 */
> -	6,	/* Two-Wire Interface 1 */
> -	6,	/* Two-Wire Interface 2 */
> -	0,	/* Multimedia Card Interface 0 */
> -	5,	/* Serial Peripheral Interface 0 */
> -	5,	/* Serial Peripheral Interface 1 */
> -	5,	/* UART 0 */
> -	5,	/* UART 1 */
> -	0,	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
> -	0,	/* Pulse Width Modulation Controller */
> -	0,	/* ADC Controller */
> -	0,	/* DMA Controller 0 */
> -	0,	/* DMA Controller 1 */
> -	2,	/* USB Host High Speed port */
> -	2,	/* USB Device High speed port */
> -	3,	/* Ethernet MAC 0 */
> -	3,	/* LDC Controller or Image Sensor Interface */
> -	0,	/* Multimedia Card Interface 1 */
> -	3,	/* Ethernet MAC 1 */
> -	4,	/* Synchronous Serial Interface */
> -	4,	/* CAN Controller 0 */
> -	4,	/* CAN Controller 1 */
> -	0,	/* Advanced Interrupt Controller (IRQ0) */
> -};
> -
>  struct at91_init_soc __initdata at91sam9x5_soc = {
>  	.map_io = at91sam9x5_map_io,
> -	.default_irq_priority = at91sam9x5_default_irq_priority,
>  	.register_clocks = at91sam9x5_register_clocks,
>  	.init = at91sam9x5_initialize,
>  };
> diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
> index df8605f..8e6ac53 100644
> --- a/arch/arm/mach-at91/irq.c
> +++ b/arch/arm/mach-at91/irq.c
> @@ -191,6 +191,25 @@ static struct irq_domain_ops at91_aic_irq_ops = {
>  	.xlate	= irq_domain_xlate_twocell,
>  };
>  
> +static void __init at91_aic_of_priority(struct device_node *node)
> +{
> +	struct property *prop;
> +	const __be32 *p;
> +	u32 val;
> +	int i = 0;
> +
> +	of_property_for_each_u32(node, "atmel,default-irq-priorities", prop, p, val) {
> +		/* Put hardware irq number in Source Vector Register: */
> +		at91_aic_write(AT91_AIC_SVR(i), i);
> +		/* Active Low interrupt, with the specified priority */
> +		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | val);
> +		i++;
> +	}
> +
> +	if (i < 1)
> +		pr_warn("AIC: no valid default irqs priorities\n");
> +}
> +
>  int __init at91_aic_of_init(struct device_node *node,
>  				     struct device_node *parent)
>  {
> @@ -214,6 +233,8 @@ int __init at91_aic_of_init(struct device_node *node,
>  			at91_extern_irq |= (1 << val);
>  	}
>  
> +	at91_aic_of_priority(node);
> +
>  	irq_set_default_host(at91_aic_domain);
>  
>  	at91_aic_hw_init(NR_AIC_IRQS);

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 2/7] ARM: at91: add of default irq priorities support
  2012-06-18  2:24   ` Rob Herring
@ 2012-06-19  6:45     ` ludovic.desroches
  2012-06-19 15:56       ` Rob Herring
  0 siblings, 1 reply; 12+ messages in thread
From: ludovic.desroches @ 2012-06-19  6:45 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Rob,

Le 06/18/2012 04:24 AM, Rob Herring a ?crit :
> On 06/15/2012 04:09 AM, Ludovic Desroches wrote:
>> From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
>>
>> You will have to set the default priority for all the irq.
>>
>> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
>> ---
>>   .../devicetree/bindings/arm/atmel-aic.txt          |    2 +
>>   arch/arm/boot/dts/at91sam9260.dtsi                 |   34 ++++++++++++++++
>>   arch/arm/boot/dts/at91sam9263.dtsi                 |   34 ++++++++++++++++
>>   arch/arm/boot/dts/at91sam9g45.dtsi                 |   34 ++++++++++++++++
>>   arch/arm/boot/dts/at91sam9x5.dtsi                  |   34 ++++++++++++++++
>>   arch/arm/mach-at91/at91sam9x5.c                    |   42 --------------------
>>   arch/arm/mach-at91/irq.c                           |   21 ++++++++++
>>   7 files changed, 159 insertions(+), 42 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt b/Documentation/devicetree/bindings/arm/atmel-aic.txt
>> index 1953b0c..66aa53d 100644
>> --- a/Documentation/devicetree/bindings/arm/atmel-aic.txt
>> +++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt
>> @@ -16,6 +16,8 @@ Required properties:
>>         Default flag for internal sources should be set to 4 (active high).
>>   - reg: Should contain AIC registers location and length
>>   - atmel,external-irqs: u32 array of external irqs.
>> +- atmel,default-irq-priorities: u32 array of default irq priorities. This need
>> +  to contain all the irq.
>>
>>   Examples:
>>   	/*
>> diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
>> index f2c9643..791ef87 100644
>> --- a/arch/arm/boot/dts/at91sam9260.dtsi
>> +++ b/arch/arm/boot/dts/at91sam9260.dtsi
>> @@ -57,6 +57,40 @@
>>   				interrupt-controller;
>>   				reg = <0xfffff000 0x200>;
>>   				atmel,external-irqs = <29 30 31>;
>> +				atmel,default-irq-priorities = <
>> +					7	/* Advanced Interrupt Controller */
>> +					7	/* System Peripherals */
>> +					1	/* Parallel IO Controller A */
>> +					1	/* Parallel IO Controller B */
>> +					1	/* Parallel IO Controller C */
>> +					0	/* Analog-to-Digital Converter */
>> +					5	/* USART 0 */
>> +					5	/* USART 1 */
>> +					5	/* USART 2 */
>> +					0	/* Multimedia Card Interface */
>> +					2	/* USB Device Port */
>> +					6	/* Two-Wire Interface */
>> +					5	/* Serial Peripheral Interface 0 */
>> +					5	/* Serial Peripheral Interface 1 */
>> +					5	/* Serial Synchronous Controller */
>> +					0
>> +					0
>> +					0	/* Timer Counter 0 */
>> +					0	/* Timer Counter 1 */
>> +					0	/* Timer Counter 2 */
>> +					2	/* USB Host port */
>> +					3	/* Ethernet */
>> +					0	/* Image Sensor Interface */
>> +					5	/* USART 3 */
>> +					5	/* USART 4 */
>> +					5	/* USART 5 */
>> +					0	/* Timer Counter 3 */
>> +					0	/* Timer Counter 4 */
>> +					0	/* Timer Counter 5 */
>> +					0	/* Advanced Interrupt Controller */
>> +					0	/* Advanced Interrupt Controller */
>> +					0	/* Advanced Interrupt Controller */
>
> I think this would be better as part of the interrupts property (i.e.
> another cell). Priorities are a fairly common interrupt controller
> feature, so we should support it in a common way.
>
> Rob
>

If people want to modify the priority of an irq it has to be done as you 
said in the interrupt property.

But we want to set default priority values:
- you can see quickly priorities of all interrupts at this place instead 
of having to look through all interrupts property.
- we don't want a single default priority value for all the interrupts
- we don't want people to take care about interrupt priorities. Most of 
them don't have to change default values. If they really need it, they 
could use the interrupt property to modify the default value but it is 
at their own risk.
- not all devices have drivers that will configure the priority.

Regards

Ludovic

>> +				>;
>>   			};
>>
>>   			ramc0: ramc at ffffea00 {
>> diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi
>> index c803636..8a5923a 100644
>> --- a/arch/arm/boot/dts/at91sam9263.dtsi
>> +++ b/arch/arm/boot/dts/at91sam9263.dtsi
>> @@ -53,6 +53,40 @@
>>   				interrupt-controller;
>>   				reg = <0xfffff000 0x200>;
>>   				atmel,external-irqs = <30 31>;
>> +				atmel,default-irq-priorities = <
>> +					7	/* Advanced Interrupt Controller (FIQ) */
>> +					7	/* System Peripherals */
>> +					1	/* Parallel IO Controller A */
>> +					1	/* Parallel IO Controller B */
>> +					1	/* Parallel IO Controller C, D and E */
>> +					0
>> +					0
>> +					5	/* USART 0 */
>> +					5	/* USART 1 */
>> +					5	/* USART 2 */
>> +					0	/* Multimedia Card Interface 0 */
>> +					0	/* Multimedia Card Interface 1 */
>> +					3	/* CAN */
>> +					6	/* Two-Wire Interface */
>> +					5	/* Serial Peripheral Interface 0 */
>> +					5	/* Serial Peripheral Interface 1 */
>> +					4	/* Serial Synchronous Controller 0 */
>> +					4	/* Serial Synchronous Controller 1 */
>> +					5	/* AC97 Controller */
>> +					0	/* Timer Counter 0, 1 and 2 */
>> +					0	/* Pulse Width Modulation Controller */
>> +					3	/* Ethernet */
>> +					0
>> +					0	/* 2D Graphic Engine */
>> +					2	/* USB Device Port */
>> +					0	/* Image Sensor Interface */
>> +					3	/* LDC Controller */
>> +					0	/* DMA Controller */
>> +					0
>> +					2	/* USB Host port */
>> +					0	/* Advanced Interrupt Controller (IRQ0) */
>> +					0	/* Advanced Interrupt Controller (IRQ1) */
>> +				>;
>>   			};
>>
>>   			pmc: pmc at fffffc00 {
>> diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi
>> index 2d01ce2..d70e4f0 100644
>> --- a/arch/arm/boot/dts/at91sam9g45.dtsi
>> +++ b/arch/arm/boot/dts/at91sam9g45.dtsi
>> @@ -58,6 +58,40 @@
>>   				interrupt-controller;
>>   				reg = <0xfffff000 0x200>;
>>   				atmel,external-irqs = <31>;
>> +				atmel,default-irq-priorities = <
>> +					7	/* Advanced Interrupt Controller (FIQ) */
>> +					7	/* System Peripherals */
>> +					1	/* Parallel IO Controller A */
>> +					1	/* Parallel IO Controller B */
>> +					1	/* Parallel IO Controller C */
>> +					1	/* Parallel IO Controller D and E */
>> +					0
>> +					5	/* USART 0 */
>> +					5	/* USART 1 */
>> +					5	/* USART 2 */
>> +					5	/* USART 3 */
>> +					0	/* Multimedia Card Interface 0 */
>> +					6	/* Two-Wire Interface 0 */
>> +					6	/* Two-Wire Interface 1 */
>> +					5	/* Serial Peripheral Interface 0 */
>> +					5	/* Serial Peripheral Interface 1 */
>> +					4	/* Serial Synchronous Controller 0 */
>> +					4	/* Serial Synchronous Controller 1 */
>> +					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
>> +					0	/* Pulse Width Modulation Controller */
>> +					0	/* Touch Screen Controller */
>> +					0	/* DMA Controller */
>> +					2	/* USB Host High Speed port */
>> +					3	/* LDC Controller */
>> +					5	/* AC97 Controller */
>> +					3	/* Ethernet */
>> +					0	/* Image Sensor Interface */
>> +					2	/* USB Device High speed port */
>> +					0
>> +					0	/* Multimedia Card Interface 1 */
>> +					0
>> +					0	/* Advanced Interrupt Controller (IRQ0) */
>> +				>;
>>   			};
>>
>>   			ramc0: ramc at ffffe400 {
>> diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
>> index 6a0a0fb..fcd9d43 100644
>> --- a/arch/arm/boot/dts/at91sam9x5.dtsi
>> +++ b/arch/arm/boot/dts/at91sam9x5.dtsi
>> @@ -56,6 +56,40 @@
>>   				interrupt-controller;
>>   				reg = <0xfffff000 0x200>;
>>   				atmel,external-irqs = <31>;
>> +				atmel,default-irq-priorities = <
>> +					7	/* Advanced Interrupt Controller (FIQ) */
>> +					7	/* System Peripherals */
>> +					1	/* Parallel IO Controller A and B */
>> +					1	/* Parallel IO Controller C and D */
>> +					4	/* Soft Modem */
>> +					5	/* USART 0 */
>> +					5	/* USART 1 */
>> +					5	/* USART 2 */
>> +					5	/* USART 3 */
>> +					6	/* Two-Wire Interface 0 */
>> +					6	/* Two-Wire Interface 1 */
>> +					6	/* Two-Wire Interface 2 */
>> +					0	/* Multimedia Card Interface 0 */
>> +					5	/* Serial Peripheral Interface 0 */
>> +					5	/* Serial Peripheral Interface 1 */
>> +					5	/* UART 0 */
>> +					5	/* UART 1 */
>> +					0	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
>> +					0	/* Pulse Width Modulation Controller */
>> +					0	/* ADC Controller */
>> +					0	/* DMA Controller 0 */
>> +					0	/* DMA Controller 1 */
>> +					2	/* USB Host High Speed port */
>> +					2	/* USB Device High speed port */
>> +					3	/* Ethernet MAC 0 */
>> +					3	/* LDC Controller or Image Sensor Interface */
>> +					0	/* Multimedia Card Interface 1 */
>> +					3	/* Ethernet MAC 1 */
>> +					4	/* Synchronous Serial Interface */
>> +					4	/* CAN Controller 0 */
>> +					4	/* CAN Controller 1 */
>> +					0	/* Advanced Interrupt Controller (IRQ0) */
>> +				>;
>>   			};
>>
>>   			ramc0: ramc at ffffe800 {
>> diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
>> index 537710b..1e7ef56 100644
>> --- a/arch/arm/mach-at91/at91sam9x5.c
>> +++ b/arch/arm/mach-at91/at91sam9x5.c
>> @@ -316,50 +316,8 @@ void __init at91sam9x5_initialize(void)
>>   	at91_gpio_init(NULL, 0);
>>   }
>>
>> -/* --------------------------------------------------------------------
>> - *  Interrupt initialization
>> - * -------------------------------------------------------------------- */
>> -/*
>> - * The default interrupt priority levels (0 = lowest, 7 = highest).
>> - */
>> -static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS] __initdata = {
>> -	7,	/* Advanced Interrupt Controller (FIQ) */
>> -	7,	/* System Peripherals */
>> -	1,	/* Parallel IO Controller A and B */
>> -	1,	/* Parallel IO Controller C and D */
>> -	4,	/* Soft Modem */
>> -	5,	/* USART 0 */
>> -	5,	/* USART 1 */
>> -	5,	/* USART 2 */
>> -	5,	/* USART 3 */
>> -	6,	/* Two-Wire Interface 0 */
>> -	6,	/* Two-Wire Interface 1 */
>> -	6,	/* Two-Wire Interface 2 */
>> -	0,	/* Multimedia Card Interface 0 */
>> -	5,	/* Serial Peripheral Interface 0 */
>> -	5,	/* Serial Peripheral Interface 1 */
>> -	5,	/* UART 0 */
>> -	5,	/* UART 1 */
>> -	0,	/* Timer Counter 0, 1, 2, 3, 4 and 5 */
>> -	0,	/* Pulse Width Modulation Controller */
>> -	0,	/* ADC Controller */
>> -	0,	/* DMA Controller 0 */
>> -	0,	/* DMA Controller 1 */
>> -	2,	/* USB Host High Speed port */
>> -	2,	/* USB Device High speed port */
>> -	3,	/* Ethernet MAC 0 */
>> -	3,	/* LDC Controller or Image Sensor Interface */
>> -	0,	/* Multimedia Card Interface 1 */
>> -	3,	/* Ethernet MAC 1 */
>> -	4,	/* Synchronous Serial Interface */
>> -	4,	/* CAN Controller 0 */
>> -	4,	/* CAN Controller 1 */
>> -	0,	/* Advanced Interrupt Controller (IRQ0) */
>> -};
>> -
>>   struct at91_init_soc __initdata at91sam9x5_soc = {
>>   	.map_io = at91sam9x5_map_io,
>> -	.default_irq_priority = at91sam9x5_default_irq_priority,
>>   	.register_clocks = at91sam9x5_register_clocks,
>>   	.init = at91sam9x5_initialize,
>>   };
>> diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
>> index df8605f..8e6ac53 100644
>> --- a/arch/arm/mach-at91/irq.c
>> +++ b/arch/arm/mach-at91/irq.c
>> @@ -191,6 +191,25 @@ static struct irq_domain_ops at91_aic_irq_ops = {
>>   	.xlate	= irq_domain_xlate_twocell,
>>   };
>>
>> +static void __init at91_aic_of_priority(struct device_node *node)
>> +{
>> +	struct property *prop;
>> +	const __be32 *p;
>> +	u32 val;
>> +	int i = 0;
>> +
>> +	of_property_for_each_u32(node, "atmel,default-irq-priorities", prop, p, val) {
>> +		/* Put hardware irq number in Source Vector Register: */
>> +		at91_aic_write(AT91_AIC_SVR(i), i);
>> +		/* Active Low interrupt, with the specified priority */
>> +		at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | val);
>> +		i++;
>> +	}
>> +
>> +	if (i < 1)
>> +		pr_warn("AIC: no valid default irqs priorities\n");
>> +}
>> +
>>   int __init at91_aic_of_init(struct device_node *node,
>>   				     struct device_node *parent)
>>   {
>> @@ -214,6 +233,8 @@ int __init at91_aic_of_init(struct device_node *node,
>>   			at91_extern_irq |= (1 << val);
>>   	}
>>
>> +	at91_aic_of_priority(node);
>> +
>>   	irq_set_default_host(at91_aic_domain);
>>
>>   	at91_aic_hw_init(NR_AIC_IRQS);
>
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 2/7] ARM: at91: add of default irq priorities support
  2012-06-19  6:45     ` ludovic.desroches
@ 2012-06-19 15:56       ` Rob Herring
  0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2012-06-19 15:56 UTC (permalink / raw)
  To: linux-arm-kernel

On 06/19/2012 01:45 AM, ludovic.desroches wrote:
> Hi Rob,
> 
> Le 06/18/2012 04:24 AM, Rob Herring a ?crit :
>> On 06/15/2012 04:09 AM, Ludovic Desroches wrote:
>>> From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
>>>
>>> You will have to set the default priority for all the irq.
>>>
>>> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
>>> ---
>>>   .../devicetree/bindings/arm/atmel-aic.txt          |    2 +
>>>   arch/arm/boot/dts/at91sam9260.dtsi                 |   34
>>> ++++++++++++++++
>>>   arch/arm/boot/dts/at91sam9263.dtsi                 |   34
>>> ++++++++++++++++
>>>   arch/arm/boot/dts/at91sam9g45.dtsi                 |   34
>>> ++++++++++++++++
>>>   arch/arm/boot/dts/at91sam9x5.dtsi                  |   34
>>> ++++++++++++++++
>>>   arch/arm/mach-at91/at91sam9x5.c                    |   42
>>> --------------------
>>>   arch/arm/mach-at91/irq.c                           |   21 ++++++++++
>>>   7 files changed, 159 insertions(+), 42 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/arm/atmel-aic.txt
>>> b/Documentation/devicetree/bindings/arm/atmel-aic.txt
>>> index 1953b0c..66aa53d 100644
>>> --- a/Documentation/devicetree/bindings/arm/atmel-aic.txt
>>> +++ b/Documentation/devicetree/bindings/arm/atmel-aic.txt
>>> @@ -16,6 +16,8 @@ Required properties:
>>>         Default flag for internal sources should be set to 4 (active
>>> high).
>>>   - reg: Should contain AIC registers location and length
>>>   - atmel,external-irqs: u32 array of external irqs.
>>> +- atmel,default-irq-priorities: u32 array of default irq priorities.
>>> This need
>>> +  to contain all the irq.
>>>
>>>   Examples:
>>>       /*
>>> diff --git a/arch/arm/boot/dts/at91sam9260.dtsi
>>> b/arch/arm/boot/dts/at91sam9260.dtsi
>>> index f2c9643..791ef87 100644
>>> --- a/arch/arm/boot/dts/at91sam9260.dtsi
>>> +++ b/arch/arm/boot/dts/at91sam9260.dtsi
>>> @@ -57,6 +57,40 @@
>>>                   interrupt-controller;
>>>                   reg = <0xfffff000 0x200>;
>>>                   atmel,external-irqs = <29 30 31>;
>>> +                atmel,default-irq-priorities = <
>>> +                    7    /* Advanced Interrupt Controller */
>>> +                    7    /* System Peripherals */
>>> +                    1    /* Parallel IO Controller A */
>>> +                    1    /* Parallel IO Controller B */
>>> +                    1    /* Parallel IO Controller C */
>>> +                    0    /* Analog-to-Digital Converter */
>>> +                    5    /* USART 0 */
>>> +                    5    /* USART 1 */
>>> +                    5    /* USART 2 */
>>> +                    0    /* Multimedia Card Interface */
>>> +                    2    /* USB Device Port */
>>> +                    6    /* Two-Wire Interface */
>>> +                    5    /* Serial Peripheral Interface 0 */
>>> +                    5    /* Serial Peripheral Interface 1 */
>>> +                    5    /* Serial Synchronous Controller */
>>> +                    0
>>> +                    0
>>> +                    0    /* Timer Counter 0 */
>>> +                    0    /* Timer Counter 1 */
>>> +                    0    /* Timer Counter 2 */
>>> +                    2    /* USB Host port */
>>> +                    3    /* Ethernet */
>>> +                    0    /* Image Sensor Interface */
>>> +                    5    /* USART 3 */
>>> +                    5    /* USART 4 */
>>> +                    5    /* USART 5 */
>>> +                    0    /* Timer Counter 3 */
>>> +                    0    /* Timer Counter 4 */
>>> +                    0    /* Timer Counter 5 */
>>> +                    0    /* Advanced Interrupt Controller */
>>> +                    0    /* Advanced Interrupt Controller */
>>> +                    0    /* Advanced Interrupt Controller */
>>
>> I think this would be better as part of the interrupts property (i.e.
>> another cell). Priorities are a fairly common interrupt controller
>> feature, so we should support it in a common way.
>>
>> Rob
>>
> 
> If people want to modify the priority of an irq it has to be done as you
> said in the interrupt property.

So now we have the same data in 2 places? I don't see that documented
anywhere.

> But we want to set default priority values:
> - you can see quickly priorities of all interrupts at this place instead
> of having to look through all interrupts property.

A script parsing the dts could do that for you.

> - we don't want a single default priority value for all the interrupts

A per interrupt property gives you a value per interrupt.

> - we don't want people to take care about interrupt priorities. Most of
> them don't have to change default values. If they really need it, they
> could use the interrupt property to modify the default value but it is
> at their own risk.

Who exactly do you expect to change these. End users should not be
touching the dtb ideally. The dtb should be considered fixed in
firmware. Yes, we can override it, but it should not be expected to
change frequently for a given piece of h/w. So I don't see the reason
for default and override values.

If you expect this to be per end user, then a userspace interface to
adjust priorities would be more appropriate.

> - not all devices have drivers that will configure the priority.

The drivers don't need to look at it. The data in an interrupts property
only has meaning to the interrupt-parent. The interrupt controller is
responsible for any setup of the irq like edge/level and translating the
interrupts property into a value that the linux drivers understand (i.e.
a virq number).

Rob

> 
> Regards
> 
> Ludovic
> 
>>> +                >;
>>>               };
>>>
>>>               ramc0: ramc at ffffea00 {
>>> diff --git a/arch/arm/boot/dts/at91sam9263.dtsi
>>> b/arch/arm/boot/dts/at91sam9263.dtsi
>>> index c803636..8a5923a 100644
>>> --- a/arch/arm/boot/dts/at91sam9263.dtsi
>>> +++ b/arch/arm/boot/dts/at91sam9263.dtsi
>>> @@ -53,6 +53,40 @@
>>>                   interrupt-controller;
>>>                   reg = <0xfffff000 0x200>;
>>>                   atmel,external-irqs = <30 31>;
>>> +                atmel,default-irq-priorities = <
>>> +                    7    /* Advanced Interrupt Controller (FIQ) */
>>> +                    7    /* System Peripherals */
>>> +                    1    /* Parallel IO Controller A */
>>> +                    1    /* Parallel IO Controller B */
>>> +                    1    /* Parallel IO Controller C, D and E */
>>> +                    0
>>> +                    0
>>> +                    5    /* USART 0 */
>>> +                    5    /* USART 1 */
>>> +                    5    /* USART 2 */
>>> +                    0    /* Multimedia Card Interface 0 */
>>> +                    0    /* Multimedia Card Interface 1 */
>>> +                    3    /* CAN */
>>> +                    6    /* Two-Wire Interface */
>>> +                    5    /* Serial Peripheral Interface 0 */
>>> +                    5    /* Serial Peripheral Interface 1 */
>>> +                    4    /* Serial Synchronous Controller 0 */
>>> +                    4    /* Serial Synchronous Controller 1 */
>>> +                    5    /* AC97 Controller */
>>> +                    0    /* Timer Counter 0, 1 and 2 */
>>> +                    0    /* Pulse Width Modulation Controller */
>>> +                    3    /* Ethernet */
>>> +                    0
>>> +                    0    /* 2D Graphic Engine */
>>> +                    2    /* USB Device Port */
>>> +                    0    /* Image Sensor Interface */
>>> +                    3    /* LDC Controller */
>>> +                    0    /* DMA Controller */
>>> +                    0
>>> +                    2    /* USB Host port */
>>> +                    0    /* Advanced Interrupt Controller (IRQ0) */
>>> +                    0    /* Advanced Interrupt Controller (IRQ1) */
>>> +                >;
>>>               };
>>>
>>>               pmc: pmc at fffffc00 {
>>> diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi
>>> b/arch/arm/boot/dts/at91sam9g45.dtsi
>>> index 2d01ce2..d70e4f0 100644
>>> --- a/arch/arm/boot/dts/at91sam9g45.dtsi
>>> +++ b/arch/arm/boot/dts/at91sam9g45.dtsi
>>> @@ -58,6 +58,40 @@
>>>                   interrupt-controller;
>>>                   reg = <0xfffff000 0x200>;
>>>                   atmel,external-irqs = <31>;
>>> +                atmel,default-irq-priorities = <
>>> +                    7    /* Advanced Interrupt Controller (FIQ) */
>>> +                    7    /* System Peripherals */
>>> +                    1    /* Parallel IO Controller A */
>>> +                    1    /* Parallel IO Controller B */
>>> +                    1    /* Parallel IO Controller C */
>>> +                    1    /* Parallel IO Controller D and E */
>>> +                    0
>>> +                    5    /* USART 0 */
>>> +                    5    /* USART 1 */
>>> +                    5    /* USART 2 */
>>> +                    5    /* USART 3 */
>>> +                    0    /* Multimedia Card Interface 0 */
>>> +                    6    /* Two-Wire Interface 0 */
>>> +                    6    /* Two-Wire Interface 1 */
>>> +                    5    /* Serial Peripheral Interface 0 */
>>> +                    5    /* Serial Peripheral Interface 1 */
>>> +                    4    /* Serial Synchronous Controller 0 */
>>> +                    4    /* Serial Synchronous Controller 1 */
>>> +                    0    /* Timer Counter 0, 1, 2, 3, 4 and 5 */
>>> +                    0    /* Pulse Width Modulation Controller */
>>> +                    0    /* Touch Screen Controller */
>>> +                    0    /* DMA Controller */
>>> +                    2    /* USB Host High Speed port */
>>> +                    3    /* LDC Controller */
>>> +                    5    /* AC97 Controller */
>>> +                    3    /* Ethernet */
>>> +                    0    /* Image Sensor Interface */
>>> +                    2    /* USB Device High speed port */
>>> +                    0
>>> +                    0    /* Multimedia Card Interface 1 */
>>> +                    0
>>> +                    0    /* Advanced Interrupt Controller (IRQ0) */
>>> +                >;
>>>               };
>>>
>>>               ramc0: ramc at ffffe400 {
>>> diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi
>>> b/arch/arm/boot/dts/at91sam9x5.dtsi
>>> index 6a0a0fb..fcd9d43 100644
>>> --- a/arch/arm/boot/dts/at91sam9x5.dtsi
>>> +++ b/arch/arm/boot/dts/at91sam9x5.dtsi
>>> @@ -56,6 +56,40 @@
>>>                   interrupt-controller;
>>>                   reg = <0xfffff000 0x200>;
>>>                   atmel,external-irqs = <31>;
>>> +                atmel,default-irq-priorities = <
>>> +                    7    /* Advanced Interrupt Controller (FIQ) */
>>> +                    7    /* System Peripherals */
>>> +                    1    /* Parallel IO Controller A and B */
>>> +                    1    /* Parallel IO Controller C and D */
>>> +                    4    /* Soft Modem */
>>> +                    5    /* USART 0 */
>>> +                    5    /* USART 1 */
>>> +                    5    /* USART 2 */
>>> +                    5    /* USART 3 */
>>> +                    6    /* Two-Wire Interface 0 */
>>> +                    6    /* Two-Wire Interface 1 */
>>> +                    6    /* Two-Wire Interface 2 */
>>> +                    0    /* Multimedia Card Interface 0 */
>>> +                    5    /* Serial Peripheral Interface 0 */
>>> +                    5    /* Serial Peripheral Interface 1 */
>>> +                    5    /* UART 0 */
>>> +                    5    /* UART 1 */
>>> +                    0    /* Timer Counter 0, 1, 2, 3, 4 and 5 */
>>> +                    0    /* Pulse Width Modulation Controller */
>>> +                    0    /* ADC Controller */
>>> +                    0    /* DMA Controller 0 */
>>> +                    0    /* DMA Controller 1 */
>>> +                    2    /* USB Host High Speed port */
>>> +                    2    /* USB Device High speed port */
>>> +                    3    /* Ethernet MAC 0 */
>>> +                    3    /* LDC Controller or Image Sensor Interface */
>>> +                    0    /* Multimedia Card Interface 1 */
>>> +                    3    /* Ethernet MAC 1 */
>>> +                    4    /* Synchronous Serial Interface */
>>> +                    4    /* CAN Controller 0 */
>>> +                    4    /* CAN Controller 1 */
>>> +                    0    /* Advanced Interrupt Controller (IRQ0) */
>>> +                >;
>>>               };
>>>
>>>               ramc0: ramc at ffffe800 {
>>> diff --git a/arch/arm/mach-at91/at91sam9x5.c
>>> b/arch/arm/mach-at91/at91sam9x5.c
>>> index 537710b..1e7ef56 100644
>>> --- a/arch/arm/mach-at91/at91sam9x5.c
>>> +++ b/arch/arm/mach-at91/at91sam9x5.c
>>> @@ -316,50 +316,8 @@ void __init at91sam9x5_initialize(void)
>>>       at91_gpio_init(NULL, 0);
>>>   }
>>>
>>> -/* --------------------------------------------------------------------
>>> - *  Interrupt initialization
>>> - *
>>> -------------------------------------------------------------------- */
>>> -/*
>>> - * The default interrupt priority levels (0 = lowest, 7 = highest).
>>> - */
>>> -static unsigned int at91sam9x5_default_irq_priority[NR_AIC_IRQS]
>>> __initdata = {
>>> -    7,    /* Advanced Interrupt Controller (FIQ) */
>>> -    7,    /* System Peripherals */
>>> -    1,    /* Parallel IO Controller A and B */
>>> -    1,    /* Parallel IO Controller C and D */
>>> -    4,    /* Soft Modem */
>>> -    5,    /* USART 0 */
>>> -    5,    /* USART 1 */
>>> -    5,    /* USART 2 */
>>> -    5,    /* USART 3 */
>>> -    6,    /* Two-Wire Interface 0 */
>>> -    6,    /* Two-Wire Interface 1 */
>>> -    6,    /* Two-Wire Interface 2 */
>>> -    0,    /* Multimedia Card Interface 0 */
>>> -    5,    /* Serial Peripheral Interface 0 */
>>> -    5,    /* Serial Peripheral Interface 1 */
>>> -    5,    /* UART 0 */
>>> -    5,    /* UART 1 */
>>> -    0,    /* Timer Counter 0, 1, 2, 3, 4 and 5 */
>>> -    0,    /* Pulse Width Modulation Controller */
>>> -    0,    /* ADC Controller */
>>> -    0,    /* DMA Controller 0 */
>>> -    0,    /* DMA Controller 1 */
>>> -    2,    /* USB Host High Speed port */
>>> -    2,    /* USB Device High speed port */
>>> -    3,    /* Ethernet MAC 0 */
>>> -    3,    /* LDC Controller or Image Sensor Interface */
>>> -    0,    /* Multimedia Card Interface 1 */
>>> -    3,    /* Ethernet MAC 1 */
>>> -    4,    /* Synchronous Serial Interface */
>>> -    4,    /* CAN Controller 0 */
>>> -    4,    /* CAN Controller 1 */
>>> -    0,    /* Advanced Interrupt Controller (IRQ0) */
>>> -};
>>> -
>>>   struct at91_init_soc __initdata at91sam9x5_soc = {
>>>       .map_io = at91sam9x5_map_io,
>>> -    .default_irq_priority = at91sam9x5_default_irq_priority,
>>>       .register_clocks = at91sam9x5_register_clocks,
>>>       .init = at91sam9x5_initialize,
>>>   };
>>> diff --git a/arch/arm/mach-at91/irq.c b/arch/arm/mach-at91/irq.c
>>> index df8605f..8e6ac53 100644
>>> --- a/arch/arm/mach-at91/irq.c
>>> +++ b/arch/arm/mach-at91/irq.c
>>> @@ -191,6 +191,25 @@ static struct irq_domain_ops at91_aic_irq_ops = {
>>>       .xlate    = irq_domain_xlate_twocell,
>>>   };
>>>
>>> +static void __init at91_aic_of_priority(struct device_node *node)
>>> +{
>>> +    struct property *prop;
>>> +    const __be32 *p;
>>> +    u32 val;
>>> +    int i = 0;
>>> +
>>> +    of_property_for_each_u32(node, "atmel,default-irq-priorities",
>>> prop, p, val) {
>>> +        /* Put hardware irq number in Source Vector Register: */
>>> +        at91_aic_write(AT91_AIC_SVR(i), i);
>>> +        /* Active Low interrupt, with the specified priority */
>>> +        at91_aic_write(AT91_AIC_SMR(i), AT91_AIC_SRCTYPE_LOW | val);
>>> +        i++;
>>> +    }
>>> +
>>> +    if (i < 1)
>>> +        pr_warn("AIC: no valid default irqs priorities\n");
>>> +}
>>> +
>>>   int __init at91_aic_of_init(struct device_node *node,
>>>                        struct device_node *parent)
>>>   {
>>> @@ -214,6 +233,8 @@ int __init at91_aic_of_init(struct device_node
>>> *node,
>>>               at91_extern_irq |= (1 << val);
>>>       }
>>>
>>> +    at91_aic_of_priority(node);
>>> +
>>>       irq_set_default_host(at91_aic_domain);
>>>
>>>       at91_aic_hw_init(NR_AIC_IRQS);
>>
>>
>>
> 
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-06-19 15:56 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-15  9:09 [PATCH v2 0/7] ARM: at91: add sparse irq support and introduce aic5 Ludovic Desroches
2012-06-15  9:09 ` [PATCH v2 1/7] ARM: at91: aic add dt support for external irqs Ludovic Desroches
2012-06-15  9:09 ` [PATCH v2 2/7] ARM: at91: add of default irq priorities support Ludovic Desroches
2012-06-18  2:24   ` Rob Herring
2012-06-19  6:45     ` ludovic.desroches
2012-06-19 15:56       ` Rob Herring
2012-06-15  9:09 ` [PATCH v2 3/7] ARM: at91: at91 based machines specify their own irq handler at run time Ludovic Desroches
2012-06-15  9:09 ` [PATCH v2 4/7] ARM: at91: fix irq_alloc_descs parameters for sparse irq Ludovic Desroches
2012-06-15  9:11 ` Ludovic Desroches
2012-06-15  9:12 ` [PATCH v2 5/7] ARM: at91: sparse irq support Ludovic Desroches
2012-06-15  9:12 ` [PATCH v2 6/7] ARM: at91: remove mach/irqs.h Ludovic Desroches
2012-06-15  9:13 ` [PATCH v2 7/7] ARM: at91: add AIC5 support Ludovic Desroches

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.