The branch main has been updated by vexeduxr:

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

commit 3bbdc0223a7c1efaf734d3d9f3cb818e79e11d54
Author:     Ahmad Khalifa <[email protected]>
AuthorDate: 2025-10-29 17:52:51 +0000
Commit:     Ahmad Khalifa <[email protected]>
CommitDate: 2025-10-29 17:58:00 +0000

    acpi_gpiobus: implement bus_child_deleted
    
    Implement bus_child_deleted and attach the gpio_aei dev to it's ACPI
    handle.
    
    Reviewed by:    wulf
    Differential Revision:  https://reviews.freebsd.org/D51585
---
 sys/dev/gpio/acpi_gpiobus.c     | 17 +++++++++++++++++
 sys/dev/gpio/gpiobus.c          |  2 +-
 sys/dev/gpio/gpiobus_internal.h |  1 +
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/sys/dev/gpio/acpi_gpiobus.c b/sys/dev/gpio/acpi_gpiobus.c
index 0d2455cab399..0c31f4fec16d 100644
--- a/sys/dev/gpio/acpi_gpiobus.c
+++ b/sys/dev/gpio/acpi_gpiobus.c
@@ -304,6 +304,12 @@ acpi_gpiobus_attach_aei(struct acpi_gpiobus_softc *sc, 
ACPI_HANDLE handle)
                devi->gpiobus.pins[i] = pins[i + 1];
        free(pins, M_DEVBUF);
 
+       status = AcpiAttachData(aei_handle, acpi_fake_objhandler, child);
+       if (ACPI_FAILURE(status)) {
+               printf("WARNING: Unable to attach object data to %s - %s\n",
+                   acpi_name(aei_handle), AcpiFormatException(status));
+       }
+
        bus_attach_children(sc->super_sc.sc_busdev);
 }
 
@@ -427,6 +433,16 @@ acpi_gpiobus_child_location(device_t bus, device_t child, 
struct sbuf *sb)
        return (0);
 }
 
+static void
+acpi_gpiobus_child_deleted(device_t bus, device_t child)
+{
+       struct acpi_gpiobus_ivar *devi = device_get_ivars(child);
+
+       if (acpi_get_device(devi->handle) == child)
+               AcpiDetachData(devi->handle, acpi_fake_objhandler);
+       gpiobus_child_deleted(bus, child);
+}
+
 static device_method_t acpi_gpiobus_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         acpi_gpiobus_probe),
@@ -437,6 +453,7 @@ static device_method_t acpi_gpiobus_methods[] = {
        DEVMETHOD(bus_read_ivar,        acpi_gpiobus_read_ivar),
        DEVMETHOD(bus_add_child,        acpi_gpiobus_add_child),
        DEVMETHOD(bus_child_location,   acpi_gpiobus_child_location),
+       DEVMETHOD(bus_child_deleted,    acpi_gpiobus_child_deleted),
 
        DEVMETHOD_END
 };
diff --git a/sys/dev/gpio/gpiobus.c b/sys/dev/gpio/gpiobus.c
index 0fca02c41ca7..596e468d35f3 100644
--- a/sys/dev/gpio/gpiobus.c
+++ b/sys/dev/gpio/gpiobus.c
@@ -734,7 +734,7 @@ gpiobus_add_child(device_t dev, u_int order, const char 
*name, int unit)
            sizeof(struct gpiobus_ivar)));
 }
 
-static void
+void
 gpiobus_child_deleted(device_t dev, device_t child)
 {
        struct gpiobus_ivar *devi;
diff --git a/sys/dev/gpio/gpiobus_internal.h b/sys/dev/gpio/gpiobus_internal.h
index 58f862343403..be76450b2432 100644
--- a/sys/dev/gpio/gpiobus_internal.h
+++ b/sys/dev/gpio/gpiobus_internal.h
@@ -43,6 +43,7 @@ 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);
 int gpiobus_child_location(device_t, device_t, struct sbuf *);
+void gpiobus_child_deleted(device_t, device_t);
 device_t gpiobus_add_child_common(device_t, u_int, const char *, int, size_t);
 int gpiobus_add_gpioc(device_t);
 

Reply via email to