diff --git a/sys/arm/arm/gic.c b/sys/arm/arm/gic.c --- a/sys/arm/arm/gic.c +++ b/sys/arm/arm/gic.c @@ -270,7 +270,8 @@ "%s,s%u", name, irq - GIC_FIRST_SPI); } if (error != 0) { - /* XXX call intr_isrc_deregister() */ + while (--irq < num) + intr_isrc_deregister(&irqs[irq].gi_isrc); free(irqs, M_DEVBUF); return (error); } diff --git a/sys/arm/freescale/imx/imx_gpio.c b/sys/arm/freescale/imx/imx_gpio.c --- a/sys/arm/freescale/imx/imx_gpio.c +++ b/sys/arm/freescale/imx/imx_gpio.c @@ -503,7 +503,8 @@ error = intr_isrc_register(&sc->gpio_pic_irqsrc[irq].gi_isrc, sc->dev, 0, "%s,%u", name, irq); if (error != 0) { - /* XXX call intr_isrc_deregister() */ + while (--irq < NGPIO) + intr_isrc_deregister(&sc->gpio_pic_irqsrc[irq].gi_isrc); device_printf(sc->dev, "%s failed", __func__); return (error); } diff --git a/sys/arm/mv/mpic.c b/sys/arm/mv/mpic.c --- a/sys/arm/mv/mpic.c +++ b/sys/arm/mv/mpic.c @@ -209,7 +209,8 @@ name); } if (error != 0) { - /* XXX call intr_isrc_deregister() */ + while (--irq < sc->nirqs) + intr_isrc_deregister(&sc->mpic_isrcs[irq].mmi_isrc); device_printf(sc->sc_dev, "%s failed", __func__); return (error); } diff --git a/sys/arm64/arm64/gic_v3.c b/sys/arm64/arm64/gic_v3.c --- a/sys/arm64/arm64/gic_v3.c +++ b/sys/arm64/arm64/gic_v3.c @@ -369,7 +369,8 @@ "%s,s%u", name, irq - GIC_FIRST_SPI); } if (err != 0) { - /* XXX call intr_isrc_deregister() */ + while (--irq < sc->gic_nirqs) + intr_isrc_deregister(&sc->gic_irqs[irq].gi_isrc); free(sc->gic_irqs, M_DEVBUF); return (err); } diff --git a/sys/dev/gpio/pl061.c b/sys/dev/gpio/pl061.c --- a/sys/dev/gpio/pl061.c +++ b/sys/dev/gpio/pl061.c @@ -498,13 +498,11 @@ return (0); free_isrc: - /* - * XXX isrc_release_counters() not implemented - * for (irq = 0; irq < PL061_NUM_GPIO; irq++) - * intr_isrc_deregister(PIC_INTR_ISRC(sc, irq)); - */ + for (irq = 0; irq < PL061_NUM_GPIO; irq++) + intr_isrc_deregister(PIC_INTR_ISRC(sc, irq)); bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid, sc->sc_irq_res); + free_pic: /* * XXX intr_pic_deregister: not implemented