You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.0 KiB
60 lines
2.0 KiB
From 1c67d6e7cc30a856e79664e0be3a1f705bad56e4 Mon Sep 17 00:00:00 2001
|
|
From: Grant Likely <grant.likely@linaro.org>
|
|
Date: Thu, 19 Dec 2013 09:31:01 -0300
|
|
Subject: [PATCH 190/203] of/irq: Fix bug in interrupt parsing refactor.
|
|
|
|
Commit 2361613206e6, "of/irq: Refactor interrupt-map parsing" introduced
|
|
a bug. The irq parsing will fail for some nodes that don't have a reg
|
|
property. It is fixed by deferring the check for reg until it is
|
|
actually needed. Also adjust the testcase data to catch the bug.
|
|
|
|
Signed-off-by: Grant Likely <grant.likely@linaro.org>
|
|
Tested-by: Stephen Warren <swarren@nvidia.com>
|
|
Tested-by: Ming Lei <tom.leiming@gmail.com>
|
|
Tested-by: Stephen Warren <swarren@nvidia.com>
|
|
Cc: Rob Herring <rob.herring@calxeda.com>
|
|
|
|
Conflicts:
|
|
arch/arm/boot/dts/testcases/tests-interrupts.dtsi
|
|
---
|
|
drivers/of/irq.c | 20 ++++++++++----------
|
|
1 file changed, 10 insertions(+), 10 deletions(-)
|
|
|
|
--- a/drivers/of/irq.c
|
|
+++ b/drivers/of/irq.c
|
|
@@ -147,18 +147,9 @@ int of_irq_parse_raw(const __be32 *addr,
|
|
|
|
pr_debug(" -> addrsize=%d\n", addrsize);
|
|
|
|
- /* If we were passed no "reg" property and we attempt to parse
|
|
- * an interrupt-map, then #address-cells must be 0.
|
|
- * Fail if it's not.
|
|
- */
|
|
- if (addr == NULL && addrsize != 0) {
|
|
- pr_debug(" -> no reg passed in when needed !\n");
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
/* Precalculate the match array - this simplifies match loop */
|
|
for (i = 0; i < addrsize; i++)
|
|
- initial_match_array[i] = addr[i];
|
|
+ initial_match_array[i] = addr ? addr[i] : 0;
|
|
for (i = 0; i < intsize; i++)
|
|
initial_match_array[addrsize + i] = cpu_to_be32(out_irq->args[i]);
|
|
|
|
@@ -174,6 +165,15 @@ int of_irq_parse_raw(const __be32 *addr,
|
|
return 0;
|
|
}
|
|
|
|
+ /*
|
|
+ * interrupt-map parsing does not work without a reg
|
|
+ * property when #address-cells != 0
|
|
+ */
|
|
+ if (addrsize && !addr) {
|
|
+ pr_debug(" -> no reg passed in when needed !\n");
|
|
+ goto fail;
|
|
+ }
|
|
+
|
|
/* Now look for an interrupt-map */
|
|
imap = of_get_property(ipar, "interrupt-map", &imaplen);
|
|
/* No interrupt map, check for an interrupt parent */
|
|
|