diff options
| -rw-r--r-- | Documentation/devicetree/bindings/interrupt-controller/interrupts.txt | 12 | ||||
| -rw-r--r-- | drivers/of/irq.c | 17 |
2 files changed, 16 insertions, 13 deletions
diff --git a/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt b/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt index 1486497a24c1..ce6a1a072028 100644 --- a/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt +++ b/Documentation/devicetree/bindings/interrupt-controller/interrupts.txt | |||
| @@ -4,11 +4,13 @@ Specifying interrupt information for devices | |||
| 4 | 1) Interrupt client nodes | 4 | 1) Interrupt client nodes |
| 5 | ------------------------- | 5 | ------------------------- |
| 6 | 6 | ||
| 7 | Nodes that describe devices which generate interrupts must contain an either an | 7 | Nodes that describe devices which generate interrupts must contain an |
| 8 | "interrupts" property or an "interrupts-extended" property. These properties | 8 | "interrupts" property, an "interrupts-extended" property, or both. If both are |
| 9 | contain a list of interrupt specifiers, one per output interrupt. The format of | 9 | present, the latter should take precedence; the former may be provided simply |
| 10 | the interrupt specifier is determined by the interrupt controller to which the | 10 | for compatibility with software that does not recognize the latter. These |
| 11 | interrupts are routed; see section 2 below for details. | 11 | properties contain a list of interrupt specifiers, one per output interrupt. The |
| 12 | format of the interrupt specifier is determined by the interrupt controller to | ||
| 13 | which the interrupts are routed; see section 2 below for details. | ||
| 12 | 14 | ||
| 13 | Example: | 15 | Example: |
| 14 | interrupt-parent = <&intc1>; | 16 | interrupt-parent = <&intc1>; |
diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 3e06a699352d..1471e0a223a5 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c | |||
| @@ -301,16 +301,17 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar | |||
| 301 | /* Get the reg property (if any) */ | 301 | /* Get the reg property (if any) */ |
| 302 | addr = of_get_property(device, "reg", NULL); | 302 | addr = of_get_property(device, "reg", NULL); |
| 303 | 303 | ||
| 304 | /* Try the new-style interrupts-extended first */ | ||
| 305 | res = of_parse_phandle_with_args(device, "interrupts-extended", | ||
| 306 | "#interrupt-cells", index, out_irq); | ||
| 307 | if (!res) | ||
| 308 | return of_irq_parse_raw(addr, out_irq); | ||
| 309 | |||
| 304 | /* Get the interrupts property */ | 310 | /* Get the interrupts property */ |
| 305 | intspec = of_get_property(device, "interrupts", &intlen); | 311 | intspec = of_get_property(device, "interrupts", &intlen); |
| 306 | if (intspec == NULL) { | 312 | if (intspec == NULL) |
| 307 | /* Try the new-style interrupts-extended */ | 313 | return -EINVAL; |
| 308 | res = of_parse_phandle_with_args(device, "interrupts-extended", | 314 | |
| 309 | "#interrupt-cells", index, out_irq); | ||
| 310 | if (res) | ||
| 311 | return -EINVAL; | ||
| 312 | return of_irq_parse_raw(addr, out_irq); | ||
| 313 | } | ||
| 314 | intlen /= sizeof(*intspec); | 315 | intlen /= sizeof(*intspec); |
| 315 | 316 | ||
| 316 | pr_debug(" intspec=%d intlen=%d\n", be32_to_cpup(intspec), intlen); | 317 | pr_debug(" intspec=%d intlen=%d\n", be32_to_cpup(intspec), intlen); |
