[PATCH v2 2/7] ARM: at91: add of default irq priorities support
Ludovic Desroches
ludovic.desroches at atmel.com
Fri Jun 15 05:09:07 EDT 2012
From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
You will have to set the default priority for all the irq.
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at 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
More information about the linux-arm-kernel
mailing list