Re: [PATCH] ACPI: button: Only send `KEY_POWER` when suspended

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 4/4/2025 6:36 AM, Mario Limonciello wrote:
From: Mario Limonciello <mario.limonciello@xxxxxxx>

commit a7e23ec17feec ("ACPI: button: Install notifier for system events
as well") modified the ACPI button behavior to send
`ACPI_BUTTON_NOTIFY_WAKE` events.  This caused a regression on a
"Dell Optiplex 3040" sending `KEY_POWER` randomly at runtime.

Adjust logic so that `ACPI_BUTTON_NOTIFY_WAKE` can not send `KEY_POWER`
unless system is suspended.

Fixes: a7e23ec17feec ("ACPI: button: Install notifier for system events as well")
Reported-by: Ian Laurie <nixuser@xxxxxxxx>
Closes: https://lore.kernel.org/linux-acpi/CAJZ5v0hbA6bqxHupTh4NZR-GVSb9M5RL7JSb2yQgvYYJg+z2aQ@xxxxxxxxxxxxxx/T/#md8071e480212201f23e4929607386750d3b6bc13
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2357044
Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx>
---
Cc: Yijun Shen <yijun_shen@xxxxxxxx>
Cc: Richard Gong <richard_gong@xxxxxxx>
---
  drivers/acpi/button.c | 14 ++++++++------
  1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 90b09840536dd..515224943c3cf 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -444,10 +444,18 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
  	struct input_dev *input;
  	int keycode;
+ button = acpi_driver_data(device);
+
  	switch (event) {
  	case ACPI_BUTTON_NOTIFY_STATUS:
+		acpi_pm_wakeup_event(&device->dev);
+		if (button->suspended)
+			return;
  		break;
  	case ACPI_BUTTON_NOTIFY_WAKE:
+		acpi_pm_wakeup_event(&device->dev);
+		if (!button->suspended)
+			return;
  		break;

Thinking through this case, this probably isn't enough; it's going to lead to a situation that Yijun sees the system wake up followed by a KEY_POWER.

I'll spin a new version for testing.

  	default:
  		acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n",
@@ -455,12 +463,6 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
  		return;
  	}
- acpi_pm_wakeup_event(&device->dev);
-
-	button = acpi_driver_data(device);
-	if (button->suspended)
-		return;
-
  	input = button->input;
  	keycode = test_bit(KEY_SLEEP, input->keybit) ? KEY_SLEEP : KEY_POWER;





[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]
  Powered by Linux