The branch main has been updated by vexeduxr:

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

commit 7f53cf7e1e8902dec78f6831e69a89e424169acf
Author:     Ahmad Khalifa <vexed...@freebsd.org>
AuthorDate: 2025-08-20 06:03:25 +0000
Commit:     Ahmad Khalifa <vexed...@freebsd.org>
CommitDate: 2025-08-20 06:03:25 +0000

    gpiobus: factorize common add_child code
    
    Move common bus_add_child code to gpiobus_add_child_common.
    
    Reviewed by:    andrew
    Approved by:    imp (mentor)
    Differential Revision:  https://reviews.freebsd.org/D51582
---
 sys/dev/gpio/gpiobus.c          | 16 +++++++++++++---
 sys/dev/gpio/gpiobus_internal.h |  1 +
 sys/dev/gpio/ofw_gpiobus.c      | 14 ++++----------
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c
index c25c41f43042..2f448ea3a956 100644
--- a/sys/dev/gpio/gpiobus.c
+++ b/sys/dev/gpio/gpiobus.c
@@ -674,16 +674,19 @@ gpiobus_child_location(device_t bus, device_t child, 
struct sbuf *sb)
        return (0);
 }
 
-static device_t
-gpiobus_add_child(device_t dev, u_int order, const char *name, int unit)
+device_t
+gpiobus_add_child_common(device_t dev, u_int order, const char *name, int unit,
+    size_t ivars_size)
 {
        device_t child;
        struct gpiobus_ivar *devi;
 
+       KASSERT(ivars_size >= sizeof(struct gpiobus_ivar),
+           ("child ivars must include gpiobus_ivar as their first member"));
        child = device_add_child_ordered(dev, order, name, unit);
        if (child == NULL) 
                return (child);
-       devi = malloc(sizeof(struct gpiobus_ivar), M_DEVBUF, M_NOWAIT | M_ZERO);
+       devi = malloc(ivars_size, M_DEVBUF, M_NOWAIT | M_ZERO);
        if (devi == NULL) {
                device_delete_child(dev, child);
                return (NULL);
@@ -694,6 +697,13 @@ gpiobus_add_child(device_t dev, u_int order, const char 
*name, int unit)
        return (child);
 }
 
+static device_t
+gpiobus_add_child(device_t dev, u_int order, const char *name, int unit)
+{
+       return (gpiobus_add_child_common(dev, order, name, unit,
+           sizeof(struct gpiobus_ivar)));
+}
+
 static void
 gpiobus_child_deleted(device_t dev, device_t child)
 {
diff --git a/sys/dev/gpio/gpiobus_internal.h b/sys/dev/gpio/gpiobus_internal.h
index de3f57663132..82f1354d9e75 100644
--- a/sys/dev/gpio/gpiobus_internal.h
+++ b/sys/dev/gpio/gpiobus_internal.h
@@ -42,6 +42,7 @@ void gpiobus_free_ivars(struct gpiobus_ivar *);
 int gpiobus_read_ivar(device_t, device_t, int, uintptr_t *);
 int gpiobus_acquire_pin(device_t, uint32_t);
 void gpiobus_release_pin(device_t, uint32_t);
+device_t gpiobus_add_child_common(device_t, u_int, const char *, int, size_t);
 
 extern driver_t gpiobus_driver;
 #endif
diff --git a/sys/dev/gpio/ofw_gpiobus.c b/sys/dev/gpio/ofw_gpiobus.c
index fc5fb03d6824..b12b78fac18c 100644
--- a/sys/dev/gpio/ofw_gpiobus.c
+++ b/sys/dev/gpio/ofw_gpiobus.c
@@ -451,28 +451,22 @@ ofw_gpiobus_add_child(device_t dev, u_int order, const 
char *name, int unit)
        device_t child;
        struct ofw_gpiobus_devinfo *devi;
 
-       child = device_add_child_ordered(dev, order, name, unit);
+       child = gpiobus_add_child_common(dev, order, name, unit,
+           sizeof(struct ofw_gpiobus_devinfo));
        if (child == NULL)
-               return (child);
-       devi = malloc(sizeof(struct ofw_gpiobus_devinfo), M_DEVBUF,
-           M_NOWAIT | M_ZERO);
-       if (devi == NULL) {
-               device_delete_child(dev, child);
-               return (0);
-       }
+               return (NULL);
 
        /*
         * NULL all the OFW-related parts of the ivars for non-OFW
         * children.
         */
+       devi = device_get_ivars(child);
        devi->opd_obdinfo.obd_node = -1;
        devi->opd_obdinfo.obd_name = NULL;
        devi->opd_obdinfo.obd_compat = NULL;
        devi->opd_obdinfo.obd_type = NULL;
        devi->opd_obdinfo.obd_model = NULL;
 
-       device_set_ivars(child, devi);
-
        return (child);
 }
 

Reply via email to