From b95a8021ecfce65004fc65abdd2f1b0d46d5601c Mon Sep 17 00:00:00 2001 From: Michal Meloun Date: Fri, 25 Sep 2020 09:56:50 +0000 Subject: [PATCH] Make simplebus friendlier for subclassing. MFC after: 1 week --- sys/dev/fdt/simplebus.c | 29 +++++++++++++++++++++++++++-- sys/dev/fdt/simplebus.h | 2 ++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sys/dev/fdt/simplebus.c b/sys/dev/fdt/simplebus.c index 60387a9e7a81..6eff5360de92 100644 --- a/sys/dev/fdt/simplebus.c +++ b/sys/dev/fdt/simplebus.c @@ -67,7 +67,7 @@ static device_method_t simplebus_methods[] = { /* Device interface */ DEVMETHOD(device_probe, simplebus_probe), DEVMETHOD(device_attach, simplebus_attach), - DEVMETHOD(device_detach, bus_generic_detach), + DEVMETHOD(device_detach, simplebus_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), DEVMETHOD(device_suspend, bus_generic_suspend), DEVMETHOD(device_resume, bus_generic_resume), @@ -134,7 +134,7 @@ simplebus_probe(device_t dev) } int -simplebus_attach(device_t dev) +simplebus_attach_impl(device_t dev) { struct simplebus_softc *sc; phandle_t node; @@ -154,9 +154,34 @@ simplebus_attach(device_t dev) for (node = OF_child(sc->node); node > 0; node = OF_peer(node)) simplebus_add_device(dev, node, 0, NULL, -1, NULL); + + return (0); +} + +int +simplebus_attach(device_t dev) +{ + int rv; + + rv = simplebus_attach_impl(dev); + if (rv != 0) + return (rv); + return (bus_generic_attach(dev)); } +int +simplebus_detach(device_t dev) +{ + struct simplebus_softc *sc; + + sc = device_get_softc(dev); + if (sc->ranges != NULL) + free(sc->ranges, M_DEVBUF); + + return (bus_generic_detach(dev)); +} + void simplebus_init(device_t dev, phandle_t node) { diff --git a/sys/dev/fdt/simplebus.h b/sys/dev/fdt/simplebus.h index b416f1b94cfb..563ac4ea52ed 100644 --- a/sys/dev/fdt/simplebus.h +++ b/sys/dev/fdt/simplebus.h @@ -67,5 +67,7 @@ int simplebus_fill_ranges(phandle_t node, struct simplebus_softc *sc); int simplebus_attach(device_t dev); +int simplebus_attach_impl(device_t dev); +int simplebus_detach(device_t dev); #endif /* _FDT_SIMPLEBUS_H */