diff options
author | loos <loos@FreeBSD.org> | 2016-12-30 20:48:22 +0000 |
---|---|---|
committer | Luiz Souza <luiz@netgate.com> | 2017-07-17 14:40:44 -0500 |
commit | dd1acdc3453c78ebead0cfe029622d1aa7513f34 (patch) | |
tree | 01609f69845be09b72bc66df07ac3026c2df6063 | |
parent | e962be5686ab67404c9baa6de33086cc43673a82 (diff) | |
download | FreeBSD-src-dd1acdc3453c78ebead0cfe029622d1aa7513f34.zip FreeBSD-src-dd1acdc3453c78ebead0cfe029622d1aa7513f34.tar.gz |
MFC r308692:
Fix ti_gpio_detach() to avoid crashing if something goes wrong.
Sponsored by: Rubicon Communication, LLC (Netgate)
(cherry picked from commit ddbb1e5b9738fa9c1eb44463805c8bcf36221a81)
-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); |