diff options
author | loos <loos@FreeBSD.org> | 2016-12-30 20:48:22 +0000 |
---|---|---|
committer | loos <loos@FreeBSD.org> | 2016-12-30 20:48:22 +0000 |
commit | ddbb1e5b9738fa9c1eb44463805c8bcf36221a81 (patch) | |
tree | c9f909dac81479e45e8c69f36ad027ac844184aa /sys/arm | |
parent | 6220234a477533edd88e3c4d543967c6da5af3c3 (diff) | |
download | FreeBSD-src-ddbb1e5b9738fa9c1eb44463805c8bcf36221a81.zip FreeBSD-src-ddbb1e5b9738fa9c1eb44463805c8bcf36221a81.tar.gz |
MFC r308692:
Fix ti_gpio_detach() to avoid crashing if something goes wrong.
Sponsored by: Rubicon Communication, LLC (Netgate)
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/ti/ti_gpio.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/arm/ti/ti_gpio.c b/sys/arm/ti/ti_gpio.c index 583a65a..fbaa2dd 100644 --- a/sys/arm/ti/ti_gpio.c +++ b/sys/arm/ti/ti_gpio.c @@ -782,7 +782,8 @@ ti_gpio_detach(device_t dev) /* Disable all interrupts */ if (sc->sc_mem_res != NULL) ti_gpio_intr_clr(sc, 0xffffffff); - gpiobus_detach_bus(dev); + if (sc->sc_busdev != NULL) + gpiobus_detach_bus(dev); #ifdef INTRNG if (sc->sc_isrcs != NULL) ti_gpio_pic_detach(sc); @@ -801,10 +802,12 @@ ti_gpio_detach(device_t dev) bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_hdl); } - bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid, - sc->sc_irq_res); - bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid, - sc->sc_mem_res); + if (sc->sc_irq_res) + bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid, + sc->sc_irq_res); + if (sc->sc_mem_res) + bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid, + sc->sc_mem_res); TI_GPIO_LOCK_DESTROY(sc); return (0); |