Lines Matching +full:input +full:- +full:only
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * button.c - ACPI Button Driver
18 #include <linux/input.h>
72 /* GP-electronic T701, _LID method points to a floating GPIO */
93 * Medion Akoya E2215T, notification of the LID device only
104 * Medion Akoya E2228T, notification of the LID device only
116 * only happens on close, not on open and _LID always returns closed.
154 struct input_dev *input; member
155 char phys[32]; /* for input device */
164 static long lid_init_state = -1;
179 status = acpi_evaluate_integer(device->handle, "_LID", NULL, &lid_state); in acpi_lid_evaluate_state()
181 return -ENODEV; in acpi_lid_evaluate_state()
196 * So "last_time" is only updated after a timeout or an actual in acpi_lid_notify_state()
200 button->last_state != !!state) in acpi_lid_notify_state()
205 next_report = ktime_add(button->last_time, in acpi_lid_notify_state()
207 if (button->last_state == !!state && in acpi_lid_notify_state()
230 * But SW_LID is typed as input switch event, the input in acpi_lid_notify_state()
249 input_report_switch(button->input, in acpi_lid_notify_state()
251 input_sync(button->input); in acpi_lid_notify_state()
257 acpi_handle_debug(device->handle, "ACPI LID %s\n", in acpi_lid_notify_state()
259 input_report_switch(button->input, SW_LID, !state); in acpi_lid_notify_state()
260 input_sync(button->input); in acpi_lid_notify_state()
261 button->last_state = !!state; in acpi_lid_notify_state()
262 button->last_time = ktime_get(); in acpi_lid_notify_state()
271 struct acpi_device *device = seq->private; in acpi_button_state_seq_show()
286 /* procfs I/F for ACPI lid device only */ in acpi_button_add_fs()
287 if (button->type != ACPI_BUTTON_TYPE_LID) in acpi_button_add_fs()
292 return -EEXIST; in acpi_button_add_fs()
298 return -ENODEV; in acpi_button_add_fs()
303 ret = -ENODEV; in acpi_button_add_fs()
310 ret = -ENODEV; in acpi_button_add_fs()
319 ret = -ENODEV; in acpi_button_add_fs()
343 if (button->type != ACPI_BUTTON_TYPE_LID) in acpi_button_remove_fs()
363 return -ENODEV; in acpi_lid_open()
379 acpi_pm_wakeup_event(&device->dev); in acpi_lid_update_state()
400 button->lid_state_initialized = true; in acpi_lid_initialize_state()
406 struct input_dev *input; in acpi_button_notify() local
413 input = button->input; in acpi_button_notify()
414 if (button->type == ACPI_BUTTON_TYPE_LID) { in acpi_button_notify()
415 if (button->lid_state_initialized) in acpi_button_notify()
420 acpi_pm_wakeup_event(&device->dev); in acpi_button_notify()
421 if (button->suspended) in acpi_button_notify()
424 keycode = test_bit(KEY_SLEEP, input->keybit) ? in acpi_button_notify()
426 input_report_key(input, keycode, 1); in acpi_button_notify()
427 input_sync(input); in acpi_button_notify()
428 input_report_key(input, keycode, 0); in acpi_button_notify()
429 input_sync(input); in acpi_button_notify()
432 device->pnp.device_class, in acpi_button_notify()
433 dev_name(&device->dev), in acpi_button_notify()
434 event, ++button->pushed); in acpi_button_notify()
438 acpi_handle_debug(device->handle, "Unsupported event [0x%x]\n", in acpi_button_notify()
450 button->suspended = true; in acpi_button_suspend()
459 button->suspended = false; in acpi_button_resume()
460 if (button->type == ACPI_BUTTON_TYPE_LID) { in acpi_button_resume()
461 button->last_state = !!acpi_lid_evaluate_state(device); in acpi_button_resume()
462 button->last_time = ktime_get(); in acpi_button_resume()
469 static int acpi_lid_input_open(struct input_dev *input) in acpi_lid_input_open() argument
471 struct acpi_device *device = input_get_drvdata(input); in acpi_lid_input_open()
474 button->last_state = !!acpi_lid_evaluate_state(device); in acpi_lid_input_open()
475 button->last_time = ktime_get(); in acpi_lid_input_open()
484 struct input_dev *input; in acpi_button_add() local
491 return -ENODEV; in acpi_button_add()
495 return -ENOMEM; in acpi_button_add()
497 device->driver_data = button; in acpi_button_add()
499 button->input = input = input_allocate_device(); in acpi_button_add()
500 if (!input) { in acpi_button_add()
501 error = -ENOMEM; in acpi_button_add()
510 button->type = ACPI_BUTTON_TYPE_POWER; in acpi_button_add()
516 button->type = ACPI_BUTTON_TYPE_SLEEP; in acpi_button_add()
521 button->type = ACPI_BUTTON_TYPE_LID; in acpi_button_add()
525 input->open = acpi_lid_input_open; in acpi_button_add()
528 error = -ENODEV; in acpi_button_add()
536 snprintf(button->phys, sizeof(button->phys), "%s/button/input0", hid); in acpi_button_add()
538 input->name = name; in acpi_button_add()
539 input->phys = button->phys; in acpi_button_add()
540 input->id.bustype = BUS_HOST; in acpi_button_add()
541 input->id.product = button->type; in acpi_button_add()
542 input->dev.parent = &device->dev; in acpi_button_add()
544 switch (button->type) { in acpi_button_add()
546 input_set_capability(input, EV_KEY, KEY_POWER); in acpi_button_add()
550 input_set_capability(input, EV_KEY, KEY_SLEEP); in acpi_button_add()
554 input_set_capability(input, EV_SW, SW_LID); in acpi_button_add()
558 input_set_drvdata(input, device); in acpi_button_add()
559 error = input_register_device(input); in acpi_button_add()
562 if (button->type == ACPI_BUTTON_TYPE_LID) { in acpi_button_add()
564 * This assumes there's only one lid device, or if there are in acpi_button_add()
565 * more we only care about the last one... in acpi_button_add()
570 device_init_wakeup(&device->dev, true); in acpi_button_add()
577 input_free_device(input); in acpi_button_add()
588 input_unregister_device(button->input); in acpi_button_remove()
617 buf[c - 1] = '\n'; /* Replace the final space with a newline */ in param_get_lid_init_state()
631 if (lid_init_state == -1) { in acpi_button_register_driver()
634 lid_init_state = (long)dmi_id->driver_data; in acpi_button_register_driver()
642 * capable kernels booted in non-ACPI mode if the return value of in acpi_button_register_driver()