git: 3bbdc0223a7c - main - acpi_gpiobus: implement bus_child_deleted

From: Ahmad Khalifa <vexeduxr_at_FreeBSD.org>
Date: Wed, 29 Oct 2025 17:58:39 UTC
The branch main has been updated by vexeduxr:

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

commit 3bbdc0223a7c1efaf734d3d9f3cb818e79e11d54
Author:     Ahmad Khalifa <vexeduxr@FreeBSD.org>
AuthorDate: 2025-10-29 17:52:51 +0000
Commit:     Ahmad Khalifa <vexeduxr@FreeBSD.org>
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);