diff options
| author | Florian Fainelli <f.fainelli@gmail.com> | 2014-08-06 16:02:27 -0400 |
|---|---|---|
| committer | Grant Likely <grant.likely@linaro.org> | 2014-08-16 04:03:58 -0400 |
| commit | a9ecdc0fdc54aa499604dbd43132988effcac9b4 (patch) | |
| tree | e2722c7181c48498d01f54224e89f5d6e49c0aa4 /drivers | |
| parent | b951f9dc7f25fc1e39aafda5edb4b47b38285d9f (diff) | |
of/irq: Fix lookup to use 'interrupts-extended' property first
In case the Device Tree blob passed by the boot agent supplies both an
'interrupts-extended' and an 'interrupts' property in order to allow for
older kernels to be usable, prefer the new-style 'interrupts-extended'
property which conveys a lot more information.
This allows us to have bootloaders willingly maintaining backwards
compatibility with older kernels without entirely deprecating the
'interrupts' property.
Update the bindings documentation to describe a situation where both the
'interrupts-extended' and the 'interrupts' property are present, and
which one takes precedence over the other.
Cc: stable@vger.kernel.org # 3.13+
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Grant Likely <grant.likely@linaro.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/of/irq.c | 17 |
1 files changed, 9 insertions, 8 deletions
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); |
