From: "Rafael J. Wysocki" <rafael@kernel.org>
To: Linux ACPI <linux-acpi@vger.kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH v1 14/15] ACPI: button: Reorganize installing and removing event handlers
Date: Mon, 01 Jun 2026 19:12:19 +0200 [thread overview]
Message-ID: <2714170.Lt9SDvczpP@rafael.j.wysocki> (raw)
In-Reply-To: <12913564.O9o76ZdvQC@rafael.j.wysocki>
From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
To facilitate subsequent changes, move the code installing and
removing button event handlers into two separate functions called
acpi_button_add_event_handler() and acpi_button_remove_event_handler(),
respectively, and rearrange it to reduce code duplication.
No intentional functional impact.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
drivers/acpi/button.c | 155 ++++++++++++++++++++++++------------------
1 file changed, 89 insertions(+), 66 deletions(-)
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 122c1dd8a68d..8a56780e13da 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -522,15 +522,99 @@ static int acpi_lid_input_open(struct input_dev *input)
return 0;
}
+static acpi_notify_handler acpi_button_notify_handler(struct acpi_button *button)
+{
+ if (button->type == ACPI_BUTTON_TYPE_LID)
+ return acpi_lid_notify;
+
+ return acpi_button_notify;
+}
+
+static void acpi_button_remove_event_handler(struct acpi_button *button)
+{
+ struct acpi_device *adev = button->adev;
+
+ switch (adev->device_type) {
+ case ACPI_BUS_TYPE_POWER_BUTTON:
+ acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
+ acpi_button_event);
+ break;
+
+ case ACPI_BUS_TYPE_SLEEP_BUTTON:
+ acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
+ acpi_button_event);
+ break;
+
+ default:
+ if (button->gpe_enabled) {
+ dev_dbg(button->dev, "Disabling ACPI GPE%02llx\n",
+ adev->wakeup.gpe_number);
+ acpi_disable_gpe(adev->wakeup.gpe_device,
+ adev->wakeup.gpe_number);
+ }
+ acpi_remove_notify_handler(adev->handle, ACPI_ALL_NOTIFY,
+ acpi_button_notify_handler(button));
+ break;
+ }
+ acpi_os_wait_events_complete();
+}
+
+static int acpi_button_add_fixed_event_handler(u32 event,
+ struct acpi_button *button)
+{
+ acpi_status status;
+
+ status = acpi_install_fixed_event_handler(event, acpi_button_event, button);
+ if (ACPI_FAILURE(status))
+ return -ENODEV;
+
+ return 0;
+}
+
+static int acpi_button_add_event_handler(struct acpi_button *button)
+{
+ struct acpi_device *adev = button->adev;
+ acpi_status status;
+
+ if (adev->device_type == ACPI_BUS_TYPE_POWER_BUTTON)
+ return acpi_button_add_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
+ button);
+
+ if (adev->device_type == ACPI_BUS_TYPE_SLEEP_BUTTON)
+ return acpi_button_add_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
+ button);
+
+ status = acpi_install_notify_handler(adev->handle, ACPI_ALL_NOTIFY,
+ acpi_button_notify_handler(button),
+ button);
+ if (ACPI_FAILURE(status))
+ return -ENODEV;
+
+ if (!adev->wakeup.flags.valid)
+ return 0;
+
+ /*
+ * If the wakeup GPE has a handler method, enable it in case it is also
+ * used for signaling runtime events.
+ */
+ status = acpi_enable_gpe_cond(adev->wakeup.gpe_device,
+ adev->wakeup.gpe_number,
+ ACPI_GPE_DISPATCH_METHOD);
+ button->gpe_enabled = ACPI_SUCCESS(status);
+ if (button->gpe_enabled)
+ dev_dbg(button->dev, "Enabled ACPI GPE%02llx\n",
+ adev->wakeup.gpe_number);
+
+ return 0;
+}
+
static int acpi_button_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct acpi_device *device = ACPI_COMPANION(dev);
const struct acpi_device_id *id;
- acpi_notify_handler handler;
struct acpi_button *button;
struct input_dev *input;
- acpi_status status;
u8 button_type;
int error = 0;
@@ -567,8 +649,6 @@ static int acpi_button_probe(struct platform_device *pdev)
input_set_capability(input, EV_SW, SW_LID);
input->open = acpi_lid_input_open;
- handler = acpi_lid_notify;
-
error = acpi_lid_add_fs(button);
if (error) {
input_free_device(input);
@@ -582,8 +662,6 @@ static int acpi_button_probe(struct platform_device *pdev)
input->name = ACPI_BUTTON_DEVICE_NAME_POWER;
input_set_capability(input, EV_KEY, KEY_POWER);
input_set_capability(input, EV_KEY, KEY_WAKEUP);
-
- handler = acpi_button_notify;
break;
case ACPI_BUTTON_TYPE_SLEEP:
@@ -591,8 +669,6 @@ static int acpi_button_probe(struct platform_device *pdev)
input->name = ACPI_BUTTON_DEVICE_NAME_SLEEP;
input_set_capability(input, EV_KEY, KEY_SLEEP);
-
- handler = acpi_button_notify;
break;
default:
@@ -617,42 +693,9 @@ static int acpi_button_probe(struct platform_device *pdev)
device_init_wakeup(button->dev, true);
- switch (device->device_type) {
- case ACPI_BUS_TYPE_POWER_BUTTON:
- status = acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
- acpi_button_event,
- button);
- break;
- case ACPI_BUS_TYPE_SLEEP_BUTTON:
- status = acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
- acpi_button_event,
- button);
- break;
- default:
- status = acpi_install_notify_handler(device->handle,
- ACPI_ALL_NOTIFY, handler,
- button);
- if (ACPI_SUCCESS(status) && device->wakeup.flags.valid) {
- acpi_status st;
-
- /*
- * If the wakeup GPE has a handler method, enable it in
- * case it is also used for signaling runtime events.
- */
- st = acpi_enable_gpe_cond(device->wakeup.gpe_device,
- device->wakeup.gpe_number,
- ACPI_GPE_DISPATCH_METHOD);
- button->gpe_enabled = ACPI_SUCCESS(st);
- if (button->gpe_enabled)
- dev_dbg(button->dev, "Enabled ACPI GPE%02llx\n",
- device->wakeup.gpe_number);
- }
- break;
- }
- if (ACPI_FAILURE(status)) {
- error = -ENODEV;
+ error = acpi_button_add_event_handler(button);
+ if (error)
goto err_input_unregister;
- }
if (button_type == ACPI_BUTTON_TYPE_LID) {
/*
@@ -685,29 +728,7 @@ static void acpi_button_remove(struct platform_device *pdev)
if (button->type == ACPI_BUTTON_TYPE_LID)
acpi_lid_forget(adev);
- switch (adev->device_type) {
- case ACPI_BUS_TYPE_POWER_BUTTON:
- acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
- acpi_button_event);
- break;
- case ACPI_BUS_TYPE_SLEEP_BUTTON:
- acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
- acpi_button_event);
- break;
- default:
- if (button->gpe_enabled) {
- dev_dbg(button->dev, "Disabling ACPI GPE%02llx\n",
- adev->wakeup.gpe_number);
- acpi_disable_gpe(adev->wakeup.gpe_device,
- adev->wakeup.gpe_number);
- }
- acpi_remove_notify_handler(adev->handle, ACPI_ALL_NOTIFY,
- button->type == ACPI_BUTTON_TYPE_LID ?
- acpi_lid_notify :
- acpi_button_notify);
- break;
- }
- acpi_os_wait_events_complete();
+ acpi_button_remove_event_handler(button);
device_init_wakeup(button->dev, false);
--
2.51.0
next prev parent reply other threads:[~2026-06-01 17:13 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-01 16:53 [PATCH v1 00/15] ACPI: button: Cleanups and conversion to using devm Rafael J. Wysocki
2026-06-01 16:55 ` [PATCH v1 01/15] ACPI: button: Fix lid_device value leak past driver removal Rafael J. Wysocki
2026-06-01 16:55 ` [PATCH v1 02/15] ACPI: button: Pass ACPI handle to acpi_lid_evaluate_state() Rafael J. Wysocki
2026-06-01 16:56 ` [PATCH v1 03/15] ACPI: button: Improve warning message regarding lid state Rafael J. Wysocki
2026-06-01 16:58 ` [PATCH v1 04/15] ACPI: button: Use bool for representing boolean values Rafael J. Wysocki
2026-06-01 16:59 ` [PATCH v1 05/15] ACPI: button: Eliminate ternary operator from acpi_lid_evaluate_state() Rafael J. Wysocki
2026-06-01 17:00 ` [PATCH v1 06/15] ACPI: button: Change return type of two functions to void Rafael J. Wysocki
2026-06-01 17:00 ` [PATCH v1 07/15] ACPI: button: Eliminate redundant conditional statement Rafael J. Wysocki
2026-06-01 17:01 ` [PATCH v1 08/15] ACPI: button: Use local pointer to platform device dev field in probe Rafael J. Wysocki
2026-06-01 17:03 ` [PATCH v1 09/15] ACPI: button: Rework device verification during probe Rafael J. Wysocki
2026-06-01 17:04 ` [PATCH v1 10/15] ACPI: button: Drop redundant variable from acpi_button_probe() Rafael J. Wysocki
2026-06-01 17:05 ` [PATCH v1 11/15] ACPI: button: Merge two switch () statements in acpi_button_probe() Rafael J. Wysocki
2026-06-01 17:07 ` [PATCH v1 12/15] ACPI: button: Clean up adding and removing lid procfs interface Rafael J. Wysocki
2026-06-01 17:07 ` [PATCH v1 13/15] ACPI: button: Use string literals for generating netlink messages Rafael J. Wysocki
2026-06-01 17:12 ` Rafael J. Wysocki [this message]
2026-06-01 17:12 ` [PATCH v1 15/15] ACPI: button: Switch over to devres-based resource management Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2714170.Lt9SDvczpP@rafael.j.wysocki \
--to=rafael@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox