Lines Matching +full:button +full:-
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * button.c - ACPI Button Driver
9 #define pr_fmt(fmt) "ACPI: button: " fmt
22 #include <acpi/button.h>
24 #define ACPI_BUTTON_CLASS "button"
31 #define ACPI_BUTTON_DEVICE_NAME_POWER "Power Button"
35 #define ACPI_BUTTON_DEVICE_NAME_SLEEP "Sleep Button"
57 MODULE_DESCRIPTION("ACPI Button Driver");
73 /* GP-electronic T701, _LID method points to a floating GPIO */
161 .name = "button",
183 static long lid_init_state = -1;
198 status = acpi_evaluate_integer(device->handle, "_LID", NULL, &lid_state); in acpi_lid_evaluate_state()
200 return -ENODEV; in acpi_lid_evaluate_state()
207 struct acpi_button *button = acpi_driver_data(device); in acpi_lid_notify_state() local
219 button->last_state != !!state) in acpi_lid_notify_state()
224 next_report = ktime_add(button->last_time, in acpi_lid_notify_state()
226 if (button->last_state == !!state && in acpi_lid_notify_state()
268 input_report_switch(button->input, in acpi_lid_notify_state()
270 input_sync(button->input); in acpi_lid_notify_state()
276 acpi_handle_debug(device->handle, "ACPI LID %s\n", in acpi_lid_notify_state()
278 input_report_switch(button->input, SW_LID, !state); in acpi_lid_notify_state()
279 input_sync(button->input); in acpi_lid_notify_state()
280 button->last_state = !!state; in acpi_lid_notify_state()
281 button->last_time = ktime_get(); in acpi_lid_notify_state()
290 struct acpi_device *device = seq->private; in acpi_button_state_seq_show()
301 struct acpi_button *button = acpi_driver_data(device); in acpi_button_add_fs() local
306 if (button->type != ACPI_BUTTON_TYPE_LID) in acpi_button_add_fs()
311 return -EEXIST; in acpi_button_add_fs()
314 /* create /proc/acpi/button */ in acpi_button_add_fs()
317 return -ENODEV; in acpi_button_add_fs()
319 /* create /proc/acpi/button/lid */ in acpi_button_add_fs()
322 ret = -ENODEV; in acpi_button_add_fs()
326 /* create /proc/acpi/button/lid/LID/ */ in acpi_button_add_fs()
329 ret = -ENODEV; in acpi_button_add_fs()
333 /* create /proc/acpi/button/lid/LID/state */ in acpi_button_add_fs()
338 ret = -ENODEV; in acpi_button_add_fs()
360 struct acpi_button *button = acpi_driver_data(device); in acpi_button_remove_fs() local
362 if (button->type != ACPI_BUTTON_TYPE_LID) in acpi_button_remove_fs()
382 return -ENODEV; in acpi_lid_open()
398 acpi_pm_wakeup_event(&device->dev); in acpi_lid_update_state()
405 struct acpi_button *button = acpi_driver_data(device); in acpi_lid_initialize_state() local
419 button->lid_state_initialized = true; in acpi_lid_initialize_state()
425 struct acpi_button *button; in acpi_lid_notify() local
428 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n", in acpi_lid_notify()
433 button = acpi_driver_data(device); in acpi_lid_notify()
434 if (!button->lid_state_initialized) in acpi_lid_notify()
443 struct acpi_button *button; in acpi_button_notify() local
453 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n", in acpi_button_notify()
458 acpi_pm_wakeup_event(&device->dev); in acpi_button_notify()
460 button = acpi_driver_data(device); in acpi_button_notify()
461 if (button->suspended || event == ACPI_BUTTON_NOTIFY_WAKE) in acpi_button_notify()
464 input = button->input; in acpi_button_notify()
465 keycode = test_bit(KEY_SLEEP, input->keybit) ? KEY_SLEEP : KEY_POWER; in acpi_button_notify()
472 acpi_bus_generate_netlink_event(device->pnp.device_class, in acpi_button_notify()
473 dev_name(&device->dev), in acpi_button_notify()
474 event, ++button->pushed); in acpi_button_notify()
492 struct acpi_button *button = acpi_driver_data(device); in acpi_button_suspend() local
494 button->suspended = true; in acpi_button_suspend()
502 struct acpi_button *button = acpi_driver_data(device); in acpi_button_resume() local
504 button->suspended = false; in acpi_button_resume()
505 if (button->type == ACPI_BUTTON_TYPE_LID) { in acpi_button_resume()
506 button->last_state = !!acpi_lid_evaluate_state(device); in acpi_button_resume()
507 button->last_time = ktime_get(); in acpi_button_resume()
511 if (button->type == ACPI_BUTTON_TYPE_POWER) { in acpi_button_resume()
512 input = button->input; in acpi_button_resume()
525 struct acpi_button *button = acpi_driver_data(device); in acpi_lid_input_open() local
527 button->last_state = !!acpi_lid_evaluate_state(device); in acpi_lid_input_open()
528 button->last_time = ktime_get(); in acpi_lid_input_open()
537 struct acpi_button *button; in acpi_button_add() local
546 return -ENODEV; in acpi_button_add()
548 button = kzalloc(sizeof(struct acpi_button), GFP_KERNEL); in acpi_button_add()
549 if (!button) in acpi_button_add()
550 return -ENOMEM; in acpi_button_add()
552 device->driver_data = button; in acpi_button_add()
554 button->input = input = input_allocate_device(); in acpi_button_add()
556 error = -ENOMEM; in acpi_button_add()
565 button->type = ACPI_BUTTON_TYPE_POWER; in acpi_button_add()
572 button->type = ACPI_BUTTON_TYPE_SLEEP; in acpi_button_add()
578 button->type = ACPI_BUTTON_TYPE_LID; in acpi_button_add()
583 input->open = acpi_lid_input_open; in acpi_button_add()
586 error = -ENODEV; in acpi_button_add()
597 snprintf(button->phys, sizeof(button->phys), "%s/button/input0", hid); in acpi_button_add()
599 input->name = name; in acpi_button_add()
600 input->phys = button->phys; in acpi_button_add()
601 input->id.bustype = BUS_HOST; in acpi_button_add()
602 input->id.product = button->type; in acpi_button_add()
603 input->dev.parent = &device->dev; in acpi_button_add()
605 switch (button->type) { in acpi_button_add()
625 switch (device->device_type) { in acpi_button_add()
637 status = acpi_install_notify_handler(device->handle, in acpi_button_add()
643 error = -ENODEV; in acpi_button_add()
647 if (button->type == ACPI_BUTTON_TYPE_LID) { in acpi_button_add()
655 device_init_wakeup(&device->dev, true); in acpi_button_add()
664 kfree(button); in acpi_button_add()
670 struct acpi_button *button = acpi_driver_data(device); in acpi_button_remove() local
672 switch (device->device_type) { in acpi_button_remove()
682 acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, in acpi_button_remove()
683 button->type == ACPI_BUTTON_TYPE_LID ? in acpi_button_remove()
691 input_unregister_device(button->input); in acpi_button_remove()
692 kfree(button); in acpi_button_remove()
719 buf[c - 1] = '\n'; /* Replace the final space with a newline */ in param_get_lid_init_state()
733 if (lid_init_state == -1) { in acpi_button_register_driver()
736 lid_init_state = (long)dmi_id->driver_data; in acpi_button_register_driver()
744 * capable kernels booted in non-ACPI mode if the return value of in acpi_button_register_driver()