It turns out on OMAP4/OMAP5 there is a "Wake-up generator" interrupt controller that routes interrupts to the GIC and does power management comparable to imx with the i.MX6 General Power Controller (GPC).
/ { #address-cells = <0x00000001>; #size-cells = <0x00000001>; compatible = "ti,omap4-panda-es", "ti,omap4-panda", "ti,omap4460", "ti,omap4430", "ti,omap4"; interrupt-parent = <0x00000001>; model = "TI OMAP4 PandaBoard-ES"; ... interrupt-controller@48241000 { compatible = "arm,cortex-a9-gic"; interrupt-controller; #interrupt-cells = <0x00000003>; reg = <0x48241000 0x00001000 0x48240100 0x00000100>; interrupt-parent = <0x00000004>; linux,phandle = <0x00000004>; phandle = <0x00000004>; }; interrupt-controller@48281000 { compatible = "ti,omap4-wugen-mpu"; interrupt-controller; #interrupt-cells = <0x00000003>; reg = <0x48281000 0x00001000>; interrupt-parent = <0x00000004>; linux,phandle = <0x00000001>; phandle = <0x00000001>; }; Reusing the imxgpc code to handle this allows interrupts on ommc(4) with the pandaboard to work again and the board can now find it's root disk once again. Index: omap/files.omap =================================================================== RCS file: /cvs/src/sys/arch/armv7/omap/files.omap,v retrieving revision 1.17 diff -u -p -r1.17 files.omap --- omap/files.omap 15 Aug 2016 13:42:49 -0000 1.17 +++ omap/files.omap 15 Sep 2016 04:33:56 -0000 @@ -42,6 +42,10 @@ device intc attach intc at fdt file arch/armv7/omap/intc.c intc +device omwugen +attach omwugen at fdt +file arch/armv7/omap/omwugen.c omwugen + device gptimer attach gptimer at omap file arch/armv7/omap/gptimer.c gptimer Index: conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC,v retrieving revision 1.53 diff -u -p -r1.53 GENERIC --- conf/GENERIC 12 Sep 2016 08:28:44 -0000 1.53 +++ conf/GENERIC 15 Sep 2016 04:33:56 -0000 @@ -63,6 +63,7 @@ omapid* at omap? # OMAP on-chip devices intc* at fdt? # OMAP3 interrupt controller +omwugen* at fdt? # Wake-up generator #edma* at omap? # OMAP3 dma controller prcm* at omap? # power/clock controller sitaracm* at omap? # sitara control module Index: conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/RAMDISK,v retrieving revision 1.48 diff -u -p -r1.48 RAMDISK --- conf/RAMDISK 21 Aug 2016 06:36:23 -0000 1.48 +++ conf/RAMDISK 15 Sep 2016 04:33:56 -0000 @@ -61,6 +61,7 @@ omapid* at omap? # OMAP on-chip devices intc* at fdt? # OMAP3 interrupt controller +omwugen* at fdt? # Wake-up generator #edma* at omap? # OMAP3 dma controller prcm* at omap? # power/clock controller sitaracm* at omap? # sitara control module --- /dev/null Thu Sep 15 14:35:46 2016 +++ omap/omwugen.c Thu Sep 15 14:22:00 2016 @@ -0,0 +1,63 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2016 Mark Kettenis + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <machine/fdt.h> + +#include <dev/ofw/openfirm.h> + +struct omwugen_softc { + struct device sc_dev; + struct interrupt_controller sc_ic; +}; + +int omwugen_match(struct device *, void *, void *); +void omwugen_attach(struct device *, struct device *, void *); + +struct cfattach omwugen_ca = { + sizeof(struct omwugen_softc), omwugen_match, omwugen_attach +}; + +struct cfdriver omwugen_cd = { + NULL, "omwugen", DV_DULL +}; + +int +omwugen_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "ti,omap4-wugen-mpu"); +} + +void +omwugen_attach(struct device *parent, struct device *self, void *aux) +{ + struct fdt_attach_args *faa = aux; + struct omwugen_softc *sc = (struct omwugen_softc *)self; + + sc->sc_ic.ic_node = faa->fa_node; + sc->sc_ic.ic_cookie = &sc->sc_ic; + sc->sc_ic.ic_establish = arm_intr_parent_establish_fdt; + sc->sc_ic.ic_disestablish = arm_intr_parent_disestablish_fdt; + arm_intr_register_fdt(&sc->sc_ic); + + printf("\n"); +}