FreeBSD/sys/dev/gpio/gpiobus.c
/*
 * Since this is not a self-enumerating bus, and since we always add
 * children in attach, we have to always delete children here.
 */
Since this is not a self-enumerating bus, and since we always add
children in attach, we have to always delete children here.
Since this is not a self - enumerating bus and since we always add children in attach we have to always delete children here .
static int
gpiobus_detach(device_t dev)
{
	struct gpiobus_softc *sc;
	struct gpiobus_ivar *devi;
	device_t *devlist;
	int i, err, ndevs;
	sc = GPIOBUS_SOFTC(dev);
	KASSERT(mtx_initialized(&sc->sc_mtx),
	    ("gpiobus mutex not initialized"));
	GPIOBUS_LOCK_DESTROY(sc);
	if ((err = bus_generic_detach(dev)) != 0)
		return (err);
	if ((err = device_get_children(dev, &devlist, &ndevs)) != 0)
		return (err);
	for (i = 0; i < ndevs; i++) {
		devi = GPIOBUS_IVAR(devlist[i]);
		gpiobus_free_ivars(devi);
		resource_list_free(&devi->rl);
		free(devi, M_DEVBUF);
		device_delete_child(dev, devlist[i]);
	}
	free(devlist, M_TEMP);
	rman_fini(&sc->sc_intr_rman);
	if (sc->sc_pins) {
		for (i = 0; i < sc->sc_npins; i++) {
			if (sc->sc_pins[i].name != NULL)
				free(sc->sc_pins[i].name, M_DEVBUF);
			sc->sc_pins[i].name = NULL;
		}
		free(sc->sc_pins, M_DEVBUF);
		sc->sc_pins = NULL;
	}
	return (0);
}
static int gpiobus_detach ( device_t dev ) { struct gpiobus_softc * sc ; struct gpiobus_ivar * devi ; device_t * devlist ; int i , err , ndevs ; sc = GPIOBUS_SOFTC ( dev ) ; KASSERT ( mtx_initialized ( & sc -> sc_mtx ) , ( " " ) ) ; GPIOBUS_LOCK_DESTROY ( sc ) ; if ( ( err = bus_generic_detach ( dev ) ) != 0 ) return ( err ) ; if ( ( err = device_get_children ( dev , & devlist , & ndevs ) ) != 0 ) return ( err ) ; for ( i = 0 ; i < ndevs ; i ++ ) { devi = GPIOBUS_IVAR ( devlist [ i ] ) ; gpiobus_free_ivars ( devi ) ; resource_list_free ( & devi -> rl ) ; free ( devi , M_DEVBUF ) ; device_delete_child ( dev , devlist [ i ] ) ; } free ( devlist , M_TEMP ) ; rman_fini ( & sc -> sc_intr_rman ) ; if ( sc -> sc_pins ) { for ( i = 0 ; i < sc -> sc_npins ; i ++ ) { if ( sc -> sc_pins [ i ] . name != NULL ) free ( sc -> sc_pins [ i ] . name , M_DEVBUF ) ; sc -> sc_pins [ i ] . name = NULL ; } free ( sc -> sc_pins , M_DEVBUF ) ; sc -> sc_pins = NULL ; } return ( 0 ) ; }
Since this is not a self-enumerating bus, and since we always add
 children in attach, we have to always delete children here.
Since this is not a self - enumerating bus and since we always add children in attach we have to always delete children here .