18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci#include <linux/module.h>
38c2ecf20Sopenharmony_ci#include <linux/sched/signal.h>
48c2ecf20Sopenharmony_ci#include <linux/acpi.h>
58c2ecf20Sopenharmony_ci#include <acpi/button.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ciMODULE_AUTHOR("Josh Triplett");
88c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("ACPI Tiny Power Button Driver");
98c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_cistatic int power_signal __read_mostly = CONFIG_ACPI_TINY_POWER_BUTTON_SIGNAL;
128c2ecf20Sopenharmony_cimodule_param(power_signal, int, 0644);
138c2ecf20Sopenharmony_ciMODULE_PARM_DESC(power_signal, "Power button sends this signal to init");
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistatic const struct acpi_device_id tiny_power_button_device_ids[] = {
168c2ecf20Sopenharmony_ci	{ ACPI_BUTTON_HID_POWER, 0 },
178c2ecf20Sopenharmony_ci	{ ACPI_BUTTON_HID_POWERF, 0 },
188c2ecf20Sopenharmony_ci	{ "", 0 },
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, tiny_power_button_device_ids);
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistatic int acpi_noop_add_remove(struct acpi_device *device)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	return 0;
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cistatic void acpi_tiny_power_button_notify(struct acpi_device *device, u32 event)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	kill_cad_pid(power_signal, 1);
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic struct acpi_driver acpi_tiny_power_button_driver = {
338c2ecf20Sopenharmony_ci	.name = "tiny-power-button",
348c2ecf20Sopenharmony_ci	.class = "tiny-power-button",
358c2ecf20Sopenharmony_ci	.ids = tiny_power_button_device_ids,
368c2ecf20Sopenharmony_ci	.ops = {
378c2ecf20Sopenharmony_ci		.add = acpi_noop_add_remove,
388c2ecf20Sopenharmony_ci		.remove = acpi_noop_add_remove,
398c2ecf20Sopenharmony_ci		.notify = acpi_tiny_power_button_notify,
408c2ecf20Sopenharmony_ci	},
418c2ecf20Sopenharmony_ci};
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cimodule_driver(acpi_tiny_power_button_driver,
448c2ecf20Sopenharmony_ci		acpi_bus_register_driver,
458c2ecf20Sopenharmony_ci		acpi_bus_unregister_driver);
46