Index: sys/arm/allwinner/a10/a10_intc.c =================================================================== --- sys/arm/allwinner/a10/a10_intc.c +++ sys/arm/allwinner/a10/a10_intc.c @@ -106,6 +106,7 @@ struct a10_aintc_softc { device_t sc_dev; + struct intr_pic * sc_pic; struct resource * aintc_res; bus_space_tag_t aintc_bst; bus_space_handle_t aintc_bsh; @@ -266,11 +267,11 @@ } xref = OF_xref_from_node(ofw_bus_get_node(sc->sc_dev)); - error = intr_pic_register(sc->sc_dev, xref); - if (error != 0) - return (error); + sc->sc_pic = intr_pic_register(sc->sc_dev, xref); + if (sc->sc_pic == NULL) + return (ENXIO); - return (intr_pic_claim_root(sc->sc_dev, xref, a10_intr, sc, 0)); + return (intr_pic_claim_root(sc->sc_pic, a10_intr, sc, 0)); } static void Index: sys/arm/arm/gic.c =================================================================== --- sys/arm/arm/gic.c +++ sys/arm/arm/gic.c @@ -151,6 +151,7 @@ struct arm_gic_softc { device_t gic_dev; + struct intr_pic * gic_pic; #ifdef INTRNG void * gic_intrhand; struct gic_irqsrc * gic_irqs; @@ -669,7 +670,8 @@ * Now, when everything is initialized, it's right time to * register interrupt controller to interrupt framefork. */ - if (intr_pic_register(dev, xref) != 0) { + sc->gic_pic = intr_pic_register(dev, xref); + if (sc->gic_pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup; } @@ -681,23 +683,23 @@ */ pxref = ofw_bus_find_iparent(ofw_bus_get_node(dev)); if (pxref == 0 || xref == pxref) { - if (intr_pic_claim_root(dev, xref, arm_gic_intr, sc, + if (intr_pic_claim_root(sc->gic_pic, arm_gic_intr, sc, GIC_LAST_SGI - GIC_FIRST_SGI + 1) != 0) { device_printf(dev, "could not set PIC as a root\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->gic_pic); goto cleanup; } } else { if (sc->gic_res[2] == NULL) { device_printf(dev, "not root PIC must have defined interrupt\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->gic_pic); goto cleanup; } if (bus_setup_intr(dev, sc->gic_res[2], INTR_TYPE_CLK, arm_gic_intr, NULL, sc, &sc->gic_intrhand)) { device_printf(dev, "could not setup irq handler\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->gic_pic); goto cleanup; } } Index: sys/arm/broadcom/bcm2835/bcm2835_gpio.c =================================================================== --- sys/arm/broadcom/bcm2835/bcm2835_gpio.c +++ sys/arm/broadcom/bcm2835/bcm2835_gpio.c @@ -104,6 +104,7 @@ struct bcm_gpio_softc { device_t sc_dev; device_t sc_busdev; + struct intr_pic * sc_pic; struct mtx sc_mtx; struct resource * sc_res[BCM_GPIO_IRQS + 1]; bus_space_tag_t sc_bst; @@ -1045,8 +1046,12 @@ if (error != 0) return (error); /* XXX deregister ISRCs */ } - return (intr_pic_register(sc->sc_dev, - OF_xref_from_node(ofw_bus_get_node(sc->sc_dev)))); + sc->sc_pic = intr_pic_register(sc->sc_dev, + OF_xref_from_node(ofw_bus_get_node(sc->sc_dev))); + if (sc->sc_pic == NULL) + return (ENXIO); + + return (0); } static int Index: sys/arm/broadcom/bcm2835/bcm2835_intr.c =================================================================== --- sys/arm/broadcom/bcm2835/bcm2835_intr.c +++ sys/arm/broadcom/bcm2835/bcm2835_intr.c @@ -139,6 +139,7 @@ struct bcm_intc_softc { device_t sc_dev; + struct intr_pic * intc_pic; struct resource * intc_res; bus_space_tag_t intc_bst; bus_space_handle_t intc_bsh; @@ -309,7 +310,7 @@ { } -static int +static struct intr_pic * bcm_intc_pic_register(struct bcm_intc_softc *sc, intptr_t xref) { struct bcm_intc_irqsrc *bii; @@ -334,12 +335,12 @@ bii->bii_enable_reg = INTC_ENABLE_BANK2; bii->bii_mask = 1 << IRQ_BANK2(irq); } else - return (ENXIO); + return (NULL); error = intr_isrc_register(&bii->bii_isrc, sc->sc_dev, 0, "%s,%u", name, irq); if (error != 0) - return (error); + return (NULL); } return (intr_pic_register(sc->sc_dev, xref)); } @@ -379,7 +380,8 @@ #ifdef INTRNG xref = OF_xref_from_node(ofw_bus_get_node(dev)); - if (bcm_intc_pic_register(sc, xref) != 0) { + sc->intc_pic = bcm_intc_pic_register(sc, xref); + if (sc->intc_pic == NULL) { bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->intc_res); device_printf(dev, "could not register PIC\n"); return (ENXIO); @@ -389,7 +391,8 @@ sc->intc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); if (sc->intc_irq_res == NULL) { - if (intr_pic_claim_root(dev, xref, bcm2835_intc_intr, sc, 0) != 0) { + if (intr_pic_claim_root(sc->intc_pic, bcm2835_intc_intr, sc, + 0) != 0) { /* XXX clean up */ device_printf(dev, "could not set PIC as a root\n"); return (ENXIO); Index: sys/arm/broadcom/bcm2835/bcm2836.c =================================================================== --- sys/arm/broadcom/bcm2835/bcm2836.c +++ sys/arm/broadcom/bcm2835/bcm2836.c @@ -166,6 +166,7 @@ struct bcm_lintc_softc { device_t bls_dev; + struct intr_pic * bls_pic; struct mtx bls_mtx; struct resource * bls_mem; bus_space_tag_t bls_bst; @@ -653,11 +654,11 @@ } xref = OF_xref_from_node(ofw_bus_get_node(sc->bls_dev)); - error = intr_pic_register(sc->bls_dev, xref); - if (error != 0) - return (error); + sc->bls_pic = intr_pic_register(sc->bls_dev, xref); + if (sc->bls_pic == NULL) + return (ENXIO); - return (intr_pic_claim_root(sc->bls_dev, xref, bcm_lintc_intr, sc, 0)); + return (intr_pic_claim_root(sc->bls_pic, bcm_lintc_intr, sc, 0)); } static int Index: sys/arm/mv/mpic.c =================================================================== --- sys/arm/mv/mpic.c +++ sys/arm/mv/mpic.c @@ -274,7 +274,7 @@ bus_release_resources(dev, mv_mpic_spec, sc->mpic_res); return (ENXIO); } - if (intr_pic_register(dev, OF_xref_from_device(dev)) != 0) { + if (intr_pic_register(dev, OF_xref_from_device(dev)) == NULL) { device_printf(dev, "could not register PIC\n"); bus_release_resources(dev, mv_mpic_spec, sc->mpic_res); return (ENXIO); Index: sys/arm/nvidia/tegra_gpio.c =================================================================== --- sys/arm/nvidia/tegra_gpio.c +++ sys/arm/nvidia/tegra_gpio.c @@ -433,7 +433,7 @@ return (FILTER_HANDLED); } -static int +static struct intr_pic * tegra_gpio_pic_attach(struct tegra_gpio_softc *sc) { int error; @@ -450,7 +450,7 @@ error = intr_isrc_register(&sc->isrcs[irq].isrc, sc->dev, 0, "%s,%u", name, irq); if (error != 0) - return (error); /* XXX deregister ISRCs */ + return (NULL); /* XXX deregister ISRCs */ } return (intr_pic_register(sc->dev, OF_xref_from_node(ofw_bus_get_node(sc->dev)))); @@ -814,7 +814,7 @@ } } - if (tegra_gpio_pic_attach(sc) != 0) { + if (tegra_gpio_pic_attach(sc) == NULL) { device_printf(dev, "WARNING: unable to attach PIC\n"); tegra_gpio_detach(dev); return (ENXIO); Index: sys/arm/nvidia/tegra_lic.c =================================================================== --- sys/arm/nvidia/tegra_lic.c +++ sys/arm/nvidia/tegra_lic.c @@ -233,7 +233,7 @@ } - if (intr_pic_register(dev, OF_xref_from_node(node)) != 0) { + if (intr_pic_register(dev, OF_xref_from_node(node)) == NULL) { device_printf(dev, "Cannot register PIC\n"); goto fail; } Index: sys/arm/ti/aintc.c =================================================================== --- sys/arm/ti/aintc.c +++ sys/arm/ti/aintc.c @@ -77,6 +77,7 @@ struct ti_aintc_softc { device_t sc_dev; + struct intr_pic * sc_pic; struct resource * aintc_res[3]; bus_space_tag_t aintc_bst; bus_space_handle_t aintc_bsh; @@ -236,11 +237,11 @@ } xref = OF_xref_from_node(ofw_bus_get_node(sc->sc_dev)); - error = intr_pic_register(sc->sc_dev, xref); - if (error != 0) - return (error); + sc->sc_pic = intr_pic_register(sc->sc_dev, xref); + if (sc->sc_pic == NULL) + return (ENXIO); - return (intr_pic_claim_root(sc->sc_dev, xref, ti_aintc_intr, sc, 0)); + return (intr_pic_claim_root(sc->sc_pic, ti_aintc_intr, sc, 0)); } #else Index: sys/arm/ti/omap4/omap4_wugen.c =================================================================== --- sys/arm/ti/omap4/omap4_wugen.c +++ sys/arm/ti/omap4/omap4_wugen.c @@ -210,7 +210,7 @@ return (ENXIO); } - if (intr_pic_register(dev, OF_xref_from_node(node)) != 0) { + if (intr_pic_register(dev, OF_xref_from_node(node)) == NULL) { device_printf(dev, "can't register PIC\n"); goto fail; } Index: sys/arm/ti/ti_gpio.c =================================================================== --- sys/arm/ti/ti_gpio.c +++ sys/arm/ti/ti_gpio.c @@ -122,7 +122,7 @@ static int ti_gpio_detach(device_t); #ifdef INTRNG -static int ti_gpio_pic_attach(struct ti_gpio_softc *sc); +static struct intr_pic *ti_gpio_pic_attach(struct ti_gpio_softc *sc); static int ti_gpio_pic_detach(struct ti_gpio_softc *sc); #endif @@ -709,7 +709,7 @@ } #ifdef INTRNG - if (ti_gpio_pic_attach(sc) != 0) { + if (ti_gpio_pic_attach(sc) == NULL) { device_printf(dev, "WARNING: unable to attach PIC\n"); ti_gpio_detach(dev); return (ENXIO); @@ -883,7 +883,7 @@ return (FILTER_HANDLED); } -static int +static struct intr_pic * ti_gpio_pic_attach(struct ti_gpio_softc *sc) { int error; @@ -902,7 +902,7 @@ error = intr_isrc_register(&sc->sc_isrcs[irq].tgi_isrc, sc->sc_dev, 0, "%s,%u", name, irq); if (error != 0) - return (error); /* XXX deregister ISRCs */ + return (NULL); /* XXX deregister ISRCs */ } return (intr_pic_register(sc->sc_dev, OF_xref_from_node(ofw_bus_get_node(sc->sc_dev)))); Index: sys/kern/subr_intr.c =================================================================== --- sys/kern/subr_intr.c +++ sys/kern/subr_intr.c @@ -521,6 +521,7 @@ int error; struct intr_irqsrc *isrc; struct intr_dev_data *ddata; + struct intr_pic *pic; isrc = isrc_lookup(irq); if (isrc != NULL) { @@ -538,8 +539,10 @@ ddata = intr_ddata_tab[irq]; if (ddata->idd_isrc == NULL) { - error = intr_map_irq(ddata->idd_dev, ddata->idd_xref, - ddata->idd_data, &irq); + pic = pic_lookup(ddata->idd_dev, ddata->idd_xref); + if (pic == NULL) + return (NULL); + error = intr_map_irq(pic, ddata->idd_data, &irq); if (error != 0) return (NULL); ddata->idd_isrc = isrc_lookup(irq); @@ -887,16 +890,10 @@ * Destroy interrupt controller. */ static void -pic_destroy(device_t dev, intptr_t xref) +pic_destroy(struct intr_pic *pic) { - struct intr_pic *pic; mtx_lock(&pic_list_lock); - pic = pic_lookup_locked(dev, xref); - if (pic == NULL) { - mtx_unlock(&pic_list_lock); - return; - } SLIST_REMOVE(&pic_list, pic, intr_pic, pic_next); mtx_unlock(&pic_list_lock); @@ -906,27 +903,27 @@ /* * Register interrupt controller. */ -int +struct intr_pic * intr_pic_register(device_t dev, intptr_t xref) { struct intr_pic *pic; if (dev == NULL) - return (EINVAL); + return (NULL); pic = pic_create(dev, xref); if (pic == NULL) - return (ENOMEM); + return (NULL); debugf("PIC %p registered for %s \n", pic, device_get_nameunit(dev), dev, xref); - return (0); + return (pic); } /* * Unregister interrupt controller. */ int -intr_pic_deregister(device_t dev, intptr_t xref) +intr_pic_deregister(struct intr_pic *pic) { panic("%s: not implemented", __func__); @@ -945,16 +942,12 @@ * an interrupts property and thus no explicit interrupt parent." */ int -intr_pic_claim_root(device_t dev, intptr_t xref, intr_irq_filter_t *filter, +intr_pic_claim_root(struct intr_pic *pic, intr_irq_filter_t *filter, void *arg, u_int ipicount) { - if (pic_lookup(dev, xref) == NULL) { - device_printf(dev, "not registered\n"); - return (EINVAL); - } if (filter == NULL) { - device_printf(dev, "filter missing\n"); + device_printf(pic->pic_dev, "filter missing\n"); return (EINVAL); } @@ -964,11 +957,11 @@ * routine (handler) on the root. See intr_irq_handler(). */ if (intr_irq_root_dev != NULL) { - device_printf(dev, "another root already set\n"); + device_printf(pic->pic_dev, "another root already set\n"); return (EBUSY); } - intr_irq_root_dev = dev; + intr_irq_root_dev = pic->pic_dev; irq_root_filter = filter; irq_root_arg = arg; irq_root_ipicount = ipicount; @@ -978,20 +971,15 @@ } int -intr_map_irq(device_t dev, intptr_t xref, struct intr_map_data *data, +intr_map_irq(struct intr_pic *pic, struct intr_map_data *data, u_int *irqp) { int error; struct intr_irqsrc *isrc; - struct intr_pic *pic; if (data == NULL) return (EINVAL); - pic = pic_lookup(dev, xref); - if (pic == NULL) - return (ESRCH); - error = PIC_MAP_INTR(pic->pic_dev, data, &isrc); if (error == 0) *irqp = isrc->isrc_irq; Index: sys/mips/mediatek/mtk_gpio_v1.c =================================================================== --- sys/mips/mediatek/mtk_gpio_v1.c +++ sys/mips/mediatek/mtk_gpio_v1.c @@ -90,6 +90,7 @@ struct mtk_gpio_softc { device_t dev; device_t busdev; + struct intr_pic * pic; struct resource *res[2]; struct mtx mtx; struct mtk_gpio_pin pins[MTK_GPIO_PINS]; @@ -308,7 +309,8 @@ goto fail; } - if (intr_pic_register(dev, OF_xref_from_node(node)) != 0) { + sc->pic = intr_pic_register(dev, OF_xref_from_node(node)); + if (sc->pic == NULL) { device_printf(dev, "could not register PIC\n"); goto fail; } @@ -323,7 +325,7 @@ return (0); fail_pic: - intr_pic_deregister(dev, OF_xref_from_node(node)); + intr_pic_deregister(sc->pic); fail: if(sc->intrhand != NULL) bus_teardown_intr(dev, sc->res[1], sc->intrhand); @@ -339,7 +341,7 @@ phandle_t node; node = ofw_bus_get_node(dev); - intr_pic_deregister(dev, OF_xref_from_node(node)); + intr_pic_deregister(sc->pic); if (sc->intrhand != NULL) bus_teardown_intr(dev, sc->res[1], sc->intrhand); bus_release_resources(dev, mtk_gpio_spec, sc->res); Index: sys/mips/mediatek/mtk_gpio_v2.c =================================================================== --- sys/mips/mediatek/mtk_gpio_v2.c +++ sys/mips/mediatek/mtk_gpio_v2.c @@ -76,6 +76,7 @@ struct mtk_gpio_softc { device_t dev; device_t busdev; + struct intr_pic * pic; struct resource *res[2]; struct mtx mtx; struct mtk_gpio_pin pins[MTK_GPIO_PINS]; @@ -299,7 +300,8 @@ goto fail; } - if (intr_pic_register(dev, OF_xref_from_node(node)) != 0) { + sc->pic = intr_pic_register(dev, OF_xref_from_node(node)); + if (sc->pic == NULL) { device_printf(dev, "could not register PIC\n"); goto fail; } @@ -314,7 +316,7 @@ return (0); fail_pic: - intr_pic_deregister(dev, OF_xref_from_node(node)); + intr_pic_deregister(sc->pic); fail: if(sc->intrhand != NULL) bus_teardown_intr(dev, sc->res[1], sc->intrhand); @@ -330,7 +332,7 @@ phandle_t node; node = ofw_bus_get_node(dev); - intr_pic_deregister(dev, OF_xref_from_node(node)); + intr_pic_deregister(sc->pic); if (sc->intrhand != NULL) bus_teardown_intr(dev, sc->res[1], sc->intrhand); bus_release_resources(dev, mtk_gpio_spec, sc->res); Index: sys/mips/mediatek/mtk_intr_gic.c =================================================================== --- sys/mips/mediatek/mtk_intr_gic.c +++ sys/mips/mediatek/mtk_intr_gic.c @@ -84,6 +84,7 @@ struct mtk_gic_softc { device_t gic_dev; + struct intr_pic * gic_pic; void * gic_intrhand; struct resource * gic_res[2]; struct mtk_gic_irqsrc gic_irqs[MTK_NIRQS]; @@ -213,7 +214,8 @@ * Now, when everything is initialized, it's right time to * register interrupt controller to interrupt framefork. */ - if (intr_pic_register(dev, xref) != 0) { + sc->gic_pic = intr_pic_register(dev, xref); + if (sc->gic_pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup; } Index: sys/mips/mediatek/mtk_intr_v1.c =================================================================== --- sys/mips/mediatek/mtk_intr_v1.c +++ sys/mips/mediatek/mtk_intr_v1.c @@ -75,6 +75,7 @@ struct mtk_pic_softc { device_t pic_dev; + struct intr_pic * pic; void * pic_intrhand; struct resource * pic_res[2]; struct mtk_pic_irqsrc pic_irqs[MTK_NIRQS]; @@ -201,7 +202,8 @@ * Now, when everything is initialized, it's right time to * register interrupt controller to interrupt framefork. */ - if (intr_pic_register(dev, xref) != 0) { + sc->pic = intr_pic_register(dev, xref); + if (sc->pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup; } @@ -209,7 +211,7 @@ if (bus_setup_intr(dev, sc->pic_res[1], INTR_TYPE_CLK, mtk_pic_intr, NULL, sc, &sc->pic_intrhand)) { device_printf(dev, "could not setup irq handler\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->pic); goto cleanup; } return (0); Index: sys/mips/mediatek/mtk_intr_v2.c =================================================================== --- sys/mips/mediatek/mtk_intr_v2.c +++ sys/mips/mediatek/mtk_intr_v2.c @@ -75,6 +75,7 @@ struct mtk_pic_softc { device_t pic_dev; + struct intr_pic * pic; void * pic_intrhand; struct resource * pic_res[2]; struct mtk_pic_irqsrc pic_irqs[MTK_NIRQS]; @@ -196,7 +197,8 @@ * Now, when everything is initialized, it's right time to * register interrupt controller to interrupt framefork. */ - if (intr_pic_register(dev, xref) != 0) { + sc->pic = intr_pic_register(dev, xref); + if (sc->pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup; } @@ -204,7 +206,7 @@ if (bus_setup_intr(dev, sc->pic_res[1], INTR_TYPE_CLK, mtk_pic_intr, NULL, sc, &sc->pic_intrhand)) { device_printf(dev, "could not setup irq handler\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->pic); goto cleanup; } return (0); Index: sys/mips/mediatek/mtk_pcie.c =================================================================== --- sys/mips/mediatek/mtk_pcie.c +++ sys/mips/mediatek/mtk_pcie.c @@ -229,6 +229,7 @@ { struct mtk_pci_softc *sc = device_get_softc(dev); struct mtk_pci_range io_space, mem_space; + struct intr_pic *pic; phandle_t node; intptr_t xref; int i, rid; @@ -318,7 +319,8 @@ } /* Register ourselves as an interrupt controller */ - if (intr_pic_register(dev, xref) != 0) { + pic = intr_pic_register(dev, xref); + if (pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup_rman; } @@ -350,7 +352,7 @@ cleanup: #ifdef notyet - intr_pic_unregister(dev, xref); + intr_pic_unregister(pic); #endif for (i = 1; i <= sc->sc_num_irq; i++) { if (sc->pci_intrhand[i - 1] != NULL) Index: sys/mips/mips/mips_pic.c =================================================================== --- sys/mips/mips/mips_pic.c +++ sys/mips/mips/mips_pic.c @@ -79,6 +79,7 @@ struct mips_pic_softc { device_t pic_dev; + struct intr_pic * pic; struct mips_pic_irqsrc pic_irqs[NREAL_IRQS]; struct rman pic_irq_rman; struct mtx mutex; @@ -223,15 +224,16 @@ * Now, when everything is initialized, it's right time to * register interrupt controller to interrupt framefork. */ - if (intr_pic_register(dev, xref) != 0) { + sc->pic = intr_pic_register(dev, xref); + if (sc->pic == NULL) { device_printf(dev, "could not register PIC\n"); goto cleanup; } /* Claim our root controller role */ - if (intr_pic_claim_root(dev, xref, mips_pic_intr, sc, 0) != 0) { + if (intr_pic_claim_root(sc->pic, mips_pic_intr, sc, 0) != 0) { device_printf(dev, "could not set PIC as a root\n"); - intr_pic_deregister(dev, xref); + intr_pic_deregister(sc->pic); goto cleanup; } Index: sys/sys/intr.h =================================================================== --- sys/sys/intr.h +++ sys/sys/intr.h @@ -34,6 +34,8 @@ #define INTR_IRQ_INVALID 0xFFFFFFFF +struct intr_pic; + enum intr_map_data_type { INTR_MAP_DATA_ACPI, INTR_MAP_DATA_FDT, @@ -110,14 +112,14 @@ int intr_isrc_dispatch(struct intr_irqsrc *, struct trapframe *); u_int intr_irq_next_cpu(u_int current_cpu, cpuset_t *cpumask); -int intr_pic_register(device_t, intptr_t); -int intr_pic_deregister(device_t, intptr_t); -int intr_pic_claim_root(device_t, intptr_t, intr_irq_filter_t *, void *, u_int); +struct intr_pic *intr_pic_register(device_t, intptr_t); +int intr_pic_deregister(struct intr_pic *); +int intr_pic_claim_root(struct intr_pic *, intr_irq_filter_t *, void *, u_int); extern device_t intr_irq_root_dev; /* Intr interface for BUS. */ -int intr_map_irq(device_t, intptr_t, struct intr_map_data *, u_int *); +int intr_map_irq(struct intr_pic *, struct intr_map_data *, u_int *); int intr_alloc_irq(device_t, struct resource *); int intr_release_irq(device_t, struct resource *);