diff options
author | Jason Cooper <jason@lakedaemon.net> | 2015-04-10 18:57:56 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2015-04-10 18:57:56 -0400 |
commit | 07c523f1493b6860662e74a3d7e1ae0e7d67d416 (patch) | |
tree | 8d8edfc4f8ba1c985e1b8ca032beadf04323cc01 | |
parent | 37b25fffd1435dd9b77ac5882a6791f7d5691097 (diff) | |
parent | 7136d457f365ecc93ddffcdd42ab49a8473f260b (diff) |
Merge branch 'irqchip/stacked-omap' into irqchip/core
30 files changed, 376 insertions, 278 deletions
diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt index c97484b73e72..1e0d21201d3a 100644 --- a/Documentation/devicetree/bindings/arm/gic.txt +++ b/Documentation/devicetree/bindings/arm/gic.txt | |||
@@ -56,11 +56,6 @@ Optional | |||
56 | regions, used when the GIC doesn't have banked registers. The offset is | 56 | regions, used when the GIC doesn't have banked registers. The offset is |
57 | cpu-offset * cpu-nr. | 57 | cpu-offset * cpu-nr. |
58 | 58 | ||
59 | - arm,routable-irqs : Total number of gic irq inputs which are not directly | ||
60 | connected from the peripherals, but are routed dynamically | ||
61 | by a crossbar/multiplexer preceding the GIC. The GIC irq | ||
62 | input line is assigned dynamically when the corresponding | ||
63 | peripheral's crossbar line is mapped. | ||
64 | Example: | 59 | Example: |
65 | 60 | ||
66 | intc: interrupt-controller@fff11000 { | 61 | intc: interrupt-controller@fff11000 { |
@@ -68,7 +63,6 @@ Example: | |||
68 | #interrupt-cells = <3>; | 63 | #interrupt-cells = <3>; |
69 | #address-cells = <1>; | 64 | #address-cells = <1>; |
70 | interrupt-controller; | 65 | interrupt-controller; |
71 | arm,routable-irqs = <160>; | ||
72 | reg = <0xfff11000 0x1000>, | 66 | reg = <0xfff11000 0x1000>, |
73 | <0xfff10100 0x100>; | 67 | <0xfff10100 0x100>; |
74 | }; | 68 | }; |
diff --git a/Documentation/devicetree/bindings/arm/omap/crossbar.txt b/Documentation/devicetree/bindings/arm/omap/crossbar.txt index 4139db353d0a..a9b28d74d902 100644 --- a/Documentation/devicetree/bindings/arm/omap/crossbar.txt +++ b/Documentation/devicetree/bindings/arm/omap/crossbar.txt | |||
@@ -9,7 +9,9 @@ inputs. | |||
9 | Required properties: | 9 | Required properties: |
10 | - compatible : Should be "ti,irq-crossbar" | 10 | - compatible : Should be "ti,irq-crossbar" |
11 | - reg: Base address and the size of the crossbar registers. | 11 | - reg: Base address and the size of the crossbar registers. |
12 | - ti,max-irqs: Total number of irqs available at the interrupt controller. | 12 | - interrupt-controller: indicates that this block is an interrupt controller. |
13 | - interrupt-parent: the interrupt controller this block is connected to. | ||
14 | - ti,max-irqs: Total number of irqs available at the parent interrupt controller. | ||
13 | - ti,max-crossbar-sources: Maximum number of crossbar sources that can be routed. | 15 | - ti,max-crossbar-sources: Maximum number of crossbar sources that can be routed. |
14 | - ti,reg-size: Size of a individual register in bytes. Every individual | 16 | - ti,reg-size: Size of a individual register in bytes. Every individual |
15 | register is assumed to be of same size. Valid sizes are 1, 2, 4. | 17 | register is assumed to be of same size. Valid sizes are 1, 2, 4. |
@@ -27,13 +29,13 @@ Optional properties: | |||
27 | when the interrupt controller irq is unused (when not provided, default is 0) | 29 | when the interrupt controller irq is unused (when not provided, default is 0) |
28 | 30 | ||
29 | Examples: | 31 | Examples: |
30 | crossbar_mpu: @4a020000 { | 32 | crossbar_mpu: crossbar@4a002a48 { |
31 | compatible = "ti,irq-crossbar"; | 33 | compatible = "ti,irq-crossbar"; |
32 | reg = <0x4a002a48 0x130>; | 34 | reg = <0x4a002a48 0x130>; |
33 | ti,max-irqs = <160>; | 35 | ti,max-irqs = <160>; |
34 | ti,max-crossbar-sources = <400>; | 36 | ti,max-crossbar-sources = <400>; |
35 | ti,reg-size = <2>; | 37 | ti,reg-size = <2>; |
36 | ti,irqs-reserved = <0 1 2 3 5 6 131 132 139 140>; | 38 | ti,irqs-reserved = <0 1 2 3 5 6 131 132>; |
37 | ti,irqs-skip = <10 133 139 140>; | 39 | ti,irqs-skip = <10 133 139 140>; |
38 | }; | 40 | }; |
39 | 41 | ||
@@ -44,10 +46,6 @@ Documentation/devicetree/bindings/arm/gic.txt for further details. | |||
44 | 46 | ||
45 | An interrupt consumer on an SoC using crossbar will use: | 47 | An interrupt consumer on an SoC using crossbar will use: |
46 | interrupts = <GIC_SPI request_number interrupt_level> | 48 | interrupts = <GIC_SPI request_number interrupt_level> |
47 | When the request number is between 0 to that described by | ||
48 | "ti,max-crossbar-sources", it is assumed to be a crossbar mapping. If the | ||
49 | request_number is greater than "ti,max-crossbar-sources", then it is mapped as a | ||
50 | quirky hardware mapping direct to GIC. | ||
51 | 49 | ||
52 | Example: | 50 | Example: |
53 | device_x@0x4a023000 { | 51 | device_x@0x4a023000 { |
@@ -55,9 +53,3 @@ Example: | |||
55 | interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; | 53 | interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>; |
56 | ... | 54 | ... |
57 | }; | 55 | }; |
58 | |||
59 | device_y@0x4a033000 { | ||
60 | /* Direct mapped GIC SPI 1 used */ | ||
61 | interrupts = <GIC_SPI DIRECT_IRQ(1) IRQ_TYPE_LEVEL_HIGH>; | ||
62 | ... | ||
63 | }; | ||
diff --git a/Documentation/devicetree/bindings/interrupt-controller/ti,omap4-wugen-mpu b/Documentation/devicetree/bindings/interrupt-controller/ti,omap4-wugen-mpu new file mode 100644 index 000000000000..43effa0a4fe7 --- /dev/null +++ b/Documentation/devicetree/bindings/interrupt-controller/ti,omap4-wugen-mpu | |||
@@ -0,0 +1,33 @@ | |||
1 | TI OMAP4 Wake-up Generator | ||
2 | |||
3 | All TI OMAP4/5 (and their derivatives) an interrupt controller that | ||
4 | routes interrupts to the GIC, and also serves as a wakeup source. It | ||
5 | is also referred to as "WUGEN-MPU", hence the name of the binding. | ||
6 | |||
7 | Reguired properties: | ||
8 | |||
9 | - compatible : should contain at least "ti,omap4-wugen-mpu" or | ||
10 | "ti,omap5-wugen-mpu" | ||
11 | - reg : Specifies base physical address and size of the registers. | ||
12 | - interrupt-controller : Identifies the node as an interrupt controller. | ||
13 | - #interrupt-cells : Specifies the number of cells needed to encode an | ||
14 | interrupt source. The value must be 3. | ||
15 | - interrupt-parent : a phandle to the GIC these interrupts are routed | ||
16 | to. | ||
17 | |||
18 | Notes: | ||
19 | |||
20 | - Because this HW ultimately routes interrupts to the GIC, the | ||
21 | interrupt specifier must be that of the GIC. | ||
22 | - Only SPIs can use the WUGEN as an interrupt parent. SGIs and PPIs | ||
23 | are explicitly forbiden. | ||
24 | |||
25 | Example: | ||
26 | |||
27 | wakeupgen: interrupt-controller@48281000 { | ||
28 | compatible = "ti,omap5-wugen-mpu", "ti,omap4-wugen-mpu"; | ||
29 | interrupt-controller; | ||
30 | #interrupt-cells = <3>; | ||
31 | reg = <0x48281000 0x1000>; | ||
32 | interrupt-parent = <&gic>; | ||
33 | }; | ||
diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi index 1943fc333e7c..8a099bc10c1e 100644 --- a/arch/arm/boot/dts/am4372.dtsi +++ b/arch/arm/boot/dts/am4372.dtsi | |||
@@ -15,7 +15,7 @@ | |||
15 | 15 | ||
16 | / { | 16 | / { |
17 | compatible = "ti,am4372", "ti,am43"; | 17 | compatible = "ti,am4372", "ti,am43"; |
18 | interrupt-parent = <&gic>; | 18 | interrupt-parent = <&wakeupgen>; |
19 | 19 | ||
20 | 20 | ||
21 | aliases { | 21 | aliases { |
@@ -48,6 +48,15 @@ | |||
48 | #interrupt-cells = <3>; | 48 | #interrupt-cells = <3>; |
49 | reg = <0x48241000 0x1000>, | 49 | reg = <0x48241000 0x1000>, |
50 | <0x48240100 0x0100>; | 50 | <0x48240100 0x0100>; |
51 | interrupt-parent = <&gic>; | ||
52 | }; | ||
53 | |||
54 | wakeupgen: interrupt-controller@48281000 { | ||
55 | compatible = "ti,omap4-wugen-mpu"; | ||
56 | interrupt-controller; | ||
57 | #interrupt-cells = <3>; | ||
58 | reg = <0x48281000 0x1000>; | ||
59 | interrupt-parent = <&gic>; | ||
51 | }; | 60 | }; |
52 | 61 | ||
53 | l2-cache-controller@48242000 { | 62 | l2-cache-controller@48242000 { |
diff --git a/arch/arm/boot/dts/am437x-gp-evm.dts b/arch/arm/boot/dts/am437x-gp-evm.dts index f84d9715a4a9..26956cb50835 100644 --- a/arch/arm/boot/dts/am437x-gp-evm.dts +++ b/arch/arm/boot/dts/am437x-gp-evm.dts | |||
@@ -352,7 +352,6 @@ | |||
352 | reg = <0x24>; | 352 | reg = <0x24>; |
353 | compatible = "ti,tps65218"; | 353 | compatible = "ti,tps65218"; |
354 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */ | 354 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */ |
355 | interrupt-parent = <&gic>; | ||
356 | interrupt-controller; | 355 | interrupt-controller; |
357 | #interrupt-cells = <2>; | 356 | #interrupt-cells = <2>; |
358 | 357 | ||
diff --git a/arch/arm/boot/dts/am437x-sk-evm.dts b/arch/arm/boot/dts/am437x-sk-evm.dts index 832d24318f62..8ae29c955c11 100644 --- a/arch/arm/boot/dts/am437x-sk-evm.dts +++ b/arch/arm/boot/dts/am437x-sk-evm.dts | |||
@@ -392,7 +392,6 @@ | |||
392 | tps@24 { | 392 | tps@24 { |
393 | compatible = "ti,tps65218"; | 393 | compatible = "ti,tps65218"; |
394 | reg = <0x24>; | 394 | reg = <0x24>; |
395 | interrupt-parent = <&gic>; | ||
396 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; | 395 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; |
397 | interrupt-controller; | 396 | interrupt-controller; |
398 | #interrupt-cells = <2>; | 397 | #interrupt-cells = <2>; |
diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts b/arch/arm/boot/dts/am43x-epos-evm.dts index 257c099c347e..1d7109196872 100644 --- a/arch/arm/boot/dts/am43x-epos-evm.dts +++ b/arch/arm/boot/dts/am43x-epos-evm.dts | |||
@@ -369,7 +369,6 @@ | |||
369 | reg = <0x24>; | 369 | reg = <0x24>; |
370 | compatible = "ti,tps65218"; | 370 | compatible = "ti,tps65218"; |
371 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */ | 371 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* NMIn */ |
372 | interrupt-parent = <&gic>; | ||
373 | interrupt-controller; | 372 | interrupt-controller; |
374 | #interrupt-cells = <2>; | 373 | #interrupt-cells = <2>; |
375 | 374 | ||
diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts b/arch/arm/boot/dts/am57xx-beagle-x15.dts index 03750af3b49a..170fbf953e5d 100644 --- a/arch/arm/boot/dts/am57xx-beagle-x15.dts +++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts | |||
@@ -454,7 +454,6 @@ | |||
454 | mcp_rtc: rtc@6f { | 454 | mcp_rtc: rtc@6f { |
455 | compatible = "microchip,mcp7941x"; | 455 | compatible = "microchip,mcp7941x"; |
456 | reg = <0x6f>; | 456 | reg = <0x6f>; |
457 | interrupt-parent = <&gic>; | ||
458 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_LOW>; /* IRQ_SYS_1N */ | 457 | interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_LOW>; /* IRQ_SYS_1N */ |
459 | 458 | ||
460 | pinctrl-names = "default"; | 459 | pinctrl-names = "default"; |
@@ -477,7 +476,7 @@ | |||
477 | 476 | ||
478 | &uart3 { | 477 | &uart3 { |
479 | status = "okay"; | 478 | status = "okay"; |
480 | interrupts-extended = <&gic GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, | 479 | interrupts-extended = <&crossbar_mpu GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>, |
481 | <&dra7_pmx_core 0x248>; | 480 | <&dra7_pmx_core 0x248>; |
482 | 481 | ||
483 | pinctrl-names = "default"; | 482 | pinctrl-names = "default"; |
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index 746cddb1b8f5..789ee58ba47e 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts | |||
@@ -446,7 +446,7 @@ | |||
446 | status = "okay"; | 446 | status = "okay"; |
447 | pinctrl-names = "default"; | 447 | pinctrl-names = "default"; |
448 | pinctrl-0 = <&uart1_pins>; | 448 | pinctrl-0 = <&uart1_pins>; |
449 | interrupts-extended = <&gic GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>, | 449 | interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>, |
450 | <&dra7_pmx_core 0x3e0>; | 450 | <&dra7_pmx_core 0x3e0>; |
451 | }; | 451 | }; |
452 | 452 | ||
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi index 5827fedafd43..c65eea095afa 100644 --- a/arch/arm/boot/dts/dra7.dtsi +++ b/arch/arm/boot/dts/dra7.dtsi | |||
@@ -13,14 +13,13 @@ | |||
13 | #include "skeleton.dtsi" | 13 | #include "skeleton.dtsi" |
14 | 14 | ||
15 | #define MAX_SOURCES 400 | 15 | #define MAX_SOURCES 400 |
16 | #define DIRECT_IRQ(irq) (MAX_SOURCES + irq) | ||
17 | 16 | ||
18 | / { | 17 | / { |
19 | #address-cells = <1>; | 18 | #address-cells = <1>; |
20 | #size-cells = <1>; | 19 | #size-cells = <1>; |
21 | 20 | ||
22 | compatible = "ti,dra7xx"; | 21 | compatible = "ti,dra7xx"; |
23 | interrupt-parent = <&gic>; | 22 | interrupt-parent = <&crossbar_mpu>; |
24 | 23 | ||
25 | aliases { | 24 | aliases { |
26 | i2c0 = &i2c1; | 25 | i2c0 = &i2c1; |
@@ -50,18 +49,27 @@ | |||
50 | <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, | 49 | <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, |
51 | <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, | 50 | <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>, |
52 | <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>; | 51 | <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>; |
52 | interrupt-parent = <&gic>; | ||
53 | }; | 53 | }; |
54 | 54 | ||
55 | gic: interrupt-controller@48211000 { | 55 | gic: interrupt-controller@48211000 { |
56 | compatible = "arm,cortex-a15-gic"; | 56 | compatible = "arm,cortex-a15-gic"; |
57 | interrupt-controller; | 57 | interrupt-controller; |
58 | #interrupt-cells = <3>; | 58 | #interrupt-cells = <3>; |
59 | arm,routable-irqs = <192>; | ||
60 | reg = <0x48211000 0x1000>, | 59 | reg = <0x48211000 0x1000>, |
61 | <0x48212000 0x1000>, | 60 | <0x48212000 0x1000>, |
62 | <0x48214000 0x2000>, | 61 | <0x48214000 0x2000>, |
63 | <0x48216000 0x2000>; | 62 | <0x48216000 0x2000>; |
64 | interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>; | 63 | interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>; |
64 | interrupt-parent = <&gic>; | ||
65 | }; | ||
66 | |||
67 | wakeupgen: interrupt-controller@48281000 { | ||
68 | compatible = "ti,omap5-wugen-mpu", "ti,omap4-wugen-mpu"; | ||
69 | interrupt-controller; | ||
70 | #interrupt-cells = <3>; | ||
71 | reg = <0x48281000 0x1000>; | ||
72 | interrupt-parent = <&gic>; | ||
65 | }; | 73 | }; |
66 | 74 | ||
67 | /* | 75 | /* |
@@ -91,8 +99,8 @@ | |||
91 | ti,hwmods = "l3_main_1", "l3_main_2"; | 99 | ti,hwmods = "l3_main_1", "l3_main_2"; |
92 | reg = <0x44000000 0x1000000>, | 100 | reg = <0x44000000 0x1000000>, |
93 | <0x45000000 0x1000>; | 101 | <0x45000000 0x1000>; |
94 | interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, | 102 | interrupts-extended = <&crossbar_mpu GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>, |
95 | <GIC_SPI DIRECT_IRQ(10) IRQ_TYPE_LEVEL_HIGH>; | 103 | <&wakeupgen GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; |
96 | 104 | ||
97 | prm: prm@4ae06000 { | 105 | prm: prm@4ae06000 { |
98 | compatible = "ti,dra7-prm"; | 106 | compatible = "ti,dra7-prm"; |
@@ -344,7 +352,7 @@ | |||
344 | uart1: serial@4806a000 { | 352 | uart1: serial@4806a000 { |
345 | compatible = "ti,omap4-uart"; | 353 | compatible = "ti,omap4-uart"; |
346 | reg = <0x4806a000 0x100>; | 354 | reg = <0x4806a000 0x100>; |
347 | interrupts-extended = <&gic GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; | 355 | interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; |
348 | ti,hwmods = "uart1"; | 356 | ti,hwmods = "uart1"; |
349 | clock-frequency = <48000000>; | 357 | clock-frequency = <48000000>; |
350 | status = "disabled"; | 358 | status = "disabled"; |
@@ -355,7 +363,7 @@ | |||
355 | uart2: serial@4806c000 { | 363 | uart2: serial@4806c000 { |
356 | compatible = "ti,omap4-uart"; | 364 | compatible = "ti,omap4-uart"; |
357 | reg = <0x4806c000 0x100>; | 365 | reg = <0x4806c000 0x100>; |
358 | interrupts-extended = <&gic GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>; | 366 | interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>; |
359 | ti,hwmods = "uart2"; | 367 | ti,hwmods = "uart2"; |
360 | clock-frequency = <48000000>; | 368 | clock-frequency = <48000000>; |
361 | status = "disabled"; | 369 | status = "disabled"; |
@@ -366,7 +374,7 @@ | |||
366 | uart3: serial@48020000 { | 374 | uart3: serial@48020000 { |
367 | compatible = "ti,omap4-uart"; | 375 | compatible = "ti,omap4-uart"; |
368 | reg = <0x48020000 0x100>; | 376 | reg = <0x48020000 0x100>; |
369 | interrupts-extended = <&gic GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>; | 377 | interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>; |
370 | ti,hwmods = "uart3"; | 378 | ti,hwmods = "uart3"; |
371 | clock-frequency = <48000000>; | 379 | clock-frequency = <48000000>; |
372 | status = "disabled"; | 380 | status = "disabled"; |
@@ -377,7 +385,7 @@ | |||
377 | uart4: serial@4806e000 { | 385 | uart4: serial@4806e000 { |
378 | compatible = "ti,omap4-uart"; | 386 | compatible = "ti,omap4-uart"; |
379 | reg = <0x4806e000 0x100>; | 387 | reg = <0x4806e000 0x100>; |
380 | interrupts-extended = <&gic GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; | 388 | interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>; |
381 | ti,hwmods = "uart4"; | 389 | ti,hwmods = "uart4"; |
382 | clock-frequency = <48000000>; | 390 | clock-frequency = <48000000>; |
383 | status = "disabled"; | 391 | status = "disabled"; |
@@ -388,7 +396,7 @@ | |||
388 | uart5: serial@48066000 { | 396 | uart5: serial@48066000 { |
389 | compatible = "ti,omap4-uart"; | 397 | compatible = "ti,omap4-uart"; |
390 | reg = <0x48066000 0x100>; | 398 | reg = <0x48066000 0x100>; |
391 | interrupts-extended = <&gic GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; | 399 | interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>; |
392 | ti,hwmods = "uart5"; | 400 | ti,hwmods = "uart5"; |
393 | clock-frequency = <48000000>; | 401 | clock-frequency = <48000000>; |
394 | status = "disabled"; | 402 | status = "disabled"; |
@@ -399,7 +407,7 @@ | |||
399 | uart6: serial@48068000 { | 407 | uart6: serial@48068000 { |
400 | compatible = "ti,omap4-uart"; | 408 | compatible = "ti,omap4-uart"; |
401 | reg = <0x48068000 0x100>; | 409 | reg = <0x48068000 0x100>; |
402 | interrupts-extended = <&gic GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; | 410 | interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>; |
403 | ti,hwmods = "uart6"; | 411 | ti,hwmods = "uart6"; |
404 | clock-frequency = <48000000>; | 412 | clock-frequency = <48000000>; |
405 | status = "disabled"; | 413 | status = "disabled"; |
@@ -410,7 +418,7 @@ | |||
410 | uart7: serial@48420000 { | 418 | uart7: serial@48420000 { |
411 | compatible = "ti,omap4-uart"; | 419 | compatible = "ti,omap4-uart"; |
412 | reg = <0x48420000 0x100>; | 420 | reg = <0x48420000 0x100>; |
413 | interrupts-extended = <&gic GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>; | 421 | interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>; |
414 | ti,hwmods = "uart7"; | 422 | ti,hwmods = "uart7"; |
415 | clock-frequency = <48000000>; | 423 | clock-frequency = <48000000>; |
416 | status = "disabled"; | 424 | status = "disabled"; |
@@ -419,7 +427,7 @@ | |||
419 | uart8: serial@48422000 { | 427 | uart8: serial@48422000 { |
420 | compatible = "ti,omap4-uart"; | 428 | compatible = "ti,omap4-uart"; |
421 | reg = <0x48422000 0x100>; | 429 | reg = <0x48422000 0x100>; |
422 | interrupts-extended = <&gic GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>; | 430 | interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>; |
423 | ti,hwmods = "uart8"; | 431 | ti,hwmods = "uart8"; |
424 | clock-frequency = <48000000>; | 432 | clock-frequency = <48000000>; |
425 | status = "disabled"; | 433 | status = "disabled"; |
@@ -428,7 +436,7 @@ | |||
428 | uart9: serial@48424000 { | 436 | uart9: serial@48424000 { |
429 | compatible = "ti,omap4-uart"; | 437 | compatible = "ti,omap4-uart"; |
430 | reg = <0x48424000 0x100>; | 438 | reg = <0x48424000 0x100>; |
431 | interrupts-extended = <&gic GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>; | 439 | interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>; |
432 | ti,hwmods = "uart9"; | 440 | ti,hwmods = "uart9"; |
433 | clock-frequency = <48000000>; | 441 | clock-frequency = <48000000>; |
434 | status = "disabled"; | 442 | status = "disabled"; |
@@ -437,7 +445,7 @@ | |||
437 | uart10: serial@4ae2b000 { | 445 | uart10: serial@4ae2b000 { |
438 | compatible = "ti,omap4-uart"; | 446 | compatible = "ti,omap4-uart"; |
439 | reg = <0x4ae2b000 0x100>; | 447 | reg = <0x4ae2b000 0x100>; |
440 | interrupts-extended = <&gic GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>; | 448 | interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>; |
441 | ti,hwmods = "uart10"; | 449 | ti,hwmods = "uart10"; |
442 | clock-frequency = <48000000>; | 450 | clock-frequency = <48000000>; |
443 | status = "disabled"; | 451 | status = "disabled"; |
@@ -1337,9 +1345,12 @@ | |||
1337 | status = "disabled"; | 1345 | status = "disabled"; |
1338 | }; | 1346 | }; |
1339 | 1347 | ||
1340 | crossbar_mpu: crossbar@4a020000 { | 1348 | crossbar_mpu: crossbar@4a002a48 { |
1341 | compatible = "ti,irq-crossbar"; | 1349 | compatible = "ti,irq-crossbar"; |
1342 | reg = <0x4a002a48 0x130>; | 1350 | reg = <0x4a002a48 0x130>; |
1351 | interrupt-controller; | ||
1352 | interrupt-parent = <&wakeupgen>; | ||
1353 | #interrupt-cells = <3>; | ||
1343 | ti,max-irqs = <160>; | 1354 | ti,max-irqs = <160>; |
1344 | ti,max-crossbar-sources = <MAX_SOURCES>; | 1355 | ti,max-crossbar-sources = <MAX_SOURCES>; |
1345 | ti,reg-size = <2>; | 1356 | ti,reg-size = <2>; |
diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts index 4d8711713610..2373054f588d 100644 --- a/arch/arm/boot/dts/dra72-evm.dts +++ b/arch/arm/boot/dts/dra72-evm.dts | |||
@@ -160,7 +160,6 @@ | |||
160 | pinctrl-0 = <&tps65917_pins_default>; | 160 | pinctrl-0 = <&tps65917_pins_default>; |
161 | 161 | ||
162 | interrupts = <GIC_SPI 2 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ | 162 | interrupts = <GIC_SPI 2 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ |
163 | interrupt-parent = <&gic>; | ||
164 | interrupt-controller; | 163 | interrupt-controller; |
165 | #interrupt-cells = <2>; | 164 | #interrupt-cells = <2>; |
166 | 165 | ||
diff --git a/arch/arm/boot/dts/dra72x.dtsi b/arch/arm/boot/dts/dra72x.dtsi index e5a3d23a3df1..f7fb0d0ef25a 100644 --- a/arch/arm/boot/dts/dra72x.dtsi +++ b/arch/arm/boot/dts/dra72x.dtsi | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | pmu { | 26 | pmu { |
27 | compatible = "arm,cortex-a15-pmu"; | 27 | compatible = "arm,cortex-a15-pmu"; |
28 | interrupts = <GIC_SPI DIRECT_IRQ(131) IRQ_TYPE_LEVEL_HIGH>; | 28 | interrupt-parent = <&wakeupgen>; |
29 | interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>; | ||
29 | }; | 30 | }; |
30 | }; | 31 | }; |
diff --git a/arch/arm/boot/dts/dra74x.dtsi b/arch/arm/boot/dts/dra74x.dtsi index 10173fab1a15..00eeed789b4b 100644 --- a/arch/arm/boot/dts/dra74x.dtsi +++ b/arch/arm/boot/dts/dra74x.dtsi | |||
@@ -41,8 +41,9 @@ | |||
41 | 41 | ||
42 | pmu { | 42 | pmu { |
43 | compatible = "arm,cortex-a15-pmu"; | 43 | compatible = "arm,cortex-a15-pmu"; |
44 | interrupts = <GIC_SPI DIRECT_IRQ(131) IRQ_TYPE_LEVEL_HIGH>, | 44 | interrupt-parent = <&wakeupgen>; |
45 | <GIC_SPI DIRECT_IRQ(132) IRQ_TYPE_LEVEL_HIGH>; | 45 | interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>, |
46 | <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>; | ||
46 | }; | 47 | }; |
47 | 48 | ||
48 | ocp { | 49 | ocp { |
diff --git a/arch/arm/boot/dts/omap4-duovero.dtsi b/arch/arm/boot/dts/omap4-duovero.dtsi index e860ccd9d09c..f2a94fa62552 100644 --- a/arch/arm/boot/dts/omap4-duovero.dtsi +++ b/arch/arm/boot/dts/omap4-duovero.dtsi | |||
@@ -173,14 +173,12 @@ | |||
173 | twl: twl@48 { | 173 | twl: twl@48 { |
174 | reg = <0x48>; | 174 | reg = <0x48>; |
175 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ | 175 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ |
176 | interrupt-parent = <&gic>; | ||
177 | }; | 176 | }; |
178 | 177 | ||
179 | twl6040: twl@4b { | 178 | twl6040: twl@4b { |
180 | compatible = "ti,twl6040"; | 179 | compatible = "ti,twl6040"; |
181 | reg = <0x4b>; | 180 | reg = <0x4b>; |
182 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ | 181 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ |
183 | interrupt-parent = <&gic>; | ||
184 | ti,audpwron-gpio = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* gpio_160 */ | 182 | ti,audpwron-gpio = <&gpio6 0 GPIO_ACTIVE_HIGH>; /* gpio_160 */ |
185 | 183 | ||
186 | vio-supply = <&v1v8>; | 184 | vio-supply = <&v1v8>; |
diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi index 150513506c19..7c15fb2e2fe4 100644 --- a/arch/arm/boot/dts/omap4-panda-common.dtsi +++ b/arch/arm/boot/dts/omap4-panda-common.dtsi | |||
@@ -372,7 +372,6 @@ | |||
372 | reg = <0x48>; | 372 | reg = <0x48>; |
373 | /* IRQ# = 7 */ | 373 | /* IRQ# = 7 */ |
374 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ | 374 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ |
375 | interrupt-parent = <&gic>; | ||
376 | }; | 375 | }; |
377 | 376 | ||
378 | twl6040: twl@4b { | 377 | twl6040: twl@4b { |
@@ -384,7 +383,6 @@ | |||
384 | 383 | ||
385 | /* IRQ# = 119 */ | 384 | /* IRQ# = 119 */ |
386 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ | 385 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ |
387 | interrupt-parent = <&gic>; | ||
388 | ti,audpwron-gpio = <&gpio4 31 GPIO_ACTIVE_HIGH>; /* gpio line 127 */ | 386 | ti,audpwron-gpio = <&gpio4 31 GPIO_ACTIVE_HIGH>; /* gpio line 127 */ |
389 | 387 | ||
390 | vio-supply = <&v1v8>; | 388 | vio-supply = <&v1v8>; |
@@ -479,17 +477,17 @@ | |||
479 | }; | 477 | }; |
480 | 478 | ||
481 | &uart2 { | 479 | &uart2 { |
482 | interrupts-extended = <&gic GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH | 480 | interrupts-extended = <&wakeupgen GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH |
483 | &omap4_pmx_core OMAP4_UART2_RX>; | 481 | &omap4_pmx_core OMAP4_UART2_RX>; |
484 | }; | 482 | }; |
485 | 483 | ||
486 | &uart3 { | 484 | &uart3 { |
487 | interrupts-extended = <&gic GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH | 485 | interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH |
488 | &omap4_pmx_core OMAP4_UART3_RX>; | 486 | &omap4_pmx_core OMAP4_UART3_RX>; |
489 | }; | 487 | }; |
490 | 488 | ||
491 | &uart4 { | 489 | &uart4 { |
492 | interrupts-extended = <&gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH | 490 | interrupts-extended = <&wakeupgen GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH |
493 | &omap4_pmx_core OMAP4_UART4_RX>; | 491 | &omap4_pmx_core OMAP4_UART4_RX>; |
494 | }; | 492 | }; |
495 | 493 | ||
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index 3e1da43068f6..8aca8dae968a 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts | |||
@@ -363,7 +363,6 @@ | |||
363 | reg = <0x48>; | 363 | reg = <0x48>; |
364 | /* SPI = 0, IRQ# = 7, 4 = active high level-sensitive */ | 364 | /* SPI = 0, IRQ# = 7, 4 = active high level-sensitive */ |
365 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ | 365 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ |
366 | interrupt-parent = <&gic>; | ||
367 | }; | 366 | }; |
368 | 367 | ||
369 | twl6040: twl@4b { | 368 | twl6040: twl@4b { |
@@ -375,7 +374,6 @@ | |||
375 | 374 | ||
376 | /* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ | 375 | /* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ |
377 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ | 376 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ |
378 | interrupt-parent = <&gic>; | ||
379 | ti,audpwron-gpio = <&gpio4 31 0>; /* gpio line 127 */ | 377 | ti,audpwron-gpio = <&gpio4 31 0>; /* gpio line 127 */ |
380 | 378 | ||
381 | vio-supply = <&v1v8>; | 379 | vio-supply = <&v1v8>; |
@@ -570,21 +568,21 @@ | |||
570 | }; | 568 | }; |
571 | 569 | ||
572 | &uart2 { | 570 | &uart2 { |
573 | interrupts-extended = <&gic GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH | 571 | interrupts-extended = <&wakeupgen GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH |
574 | &omap4_pmx_core OMAP4_UART2_RX>; | 572 | &omap4_pmx_core OMAP4_UART2_RX>; |
575 | pinctrl-names = "default"; | 573 | pinctrl-names = "default"; |
576 | pinctrl-0 = <&uart2_pins>; | 574 | pinctrl-0 = <&uart2_pins>; |
577 | }; | 575 | }; |
578 | 576 | ||
579 | &uart3 { | 577 | &uart3 { |
580 | interrupts-extended = <&gic GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH | 578 | interrupts-extended = <&wakeupgen GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH |
581 | &omap4_pmx_core OMAP4_UART3_RX>; | 579 | &omap4_pmx_core OMAP4_UART3_RX>; |
582 | pinctrl-names = "default"; | 580 | pinctrl-names = "default"; |
583 | pinctrl-0 = <&uart3_pins>; | 581 | pinctrl-0 = <&uart3_pins>; |
584 | }; | 582 | }; |
585 | 583 | ||
586 | &uart4 { | 584 | &uart4 { |
587 | interrupts-extended = <&gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH | 585 | interrupts-extended = <&wakeupgen GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH |
588 | &omap4_pmx_core OMAP4_UART4_RX>; | 586 | &omap4_pmx_core OMAP4_UART4_RX>; |
589 | pinctrl-names = "default"; | 587 | pinctrl-names = "default"; |
590 | pinctrl-0 = <&uart4_pins>; | 588 | pinctrl-0 = <&uart4_pins>; |
diff --git a/arch/arm/boot/dts/omap4-var-som-om44.dtsi b/arch/arm/boot/dts/omap4-var-som-om44.dtsi index 062701e1a898..a4f1ba2e1903 100644 --- a/arch/arm/boot/dts/omap4-var-som-om44.dtsi +++ b/arch/arm/boot/dts/omap4-var-som-om44.dtsi | |||
@@ -185,7 +185,6 @@ | |||
185 | reg = <0x48>; | 185 | reg = <0x48>; |
186 | /* SPI = 0, IRQ# = 7, 4 = active high level-sensitive */ | 186 | /* SPI = 0, IRQ# = 7, 4 = active high level-sensitive */ |
187 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ | 187 | interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_1N cascaded to gic */ |
188 | interrupt-parent = <&gic>; | ||
189 | }; | 188 | }; |
190 | 189 | ||
191 | twl6040: twl@4b { | 190 | twl6040: twl@4b { |
@@ -197,7 +196,6 @@ | |||
197 | 196 | ||
198 | /* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ | 197 | /* SPI = 0, IRQ# = 119, 4 = active high level-sensitive */ |
199 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ | 198 | interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>; /* IRQ_SYS_2N cascaded to gic */ |
200 | interrupt-parent = <&gic>; | ||
201 | ti,audpwron-gpio = <&gpio6 22 0>; /* gpio 182 */ | 199 | ti,audpwron-gpio = <&gpio6 22 0>; /* gpio 182 */ |
202 | 200 | ||
203 | vio-supply = <&v1v8>; | 201 | vio-supply = <&v1v8>; |
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi index 074147cebae4..7cb5236f751d 100644 --- a/arch/arm/boot/dts/omap4.dtsi +++ b/arch/arm/boot/dts/omap4.dtsi | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | / { | 15 | / { |
16 | compatible = "ti,omap4430", "ti,omap4"; | 16 | compatible = "ti,omap4430", "ti,omap4"; |
17 | interrupt-parent = <&gic>; | 17 | interrupt-parent = <&wakeupgen>; |
18 | 18 | ||
19 | aliases { | 19 | aliases { |
20 | i2c0 = &i2c1; | 20 | i2c0 = &i2c1; |
@@ -56,6 +56,7 @@ | |||
56 | #interrupt-cells = <3>; | 56 | #interrupt-cells = <3>; |
57 | reg = <0x48241000 0x1000>, | 57 | reg = <0x48241000 0x1000>, |
58 | <0x48240100 0x0100>; | 58 | <0x48240100 0x0100>; |
59 | interrupt-parent = <&gic>; | ||
59 | }; | 60 | }; |
60 | 61 | ||
61 | L2: l2-cache-controller@48242000 { | 62 | L2: l2-cache-controller@48242000 { |
@@ -70,6 +71,15 @@ | |||
70 | clocks = <&mpu_periphclk>; | 71 | clocks = <&mpu_periphclk>; |
71 | reg = <0x48240600 0x20>; | 72 | reg = <0x48240600 0x20>; |
72 | interrupts = <GIC_PPI 13 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_HIGH)>; | 73 | interrupts = <GIC_PPI 13 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_HIGH)>; |
74 | interrupt-parent = <&gic>; | ||
75 | }; | ||
76 | |||
77 | wakeupgen: interrupt-controller@48281000 { | ||
78 | compatible = "ti,omap4-wugen-mpu"; | ||
79 | interrupt-controller; | ||
80 | #interrupt-cells = <3>; | ||
81 | reg = <0x48281000 0x1000>; | ||
82 | interrupt-parent = <&gic>; | ||
73 | }; | 83 | }; |
74 | 84 | ||
75 | /* | 85 | /* |
@@ -319,7 +329,7 @@ | |||
319 | uart2: serial@4806c000 { | 329 | uart2: serial@4806c000 { |
320 | compatible = "ti,omap4-uart"; | 330 | compatible = "ti,omap4-uart"; |
321 | reg = <0x4806c000 0x100>; | 331 | reg = <0x4806c000 0x100>; |
322 | interrupts-extended = <&gic GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; | 332 | interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; |
323 | ti,hwmods = "uart2"; | 333 | ti,hwmods = "uart2"; |
324 | clock-frequency = <48000000>; | 334 | clock-frequency = <48000000>; |
325 | }; | 335 | }; |
@@ -327,7 +337,7 @@ | |||
327 | uart3: serial@48020000 { | 337 | uart3: serial@48020000 { |
328 | compatible = "ti,omap4-uart"; | 338 | compatible = "ti,omap4-uart"; |
329 | reg = <0x48020000 0x100>; | 339 | reg = <0x48020000 0x100>; |
330 | interrupts-extended = <&gic GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; | 340 | interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; |
331 | ti,hwmods = "uart3"; | 341 | ti,hwmods = "uart3"; |
332 | clock-frequency = <48000000>; | 342 | clock-frequency = <48000000>; |
333 | }; | 343 | }; |
@@ -335,7 +345,7 @@ | |||
335 | uart4: serial@4806e000 { | 345 | uart4: serial@4806e000 { |
336 | compatible = "ti,omap4-uart"; | 346 | compatible = "ti,omap4-uart"; |
337 | reg = <0x4806e000 0x100>; | 347 | reg = <0x4806e000 0x100>; |
338 | interrupts-extended = <&gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; | 348 | interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; |
339 | ti,hwmods = "uart4"; | 349 | ti,hwmods = "uart4"; |
340 | clock-frequency = <48000000>; | 350 | clock-frequency = <48000000>; |
341 | }; | 351 | }; |
diff --git a/arch/arm/boot/dts/omap5-cm-t54.dts b/arch/arm/boot/dts/omap5-cm-t54.dts index b54b271e153b..61ad2ea34720 100644 --- a/arch/arm/boot/dts/omap5-cm-t54.dts +++ b/arch/arm/boot/dts/omap5-cm-t54.dts | |||
@@ -412,7 +412,6 @@ | |||
412 | palmas: palmas@48 { | 412 | palmas: palmas@48 { |
413 | compatible = "ti,palmas"; | 413 | compatible = "ti,palmas"; |
414 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ | 414 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ |
415 | interrupt-parent = <&gic>; | ||
416 | reg = <0x48>; | 415 | reg = <0x48>; |
417 | interrupt-controller; | 416 | interrupt-controller; |
418 | #interrupt-cells = <2>; | 417 | #interrupt-cells = <2>; |
diff --git a/arch/arm/boot/dts/omap5-uevm.dts b/arch/arm/boot/dts/omap5-uevm.dts index 159720d6c956..74777a6e200a 100644 --- a/arch/arm/boot/dts/omap5-uevm.dts +++ b/arch/arm/boot/dts/omap5-uevm.dts | |||
@@ -311,7 +311,6 @@ | |||
311 | palmas: palmas@48 { | 311 | palmas: palmas@48 { |
312 | compatible = "ti,palmas"; | 312 | compatible = "ti,palmas"; |
313 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ | 313 | interrupts = <GIC_SPI 7 IRQ_TYPE_NONE>; /* IRQ_SYS_1N */ |
314 | interrupt-parent = <&gic>; | ||
315 | reg = <0x48>; | 314 | reg = <0x48>; |
316 | interrupt-controller; | 315 | interrupt-controller; |
317 | #interrupt-cells = <2>; | 316 | #interrupt-cells = <2>; |
@@ -521,7 +520,6 @@ | |||
521 | pinctrl-0 = <&twl6040_pins>; | 520 | pinctrl-0 = <&twl6040_pins>; |
522 | 521 | ||
523 | interrupts = <GIC_SPI 119 IRQ_TYPE_NONE>; /* IRQ_SYS_2N cascaded to gic */ | 522 | interrupts = <GIC_SPI 119 IRQ_TYPE_NONE>; /* IRQ_SYS_2N cascaded to gic */ |
524 | interrupt-parent = <&gic>; | ||
525 | ti,audpwron-gpio = <&gpio5 13 0>; /* gpio line 141 */ | 523 | ti,audpwron-gpio = <&gpio5 13 0>; /* gpio line 141 */ |
526 | 524 | ||
527 | vio-supply = <&smps7_reg>; | 525 | vio-supply = <&smps7_reg>; |
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index b321fdf42c9f..b056156e2a7a 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi | |||
@@ -18,7 +18,7 @@ | |||
18 | #size-cells = <1>; | 18 | #size-cells = <1>; |
19 | 19 | ||
20 | compatible = "ti,omap5"; | 20 | compatible = "ti,omap5"; |
21 | interrupt-parent = <&gic>; | 21 | interrupt-parent = <&wakeupgen>; |
22 | 22 | ||
23 | aliases { | 23 | aliases { |
24 | i2c0 = &i2c1; | 24 | i2c0 = &i2c1; |
@@ -79,6 +79,7 @@ | |||
79 | <GIC_PPI 14 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>, | 79 | <GIC_PPI 14 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>, |
80 | <GIC_PPI 11 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>, | 80 | <GIC_PPI 11 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>, |
81 | <GIC_PPI 10 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>; | 81 | <GIC_PPI 10 (GIC_CPU_MASK_RAW(3) | IRQ_TYPE_LEVEL_LOW)>; |
82 | interrupt-parent = <&gic>; | ||
82 | }; | 83 | }; |
83 | 84 | ||
84 | pmu { | 85 | pmu { |
@@ -95,6 +96,15 @@ | |||
95 | <0x48212000 0x1000>, | 96 | <0x48212000 0x1000>, |
96 | <0x48214000 0x2000>, | 97 | <0x48214000 0x2000>, |
97 | <0x48216000 0x2000>; | 98 | <0x48216000 0x2000>; |
99 | interrupt-parent = <&gic>; | ||
100 | }; | ||
101 | |||
102 | wakeupgen: interrupt-controller@48281000 { | ||
103 | compatible = "ti,omap5-wugen-mpu", "ti,omap4-wugen-mpu"; | ||
104 | interrupt-controller; | ||
105 | #interrupt-cells = <3>; | ||
106 | reg = <0x48281000 0x1000>; | ||
107 | interrupt-parent = <&gic>; | ||
98 | }; | 108 | }; |
99 | 109 | ||
100 | /* | 110 | /* |
@@ -458,7 +468,7 @@ | |||
458 | uart1: serial@4806a000 { | 468 | uart1: serial@4806a000 { |
459 | compatible = "ti,omap4-uart"; | 469 | compatible = "ti,omap4-uart"; |
460 | reg = <0x4806a000 0x100>; | 470 | reg = <0x4806a000 0x100>; |
461 | interrupts-extended = <&gic GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; | 471 | interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>; |
462 | ti,hwmods = "uart1"; | 472 | ti,hwmods = "uart1"; |
463 | clock-frequency = <48000000>; | 473 | clock-frequency = <48000000>; |
464 | }; | 474 | }; |
@@ -466,7 +476,7 @@ | |||
466 | uart2: serial@4806c000 { | 476 | uart2: serial@4806c000 { |
467 | compatible = "ti,omap4-uart"; | 477 | compatible = "ti,omap4-uart"; |
468 | reg = <0x4806c000 0x100>; | 478 | reg = <0x4806c000 0x100>; |
469 | interrupts-extended = <&gic GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; | 479 | interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>; |
470 | ti,hwmods = "uart2"; | 480 | ti,hwmods = "uart2"; |
471 | clock-frequency = <48000000>; | 481 | clock-frequency = <48000000>; |
472 | }; | 482 | }; |
@@ -474,7 +484,7 @@ | |||
474 | uart3: serial@48020000 { | 484 | uart3: serial@48020000 { |
475 | compatible = "ti,omap4-uart"; | 485 | compatible = "ti,omap4-uart"; |
476 | reg = <0x48020000 0x100>; | 486 | reg = <0x48020000 0x100>; |
477 | interrupts-extended = <&gic GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; | 487 | interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>; |
478 | ti,hwmods = "uart3"; | 488 | ti,hwmods = "uart3"; |
479 | clock-frequency = <48000000>; | 489 | clock-frequency = <48000000>; |
480 | }; | 490 | }; |
@@ -482,7 +492,7 @@ | |||
482 | uart4: serial@4806e000 { | 492 | uart4: serial@4806e000 { |
483 | compatible = "ti,omap4-uart"; | 493 | compatible = "ti,omap4-uart"; |
484 | reg = <0x4806e000 0x100>; | 494 | reg = <0x4806e000 0x100>; |
485 | interrupts-extended = <&gic GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; | 495 | interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; |
486 | ti,hwmods = "uart4"; | 496 | ti,hwmods = "uart4"; |
487 | clock-frequency = <48000000>; | 497 | clock-frequency = <48000000>; |
488 | }; | 498 | }; |
@@ -490,7 +500,7 @@ | |||
490 | uart5: serial@48066000 { | 500 | uart5: serial@48066000 { |
491 | compatible = "ti,omap4-uart"; | 501 | compatible = "ti,omap4-uart"; |
492 | reg = <0x48066000 0x100>; | 502 | reg = <0x48066000 0x100>; |
493 | interrupts-extended = <&gic GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; | 503 | interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>; |
494 | ti,hwmods = "uart5"; | 504 | ti,hwmods = "uart5"; |
495 | clock-frequency = <48000000>; | 505 | clock-frequency = <48000000>; |
496 | }; | 506 | }; |
@@ -498,7 +508,7 @@ | |||
498 | uart6: serial@48068000 { | 508 | uart6: serial@48068000 { |
499 | compatible = "ti,omap4-uart"; | 509 | compatible = "ti,omap4-uart"; |
500 | reg = <0x48068000 0x100>; | 510 | reg = <0x48068000 0x100>; |
501 | interrupts-extended = <&gic GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; | 511 | interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>; |
502 | ti,hwmods = "uart6"; | 512 | ti,hwmods = "uart6"; |
503 | clock-frequency = <48000000>; | 513 | clock-frequency = <48000000>; |
504 | }; | 514 | }; |
@@ -883,14 +893,12 @@ | |||
883 | usbhsohci: ohci@4a064800 { | 893 | usbhsohci: ohci@4a064800 { |
884 | compatible = "ti,ohci-omap3"; | 894 | compatible = "ti,ohci-omap3"; |
885 | reg = <0x4a064800 0x400>; | 895 | reg = <0x4a064800 0x400>; |
886 | interrupt-parent = <&gic>; | ||
887 | interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>; | 896 | interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>; |
888 | }; | 897 | }; |
889 | 898 | ||
890 | usbhsehci: ehci@4a064c00 { | 899 | usbhsehci: ehci@4a064c00 { |
891 | compatible = "ti,ehci-omap"; | 900 | compatible = "ti,ehci-omap"; |
892 | reg = <0x4a064c00 0x400>; | 901 | reg = <0x4a064c00 0x400>; |
893 | interrupt-parent = <&gic>; | ||
894 | interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>; | 902 | interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>; |
895 | }; | 903 | }; |
896 | }; | 904 | }; |
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index f961c46453b9..3b56722dfd8a 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c | |||
@@ -20,11 +20,12 @@ | |||
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/irqdomain.h> | ||
24 | #include <linux/of_address.h> | ||
23 | #include <linux/platform_device.h> | 25 | #include <linux/platform_device.h> |
24 | #include <linux/cpu.h> | 26 | #include <linux/cpu.h> |
25 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
26 | #include <linux/cpu_pm.h> | 28 | #include <linux/cpu_pm.h> |
27 | #include <linux/irqchip/arm-gic.h> | ||
28 | 29 | ||
29 | #include "omap-wakeupgen.h" | 30 | #include "omap-wakeupgen.h" |
30 | #include "omap-secure.h" | 31 | #include "omap-secure.h" |
@@ -78,29 +79,12 @@ static inline void sar_writel(u32 val, u32 offset, u8 idx) | |||
78 | 79 | ||
79 | static inline int _wakeupgen_get_irq_info(u32 irq, u32 *bit_posn, u8 *reg_index) | 80 | static inline int _wakeupgen_get_irq_info(u32 irq, u32 *bit_posn, u8 *reg_index) |
80 | { | 81 | { |
81 | unsigned int spi_irq; | ||
82 | |||
83 | /* | ||
84 | * PPIs and SGIs are not supported. | ||
85 | */ | ||
86 | if (irq < OMAP44XX_IRQ_GIC_START) | ||
87 | return -EINVAL; | ||
88 | |||
89 | /* | ||
90 | * Subtract the GIC offset. | ||
91 | */ | ||
92 | spi_irq = irq - OMAP44XX_IRQ_GIC_START; | ||
93 | if (spi_irq > MAX_IRQS) { | ||
94 | pr_err("omap wakeupGen: Invalid IRQ%d\n", irq); | ||
95 | return -EINVAL; | ||
96 | } | ||
97 | |||
98 | /* | 82 | /* |
99 | * Each WakeupGen register controls 32 interrupt. | 83 | * Each WakeupGen register controls 32 interrupt. |
100 | * i.e. 1 bit per SPI IRQ | 84 | * i.e. 1 bit per SPI IRQ |
101 | */ | 85 | */ |
102 | *reg_index = spi_irq >> 5; | 86 | *reg_index = irq >> 5; |
103 | *bit_posn = spi_irq %= 32; | 87 | *bit_posn = irq %= 32; |
104 | 88 | ||
105 | return 0; | 89 | return 0; |
106 | } | 90 | } |
@@ -141,6 +125,7 @@ static void wakeupgen_mask(struct irq_data *d) | |||
141 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); | 125 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); |
142 | _wakeupgen_clear(d->hwirq, irq_target_cpu[d->hwirq]); | 126 | _wakeupgen_clear(d->hwirq, irq_target_cpu[d->hwirq]); |
143 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); | 127 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); |
128 | irq_chip_mask_parent(d); | ||
144 | } | 129 | } |
145 | 130 | ||
146 | /* | 131 | /* |
@@ -153,6 +138,7 @@ static void wakeupgen_unmask(struct irq_data *d) | |||
153 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); | 138 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); |
154 | _wakeupgen_set(d->hwirq, irq_target_cpu[d->hwirq]); | 139 | _wakeupgen_set(d->hwirq, irq_target_cpu[d->hwirq]); |
155 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); | 140 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); |
141 | irq_chip_unmask_parent(d); | ||
156 | } | 142 | } |
157 | 143 | ||
158 | #ifdef CONFIG_HOTPLUG_CPU | 144 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -400,15 +386,91 @@ int omap_secure_apis_support(void) | |||
400 | return omap_secure_apis; | 386 | return omap_secure_apis; |
401 | } | 387 | } |
402 | 388 | ||
389 | static struct irq_chip wakeupgen_chip = { | ||
390 | .name = "WUGEN", | ||
391 | .irq_eoi = irq_chip_eoi_parent, | ||
392 | .irq_mask = wakeupgen_mask, | ||
393 | .irq_unmask = wakeupgen_unmask, | ||
394 | .irq_retrigger = irq_chip_retrigger_hierarchy, | ||
395 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_MASK_ON_SUSPEND, | ||
396 | #ifdef CONFIG_SMP | ||
397 | .irq_set_affinity = irq_chip_set_affinity_parent, | ||
398 | #endif | ||
399 | }; | ||
400 | |||
401 | static int wakeupgen_domain_xlate(struct irq_domain *domain, | ||
402 | struct device_node *controller, | ||
403 | const u32 *intspec, | ||
404 | unsigned int intsize, | ||
405 | unsigned long *out_hwirq, | ||
406 | unsigned int *out_type) | ||
407 | { | ||
408 | if (domain->of_node != controller) | ||
409 | return -EINVAL; /* Shouldn't happen, really... */ | ||
410 | if (intsize != 3) | ||
411 | return -EINVAL; /* Not GIC compliant */ | ||
412 | if (intspec[0] != 0) | ||
413 | return -EINVAL; /* No PPI should point to this domain */ | ||
414 | |||
415 | *out_hwirq = intspec[1]; | ||
416 | *out_type = intspec[2]; | ||
417 | return 0; | ||
418 | } | ||
419 | |||
420 | static int wakeupgen_domain_alloc(struct irq_domain *domain, | ||
421 | unsigned int virq, | ||
422 | unsigned int nr_irqs, void *data) | ||
423 | { | ||
424 | struct of_phandle_args *args = data; | ||
425 | struct of_phandle_args parent_args; | ||
426 | irq_hw_number_t hwirq; | ||
427 | int i; | ||
428 | |||
429 | if (args->args_count != 3) | ||
430 | return -EINVAL; /* Not GIC compliant */ | ||
431 | if (args->args[0] != 0) | ||
432 | return -EINVAL; /* No PPI should point to this domain */ | ||
433 | |||
434 | hwirq = args->args[1]; | ||
435 | if (hwirq >= MAX_IRQS) | ||
436 | return -EINVAL; /* Can't deal with this */ | ||
437 | |||
438 | for (i = 0; i < nr_irqs; i++) | ||
439 | irq_domain_set_hwirq_and_chip(domain, virq + i, hwirq + i, | ||
440 | &wakeupgen_chip, NULL); | ||
441 | |||
442 | parent_args = *args; | ||
443 | parent_args.np = domain->parent->of_node; | ||
444 | return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, &parent_args); | ||
445 | } | ||
446 | |||
447 | static struct irq_domain_ops wakeupgen_domain_ops = { | ||
448 | .xlate = wakeupgen_domain_xlate, | ||
449 | .alloc = wakeupgen_domain_alloc, | ||
450 | .free = irq_domain_free_irqs_common, | ||
451 | }; | ||
452 | |||
403 | /* | 453 | /* |
404 | * Initialise the wakeupgen module. | 454 | * Initialise the wakeupgen module. |
405 | */ | 455 | */ |
406 | int __init omap_wakeupgen_init(void) | 456 | static int __init wakeupgen_init(struct device_node *node, |
457 | struct device_node *parent) | ||
407 | { | 458 | { |
459 | struct irq_domain *parent_domain, *domain; | ||
408 | int i; | 460 | int i; |
409 | unsigned int boot_cpu = smp_processor_id(); | 461 | unsigned int boot_cpu = smp_processor_id(); |
410 | u32 val; | 462 | u32 val; |
411 | 463 | ||
464 | if (!parent) { | ||
465 | pr_err("%s: no parent, giving up\n", node->full_name); | ||
466 | return -ENODEV; | ||
467 | } | ||
468 | |||
469 | parent_domain = irq_find_host(parent); | ||
470 | if (!parent_domain) { | ||
471 | pr_err("%s: unable to obtain parent domain\n", node->full_name); | ||
472 | return -ENXIO; | ||
473 | } | ||
412 | /* Not supported on OMAP4 ES1.0 silicon */ | 474 | /* Not supported on OMAP4 ES1.0 silicon */ |
413 | if (omap_rev() == OMAP4430_REV_ES1_0) { | 475 | if (omap_rev() == OMAP4430_REV_ES1_0) { |
414 | WARN(1, "WakeupGen: Not supported on OMAP4430 ES1.0\n"); | 476 | WARN(1, "WakeupGen: Not supported on OMAP4430 ES1.0\n"); |
@@ -416,7 +478,7 @@ int __init omap_wakeupgen_init(void) | |||
416 | } | 478 | } |
417 | 479 | ||
418 | /* Static mapping, never released */ | 480 | /* Static mapping, never released */ |
419 | wakeupgen_base = ioremap(OMAP_WKUPGEN_BASE, SZ_4K); | 481 | wakeupgen_base = of_iomap(node, 0); |
420 | if (WARN_ON(!wakeupgen_base)) | 482 | if (WARN_ON(!wakeupgen_base)) |
421 | return -ENOMEM; | 483 | return -ENOMEM; |
422 | 484 | ||
@@ -429,6 +491,14 @@ int __init omap_wakeupgen_init(void) | |||
429 | max_irqs = AM43XX_IRQS; | 491 | max_irqs = AM43XX_IRQS; |
430 | } | 492 | } |
431 | 493 | ||
494 | domain = irq_domain_add_hierarchy(parent_domain, 0, max_irqs, | ||
495 | node, &wakeupgen_domain_ops, | ||
496 | NULL); | ||
497 | if (!domain) { | ||
498 | iounmap(wakeupgen_base); | ||
499 | return -ENOMEM; | ||
500 | } | ||
501 | |||
432 | /* Clear all IRQ bitmasks at wakeupGen level */ | 502 | /* Clear all IRQ bitmasks at wakeupGen level */ |
433 | for (i = 0; i < irq_banks; i++) { | 503 | for (i = 0; i < irq_banks; i++) { |
434 | wakeupgen_writel(0, i, CPU0_ID); | 504 | wakeupgen_writel(0, i, CPU0_ID); |
@@ -437,14 +507,6 @@ int __init omap_wakeupgen_init(void) | |||
437 | } | 507 | } |
438 | 508 | ||
439 | /* | 509 | /* |
440 | * Override GIC architecture specific functions to add | ||
441 | * OMAP WakeupGen interrupt controller along with GIC | ||
442 | */ | ||
443 | gic_arch_extn.irq_mask = wakeupgen_mask; | ||
444 | gic_arch_extn.irq_unmask = wakeupgen_unmask; | ||
445 | gic_arch_extn.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE; | ||
446 | |||
447 | /* | ||
448 | * FIXME: Add support to set_smp_affinity() once the core | 510 | * FIXME: Add support to set_smp_affinity() once the core |
449 | * GIC code has necessary hooks in place. | 511 | * GIC code has necessary hooks in place. |
450 | */ | 512 | */ |
@@ -474,3 +536,9 @@ int __init omap_wakeupgen_init(void) | |||
474 | 536 | ||
475 | return 0; | 537 | return 0; |
476 | } | 538 | } |
539 | |||
540 | /* | ||
541 | * We cannot use the IRQCHIP_DECLARE macro that lives in | ||
542 | * drivers/irqchip, so we're forced to roll our own. Not very nice. | ||
543 | */ | ||
544 | OF_DECLARE_2(irqchip, ti_wakeupgen, "ti,omap4-wugen-mpu", wakeupgen_init); | ||
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.h b/arch/arm/mach-omap2/omap-wakeupgen.h index b3c8eccfae79..a3491ad12368 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.h +++ b/arch/arm/mach-omap2/omap-wakeupgen.h | |||
@@ -33,7 +33,6 @@ | |||
33 | #define OMAP_TIMESTAMPCYCLELO 0xc08 | 33 | #define OMAP_TIMESTAMPCYCLELO 0xc08 |
34 | #define OMAP_TIMESTAMPCYCLEHI 0xc0c | 34 | #define OMAP_TIMESTAMPCYCLEHI 0xc0c |
35 | 35 | ||
36 | extern int __init omap_wakeupgen_init(void); | ||
37 | extern void __iomem *omap_get_wakeupgen_base(void); | 36 | extern void __iomem *omap_get_wakeupgen_base(void); |
38 | extern int omap_secure_apis_support(void); | 37 | extern int omap_secure_apis_support(void); |
39 | #endif | 38 | #endif |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index cee0fe1ee6ff..7bb116a6f86f 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/of_platform.h> | 22 | #include <linux/of_platform.h> |
23 | #include <linux/export.h> | 23 | #include <linux/export.h> |
24 | #include <linux/irqchip/arm-gic.h> | 24 | #include <linux/irqchip/arm-gic.h> |
25 | #include <linux/irqchip/irq-crossbar.h> | ||
26 | #include <linux/of_address.h> | 25 | #include <linux/of_address.h> |
27 | #include <linux/reboot.h> | 26 | #include <linux/reboot.h> |
28 | #include <linux/genalloc.h> | 27 | #include <linux/genalloc.h> |
@@ -242,26 +241,26 @@ static int __init omap4_sar_ram_init(void) | |||
242 | } | 241 | } |
243 | omap_early_initcall(omap4_sar_ram_init); | 242 | omap_early_initcall(omap4_sar_ram_init); |
244 | 243 | ||
245 | static const struct of_device_id gic_match[] = { | 244 | static const struct of_device_id intc_match[] = { |
246 | { .compatible = "arm,cortex-a9-gic", }, | 245 | { .compatible = "ti,omap4-wugen-mpu", }, |
247 | { .compatible = "arm,cortex-a15-gic", }, | 246 | { .compatible = "ti,omap5-wugen-mpu", }, |
248 | { }, | 247 | { }, |
249 | }; | 248 | }; |
250 | 249 | ||
251 | static struct device_node *gic_node; | 250 | static struct device_node *intc_node; |
252 | 251 | ||
253 | unsigned int omap4_xlate_irq(unsigned int hwirq) | 252 | unsigned int omap4_xlate_irq(unsigned int hwirq) |
254 | { | 253 | { |
255 | struct of_phandle_args irq_data; | 254 | struct of_phandle_args irq_data; |
256 | unsigned int irq; | 255 | unsigned int irq; |
257 | 256 | ||
258 | if (!gic_node) | 257 | if (!intc_node) |
259 | gic_node = of_find_matching_node(NULL, gic_match); | 258 | intc_node = of_find_matching_node(NULL, intc_match); |
260 | 259 | ||
261 | if (WARN_ON(!gic_node)) | 260 | if (WARN_ON(!intc_node)) |
262 | return hwirq; | 261 | return hwirq; |
263 | 262 | ||
264 | irq_data.np = gic_node; | 263 | irq_data.np = intc_node; |
265 | irq_data.args_count = 3; | 264 | irq_data.args_count = 3; |
266 | irq_data.args[0] = 0; | 265 | irq_data.args[0] = 0; |
267 | irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START; | 266 | irq_data.args[1] = hwirq - OMAP44XX_IRQ_GIC_START; |
@@ -278,6 +277,12 @@ void __init omap_gic_of_init(void) | |||
278 | { | 277 | { |
279 | struct device_node *np; | 278 | struct device_node *np; |
280 | 279 | ||
280 | intc_node = of_find_matching_node(NULL, intc_match); | ||
281 | if (WARN_ON(!intc_node)) { | ||
282 | pr_err("No WUGEN found in DT, system will misbehave.\n"); | ||
283 | pr_err("UPDATE YOUR DEVICE TREE!\n"); | ||
284 | } | ||
285 | |||
281 | /* Extract GIC distributor and TWD bases for OMAP4460 ROM Errata WA */ | 286 | /* Extract GIC distributor and TWD bases for OMAP4460 ROM Errata WA */ |
282 | if (!cpu_is_omap446x()) | 287 | if (!cpu_is_omap446x()) |
283 | goto skip_errata_init; | 288 | goto skip_errata_init; |
@@ -291,9 +296,5 @@ void __init omap_gic_of_init(void) | |||
291 | WARN_ON(!twd_base); | 296 | WARN_ON(!twd_base); |
292 | 297 | ||
293 | skip_errata_init: | 298 | skip_errata_init: |
294 | omap_wakeupgen_init(); | ||
295 | #ifdef CONFIG_IRQ_CROSSBAR | ||
296 | irqcrossbar_init(); | ||
297 | #endif | ||
298 | irqchip_init(); | 299 | irqchip_init(); |
299 | } | 300 | } |
diff --git a/drivers/irqchip/irq-crossbar.c b/drivers/irqchip/irq-crossbar.c index bbbaf5de65d2..692fe2bc8197 100644 --- a/drivers/irqchip/irq-crossbar.c +++ b/drivers/irqchip/irq-crossbar.c | |||
@@ -11,11 +11,12 @@ | |||
11 | */ | 11 | */ |
12 | #include <linux/err.h> | 12 | #include <linux/err.h> |
13 | #include <linux/io.h> | 13 | #include <linux/io.h> |
14 | #include <linux/irqdomain.h> | ||
14 | #include <linux/of_address.h> | 15 | #include <linux/of_address.h> |
15 | #include <linux/of_irq.h> | 16 | #include <linux/of_irq.h> |
16 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
17 | #include <linux/irqchip/arm-gic.h> | 18 | |
18 | #include <linux/irqchip/irq-crossbar.h> | 19 | #include "irqchip.h" |
19 | 20 | ||
20 | #define IRQ_FREE -1 | 21 | #define IRQ_FREE -1 |
21 | #define IRQ_RESERVED -2 | 22 | #define IRQ_RESERVED -2 |
@@ -24,6 +25,7 @@ | |||
24 | 25 | ||
25 | /** | 26 | /** |
26 | * struct crossbar_device - crossbar device description | 27 | * struct crossbar_device - crossbar device description |
28 | * @lock: spinlock serializing access to @irq_map | ||
27 | * @int_max: maximum number of supported interrupts | 29 | * @int_max: maximum number of supported interrupts |
28 | * @safe_map: safe default value to initialize the crossbar | 30 | * @safe_map: safe default value to initialize the crossbar |
29 | * @max_crossbar_sources: Maximum number of crossbar sources | 31 | * @max_crossbar_sources: Maximum number of crossbar sources |
@@ -33,6 +35,7 @@ | |||
33 | * @write: register write function pointer | 35 | * @write: register write function pointer |
34 | */ | 36 | */ |
35 | struct crossbar_device { | 37 | struct crossbar_device { |
38 | raw_spinlock_t lock; | ||
36 | uint int_max; | 39 | uint int_max; |
37 | uint safe_map; | 40 | uint safe_map; |
38 | uint max_crossbar_sources; | 41 | uint max_crossbar_sources; |
@@ -44,72 +47,101 @@ struct crossbar_device { | |||
44 | 47 | ||
45 | static struct crossbar_device *cb; | 48 | static struct crossbar_device *cb; |
46 | 49 | ||
47 | static inline void crossbar_writel(int irq_no, int cb_no) | 50 | static void crossbar_writel(int irq_no, int cb_no) |
48 | { | 51 | { |
49 | writel(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); | 52 | writel(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); |
50 | } | 53 | } |
51 | 54 | ||
52 | static inline void crossbar_writew(int irq_no, int cb_no) | 55 | static void crossbar_writew(int irq_no, int cb_no) |
53 | { | 56 | { |
54 | writew(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); | 57 | writew(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); |
55 | } | 58 | } |
56 | 59 | ||
57 | static inline void crossbar_writeb(int irq_no, int cb_no) | 60 | static void crossbar_writeb(int irq_no, int cb_no) |
58 | { | 61 | { |
59 | writeb(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); | 62 | writeb(cb_no, cb->crossbar_base + cb->register_offsets[irq_no]); |
60 | } | 63 | } |
61 | 64 | ||
62 | static inline int get_prev_map_irq(int cb_no) | 65 | static struct irq_chip crossbar_chip = { |
63 | { | 66 | .name = "CBAR", |
64 | int i; | 67 | .irq_eoi = irq_chip_eoi_parent, |
65 | 68 | .irq_mask = irq_chip_mask_parent, | |
66 | for (i = cb->int_max - 1; i >= 0; i--) | 69 | .irq_unmask = irq_chip_unmask_parent, |
67 | if (cb->irq_map[i] == cb_no) | 70 | .irq_retrigger = irq_chip_retrigger_hierarchy, |
68 | return i; | 71 | .irq_set_wake = irq_chip_set_wake_parent, |
69 | 72 | #ifdef CONFIG_SMP | |
70 | return -ENODEV; | 73 | .irq_set_affinity = irq_chip_set_affinity_parent, |
71 | } | 74 | #endif |
75 | }; | ||
72 | 76 | ||
73 | static inline int allocate_free_irq(int cb_no) | 77 | static int allocate_gic_irq(struct irq_domain *domain, unsigned virq, |
78 | irq_hw_number_t hwirq) | ||
74 | { | 79 | { |
80 | struct of_phandle_args args; | ||
75 | int i; | 81 | int i; |
82 | int err; | ||
76 | 83 | ||
84 | raw_spin_lock(&cb->lock); | ||
77 | for (i = cb->int_max - 1; i >= 0; i--) { | 85 | for (i = cb->int_max - 1; i >= 0; i--) { |
78 | if (cb->irq_map[i] == IRQ_FREE) { | 86 | if (cb->irq_map[i] == IRQ_FREE) { |
79 | cb->irq_map[i] = cb_no; | 87 | cb->irq_map[i] = hwirq; |
80 | return i; | 88 | break; |
81 | } | 89 | } |
82 | } | 90 | } |
91 | raw_spin_unlock(&cb->lock); | ||
83 | 92 | ||
84 | return -ENODEV; | 93 | if (i < 0) |
85 | } | 94 | return -ENODEV; |
86 | 95 | ||
87 | static inline bool needs_crossbar_write(irq_hw_number_t hw) | 96 | args.np = domain->parent->of_node; |
88 | { | 97 | args.args_count = 3; |
89 | int cb_no; | 98 | args.args[0] = 0; /* SPI */ |
99 | args.args[1] = i; | ||
100 | args.args[2] = IRQ_TYPE_LEVEL_HIGH; | ||
90 | 101 | ||
91 | if (hw > GIC_IRQ_START) { | 102 | err = irq_domain_alloc_irqs_parent(domain, virq, 1, &args); |
92 | cb_no = cb->irq_map[hw - GIC_IRQ_START]; | 103 | if (err) |
93 | if (cb_no != IRQ_RESERVED && cb_no != IRQ_SKIP) | 104 | cb->irq_map[i] = IRQ_FREE; |
94 | return true; | 105 | else |
95 | } | 106 | cb->write(i, hwirq); |
96 | 107 | ||
97 | return false; | 108 | return err; |
98 | } | 109 | } |
99 | 110 | ||
100 | static int crossbar_domain_map(struct irq_domain *d, unsigned int irq, | 111 | static int crossbar_domain_alloc(struct irq_domain *d, unsigned int virq, |
101 | irq_hw_number_t hw) | 112 | unsigned int nr_irqs, void *data) |
102 | { | 113 | { |
103 | if (needs_crossbar_write(hw)) | 114 | struct of_phandle_args *args = data; |
104 | cb->write(hw - GIC_IRQ_START, cb->irq_map[hw - GIC_IRQ_START]); | 115 | irq_hw_number_t hwirq; |
116 | int i; | ||
117 | |||
118 | if (args->args_count != 3) | ||
119 | return -EINVAL; /* Not GIC compliant */ | ||
120 | if (args->args[0] != 0) | ||
121 | return -EINVAL; /* No PPI should point to this domain */ | ||
122 | |||
123 | hwirq = args->args[1]; | ||
124 | if ((hwirq + nr_irqs) > cb->max_crossbar_sources) | ||
125 | return -EINVAL; /* Can't deal with this */ | ||
126 | |||
127 | for (i = 0; i < nr_irqs; i++) { | ||
128 | int err = allocate_gic_irq(d, virq + i, hwirq + i); | ||
129 | |||
130 | if (err) | ||
131 | return err; | ||
132 | |||
133 | irq_domain_set_hwirq_and_chip(d, virq + i, hwirq + i, | ||
134 | &crossbar_chip, NULL); | ||
135 | } | ||
105 | 136 | ||
106 | return 0; | 137 | return 0; |
107 | } | 138 | } |
108 | 139 | ||
109 | /** | 140 | /** |
110 | * crossbar_domain_unmap - unmap a crossbar<->irq connection | 141 | * crossbar_domain_free - unmap/free a crossbar<->irq connection |
111 | * @d: domain of irq to unmap | 142 | * @domain: domain of irq to unmap |
112 | * @irq: virq number | 143 | * @virq: virq number |
144 | * @nr_irqs: number of irqs to free | ||
113 | * | 145 | * |
114 | * We do not maintain a use count of total number of map/unmap | 146 | * We do not maintain a use count of total number of map/unmap |
115 | * calls for a particular irq to find out if a irq can be really | 147 | * calls for a particular irq to find out if a irq can be really |
@@ -117,14 +149,20 @@ static int crossbar_domain_map(struct irq_domain *d, unsigned int irq, | |||
117 | * after which irq is anyways unusable. So an explicit map has to be called | 149 | * after which irq is anyways unusable. So an explicit map has to be called |
118 | * after that. | 150 | * after that. |
119 | */ | 151 | */ |
120 | static void crossbar_domain_unmap(struct irq_domain *d, unsigned int irq) | 152 | static void crossbar_domain_free(struct irq_domain *domain, unsigned int virq, |
153 | unsigned int nr_irqs) | ||
121 | { | 154 | { |
122 | irq_hw_number_t hw = irq_get_irq_data(irq)->hwirq; | 155 | int i; |
123 | 156 | ||
124 | if (needs_crossbar_write(hw)) { | 157 | raw_spin_lock(&cb->lock); |
125 | cb->irq_map[hw - GIC_IRQ_START] = IRQ_FREE; | 158 | for (i = 0; i < nr_irqs; i++) { |
126 | cb->write(hw - GIC_IRQ_START, cb->safe_map); | 159 | struct irq_data *d = irq_domain_get_irq_data(domain, virq + i); |
160 | |||
161 | irq_domain_reset_irq_data(d); | ||
162 | cb->irq_map[d->hwirq] = IRQ_FREE; | ||
163 | cb->write(d->hwirq, cb->safe_map); | ||
127 | } | 164 | } |
165 | raw_spin_unlock(&cb->lock); | ||
128 | } | 166 | } |
129 | 167 | ||
130 | static int crossbar_domain_xlate(struct irq_domain *d, | 168 | static int crossbar_domain_xlate(struct irq_domain *d, |
@@ -133,44 +171,22 @@ static int crossbar_domain_xlate(struct irq_domain *d, | |||
133 | unsigned long *out_hwirq, | 171 | unsigned long *out_hwirq, |
134 | unsigned int *out_type) | 172 | unsigned int *out_type) |
135 | { | 173 | { |
136 | int ret; | 174 | if (d->of_node != controller) |
137 | int req_num = intspec[1]; | 175 | return -EINVAL; /* Shouldn't happen, really... */ |
138 | int direct_map_num; | 176 | if (intsize != 3) |
139 | 177 | return -EINVAL; /* Not GIC compliant */ | |
140 | if (req_num >= cb->max_crossbar_sources) { | 178 | if (intspec[0] != 0) |
141 | direct_map_num = req_num - cb->max_crossbar_sources; | 179 | return -EINVAL; /* No PPI should point to this domain */ |
142 | if (direct_map_num < cb->int_max) { | 180 | |
143 | ret = cb->irq_map[direct_map_num]; | 181 | *out_hwirq = intspec[1]; |
144 | if (ret == IRQ_RESERVED || ret == IRQ_SKIP) { | 182 | *out_type = intspec[2]; |
145 | /* We use the interrupt num as h/w irq num */ | ||
146 | ret = direct_map_num; | ||
147 | goto found; | ||
148 | } | ||
149 | } | ||
150 | |||
151 | pr_err("%s: requested crossbar number %d > max %d\n", | ||
152 | __func__, req_num, cb->max_crossbar_sources); | ||
153 | return -EINVAL; | ||
154 | } | ||
155 | |||
156 | ret = get_prev_map_irq(req_num); | ||
157 | if (ret >= 0) | ||
158 | goto found; | ||
159 | |||
160 | ret = allocate_free_irq(req_num); | ||
161 | |||
162 | if (ret < 0) | ||
163 | return ret; | ||
164 | |||
165 | found: | ||
166 | *out_hwirq = ret + GIC_IRQ_START; | ||
167 | return 0; | 183 | return 0; |
168 | } | 184 | } |
169 | 185 | ||
170 | static const struct irq_domain_ops routable_irq_domain_ops = { | 186 | static const struct irq_domain_ops crossbar_domain_ops = { |
171 | .map = crossbar_domain_map, | 187 | .alloc = crossbar_domain_alloc, |
172 | .unmap = crossbar_domain_unmap, | 188 | .free = crossbar_domain_free, |
173 | .xlate = crossbar_domain_xlate | 189 | .xlate = crossbar_domain_xlate, |
174 | }; | 190 | }; |
175 | 191 | ||
176 | static int __init crossbar_of_init(struct device_node *node) | 192 | static int __init crossbar_of_init(struct device_node *node) |
@@ -293,7 +309,8 @@ static int __init crossbar_of_init(struct device_node *node) | |||
293 | cb->write(i, cb->safe_map); | 309 | cb->write(i, cb->safe_map); |
294 | } | 310 | } |
295 | 311 | ||
296 | register_routable_domain_ops(&routable_irq_domain_ops); | 312 | raw_spin_lock_init(&cb->lock); |
313 | |||
297 | return 0; | 314 | return 0; |
298 | 315 | ||
299 | err_reg_offset: | 316 | err_reg_offset: |
@@ -309,18 +326,37 @@ err_cb: | |||
309 | return ret; | 326 | return ret; |
310 | } | 327 | } |
311 | 328 | ||
312 | static const struct of_device_id crossbar_match[] __initconst = { | 329 | static int __init irqcrossbar_init(struct device_node *node, |
313 | { .compatible = "ti,irq-crossbar" }, | 330 | struct device_node *parent) |
314 | {} | ||
315 | }; | ||
316 | |||
317 | int __init irqcrossbar_init(void) | ||
318 | { | 331 | { |
319 | struct device_node *np; | 332 | struct irq_domain *parent_domain, *domain; |
320 | np = of_find_matching_node(NULL, crossbar_match); | 333 | int err; |
321 | if (!np) | 334 | |
335 | if (!parent) { | ||
336 | pr_err("%s: no parent, giving up\n", node->full_name); | ||
322 | return -ENODEV; | 337 | return -ENODEV; |
338 | } | ||
339 | |||
340 | parent_domain = irq_find_host(parent); | ||
341 | if (!parent_domain) { | ||
342 | pr_err("%s: unable to obtain parent domain\n", node->full_name); | ||
343 | return -ENXIO; | ||
344 | } | ||
345 | |||
346 | err = crossbar_of_init(node); | ||
347 | if (err) | ||
348 | return err; | ||
349 | |||
350 | domain = irq_domain_add_hierarchy(parent_domain, 0, | ||
351 | cb->max_crossbar_sources, | ||
352 | node, &crossbar_domain_ops, | ||
353 | NULL); | ||
354 | if (!domain) { | ||
355 | pr_err("%s: failed to allocated domain\n", node->full_name); | ||
356 | return -ENOMEM; | ||
357 | } | ||
323 | 358 | ||
324 | crossbar_of_init(np); | ||
325 | return 0; | 359 | return 0; |
326 | } | 360 | } |
361 | |||
362 | IRQCHIP_DECLARE(ti_irqcrossbar, "ti,irq-crossbar", irqcrossbar_init); | ||
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 50e70a8c7ec4..868983c6aa5e 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c | |||
@@ -798,15 +798,12 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq, | |||
798 | irq_domain_set_info(d, irq, hw, &gic_chip, d->host_data, | 798 | irq_domain_set_info(d, irq, hw, &gic_chip, d->host_data, |
799 | handle_fasteoi_irq, NULL, NULL); | 799 | handle_fasteoi_irq, NULL, NULL); |
800 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 800 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
801 | |||
802 | gic_routable_irq_domain_ops->map(d, irq, hw); | ||
803 | } | 801 | } |
804 | return 0; | 802 | return 0; |
805 | } | 803 | } |
806 | 804 | ||
807 | static void gic_irq_domain_unmap(struct irq_domain *d, unsigned int irq) | 805 | static void gic_irq_domain_unmap(struct irq_domain *d, unsigned int irq) |
808 | { | 806 | { |
809 | gic_routable_irq_domain_ops->unmap(d, irq); | ||
810 | } | 807 | } |
811 | 808 | ||
812 | static int gic_irq_domain_xlate(struct irq_domain *d, | 809 | static int gic_irq_domain_xlate(struct irq_domain *d, |
@@ -825,16 +822,8 @@ static int gic_irq_domain_xlate(struct irq_domain *d, | |||
825 | *out_hwirq = intspec[1] + 16; | 822 | *out_hwirq = intspec[1] + 16; |
826 | 823 | ||
827 | /* For SPIs, we need to add 16 more to get the GIC irq ID number */ | 824 | /* For SPIs, we need to add 16 more to get the GIC irq ID number */ |
828 | if (!intspec[0]) { | 825 | if (!intspec[0]) |
829 | ret = gic_routable_irq_domain_ops->xlate(d, controller, | 826 | *out_hwirq += 16; |
830 | intspec, | ||
831 | intsize, | ||
832 | out_hwirq, | ||
833 | out_type); | ||
834 | |||
835 | if (IS_ERR_VALUE(ret)) | ||
836 | return ret; | ||
837 | } | ||
838 | 827 | ||
839 | *out_type = intspec[2] & IRQ_TYPE_SENSE_MASK; | 828 | *out_type = intspec[2] & IRQ_TYPE_SENSE_MASK; |
840 | 829 | ||
@@ -891,37 +880,6 @@ static const struct irq_domain_ops gic_irq_domain_ops = { | |||
891 | .xlate = gic_irq_domain_xlate, | 880 | .xlate = gic_irq_domain_xlate, |
892 | }; | 881 | }; |
893 | 882 | ||
894 | /* Default functions for routable irq domain */ | ||
895 | static int gic_routable_irq_domain_map(struct irq_domain *d, unsigned int irq, | ||
896 | irq_hw_number_t hw) | ||
897 | { | ||
898 | return 0; | ||
899 | } | ||
900 | |||
901 | static void gic_routable_irq_domain_unmap(struct irq_domain *d, | ||
902 | unsigned int irq) | ||
903 | { | ||
904 | } | ||
905 | |||
906 | static int gic_routable_irq_domain_xlate(struct irq_domain *d, | ||
907 | struct device_node *controller, | ||
908 | const u32 *intspec, unsigned int intsize, | ||
909 | unsigned long *out_hwirq, | ||
910 | unsigned int *out_type) | ||
911 | { | ||
912 | *out_hwirq += 16; | ||
913 | return 0; | ||
914 | } | ||
915 | |||
916 | static const struct irq_domain_ops gic_default_routable_irq_domain_ops = { | ||
917 | .map = gic_routable_irq_domain_map, | ||
918 | .unmap = gic_routable_irq_domain_unmap, | ||
919 | .xlate = gic_routable_irq_domain_xlate, | ||
920 | }; | ||
921 | |||
922 | const struct irq_domain_ops *gic_routable_irq_domain_ops = | ||
923 | &gic_default_routable_irq_domain_ops; | ||
924 | |||
925 | void __init gic_init_bases(unsigned int gic_nr, int irq_start, | 883 | void __init gic_init_bases(unsigned int gic_nr, int irq_start, |
926 | void __iomem *dist_base, void __iomem *cpu_base, | 884 | void __iomem *dist_base, void __iomem *cpu_base, |
927 | u32 percpu_offset, struct device_node *node) | 885 | u32 percpu_offset, struct device_node *node) |
@@ -929,7 +887,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start, | |||
929 | irq_hw_number_t hwirq_base; | 887 | irq_hw_number_t hwirq_base; |
930 | struct gic_chip_data *gic; | 888 | struct gic_chip_data *gic; |
931 | int gic_irqs, irq_base, i; | 889 | int gic_irqs, irq_base, i; |
932 | int nr_routable_irqs; | ||
933 | 890 | ||
934 | BUG_ON(gic_nr >= MAX_GIC_NR); | 891 | BUG_ON(gic_nr >= MAX_GIC_NR); |
935 | 892 | ||
@@ -985,15 +942,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start, | |||
985 | gic->gic_irqs = gic_irqs; | 942 | gic->gic_irqs = gic_irqs; |
986 | 943 | ||
987 | if (node) { /* DT case */ | 944 | if (node) { /* DT case */ |
988 | const struct irq_domain_ops *ops = &gic_irq_domain_hierarchy_ops; | 945 | gic->domain = irq_domain_add_linear(node, gic_irqs, |
989 | 946 | &gic_irq_domain_hierarchy_ops, | |
990 | if (!of_property_read_u32(node, "arm,routable-irqs", | 947 | gic); |
991 | &nr_routable_irqs)) { | ||
992 | ops = &gic_irq_domain_ops; | ||
993 | gic_irqs = nr_routable_irqs; | ||
994 | } | ||
995 | |||
996 | gic->domain = irq_domain_add_linear(node, gic_irqs, ops, gic); | ||
997 | } else { /* Non-DT case */ | 948 | } else { /* Non-DT case */ |
998 | /* | 949 | /* |
999 | * For primary GICs, skip over SGIs. | 950 | * For primary GICs, skip over SGIs. |
diff --git a/include/linux/irq.h b/include/linux/irq.h index d09ec7a1243e..3057c48e4933 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -460,6 +460,7 @@ extern void irq_chip_eoi_parent(struct irq_data *data); | |||
460 | extern int irq_chip_set_affinity_parent(struct irq_data *data, | 460 | extern int irq_chip_set_affinity_parent(struct irq_data *data, |
461 | const struct cpumask *dest, | 461 | const struct cpumask *dest, |
462 | bool force); | 462 | bool force); |
463 | extern int irq_chip_set_wake_parent(struct irq_data *data, unsigned int on); | ||
463 | #endif | 464 | #endif |
464 | 465 | ||
465 | /* Handling of unhandled and spurious interrupts: */ | 466 | /* Handling of unhandled and spurious interrupts: */ |
diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h index 71d706d5f169..3978c5be4edc 100644 --- a/include/linux/irqchip/arm-gic.h +++ b/include/linux/irqchip/arm-gic.h | |||
@@ -115,11 +115,5 @@ int gic_get_cpu_id(unsigned int cpu); | |||
115 | void gic_migrate_target(unsigned int new_cpu_id); | 115 | void gic_migrate_target(unsigned int new_cpu_id); |
116 | unsigned long gic_get_sgir_physaddr(void); | 116 | unsigned long gic_get_sgir_physaddr(void); |
117 | 117 | ||
118 | extern const struct irq_domain_ops *gic_routable_irq_domain_ops; | ||
119 | static inline void __init register_routable_domain_ops | ||
120 | (const struct irq_domain_ops *ops) | ||
121 | { | ||
122 | gic_routable_irq_domain_ops = ops; | ||
123 | } | ||
124 | #endif /* __ASSEMBLY */ | 118 | #endif /* __ASSEMBLY */ |
125 | #endif | 119 | #endif |
diff --git a/include/linux/irqchip/irq-crossbar.h b/include/linux/irqchip/irq-crossbar.h deleted file mode 100644 index e5537b81df8d..000000000000 --- a/include/linux/irqchip/irq-crossbar.h +++ /dev/null | |||
@@ -1,11 +0,0 @@ | |||
1 | /* | ||
2 | * drivers/irqchip/irq-crossbar.h | ||
3 | * | ||
4 | * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | int irqcrossbar_init(void); | ||
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 6f1c7a566b95..eb9a4ea394ab 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -948,6 +948,22 @@ int irq_chip_retrigger_hierarchy(struct irq_data *data) | |||
948 | 948 | ||
949 | return -ENOSYS; | 949 | return -ENOSYS; |
950 | } | 950 | } |
951 | |||
952 | /** | ||
953 | * irq_chip_set_wake_parent - Set/reset wake-up on the parent interrupt | ||
954 | * @data: Pointer to interrupt specific data | ||
955 | * @on: Whether to set or reset the wake-up capability of this irq | ||
956 | * | ||
957 | * Conditional, as the underlying parent chip might not implement it. | ||
958 | */ | ||
959 | int irq_chip_set_wake_parent(struct irq_data *data, unsigned int on) | ||
960 | { | ||
961 | data = data->parent_data; | ||
962 | if (data->chip->irq_set_wake) | ||
963 | return data->chip->irq_set_wake(data, on); | ||
964 | |||
965 | return -ENOSYS; | ||
966 | } | ||
951 | #endif | 967 | #endif |
952 | 968 | ||
953 | /** | 969 | /** |