git: e2d42b0e6cc2 - main - ofw: Convert simplebus to device_get_softc_class().
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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 ***