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
This commit is contained in:
Ahmad Khalifa
2025-10-29 20:52:51 +03:00
parent 330b4f4702
commit 3bbdc0223a
3 changed files with 19 additions and 1 deletions
+17
View File
@@ -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
};
+1 -1
View File
@@ -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;
+1
View File
@@ -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);