aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Wibo <obiwac@FreeBSD.org>2026-02-02 23:46:44 +0000
committerAymeric Wibo <obiwac@FreeBSD.org>2026-02-02 23:51:17 +0000
commit4a71fc3b5cebdf3e6227470d50cf559bab28f26b (patch)
tree4225d59713d17a135d80548f394e258ee7cd3e9d
parent4bfb7cfb70e62bc316de9e73cfd63a5c85541154 (diff)
acpi: Post/pre device suspend/resume eventhandlers
These eventhandlers are called after suspending the device tree and before resuming it. This is useful for PMC (power management controller) drivers. Reviewed by: olce Approved by: olce Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D48735
-rw-r--r--sys/dev/acpica/acpi.c2
-rw-r--r--sys/dev/acpica/acpivar.h4
2 files changed, 5 insertions, 1 deletions
diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c
index 6944adafed8e..60a2dba91b05 100644
--- a/sys/dev/acpica/acpi.c
+++ b/sys/dev/acpica/acpi.c
@@ -3634,6 +3634,7 @@ acpi_EnterSleepState(struct acpi_softc *sc, enum power_stype stype)
device_printf(sc->acpi_dev, "device_suspend failed\n");
goto backout;
}
+ EVENTHANDLER_INVOKE(acpi_post_dev_suspend, stype);
slp_state |= ACPI_SS_DEV_SUSPEND;
if (stype != POWER_STYPE_SUSPEND_TO_IDLE) {
@@ -3683,6 +3684,7 @@ backout:
slp_state &= ~ACPI_SS_GPE_SET;
}
if ((slp_state & ACPI_SS_DEV_SUSPEND) != 0) {
+ EVENTHANDLER_INVOKE(acpi_pre_dev_resume, stype);
DEVICE_RESUME(root_bus);
slp_state &= ~ACPI_SS_DEV_SUSPEND;
}
diff --git a/sys/dev/acpica/acpivar.h b/sys/dev/acpica/acpivar.h
index 0ffb9f7c7cc3..eea54178060f 100644
--- a/sys/dev/acpica/acpivar.h
+++ b/sys/dev/acpica/acpivar.h
@@ -482,12 +482,14 @@ UINT32 acpi_event_sleep_button_wake(void *context);
#define ACPI_EVENT_PRI_DEFAULT 10000
#define ACPI_EVENT_PRI_LAST 20000
-typedef void (*acpi_event_handler_t)(void *, int);
+typedef void (*acpi_event_handler_t)(void *, enum power_stype);
EVENTHANDLER_DECLARE(acpi_sleep_event, acpi_event_handler_t);
EVENTHANDLER_DECLARE(acpi_wakeup_event, acpi_event_handler_t);
EVENTHANDLER_DECLARE(acpi_acad_event, acpi_event_handler_t);
EVENTHANDLER_DECLARE(acpi_video_event, acpi_event_handler_t);
+EVENTHANDLER_DECLARE(acpi_post_dev_suspend, acpi_event_handler_t);
+EVENTHANDLER_DECLARE(acpi_pre_dev_resume, acpi_event_handler_t);
/* Device power control. */
ACPI_STATUS acpi_pwr_wake_enable(ACPI_HANDLE consumer, int enable);