git: fedc9746bd37 - main - acpi_spmc: Register SPMC suspend/resume routines

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

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

commit fedc9746bd37340a06dfcafea28904cf401127cf
Author:     Aymeric Wibo <obiwac@FreeBSD.org>
AuthorDate: 2026-02-02 23:49:23 +0000
Commit:     Aymeric Wibo <obiwac@FreeBSD.org>
CommitDate: 2026-02-02 23:51:17 +0000

    acpi_spmc: Register SPMC suspend/resume routines
    
    SPMC suspend runs after the device tree is suspended using the
    acpi_post_dev_suspend eventhandler, and SPMC resume runs before the
    device tree is resumed using the acpi_pre_dev_suspend eventhandler.
    
    Reviewed by:    olce
    Approved by:    olce
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D48735
---
 sys/dev/acpica/acpi_spmc.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/sys/dev/acpica/acpi_spmc.c b/sys/dev/acpica/acpi_spmc.c
index d8d28d59340d..e8ed14fdcb1b 100644
--- a/sys/dev/acpica/acpi_spmc.c
+++ b/sys/dev/acpica/acpi_spmc.c
@@ -8,12 +8,12 @@
  */
 
 #include <sys/param.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/eventhandler.h>
+#include <sys/kernel.h>
 #include <sys/malloc.h>
+#include <sys/module.h>
 #include <sys/uuid.h>
-#include <sys/kdb.h>
 
 #include <machine/_inttypes.h>
 
@@ -158,6 +158,9 @@ struct acpi_spmc_softc {
 	ACPI_OBJECT		*obj;
 	enum dsm_set_flags	dsm_sets;
 
+	struct eventhandler_entry	*eh_suspend;
+	struct eventhandler_entry	*eh_resume;
+
 	bool				constraints_populated;
 	size_t				constraint_count;
 	struct acpi_spmc_constraint	*constraints;
@@ -168,6 +171,9 @@ static void	acpi_spmc_check_dsm_set(struct acpi_spmc_softc *sc,
 static int	acpi_spmc_get_constraints(device_t dev);
 static void	acpi_spmc_free_constraints(struct acpi_spmc_softc *sc);
 
+static void	acpi_spmc_suspend(device_t dev, enum power_stype stype);
+static void	acpi_spmc_resume(device_t dev, enum power_stype stype);
+
 static int
 acpi_spmc_probe(device_t dev)
 {
@@ -207,9 +213,8 @@ acpi_spmc_probe(device_t dev)
 static int
 acpi_spmc_attach(device_t dev)
 {
-	struct acpi_spmc_softc *sc;
+	struct acpi_spmc_softc *sc = device_get_softc(dev);
 
-	sc = device_get_softc(dev);
 	sc->dev = dev;
 
 	sc->handle = acpi_get_handle(dev);
@@ -221,7 +226,12 @@ acpi_spmc_attach(device_t dev)
 	sc->constraints = NULL;
 
 	/* Get device constraints. We can only call this once so do this now. */
-	acpi_spmc_get_constraints(sc->dev);
+	acpi_spmc_get_constraints(dev);
+
+	sc->eh_suspend = EVENTHANDLER_REGISTER(acpi_post_dev_suspend,
+	    acpi_spmc_suspend, dev, 0);
+	sc->eh_resume = EVENTHANDLER_REGISTER(acpi_pre_dev_resume,
+	    acpi_spmc_resume, dev, 0);
 
 	return (0);
 }
@@ -229,6 +239,11 @@ acpi_spmc_attach(device_t dev)
 static int
 acpi_spmc_detach(device_t dev)
 {
+	struct acpi_spmc_softc *sc = device_get_softc(dev);
+
+	EVENTHANDLER_DEREGISTER(acpi_post_dev_suspend, sc->eh_suspend);
+	EVENTHANDLER_DEREGISTER(acpi_pre_dev_resume, sc->eh_resume);
+
 	acpi_spmc_free_constraints(device_get_softc(dev));
 	return (0);
 }
@@ -586,22 +601,24 @@ acpi_spmc_exit_notif(device_t dev)
 	}
 }
 
-static int
-acpi_spmc_suspend(device_t dev)
+static void
+acpi_spmc_suspend(device_t dev, enum power_stype stype)
 {
+	if (stype != POWER_STYPE_SUSPEND_TO_IDLE)
+		return;
+
 	acpi_spmc_display_off_notif(dev);
 	acpi_spmc_entry_notif(dev);
-
-	return (0);
 }
 
-static int
-acpi_spmc_resume(device_t dev)
+static void
+acpi_spmc_resume(device_t dev, enum power_stype stype)
 {
+	if (stype != POWER_STYPE_SUSPEND_TO_IDLE)
+		return;
+
 	acpi_spmc_exit_notif(dev);
 	acpi_spmc_display_on_notif(dev);
-
-	return (0);
 }
 
 static device_method_t acpi_spmc_methods[] = {