git: 4a71fc3b5ceb - main - acpi: Post/pre device suspend/resume eventhandlers

From: Aymeric Wibo <obiwac_at_FreeBSD.org>
Date: Mon, 02 Feb 2026 23:51:35 UTC
The branch main has been updated by obiwac:

URL: https://cgit.FreeBSD.org/src/commit/?id=4a71fc3b5cebdf3e6227470d50cf559bab28f26b

commit 4a71fc3b5cebdf3e6227470d50cf559bab28f26b
Author:     Aymeric Wibo <obiwac@FreeBSD.org>
AuthorDate: 2026-02-02 23:46:44 +0000
Commit:     Aymeric Wibo <obiwac@FreeBSD.org>
CommitDate: 2026-02-02 23:51:17 +0000

    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
---
 sys/dev/acpica/acpi.c    | 2 ++
 sys/dev/acpica/acpivar.h | 4 +++-
 2 files changed, 5 insertions(+), 1 deletion(-)

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);