]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ACPI: button: Install notifier for system events as well
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 3 Mar 2025 21:27:09 +0000 (15:27 -0600)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 11 Mar 2025 19:41:48 +0000 (20:41 +0100)
On some systems when the system is put to sleep pressing the ACPI power
button will cause the EC SCI to try to wake the system by a Notify(DEV, 0x2)
with an intention to wake the system up from suspend.

This behavior matches the ACPI specification in ACPI 6.4 section
4.8.3.1.1.2 which describes that the AML handler would generate a Notify()
with a code of 0x2 to indicate it was responsible for waking the system.

This currently doesn't work because acpi_button_add() only configured
`ACPI_DEVICE_NOTIFY` which means that device handler notifications
0x80 through 0xFF are handled.

To fix the wakeups on such systems, adjust the ACPI button handler to
use `ACPI_ALL_NOTIFY` which will handle all events 0x00 through 0x7F.

Reported-by: Yijun Shen <Yijun.Shen@dell.com>
Tested-by: Richard Gong <Richard.Gong@amd.com>
Link: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/04_ACPI_Hardware_Specification/ACPI_Hardware_Specification.html?highlight=0x2#control-method-power-button
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Tested-by: Yijun Shen <Yijun_Shen@Dell.com>
Link: https://patch.msgid.link/20250303212719.4153485-1-superm1@kernel.org
[ rjw: Removed uneeded semicolon ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/button.c

index 7773e6b860e73bef6231504e3aa1ee8ef30d8917..90b09840536dde1771cfe6a568edebcc0917d96f 100644 (file)
@@ -24,6 +24,7 @@
 #define ACPI_BUTTON_CLASS              "button"
 #define ACPI_BUTTON_FILE_STATE         "state"
 #define ACPI_BUTTON_TYPE_UNKNOWN       0x00
+#define ACPI_BUTTON_NOTIFY_WAKE                0x02
 #define ACPI_BUTTON_NOTIFY_STATUS      0x80
 
 #define ACPI_BUTTON_SUBCLASS_POWER     "power"
@@ -443,7 +444,12 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
        struct input_dev *input;
        int keycode;
 
-       if (event != ACPI_BUTTON_NOTIFY_STATUS) {
+       switch (event) {
+       case ACPI_BUTTON_NOTIFY_STATUS:
+               break;
+       case ACPI_BUTTON_NOTIFY_WAKE:
+               break;
+       default:
                acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n",
                                  event);
                return;
@@ -629,7 +635,7 @@ static int acpi_button_add(struct acpi_device *device)
                break;
        default:
                status = acpi_install_notify_handler(device->handle,
-                                                    ACPI_DEVICE_NOTIFY, handler,
+                                                    ACPI_ALL_NOTIFY, handler,
                                                     device);
                break;
        }