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.
This commit is contained in:
ian 2019-06-16 16:02:50 +00:00
parent ddf6ac67ba
commit 99654c675c

View File

@ -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);
}