summaryrefslogtreecommitdiffstats
path: root/sys/arm/arm/nexus.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arm/arm/nexus.c')
-rw-r--r--sys/arm/arm/nexus.c53
1 files changed, 40 insertions, 13 deletions
diff --git a/sys/arm/arm/nexus.c b/sys/arm/arm/nexus.c
index 0c5d1cf..879bc30 100644
--- a/sys/arm/arm/nexus.c
+++ b/sys/arm/arm/nexus.c
@@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
#ifdef FDT
#include <machine/fdt.h>
+#include <dev/ofw/ofw_bus_subr.h>
#include "ofw_bus_if.h"
#endif
@@ -379,6 +380,15 @@ nexus_activate_resource(device_t bus, device_t child, int type, int rid,
#endif
rman_set_virtual(r, (void *)vaddr);
rman_set_bushandle(r, vaddr);
+ return (0);
+ } else if (type == SYS_RES_IRQ) {
+#ifdef INTRNG
+ err = intr_activate_irq(child, r);
+ if (err != 0) {
+ rman_deactivate_resource(r);
+ return (err);
+ }
+#endif
}
return (0);
}
@@ -390,17 +400,23 @@ nexus_deactivate_resource(device_t bus, device_t child, int type, int rid,
bus_size_t psize;
bus_space_handle_t vaddr;
- psize = (bus_size_t)rman_get_size(r);
- vaddr = rman_get_bushandle(r);
+ if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) {
+ psize = (bus_size_t)rman_get_size(r);
+ vaddr = rman_get_bushandle(r);
- if (vaddr != 0) {
+ if (vaddr != 0) {
#ifdef FDT
- bus_space_unmap(fdtbus_bs_tag, vaddr, psize);
+ bus_space_unmap(fdtbus_bs_tag, vaddr, psize);
#else
- pmap_unmapdev((vm_offset_t)vaddr, (vm_size_t)psize);
+ pmap_unmapdev((vm_offset_t)vaddr, (vm_size_t)psize);
+#endif
+ rman_set_virtual(r, NULL);
+ rman_set_bushandle(r, 0);
+ }
+ } else if (type == SYS_RES_IRQ) {
+#ifdef INTRNG
+ intr_deactivate_irq(child, r);
#endif
- rman_set_virtual(r, NULL);
- rman_set_bushandle(r, 0);
}
return (rman_deactivate_resource(r));
@@ -411,11 +427,22 @@ static int
nexus_ofw_map_intr(device_t dev, device_t child, phandle_t iparent, int icells,
pcell_t *intr)
{
-
-#ifdef INTRNG
- return (INTR_IRQ_INVALID);
-#else
+#ifndef INTRNG
return (intr_fdt_map_irq(iparent, intr, icells));
-#endif
+#else
+ u_int irq;
+ struct intr_map_data_fdt *fdt_data;
+ size_t len;
+
+ len = sizeof(*fdt_data) + icells * sizeof(pcell_t);
+ fdt_data = (struct intr_map_data_fdt *)intr_alloc_map_data(
+ INTR_MAP_DATA_FDT, len, M_WAITOK | M_ZERO);
+ fdt_data->iparent = iparent;
+ fdt_data->ncells = icells;
+ memcpy(fdt_data->cells, intr, icells * sizeof(pcell_t));
+ irq = intr_map_irq(NULL, iparent, (struct intr_map_data *)fdt_data);
+ return (irq);
+#endif /* INTRNG */
}
-#endif
+#endif /* FDT */
+
OpenPOWER on IntegriCloud