git: e2d42b0e6cc2 - main - ofw: Convert simplebus to device_get_softc_class().

From: Michal Meloun <mmel_at_FreeBSD.org>
Date: Sat, 26 Sep 2026 08:30:55 UTC
The branch main has been updated by mmel:

URL: https://cgit.FreeBSD.org/src/commit/?id=e2d42b0e6cc235c56484e274639b1df00c99760b

commit e2d42b0e6cc235c56484e274639b1df00c99760b
Author:     Michal Meloun <mmel@FreeBSD.org>
AuthorDate: 2026-09-26 07:25:59 +0000
Commit:     Michal Meloun <mmel@FreeBSD.org>
CommitDate: 2026-09-26 08:30:42 +0000

    ofw: Convert simplebus to device_get_softc_class().
    
    Stop embedding struct simplebus_softc as the first member of subclass
    softcs. Use device_get_softc_class() to locate the simplebus portion of
    the device softc
    
    MFC after:      2 months
    Differential Revision:  https://reviews.freebsd.org/D59837
---
 sys/arm/broadcom/bcm2835/bcm2835_firmware.c    | 13 ++++++---
 sys/arm/nvidia/drm2/tegra_host1x.c             |  3 +-
 sys/arm/ti/am335x/am335x_pwmss.c               | 23 +++-------------
 sys/arm/ti/ti_omap4_cm.c                       | 17 ++----------
 sys/arm/ti/ti_prcm.c                           | 13 ++++-----
 sys/arm/ti/ti_scm.c                            | 17 +++---------
 sys/arm/ti/ti_scm_syscon.c                     | 11 +++-----
 sys/arm/ti/ti_sysc.c                           |  1 -
 sys/arm64/broadcom/brcmmdio/mdio_mux_iproc.c   |  5 ++--
 sys/arm64/broadcom/brcmmdio/mdio_nexus_iproc.c |  3 +-
 sys/arm64/rockchip/rk_pinctrl.c                |  1 -
 sys/dev/clk/allwinner/aw_ccu.c                 | 15 ++--------
 sys/dev/clk/clk_bus.c                          | 20 ++++----------
 sys/dev/dialog/da9063/da9063_iic.c             |  8 ++++--
 sys/dev/dpaa/fman.c                            | 34 +++++++++++++----------
 sys/dev/dpaa/fman.h                            |  2 +-
 sys/dev/dpaa/fman_fdt.c                        |  6 ++--
 sys/dev/dpaa/fman_keygen.c                     |  6 ++--
 sys/dev/dpaa2/dpaa2_mc_fdt.c                   |  4 +--
 sys/dev/dpaa2/memac_mdio_fdt.c                 |  9 ++----
 sys/dev/fdt/simple_mfd.c                       | 38 ++++----------------------
 sys/dev/fdt/simple_mfd.h                       |  1 -
 sys/dev/fdt/simplebus.c                        | 25 ++++++++++-------
 sys/dev/fdt/simplebus.h                        |  2 +-
 sys/dev/firmware/arm/scmi.h                    |  1 -
 sys/dev/firmware/xilinx/zynqmp_firmware.c      |  1 -
 sys/dev/gpio/dwgpio/dwgpio_bus.c               | 17 +++---------
 sys/dev/ofw/ofw_firmware.c                     | 25 +++++++++--------
 sys/dev/ofw/ofwbus.c                           |  3 +-
 sys/dev/qcom_dwc3/qcom_dwc3.c                  | 14 ++--------
 sys/dev/regulator/regulator_bus.c              | 18 ++++--------
 sys/dev/sram/mmio_sram.c                       | 17 +++---------
 sys/dev/syscon/syscon_generic.c                |  2 +-
 sys/dev/syscon/syscon_generic.h                |  1 -
 sys/dev/usb/controller/dwc3/aw_dwc3.c          | 18 +++---------
 sys/dev/usb/controller/dwc3/rk_dwc3.c          | 17 +++---------
 sys/dev/usb/controller/xlnx_dwc3.c             | 17 ++----------
 37 files changed, 139 insertions(+), 289 deletions(-)

diff --git a/sys/arm/broadcom/bcm2835/bcm2835_firmware.c b/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
index c1d23c0222cd..1da69b32b93f 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
@@ -46,7 +46,7 @@
 #include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
 
 struct bcm2835_firmware_softc {
-	struct simplebus_softc	sc;
+	device_t	dev;
 	phandle_t	sc_mbox;
 };
 
@@ -81,6 +81,7 @@ bcm2835_firmware_attach(device_t dev)
 	int rv;
 
 	sc = device_get_softc(dev);
+	sc->dev = dev;
 
 	node = ofw_bus_get_node(dev);
 	rv = OF_getencprop(node, "mboxes", &mbox, sizeof(mbox));
@@ -101,8 +102,12 @@ bcm2835_firmware_attach(device_t dev)
 	    "Firmware revision");
 
 	/* The firmwaare doesn't have a ranges property */
-	sc->sc.flags |= SB_FLAG_NO_RANGES;
-	return (simplebus_attach(dev));
+	rv = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (rv != 0)
+		return (rv);
+
+	bus_attach_children(dev);
+	return (0);
 }
 
 int
@@ -151,7 +156,7 @@ sysctl_bcm2835_firmware_get_revision(SYSCTL_HANDLER_ARGS)
 	uint32_t rev;
 	int err;
 
