From b71764df9674ebc4943f728f205e0668be19173c Mon Sep 17 00:00:00 2001 From: Ian Lepore Date: Sun, 16 Jun 2019 16:02:50 +0000 Subject: [PATCH] In detach(), call bus_generic_detach() before deleting the iicbus child. This gives the bus and its children the chance to return EBUSY to abort the detach if they're in the middle of doing some IO. --- sys/arm/ti/ti_i2c.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/sys/arm/ti/ti_i2c.c b/sys/arm/ti/ti_i2c.c index 0893e80b8caa..8f1804493192 100644 --- a/sys/arm/ti/ti_i2c.c +++ b/sys/arm/ti/ti_i2c.c @@ -735,8 +735,6 @@ ti_i2c_deactivate(device_t dev) sc->sc_irq_h = NULL; } - bus_generic_detach(sc->sc_dev); - /* Unmap the I2C controller registers. */ if (sc->sc_mem_res != NULL) { bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); @@ -925,12 +923,19 @@ ti_i2c_detach(device_t dev) int rv; sc = device_get_softc(dev); - ti_i2c_deactivate(dev); - TI_I2C_LOCK_DESTROY(sc); - if (sc->sc_iicbus && + + if ((rv = bus_generic_detach(dev)) != 0) { + device_printf(dev, "cannot detach child devices\n"); + return (rv); + } + + if (sc->sc_iicbus && (rv = device_delete_child(dev, sc->sc_iicbus)) != 0) return (rv); + ti_i2c_deactivate(dev); + TI_I2C_LOCK_DESTROY(sc); + return (0); }