| // 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> |
| |
| 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); |