Author: andrew
Date: Mon Aug  3 16:43:40 2020
New Revision: 363800
URL: https://svnweb.freebsd.org/changeset/base/363800

Log:
  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

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_firmware.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_firmware.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_firmware.c    Mon Aug  3 16:26:10 
2020        (r363799)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_firmware.c    Mon Aug  3 16:43:40 
2020        (r363800)
@@ -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_AR
        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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to