summaryrefslogtreecommitdiff
path: root/sys/dev/ofw/ofw_bus_subr.c
diff options
context:
space:
mode:
authorNathan Whitehorn <nwhitehorn@FreeBSD.org>2015-01-05 21:39:35 +0000
committerNathan Whitehorn <nwhitehorn@FreeBSD.org>2015-01-05 21:39:35 +0000
commit08b96b9ff5c8f964f38f2511bc36d800d5d31463 (patch)
tree4c3db7d4bfb6dca4d572b0e95ece0bd15c084d46 /sys/dev/ofw/ofw_bus_subr.c
parent531d65e139675cdbfed6511074efe9d94f873fbd (diff)
Notes
Diffstat (limited to 'sys/dev/ofw/ofw_bus_subr.c')
-rw-r--r--sys/dev/ofw/ofw_bus_subr.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/dev/ofw/ofw_bus_subr.c b/sys/dev/ofw/ofw_bus_subr.c
index cd1169365d680..5805eb4f45e86 100644
--- a/sys/dev/ofw/ofw_bus_subr.c
+++ b/sys/dev/ofw/ofw_bus_subr.c
@@ -382,9 +382,17 @@ ofw_bus_intr_to_rl(device_t dev, phandle_t node, struct resource_list *rl)
if (nintr > 0) {
if (OF_searchencprop(node, "interrupt-parent", &iparent,
sizeof(iparent)) == -1) {
- device_printf(dev, "No interrupt-parent found, "
- "assuming direct parent\n");
- iparent = OF_parent(node);
+ for (iparent = node; iparent != 0;
+ iparent = OF_parent(node)) {
+ if (OF_hasprop(iparent, "interrupt-controller"))
+ break;
+ }
+ if (iparent == 0) {
+ device_printf(dev, "No interrupt-parent found, "
+ "assuming direct parent\n");
+ iparent = OF_parent(node);
+ }
+ iparent = OF_xref_from_node(iparent);
}
if (OF_searchencprop(OF_node_from_xref(iparent),
"#interrupt-cells", &icells, sizeof(icells)) == -1) {
@@ -430,3 +438,4 @@ ofw_bus_intr_to_rl(device_t dev, phandle_t node, struct resource_list *rl)
free(intr, M_OFWPROP);
return (err);
}
+