Author: ian
Date: Sun Jun 16 16:02:50 2019
New Revision: 349116
URL: https://svnweb.freebsd.org/changeset/base/349116

Log:
  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.

Modified:
  head/sys/arm/ti/ti_i2c.c

Modified: head/sys/arm/ti/ti_i2c.c
==============================================================================
--- head/sys/arm/ti/ti_i2c.c    Sun Jun 16 15:56:59 2019        (r349115)
+++ head/sys/arm/ti/ti_i2c.c    Sun Jun 16 16:02:50 2019        (r349116)
@@ -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,11 +923,18 @@ 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);
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to