-	if (bcm2835_firmware_property(sc->sc.dev,
+	if (bcm2835_firmware_property(sc->dev,
 	    BCM2835_MBOX_TAG_FIRMWARE_REVISION, &rev, sizeof(rev)) != 0)
 		return (ENXIO);
 
diff --git a/sys/arm/nvidia/drm2/tegra_host1x.c b/sys/arm/nvidia/drm2/tegra_host1x.c
index 81f727a83edc..8f09c55e0f4b 100644
--- a/sys/arm/nvidia/drm2/tegra_host1x.c
+++ b/sys/arm/nvidia/drm2/tegra_host1x.c
@@ -88,7 +88,6 @@ struct client_info {
 };
 
 struct host1x_softc {
-	struct simplebus_softc	simplebus_sc;	/* must be first */
 	device_t		dev;
 	struct sx		lock;
 	int 			attach_done;
@@ -514,7 +513,7 @@ host1x_new_pass(device_t dev)
 		goto fail;
 	}
 
-	simplebus_init(dev, 0);
+	simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
 	for (node = OF_child(node); node > 0; node = OF_peer(node))
 	    simplebus_add_device(dev, node, 0, NULL, -1, NULL);
 
diff --git a/sys/arm/ti/am335x/am335x_pwmss.c b/sys/arm/ti/am335x/am335x_pwmss.c
index 039448f9099f..7050501a103d 100644
--- a/sys/arm/ti/am335x/am335x_pwmss.c
+++ b/sys/arm/ti/am335x/am335x_pwmss.c
@@ -67,7 +67,6 @@ static device_attach_t am335x_pwmss_attach;
 static device_detach_t am335x_pwmss_detach;
 
 struct am335x_pwmss_softc {
-	struct simplebus_softc	sc_simplebus;
 	device_t		sc_dev;
 	struct syscon           *syscon;
 };
@@ -101,7 +100,7 @@ am335x_pwmss_attach(device_t dev)
 	struct am335x_pwmss_softc *sc;
 	uint32_t reg, id;
 	uint64_t rev_address;
-	phandle_t node, opp_table;
+	phandle_t opp_table;
 
 	sc = device_get_softc(dev);
 	sc->sc_dev = dev;
@@ -140,23 +139,9 @@ am335x_pwmss_attach(device_t dev)
 	reg |= (1 << id);
 	SYSCON_WRITE_4(sc->syscon, SCM_PWMSS_CTRL, reg);
 
-	node = ofw_bus_get_node(dev);
-
-	if (node == -1)
-		return (ENXIO);
-
-	simplebus_init(dev, node);
-
-	/*
-	 * Allow devices to identify.
-	 */
-	bus_identify_children(dev);
-
-	/*
-	 * Now walk the OFW tree and attach top-level devices.
-	 */
-	for (node = OF_child(node); node > 0; node = OF_peer(node))
-		simplebus_add_device(dev, node, 0, NULL, -1, NULL);
+	error = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (error != 0)
+		return (error);
 
 	bus_attach_children(dev);
 	return (0);
diff --git a/sys/arm/ti/ti_omap4_cm.c b/sys/arm/ti/ti_omap4_cm.c
index 572bae7173a1..b1208c930a92 100644
--- a/sys/arm/ti/ti_omap4_cm.c
+++ b/sys/arm/ti/ti_omap4_cm.c
@@ -55,7 +55,6 @@ static struct ofw_compat_data compat_data[] = {
 };
 
 struct ti_omap4_cm_softc {
-	struct simplebus_softc	sc;
 	device_t		dev;
 };
 
@@ -101,19 +100,9 @@ ti_omap4_cm_attach(device_t dev)
 	sc->dev = dev;
 	node = ofw_bus_get_node(dev);
 
-	simplebus_init(dev, node);
-	if (simplebus_fill_ranges(node, &sc->sc) < 0) {
-		device_printf(dev, "could not get ranges\n");
-		return (ENXIO);
-	}
-
-	bus_identify_children(sc->dev);
-
-	for (child = OF_child(node); child > 0; child = OF_peer(child)) {
-		cdev = simplebus_add_device(dev, child, 0, NULL, -1, NULL);
-		if (cdev != NULL)
-			device_probe_and_attach(cdev);
-	}
+	rv = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, node);
+	if (rv != 0)
+		return (rv);
 
 	bus_attach_children(dev);
 	return (0);
diff --git a/sys/arm/ti/ti_prcm.c b/sys/arm/ti/ti_prcm.c
index 88659ba3ea49..9fc98b76d1b5 100644
--- a/sys/arm/ti/ti_prcm.c
+++ b/sys/arm/ti/ti_prcm.c
@@ -63,7 +63,6 @@
 #endif
 
 struct ti_prcm_softc {
-	struct simplebus_softc  sc_simplebus;
 	device_t		dev;
 	struct resource *	mem_res;
 	bus_space_tag_t		bst;
@@ -135,6 +134,7 @@ static int
 ti_prcm_attach(device_t dev)
 {
 	struct ti_prcm_softc *sc;
+	struct simplebus__softc *sb_sc;
 	phandle_t node, child;
 	int rid;
 
@@ -144,20 +144,19 @@ ti_prcm_attach(device_t dev)
 	node = ofw_bus_get_node(sc->dev);
 	simplebus_init(sc->dev, node);
 
-	if (simplebus_fill_ranges(node, &sc->sc_simplebus) < 0) {
+	if (simplebus_fill_ranges(node, sb_sc) < 0) {
 		device_printf(sc->dev, "could not get ranges\n");
 		return (ENXIO);
 	}
-	if (sc->sc_simplebus.nranges == 0) {
+	if (sb_sc->nranges == 0) {
 		device_printf(sc->dev, "nranges == 0\n");
 		return (ENXIO);
 	}
 
 	sc->mem_res = bus_alloc_resource(sc->dev, SYS_RES_MEMORY, &rid,
-		sc->sc_simplebus.ranges[0].host,
-		(sc->sc_simplebus.ranges[0].host +
-			sc->sc_simplebus.ranges[0].size - 1),
-		sc->sc_simplebus.ranges[0].size,
+		sb_sc->ranges[0].host,
+		(sb_sc->ranges[0].host + sb_sc->ranges[0].size - 1),
+		sb_sc->ranges[0].size,
 		RF_ACTIVE | RF_SHAREABLE);
 
 	if (sc->mem_res == NULL) {
diff --git a/sys/arm/ti/ti_scm.c b/sys/arm/ti/ti_scm.c
index dc687641502c..0495e429f1a4 100644
--- a/sys/arm/ti/ti_scm.c
+++ b/sys/arm/ti/ti_scm.c
@@ -82,7 +82,6 @@ static struct ofw_compat_data compat_data[] = {
 };
 
 struct ti_scm_softc {
-	struct simplebus_softc	sc;
 	device_t		dev;
 };
 
@@ -108,24 +107,16 @@ static int
 ti_scm_attach(device_t dev)
 {
 	struct ti_scm_softc *sc;
-	device_t cdev;
 	phandle_t node, child;
+	int rv
 
 	sc = device_get_softc(dev);
 	sc->dev = dev;
 	node = ofw_bus_get_node(dev);
 
-	simplebus_init(dev, node);
-	if (simplebus_fill_ranges(node, &sc->sc) < 0) {
-		device_printf(dev, "could not get ranges\n");
-		return (ENXIO);
-	}
-
-	for (child = OF_child(node); child > 0; child = OF_peer(child)) {
-		cdev = simplebus_add_device(dev, child, 0, NULL, -1, NULL);
-		if (cdev != NULL)
-			device_probe_and_attach(cdev);
-	}
+	rv = simplebus_attach_impl(dev, 0, node);
+	if (rv != 0)
+		return (rv);
 
 	bus_attach_children(dev);
 	return (0);
diff --git a/sys/arm/ti/ti_scm_syscon.c b/sys/arm/ti/ti_scm_syscon.c
index 37d802d6c5d7..6aa5cf5b0bb4 100644
--- a/sys/arm/ti/ti_scm_syscon.c
+++ b/sys/arm/ti/ti_scm_syscon.c
@@ -60,7 +60,6 @@
 MALLOC_DECLARE(M_SYSCON);
 
 struct ti_scm_syscon_softc {
-	struct simplebus_softc	sc_simplebus;
 	device_t		dev;
 	struct syscon *		syscon;
 	struct resource *	res[1];
@@ -160,6 +159,7 @@ ti_scm_syscon_attach(device_t dev)
 {
 	struct ti_scm_syscon_softc *sc;
 	phandle_t node, child;
+	int rv;
 
  	sc = device_get_softc(dev);
 	sc->dev = dev;
@@ -183,12 +183,9 @@ ti_scm_syscon_attach(device_t dev)
 		return (ENXIO);
 	}
 
-	simplebus_init(sc->dev, node);
-
-	bus_identify_children(sc->dev);
-	for (child = OF_child(node); child != 0; child = OF_peer(child)) {
-		simplebus_add_device(sc->dev, child, 0, NULL, -1, NULL);
-	}
+	rv = simplebus_attach_impl(sc->dev, SB_FLAG_NO_RANGES, node);
+	if (rv != 0)
+		return (rv);
 
 	bus_attach_children(sc->dev);
 	return (0);
diff --git a/sys/arm/ti/ti_sysc.c b/sys/arm/ti/ti_sysc.c
index 3b7d0b2b3123..b2be5f2a1431 100644
--- a/sys/arm/ti/ti_sysc.c
+++ b/sys/arm/ti/ti_sysc.c
@@ -129,7 +129,6 @@ struct clk_list {
 };
 
 struct ti_sysc_softc {
-	struct simplebus_softc	sc;
 	bool			attach_done;
 
 	device_t		dev;
diff --git a/sys/arm64/broadcom/brcmmdio/mdio_mux_iproc.c b/sys/arm64/broadcom/brcmmdio/mdio_mux_iproc.c
index 81e79a16bf02..34c751154b16 100644
--- a/sys/arm64/broadcom/brcmmdio/mdio_mux_iproc.c
+++ b/sys/arm64/broadcom/brcmmdio/mdio_mux_iproc.c
@@ -90,7 +90,6 @@ struct brcm_mdio_ofw_devinfo {
 };
 
 struct brcm_iproc_mdio_softc {
-	struct simplebus_softc	sbus;
 	device_t		dev;
 	struct resource *	reg_base;
 	uint32_t		clock_rate;
@@ -300,12 +299,14 @@ static int
 brcm_iproc_mdio_attach(device_t dev)
 {
 	struct brcm_iproc_mdio_softc *sc;
+	struct simplebus_softc *sb_sc;
 	phandle_t node, parent;
 	struct brcm_mdio_ofw_devinfo *di;
 	int rid;
 	device_t child;
 
 	sc = device_get_softc(dev);
+	sb_sc = device_get_softc_class(dev, &simplebus_driver);
 	sc->dev = dev;
 
 	/* Allocate memory resources */
@@ -337,7 +338,7 @@ brcm_iproc_mdio_attach(device_t dev)
 
 		/* Initialize and populate resource list. */
 		resource_list_init(&di->di_rl);
-		ofw_bus_reg_to_rl(dev, node, sc->sbus.acells, sc->sbus.scells,
+		ofw_bus_reg_to_rl(dev, node, sb_sc->acells, sb_sc->scells,
 		    &di->di_rl);
 		ofw_bus_intr_to_rl(dev, node, &di->di_rl, NULL);
 
diff --git a/sys/arm64/broadcom/brcmmdio/mdio_nexus_iproc.c b/sys/arm64/broadcom/brcmmdio/mdio_nexus_iproc.c
index 2d3185e22041..be1301b972f4 100644
--- a/sys/arm64/broadcom/brcmmdio/mdio_nexus_iproc.c
+++ b/sys/arm64/broadcom/brcmmdio/mdio_nexus_iproc.c
@@ -45,7 +45,6 @@ MALLOC_DEFINE(M_BRCM_IPROC_NEXUS, "Broadcom IPROC MDIO NEXUS",
     "Broadcom IPROC MDIO NEXUS dynamic memory");
 
 struct brcm_mdionexus_softc {
-	struct simplebus_softc simplebus_sc;
 	uint32_t mux_id;
 };
 
@@ -198,7 +197,7 @@ brcm_mdionexus_ofw_bus_attach(device_t dev)
 	parent = ofw_bus_get_node(dev);
 	simplebus_init(dev, parent);
 
-	sc = (struct simplebus_softc *)device_get_softc(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
 
 	/* Iterate through all bus subordinates */
 	for (node = OF_child(parent); node > 0; node = OF_peer(node)) {
diff --git a/sys/arm64/rockchip/rk_pinctrl.c b/sys/arm64/rockchip/rk_pinctrl.c
index f38601742142..cbe7f29937cb 100644
--- a/sys/arm64/rockchip/rk_pinctrl.c
+++ b/sys/arm64/rockchip/rk_pinctrl.c
@@ -103,7 +103,6 @@ struct rk_pinctrl_conf {
 };
 
 struct rk_pinctrl_softc {
-	struct simplebus_softc	simplebus_sc;
 	device_t		dev;
 	struct syscon		*grf;
 	struct syscon		*pmu;
diff --git a/sys/dev/clk/allwinner/aw_ccu.c b/sys/dev/clk/allwinner/aw_ccu.c
index b7a088bb68f6..13817873e785 100644
--- a/sys/dev/clk/allwinner/aw_ccu.c
+++ b/sys/dev/clk/allwinner/aw_ccu.c
@@ -50,7 +50,6 @@
 #define	CCU_SIZE	0x400
 
 struct aw_ccu_softc {
-	struct simplebus_softc	sc;
 	bus_space_tag_t		bst;
 	bus_space_handle_t	bsh;
 	struct mtx		mtx;
@@ -187,14 +186,9 @@ static int
 aw_ccu_attach(device_t dev)
 {
 	struct aw_ccu_softc *sc;
-	phandle_t node, child;
-	device_t cdev;
 	int error;
 
 	sc = device_get_softc(dev);
-	node = ofw_bus_get_node(dev);
-
-	simplebus_init(dev, node);
 
 	sc->flags = aw_ccu_search_compatible()->ocd_data;
 
@@ -213,12 +207,9 @@ aw_ccu_attach(device_t dev)
 
 	mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF);
 
-	/* Attach child devices */
-	for (child = OF_child(node); child > 0; child = OF_peer(child)) {
-		cdev = simplebus_add_device(dev, child, 0, NULL, -1, NULL);
-		if (cdev != NULL)
-			device_probe_and_attach(cdev);
-	}
+	error = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (error != 0)
+		return (error);
 
 	bus_attach_children(dev);
 	return (0);
diff --git a/sys/dev/clk/clk_bus.c b/sys/dev/clk/clk_bus.c
index 2eb25fff6542..ec0127640f27 100644
--- a/sys/dev/clk/clk_bus.c
+++ b/sys/dev/clk/clk_bus.c
@@ -35,10 +35,6 @@
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus_subr.h>
 
-struct ofw_clkbus_softc {
-	struct simplebus_softc simplebus_sc;
-};
-
 static int
 ofw_clkbus_probe(device_t dev)
 {
@@ -57,17 +53,11 @@ ofw_clkbus_probe(device_t dev)
 static int
 ofw_clkbus_attach(device_t dev)
 {
-	phandle_t node, child;
-	device_t cdev;
-
-	node  = ofw_bus_get_node(dev);
-	simplebus_init(dev, node);
+	int	rv;
 
-	for (child = OF_child(node); child > 0; child = OF_peer(child)) {
-		cdev = simplebus_add_device(dev, child, 0, NULL, -1, NULL);
-		if (cdev != NULL)
-			device_probe_and_attach(cdev);
-	}
+	rv = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (rv != 0)
+		return (rv);
 
 	bus_attach_children(dev);
 	return (0);
@@ -82,7 +72,7 @@ static device_method_t ofw_clkbus_methods[] = {
 };
 
 DEFINE_CLASS_1(ofw_clkbus, ofw_clkbus_driver, ofw_clkbus_methods,
-    sizeof(struct ofw_clkbus_softc), simplebus_driver);
+    0, simplebus_driver);
 EARLY_DRIVER_MODULE(ofw_clkbus, simplebus, ofw_clkbus_driver, 0, 0,
     BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
 MODULE_VERSION(ofw_clkbus, 1);
diff --git a/sys/dev/dialog/da9063/da9063_iic.c b/sys/dev/dialog/da9063/da9063_iic.c
index 517a04540600..bb0d246c5278 100644
--- a/sys/dev/dialog/da9063/da9063_iic.c
+++ b/sys/dev/dialog/da9063/da9063_iic.c
@@ -54,7 +54,6 @@
 #define	DA9063_IIC_PAGE_CON_REG_PAGE_SHIFT	1
 
 struct da9063_iic_softc {
-	struct simplebus_softc	simplebus_sc;
 	device_t		dev;
 	struct mtx		mtx;
 	uint8_t			page;
@@ -219,9 +218,12 @@ da9063_iic_attach(device_t dev)
 	    DA9063_PAGE_CON_REG_PAGE_MASK) >> DA9063_IIC_PAGE_CON_REG_PAGE_SHIFT;
 	mtx_init(&sc->mtx, device_get_nameunit(sc->dev), NULL, MTX_DEF);
 
-	sc->simplebus_sc.flags |= SB_FLAG_NO_RANGES;
+	error = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (error != 0)
+		return (error);
 
-	return (simplebus_attach(dev));
+	bus_attach_children(dev);
+	return (0);
 }
 
 static int
diff --git a/sys/dev/dpaa/fman.c b/sys/dev/dpaa/fman.c
index 880f881a33bc..3a7a73b02c6a 100644
--- a/sys/dev/dpaa/fman.c
+++ b/sys/dev/dpaa/fman.c
@@ -161,13 +161,15 @@ int
 fman_activate_resource(device_t bus, device_t child, struct resource *res)
 {
 	struct fman_softc *sc;
+	struct simplebus_softc *sb_sc;
 	bus_space_tag_t bt;
 	bus_space_handle_t bh;
 	int i, rv;
 
 	sc = device_get_softc(bus);
+	sb_sc = device_get_softc_class(bus, &simplebus_driver);
 	if (rman_get_type(res) != SYS_RES_IRQ) {
-		for (i = 0; i < sc->sc_base.nranges; i++) {
+		for (i = 0; i < sb_sc->nranges; i++) {
 			if (rman_is_region_manager(res, &sc->rman) != 0) {
 				bt = rman_get_bustag(sc->mem_res);
 				rv = bus_space_subregion(bt,
@@ -224,6 +226,7 @@ fman_alloc_resource(device_t bus, device_t child, int type, int rid,
     rman_res_t start, rman_res_t end, rman_res_t count, u_int flags)
 {
 	struct fman_softc *sc;
+	struct simplebus_softc *sb_sc;
 	struct resource_list *rl;
 	struct resource_list_entry *rle = NULL;
 	struct resource *res;
@@ -232,6 +235,7 @@ fman_alloc_resource(device_t bus, device_t child, int type, int rid,
 	isdefault = RMAN_IS_DEFAULT_RANGE(start, end);
 	passthrough = (device_get_parent(child) != bus);
 	sc = device_get_softc(bus);
+	sb_sc = device_get_softc_class(bus, &simplebus_driver);
 	rl = BUS_GET_RESOURCE_LIST(bus, child);
 	switch (type) {
 	case SYS_RES_MEMORY:
@@ -252,9 +256,9 @@ fman_alloc_resource(device_t bus, device_t child, int type, int rid,
 
 		res = NULL;
 		/* Map fman ranges to nexus ranges. */
-		for (i = 0; i < sc->sc_base.nranges; i++) {
-			if (start >= sc->sc_base.ranges[i].bus && end <
-			    sc->sc_base.ranges[i].bus + sc->sc_base.ranges[i].size) {
+		for (i = 0; i < sb_sc->nranges; i++) {
+			if (start >= sb_sc->ranges[i].bus && end <
+			    sb_sc->ranges[i].bus + sb_sc->ranges[i].size) {
 				start += rman_get_start(sc->mem_res);
 				end += rman_get_start(sc->mem_res);
 				res = rman_reserve_resource(&sc->rman, start,
@@ -366,14 +370,14 @@ fman_fill_soc_params(struct fman_softc *sc)
 			sc->total_fifo_size = 295 * 1024;
 			break;
 		default:
-			device_printf(sc->sc_base.dev,
+			device_printf(sc->dev,
 			    "Unsupported FManv3 revision: %d\n",
 			    sc->sc_revision_minor);
 			break;
 		}
 		break;
 	default:
-		device_printf(sc->sc_base.dev,
+		device_printf(sc->dev,
 		    "Unsupported FMan version: %d\n", sc->sc_revision_major);
 		break;
 	}
@@ -403,12 +407,12 @@ fman_reset(struct fman_softc *sc)
 #define	DEVDISR2_FMAN1	0xfcc00000
 #define	DEVDISR2_FMAN2	0x000fcc00
 
-		node = ofw_bus_get_node(device_get_parent(sc->sc_base.dev));
+		node = ofw_bus_get_node(device_get_parent(sc->dev));
 		node = fdt_find_compatible(node, "fsl,qoriq-device-config-2.0",
 		    false);
 
 		if (node == 0) {
-			device_printf(sc->sc_base.dev,
+			device_printf(sc->dev,
 			    "missing device-config node in FDT.  Cannot reset FMAN");
 			return (0);
 		}
@@ -487,7 +491,7 @@ fman_dma_init(struct fman_softc *sc)
 	    sc->dma_cam_num_entries * DMA_CAM_SIZE, DMA_CAM_ALIGN, 0, 0,
 	    VMEM_ADDR_MIN, VMEM_ADDR_MAX, M_BESTFIT | M_WAITOK, &addr);
 	if (err != 0)
-		device_printf(sc->sc_base.dev,
+		device_printf(sc->dev,
 		    "failed to allocate DMA buffer\n");
 	reg = addr;
 	bus_write_4(sc->mem_res, FMDM_EBCR, reg);
@@ -593,7 +597,7 @@ fman_init(struct fman_softc *sc)
 	sc->sc_revision_minor = fman_get_revision_minor(sc);
 
 	if (bootverbose)
-		device_printf(sc->sc_base.dev, "Hardware version: %d.%d.\n",
+		device_printf(sc->dev, "Hardware version: %d.%d.\n",
 		    sc->sc_revision_major, sc->sc_revision_minor);
 
 	fman_fill_soc_params(sc);
@@ -649,7 +653,7 @@ fman_init_muram(struct fman_softc *sc)
 	u_long base, size;
 	phandle_t node;
 
-	node = ofw_bus_get_node(sc->sc_base.dev);
+	node = ofw_bus_get_node(sc->dev);
 	for (node = OF_child(node); node != 0; node = OF_peer(node)) {
 		char compat[255];
 
@@ -659,11 +663,11 @@ fman_init_muram(struct fman_softc *sc)
 			break;
 	}
 	if (node == 0) {
-		device_printf(sc->sc_base.dev, "no muram node\n");
+		device_printf(sc->dev, "no muram node\n");
 		return (ENXIO);
 	}
 	if (fdt_regsize(node, &base, &size) != 0) {
-		device_printf(sc->sc_base.dev, "failed to get muram reg\n");
+		device_printf(sc->dev, "failed to get muram reg\n");
 		return (ENXIO);
 	}
 	sc->muram_vmem = vmem_create("MURAM",
@@ -681,7 +685,7 @@ fman_attach(device_t dev)
 	phandle_t node;
 
 	sc = device_get_softc(dev);
-	sc->sc_base.dev = dev;
+	sc->dev = dev;
 
 	cell = 0;
 	node = ofw_bus_get_node(dev);
@@ -729,7 +733,7 @@ fman_attach(device_t dev)
 	sc->rman.rm_type = RMAN_ARRAY;
 	sc->rman.rm_descr = "FMan range";
 	rman_init_from_resource(&sc->rman, sc->mem_res);
-	simplebus_attach_impl(sc->sc_base.dev);
+	simplebus_attach_impl(sc->dev, 0, 0);
 
 	if (fman_init_muram(sc) != 0)
 		goto err;
diff --git a/sys/dev/dpaa/fman.h b/sys/dev/dpaa/fman.h
index bc4a5752fbfb..f3e6bfd61bff 100644
--- a/sys/dev/dpaa/fman.h
+++ b/sys/dev/dpaa/fman.h
@@ -63,7 +63,7 @@
  * FMan driver instance data.
  */
 struct fman_softc {
-	struct simplebus_softc sc_base;
+	device_t dev;
 	struct resource *mem_res;
 	struct resource *irq_res;
 	struct resource *err_irq_res;
diff --git a/sys/dev/dpaa/fman_fdt.c b/sys/dev/dpaa/fman_fdt.c
index 88f08269f086..a7ff673938d6 100644
--- a/sys/dev/dpaa/fman_fdt.c
+++ b/sys/dev/dpaa/fman_fdt.c
@@ -87,16 +87,14 @@ fman_fdt_probe(device_t dev)
 uint32_t
 fman_get_clock(struct fman_softc *sc)
 {
-	device_t dev;
 	phandle_t node;
 	pcell_t fman_clock;
 
-	dev = sc->sc_base.dev;
-	node = ofw_bus_get_node(dev);
+	node = ofw_bus_get_node(sc->dev);
 
 	if ((OF_getprop(node, "clock-frequency", &fman_clock,
 	    sizeof(fman_clock)) <= 0) || (fman_clock == 0)) {
-		device_printf(dev,
+		device_printf(sc->dev,
 		    "could not acquire correct frequency from DTS\n");
 
 		return (0);
diff --git a/sys/dev/dpaa/fman_keygen.c b/sys/dev/dpaa/fman_keygen.c
index b2384721c5b0..d261d8c70f81 100644
--- a/sys/dev/dpaa/fman_keygen.c
+++ b/sys/dev/dpaa/fman_keygen.c
@@ -145,12 +145,12 @@ kg_ar_write(struct fman_softc *sc, uint32_t ar)
 		DELAY(1);
 	}
 	if ((ar & FMKG_AR_GO) != 0) {
-		device_printf(sc->sc_base.dev,
+		device_printf(sc->dev,
 		    "fman_kg: AR stuck busy (0x%08x)\n", ar);
 		return (ETIMEDOUT);
 	}
 	if ((ar & FMKG_AR_ERR) != 0) {
-		device_printf(sc->sc_base.dev,
+		device_printf(sc->dev,
 		    "fman_kg: AR reported error (0x%08x)\n", ar);
 		return (EIO);
 	}
@@ -212,7 +212,7 @@ kg_program_scheme(struct fman_softc *sc, uint8_t scheme_id,
 	error = kg_ar_write(sc, FMKG_AR_GO |
 	    (scheme_id << FMKG_AR_NUM_SHIFT) | FMKG_AR_SCM_WSEL_UPDCNT);
 	if (error != 0)
-		device_printf(sc->sc_base.dev,
+		device_printf(sc->dev,
 		    "fman_kg: scheme %u program failed\n", scheme_id);
 	return (error);
 }
diff --git a/sys/dev/dpaa2/dpaa2_mc_fdt.c b/sys/dev/dpaa2/dpaa2_mc_fdt.c
index 2a808948306f..f6a2bf955c0e 100644
--- a/sys/dev/dpaa2/dpaa2_mc_fdt.c
+++ b/sys/dev/dpaa2/dpaa2_mc_fdt.c
@@ -396,7 +396,7 @@ static device_method_t dpaa2_mc_fdt_methods[] = {
 	DEVMETHOD_END
 };
 
-DEFINE_CLASS_1(dpaa2_mc, dpaa2_mc_fdt_driver, dpaa2_mc_fdt_methods,
-    sizeof(struct dpaa2_mc_softc), dpaa2_mc_driver);
+DEFINE_CLASS_2(dpaa2_mc, dpaa2_mc_fdt_driver, dpaa2_mc_fdt_methods,
+    sizeof(struct dpaa2_mc_softc), dpaa2_mc_driver, simplebus_driver);
 
 DRIVER_MODULE(dpaa2_mc, simplebus, dpaa2_mc_fdt_driver, 0, 0);
diff --git a/sys/dev/dpaa2/memac_mdio_fdt.c b/sys/dev/dpaa2/memac_mdio_fdt.c
index 247a70c6545c..374f05004bf3 100644
--- a/sys/dev/dpaa2/memac_mdio_fdt.c
+++ b/sys/dev/dpaa2/memac_mdio_fdt.c
@@ -160,12 +160,7 @@ MODULE_DEPEND(memacphy_fdt, miibus, 1, 1, 1);
 
 /* -------------------------------------------------------------------------- */
 
-/*
- * Order in this softc is important; memac_mdio_fdt_attach() calls
- * simplebus_init() which expects sb_sc at the beginning.
- */
 struct memac_mdio_softc_fdt {
-	struct simplebus_softc		sb_sc;		/* Must stay first. */
 	struct memac_mdio_softc_common	scc;
 };
 
@@ -294,8 +289,8 @@ static device_method_t memac_mdio_fdt_methods[] = {
 	DEVMETHOD_END
 };
 
-DEFINE_CLASS_0(memac_mdio_fdt, memac_mdio_fdt_driver, memac_mdio_fdt_methods,
-    sizeof(struct memac_mdio_softc_fdt));
+DEFINE_CLASS_1(memac_mdio_fdt, memac_mdio_fdt_driver, memac_mdio_fdt_methods,
+    sizeof(struct memac_mdio_softc_fdt), simplebus_driver);
 
 EARLY_DRIVER_MODULE(memac_mdio_fdt, simplebus, memac_mdio_fdt_driver, 0, 0,
     BUS_PASS_SUPPORTDEV);
diff --git a/sys/dev/fdt/simple_mfd.c b/sys/dev/fdt/simple_mfd.c
index 66352e3f9409..fe76d8690843 100644
--- a/sys/dev/fdt/simple_mfd.c
+++ b/sys/dev/fdt/simple_mfd.c
@@ -152,7 +152,6 @@ simple_mfd_syscon_unlock(device_t dev)
 static int
 simple_mfd_probe(device_t dev)
 {
-
 	if (!ofw_bus_status_okay(dev))
 		return (ENXIO);
 	if (!ofw_bus_is_compatible(dev, "simple-mfd"))
@@ -167,43 +166,16 @@ static int
 simple_mfd_attach(device_t dev)
 {
 	struct simple_mfd_softc *sc;
-	phandle_t node, child;
-	int rid;
+	int rid, rv;
 
 	sc = device_get_softc(dev);
-	node = ofw_bus_get_node(dev);
 
 	sc->dev = dev;
 	rid = 0;
 
-	/* Parse address-cells and size-cells from the parent node as a fallback */
-	if (OF_getencprop(node, "#address-cells", &sc->sc.acells,
-	    sizeof(sc->sc.acells)) == -1) {
-		if (OF_getencprop(OF_parent(node), "#address-cells", &sc->sc.acells,
-		    sizeof(sc->sc.acells)) == -1) {
-			sc->sc.acells = 2;
-		}
-	}
-	if (OF_getencprop(node, "#size-cells", &sc->sc.scells,
-	    sizeof(sc->sc.scells)) == -1) {
-		if (OF_getencprop(OF_parent(node), "#size-cells", &sc->sc.scells,
-		    sizeof(sc->sc.scells)) == -1) {
-			sc->sc.scells = 1;
-		}
-	}
-
-	/* If the node has a ranges prop, parse it so children mapping will be done correctly */
-	if (OF_hasprop(node, "ranges")) {
-		if (simplebus_fill_ranges(node, &sc->sc) < 0) {
-			device_printf(dev, "could not get ranges\n");
-			return (ENXIO);
-		}
-	}
-
-	/* Attach child devices */
-	for (child = OF_child(node); child > 0; child = OF_peer(child)) {
-		(void)simple_mfd_add_device(dev, child, 0, NULL, -1, NULL);
-	}
+	rv = simplebus_attach_impl(dev, SB_FLAG_NO_RANGES, 0);
+	if (rv != 0)
+		return (rv);
 
 	if (ofw_bus_is_compatible(dev, "syscon")) {
 		sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
@@ -255,7 +227,7 @@ simple_mfd_setup_dinfo(device_t dev, phandle_t node,
 	struct simplebus_softc *sc;
 	struct simplebus_devinfo *ndi;
 
-	sc = device_get_softc(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
 	if (di == NULL)
 		ndi = malloc(sizeof(*ndi), M_DEVBUF, M_WAITOK | M_ZERO);
 	else
diff --git a/sys/dev/fdt/simple_mfd.h b/sys/dev/fdt/simple_mfd.h
index c210e635bb00..26786daf5723 100644
--- a/sys/dev/fdt/simple_mfd.h
+++ b/sys/dev/fdt/simple_mfd.h
@@ -30,7 +30,6 @@
 #include <dev/fdt/simplebus.h>
 
 struct simple_mfd_softc {
-	struct simplebus_softc  sc;
 	device_t                dev;
 	struct syscon           *syscon;
 	struct resource         *mem_res;
diff --git a/sys/dev/fdt/simplebus.c b/sys/dev/fdt/simplebus.c
index 3ad6515ed3b7..3e78ba8c4789 100644
--- a/sys/dev/fdt/simplebus.c
+++ b/sys/dev/fdt/simplebus.c
@@ -34,6 +34,8 @@
 #include <sys/kernel.h>
 #include <sys/rman.h>
 
+#include <machine/bus.h>
+
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
@@ -178,13 +180,16 @@ simplebus_probe(device_t dev)
 }
 
 int
-simplebus_attach_impl(device_t dev)
+simplebus_attach_impl(device_t dev, int flags, phandle_t node)
 {
 	struct		simplebus_softc *sc;
-	phandle_t	node;
 
-	sc = device_get_softc(dev);
-	simplebus_init(dev, 0);
+	if (node == 0)
+		node = ofw_bus_get_node(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
+	sc->flags |=flags;
+
+	simplebus_init(dev, node);
 	if ((sc->flags & SB_FLAG_NO_RANGES) == 0 &&
 	    simplebus_fill_ranges(sc->node, sc) < 0) {
 		device_printf(dev, "could not get ranges\n");
@@ -207,7 +212,7 @@ simplebus_attach(device_t dev)
 {
 	int	rv;
 
-	rv = simplebus_attach_impl(dev);
+	rv = simplebus_attach_impl(dev, 0, 0);
 	if (rv != 0)
 		return (rv);
 
@@ -225,7 +230,7 @@ simplebus_detach(device_t dev)
 	if (rv != 0)
 		return (rv);
 
-	sc = device_get_softc(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
 	if (sc->ranges != NULL)
 		free(sc->ranges, M_DEVBUF);
 
@@ -236,8 +241,7 @@ void
 simplebus_init(device_t dev, phandle_t node)
 {
 	struct simplebus_softc *sc;
-
-	sc = device_get_softc(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
 	if (node == 0)
 		node = ofw_bus_get_node(dev);
 	sc->dev = dev;
@@ -250,6 +254,7 @@ simplebus_init(device_t dev, phandle_t node)
 	OF_getencprop(node, "#address-cells", &sc->acells, sizeof(sc->acells));
 	sc->scells = 1;
 	OF_getencprop(node, "#size-cells", &sc->scells, sizeof(sc->scells));
+
 }
 
 int
@@ -308,7 +313,7 @@ simplebus_setup_dinfo(device_t dev, phandle_t node,
 	struct simplebus_softc *sc;
 	struct simplebus_devinfo *ndi;
 
-	sc = device_get_softc(dev);
+	sc = device_get_softc_class(dev, &simplebus_driver);
 	if (di == NULL)
 		ndi = malloc(sizeof(*ndi), M_DEVBUF, M_WAITOK | M_ZERO);
 	else
@@ -468,7 +473,7 @@ simplebus_alloc_resource(device_t bus, device_t child, int type, int rid,
 	struct resource_list_entry *rle;
 	int j;
 
-	sc = device_get_softc(bus);
+	sc = device_get_softc_class(bus, &simplebus_driver);
 
 	/*
 	 * Request for the default allocation with a given rid: use resource
diff --git a/sys/dev/fdt/simplebus.h b/sys/dev/fdt/simplebus.h
index 25f2cb534e0f..2d8aa8d9a1f4 100644
--- a/sys/dev/fdt/simplebus.h
+++ b/sys/dev/fdt/simplebus.h
@@ -65,7 +65,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_attach_impl(device_t dev, int flags, phandle_t node);
 int simplebus_detach(device_t dev);
 
 #endif	/* _FDT_SIMPLEBUS_H */
diff --git a/sys/dev/firmware/arm/scmi.h b/sys/dev/firmware/arm/scmi.h
index fc52732bd503..e6bfae157544 100644
--- a/sys/dev/firmware/arm/scmi.h
+++ b/sys/dev/firmware/arm/scmi.h
@@ -61,7 +61,6 @@ struct scmi_transport_desc {
 struct scmi_transport;
 
 struct scmi_softc {
-	struct simplebus_softc		simplebus_sc;
 	device_t			dev;
 	struct mtx			mtx;
 	struct scmi_transport_desc	trs_desc;
diff --git a/sys/dev/firmware/xilinx/zynqmp_firmware.c b/sys/dev/firmware/xilinx/zynqmp_firmware.c
index dfe41842c40c..b2f507ee69c5 100644
--- a/sys/dev/firmware/xilinx/zynqmp_firmware.c
+++ b/sys/dev/firmware/xilinx/zynqmp_firmware.c
@@ -88,7 +88,6 @@ enum {
 typedef int (*zynqmp_callfn_t)(register_t, register_t, register_t, uint32_t *payload);
 
 struct zynqmp_firmware_softc {
-	struct simplebus_softc	sc;
 	device_t		dev;
 	zynqmp_callfn_t		callfn;
 };
diff --git a/sys/dev/gpio/dwgpio/dwgpio_bus.c b/sys/dev/gpio/dwgpio/dwgpio_bus.c
index 7f3fc5b91f69..dc4b05f095c3 100644
--- a/sys/dev/gpio/dwgpio/dwgpio_bus.c
+++ b/sys/dev/gpio/dwgpio/dwgpio_bus.c
@@ -46,7 +46,6 @@
 #include "dwgpio_if.h"
 
*** 380 LINES SKIPPED ***