aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMagnus Damm <damm@opensource.se>2013-03-25 21:34:42 -0400
committerSimon Horman <horms+renesas@verge.net.au>2013-04-01 21:58:20 -0400
commit984ca295010ad0113b986a404931566f9b1791d4 (patch)
treed3bc7191079a81df7ed4ea0f1c4dd5be196d9e4a
parente481a528901d0cd18b5b5fcbdc55207ea3b6ef68 (diff)
ARM: shmobile: r8a73a4 IRQC support V2
Add IRQC interrupt controller support to r8a73a4 by hooking up two IRQC instances to handle 58 external IRQ signals. There IRQC controllers are tied to SPIs of the GIC. On r8a73a4 exact IRQ pin routing is handled by the PFC which is excluded from this patch. Both platform devices and DT devices are added in this patch. The platform device versions are used to provide a static interrupt map configuration for board code written in C. Signed-off-by: Magnus Damm <damm@opensource.se> Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
-rw-r--r--arch/arm/boot/dts/r8a73a4.dtsi32
-rw-r--r--arch/arm/mach-shmobile/Kconfig1
-rw-r--r--arch/arm/mach-shmobile/setup-r8a73a4.c84
3 files changed, 117 insertions, 0 deletions
diff --git a/arch/arm/boot/dts/r8a73a4.dtsi b/arch/arm/boot/dts/r8a73a4.dtsi
index 72c58c172e9d..4c68ba15727c 100644
--- a/arch/arm/boot/dts/r8a73a4.dtsi
+++ b/arch/arm/boot/dts/r8a73a4.dtsi
@@ -52,4 +52,36 @@
52 <1 11 0xf08>, 52 <1 11 0xf08>,
53 <1 10 0xf08>; 53 <1 10 0xf08>;
54 }; 54 };
55
56 irqc0: interrupt-controller@e61c0000 {
57 compatible = "renesas,irqc";
58 #interrupt-cells = <2>;
59 interrupt-controller;
60 reg = <0xe61c0000 0x200>;
61 interrupt-parent = <&gic>;
62 interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>,
63 <0 4 4>, <0 5 4>, <0 6 4>, <0 7 4>,
64 <0 8 4>, <0 9 4>, <0 10 4>, <0 11 4>,
65 <0 12 4>, <0 13 4>, <0 14 4>, <0 15 4>,
66 <0 16 4>, <0 17 4>, <0 18 4>, <0 19 4>,
67 <0 20 4>, <0 21 4>, <0 22 4>, <0 23 4>,
68 <0 24 4>, <0 25 4>, <0 26 4>, <0 27 4>,
69 <0 28 4>, <0 29 4>, <0 30 4>, <0 31 4>;
70 };
71
72 irqc1: interrupt-controller@e61c0200 {
73 compatible = "renesas,irqc";
74 #interrupt-cells = <2>;
75 interrupt-controller;
76 reg = <0xe61c0200 0x200>;
77 interrupt-parent = <&gic>;
78 interrupts = <0 32 4>, <0 33 4>, <0 34 4>, <0 35 4>,
79 <0 36 4>, <0 37 4>, <0 38 4>, <0 39 4>,
80 <0 40 4>, <0 41 4>, <0 42 4>, <0 43 4>,
81 <0 44 4>, <0 45 4>, <0 46 4>, <0 47 4>,
82 <0 48 4>, <0 49 4>, <0 50 4>, <0 51 4>,
83 <0 52 4>, <0 53 4>, <0 54 4>, <0 55 4>,
84 <0 56 4>, <0 57 4>;
85 };
86
55}; 87};
diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig
index 663d27b39880..17a59cde826e 100644
--- a/arch/arm/mach-shmobile/Kconfig
+++ b/arch/arm/mach-shmobile/Kconfig
@@ -24,6 +24,7 @@ config ARCH_R8A73A4
24 select CPU_V7 24 select CPU_V7
25 select ARM_ARCH_TIMER 25 select ARM_ARCH_TIMER
26 select SH_CLK_CPG 26 select SH_CLK_CPG
27 select RENESAS_IRQC
27 28
28config ARCH_R8A7740 29config ARCH_R8A7740
29 bool "R-Mobile A1 (R8A77400)" 30 bool "R-Mobile A1 (R8A77400)"
diff --git a/arch/arm/mach-shmobile/setup-r8a73a4.c b/arch/arm/mach-shmobile/setup-r8a73a4.c
index 746a3dc4474d..da5ae1611518 100644
--- a/arch/arm/mach-shmobile/setup-r8a73a4.c
+++ b/arch/arm/mach-shmobile/setup-r8a73a4.c
@@ -21,6 +21,7 @@
21#include <linux/irqchip.h> 21#include <linux/irqchip.h>
22#include <linux/kernel.h> 22#include <linux/kernel.h>
23#include <linux/of_platform.h> 23#include <linux/of_platform.h>
24#include <linux/platform_data/irq-renesas-irqc.h>
24#include <linux/serial_sci.h> 25#include <linux/serial_sci.h>
25#include <mach/common.h> 26#include <mach/common.h>
26#include <mach/irqs.h> 27#include <mach/irqs.h>
@@ -63,6 +64,87 @@ static inline void r8a73a4_register_scif(int idx)
63 sizeof(struct plat_sci_port)); 64 sizeof(struct plat_sci_port));
64} 65}
65 66
67static const struct renesas_irqc_config irqc0_data = {
68 .irq_base = irq_pin(0), /* IRQ0 -> IRQ31 */
69};
70
71static const struct resource irqc0_resources[] = {
72 DEFINE_RES_MEM(0xe61c0000, 0x200), /* IRQC Event Detector Block_0 */
73 DEFINE_RES_IRQ(gic_spi(0)), /* IRQ0 */
74 DEFINE_RES_IRQ(gic_spi(1)), /* IRQ1 */
75 DEFINE_RES_IRQ(gic_spi(2)), /* IRQ2 */
76 DEFINE_RES_IRQ(gic_spi(3)), /* IRQ3 */
77 DEFINE_RES_IRQ(gic_spi(4)), /* IRQ4 */
78 DEFINE_RES_IRQ(gic_spi(5)), /* IRQ5 */
79 DEFINE_RES_IRQ(gic_spi(6)), /* IRQ6 */
80 DEFINE_RES_IRQ(gic_spi(7)), /* IRQ7 */
81 DEFINE_RES_IRQ(gic_spi(8)), /* IRQ8 */
82 DEFINE_RES_IRQ(gic_spi(9)), /* IRQ9 */
83 DEFINE_RES_IRQ(gic_spi(10)), /* IRQ10 */
84 DEFINE_RES_IRQ(gic_spi(11)), /* IRQ11 */
85 DEFINE_RES_IRQ(gic_spi(12)), /* IRQ12 */
86 DEFINE_RES_IRQ(gic_spi(13)), /* IRQ13 */
87 DEFINE_RES_IRQ(gic_spi(14)), /* IRQ14 */
88 DEFINE_RES_IRQ(gic_spi(15)), /* IRQ15 */
89 DEFINE_RES_IRQ(gic_spi(16)), /* IRQ16 */
90 DEFINE_RES_IRQ(gic_spi(17)), /* IRQ17 */
91 DEFINE_RES_IRQ(gic_spi(18)), /* IRQ18 */
92 DEFINE_RES_IRQ(gic_spi(19)), /* IRQ19 */
93 DEFINE_RES_IRQ(gic_spi(20)), /* IRQ20 */
94 DEFINE_RES_IRQ(gic_spi(21)), /* IRQ21 */
95 DEFINE_RES_IRQ(gic_spi(22)), /* IRQ22 */
96 DEFINE_RES_IRQ(gic_spi(23)), /* IRQ23 */
97 DEFINE_RES_IRQ(gic_spi(24)), /* IRQ24 */
98 DEFINE_RES_IRQ(gic_spi(25)), /* IRQ25 */
99 DEFINE_RES_IRQ(gic_spi(26)), /* IRQ26 */
100 DEFINE_RES_IRQ(gic_spi(27)), /* IRQ27 */
101 DEFINE_RES_IRQ(gic_spi(28)), /* IRQ28 */
102 DEFINE_RES_IRQ(gic_spi(29)), /* IRQ29 */
103 DEFINE_RES_IRQ(gic_spi(30)), /* IRQ30 */
104 DEFINE_RES_IRQ(gic_spi(31)), /* IRQ31 */
105};
106
107static const struct renesas_irqc_config irqc1_data = {
108 .irq_base = irq_pin(32), /* IRQ32 -> IRQ57 */
109};
110
111static const struct resource irqc1_resources[] = {
112 DEFINE_RES_MEM(0xe61c0200, 0x200), /* IRQC Event Detector Block_1 */
113 DEFINE_RES_IRQ(gic_spi(32)), /* IRQ32 */
114 DEFINE_RES_IRQ(gic_spi(33)), /* IRQ33 */
115 DEFINE_RES_IRQ(gic_spi(34)), /* IRQ34 */
116 DEFINE_RES_IRQ(gic_spi(35)), /* IRQ35 */
117 DEFINE_RES_IRQ(gic_spi(36)), /* IRQ36 */
118 DEFINE_RES_IRQ(gic_spi(37)), /* IRQ37 */
119 DEFINE_RES_IRQ(gic_spi(38)), /* IRQ38 */
120 DEFINE_RES_IRQ(gic_spi(39)), /* IRQ39 */
121 DEFINE_RES_IRQ(gic_spi(40)), /* IRQ40 */
122 DEFINE_RES_IRQ(gic_spi(41)), /* IRQ41 */
123 DEFINE_RES_IRQ(gic_spi(42)), /* IRQ42 */
124 DEFINE_RES_IRQ(gic_spi(43)), /* IRQ43 */
125 DEFINE_RES_IRQ(gic_spi(44)), /* IRQ44 */
126 DEFINE_RES_IRQ(gic_spi(45)), /* IRQ45 */
127 DEFINE_RES_IRQ(gic_spi(46)), /* IRQ46 */
128 DEFINE_RES_IRQ(gic_spi(47)), /* IRQ47 */
129 DEFINE_RES_IRQ(gic_spi(48)), /* IRQ48 */
130 DEFINE_RES_IRQ(gic_spi(49)), /* IRQ49 */
131 DEFINE_RES_IRQ(gic_spi(50)), /* IRQ50 */
132 DEFINE_RES_IRQ(gic_spi(51)), /* IRQ51 */
133 DEFINE_RES_IRQ(gic_spi(52)), /* IRQ52 */
134 DEFINE_RES_IRQ(gic_spi(53)), /* IRQ53 */
135 DEFINE_RES_IRQ(gic_spi(54)), /* IRQ54 */
136 DEFINE_RES_IRQ(gic_spi(55)), /* IRQ55 */
137 DEFINE_RES_IRQ(gic_spi(56)), /* IRQ56 */
138 DEFINE_RES_IRQ(gic_spi(57)), /* IRQ57 */
139};
140
141#define r8a73a4_register_irqc(idx) \
142 platform_device_register_resndata(&platform_bus, "renesas_irqc", \
143 idx, irqc##idx##_resources, \
144 ARRAY_SIZE(irqc##idx##_resources), \
145 &irqc##idx##_data, \
146 sizeof(struct renesas_irqc_config))
147
66void __init r8a73a4_add_standard_devices(void) 148void __init r8a73a4_add_standard_devices(void)
67{ 149{
68 r8a73a4_register_scif(SCIFA0); 150 r8a73a4_register_scif(SCIFA0);
@@ -71,6 +153,8 @@ void __init r8a73a4_add_standard_devices(void)
71 r8a73a4_register_scif(SCIFB1); 153 r8a73a4_register_scif(SCIFB1);
72 r8a73a4_register_scif(SCIFB2); 154 r8a73a4_register_scif(SCIFB2);
73 r8a73a4_register_scif(SCIFB3); 155 r8a73a4_register_scif(SCIFB3);
156 r8a73a4_register_irqc(0);
157 r8a73a4_register_irqc(1);
74} 158}
75 159
76#ifdef CONFIG_USE_OF 160#ifdef CONFIG_USE_OF