Allow the Raspberry Pi firmware driver to be a bus

There are child nodes in the device tree, e.g. the Raspberry Pi firmware
GPIO device. Add support for this to be a bus so we can attach these
children.

Reviewed by:	manu
Sponsored by:	Innovate UK
Differential Revision:	https://reviews.freebsd.org/D25848
This commit is contained in:
Andrew Turner 2020-08-03 16:43:40 +00:00
parent bc9b178cd0
commit 7e077ed00c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=363800

View File

@ -38,6 +38,8 @@ __FBSDID("$FreeBSD$");
#include <sys/module.h>
#include <sys/sysctl.h>
#include <dev/fdt/simplebus.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
@ -47,7 +49,7 @@ __FBSDID("$FreeBSD$");
#include <arm/broadcom/bcm2835/bcm2835_vcbus.h>
struct bcm2835_firmware_softc {
device_t sc_dev;
struct simplebus_softc sc;
phandle_t sc_mbox;
};
@ -82,7 +84,6 @@ bcm2835_firmware_attach(device_t dev)
int rv;
sc = device_get_softc(dev);
sc->sc_dev = dev;
node = ofw_bus_get_node(dev);
rv = OF_getencprop(node, "mboxes", &mbox, sizeof(mbox));
@ -94,14 +95,17 @@ bcm2835_firmware_attach(device_t dev)
OF_device_register_xref(OF_xref_from_node(node), dev);
ctx = device_get_sysctl_ctx(sc->sc_dev);
tree_node = device_get_sysctl_tree(sc->sc_dev);
ctx = device_get_sysctl_ctx(dev);
tree_node = device_get_sysctl_tree(dev);
tree = SYSCTL_CHILDREN(tree_node);
SYSCTL_ADD_PROC(ctx, tree, OID_AUTO, "revision",
CTLTYPE_UINT | CTLFLAG_RD, sc, sizeof(*sc),
sysctl_bcm2835_firmware_get_revision, "IU",
"Firmware revision");
return (0);
/* The firmwaare doesn't have a ranges property */
sc->sc.flags |= SB_FLAG_NO_RANGES;
return (simplebus_attach(dev));
}
int
@ -150,7 +154,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->sc.dev,
BCM2835_MBOX_TAG_FIRMWARE_REVISION, &rev, sizeof(rev)) != 0)
return (ENXIO);
@ -171,11 +175,9 @@ static device_method_t bcm2835_firmware_methods[] = {
};
static devclass_t bcm2835_firmware_devclass;
static driver_t bcm2835_firmware_driver = {
"bcm2835_firmware",
bcm2835_firmware_methods,
sizeof(struct bcm2835_firmware_softc),
};
DEFINE_CLASS_1(bcm2835_firmware, bcm2835_firmware_driver,
bcm2835_firmware_methods, sizeof(struct bcm2835_firmware_softc),
simplebus_driver);
EARLY_DRIVER_MODULE(bcm2835_firmware, simplebus, bcm2835_firmware_driver,
bcm2835_firmware_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LAST);