-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ACPI: Add new tiny-power-button driver to directly signal init
Virtual machines often use an ACPI power button event to tell the machine to shut down gracefully. Provide an extremely lightweight "tiny power button" driver to handle this event by signaling init directly, rather than running a separate daemon (such as acpid or systemd-logind) that adds to startup time and VM image complexity. The kernel configuration defines the default signal to send init, and userspace can change this signal via a module parameter. Suggested-by: "Rafael J. Wysocki" <rafael@kernel.org> Signed-off-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
- Loading branch information
Josh Triplett
authored and
Rafael J. Wysocki
committed
Feb 13, 2020
1 parent
ac1cc6b
commit a1b93e8
Showing
3 changed files
with
71 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
#include <linux/module.h> | ||
#include <linux/sched/signal.h> | ||
#include <linux/acpi.h> | ||
#include <acpi/button.h> | ||
|
||
ACPI_MODULE_NAME("tiny-power-button"); | ||
MODULE_AUTHOR("Josh Triplett"); | ||
MODULE_DESCRIPTION("ACPI Tiny Power Button Driver"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
static int power_signal __read_mostly = CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL; | ||
module_param(power_signal, int, 0644); | ||
MODULE_PARM_DESC(power_signal, "Power button sends this signal to init"); | ||
|
||
static const struct acpi_device_id tiny_power_button_device_ids[] = { | ||
{ ACPI_BUTTON_HID_POWER, 0 }, | ||
{ ACPI_BUTTON_HID_POWERF, 0 }, | ||
{ "", 0 }, | ||
}; | ||
MODULE_DEVICE_TABLE(acpi, tiny_power_button_device_ids); | ||
|
||
static int acpi_noop_add_remove(struct acpi_device *device) | ||
{ | ||
return 0; | ||
} | ||
|
||
static void acpi_tiny_power_button_notify(struct acpi_device *device, u32 event) | ||
{ | ||
kill_cad_pid(power_signal, 1); | ||
} | ||
|
||
static struct acpi_driver acpi_tiny_power_button_driver = { | ||
.name = "tiny-power-button", | ||
.class = "tiny-power-button", | ||
.ids = tiny_power_button_device_ids, | ||
.ops = { | ||
.add = acpi_noop_add_remove, | ||
.remove = acpi_noop_add_remove, | ||
.notify = acpi_tiny_power_button_notify, | ||
}, | ||
}; | ||
|
||
module_driver(acpi_tiny_power_button_driver, | ||
acpi_bus_register_driver, | ||
acpi_bus_unregister_driver); |