Lines Matching +full:wakeup +full:- +full:event +full:- +full:action
1 // SPDX-License-Identifier: GPL-2.0-only
30 #include <dt-bindings/input/gpio-keys.h>
40 unsigned int release_delay; /* in msecs, for IRQ-only buttons */
43 unsigned int software_debounce; /* in msecs, for GPIO-driven buttons */
64 * There are 4 attributes under /sys/devices/platform/gpio-keys/
65 * keys [ro] - bitmap of keys (EV_KEY) which can be
67 * switches [ro] - bitmap of switches (EV_SW) which can be
69 * disabled_keys [rw] - bitmap of keys currently disabled
70 * disabled_switches [rw] - bitmap of switches currently disabled
72 * Userland can change these values and hence disable event generation
76 * For example, if we have following switches set up as gpio-keys:
82 * 11-9,5
96 * get_n_events_by_type() - returns maximum number of events per @type
110 * get_bm_events_by_type() - returns bitmap of supported events per @type
122 return (type == EV_KEY) ? dev->keybit : dev->swbit; in get_bm_events_by_type()
126 * gpio_keys_disable_button() - disables given GPIO button
134 * Make sure that @bdata->disable_lock is locked when entering
140 if (!bdata->disabled) { in gpio_keys_disable_button()
144 disable_irq(bdata->irq); in gpio_keys_disable_button()
146 if (bdata->gpiod) in gpio_keys_disable_button()
147 cancel_delayed_work_sync(&bdata->work); in gpio_keys_disable_button()
149 del_timer_sync(&bdata->release_timer); in gpio_keys_disable_button()
151 bdata->disabled = true; in gpio_keys_disable_button()
156 * gpio_keys_enable_button() - enables given GPIO button
161 * Make sure that @bdata->disable_lock is locked when entering
167 if (bdata->disabled) { in gpio_keys_enable_button()
168 enable_irq(bdata->irq); in gpio_keys_enable_button()
169 bdata->disabled = false; in gpio_keys_enable_button()
174 * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons
198 return -ENOMEM; in gpio_keys_attr_show_helper()
200 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_show_helper()
201 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_show_helper()
203 if (bdata->button->type != type) in gpio_keys_attr_show_helper()
206 if (only_disabled && !bdata->disabled) in gpio_keys_attr_show_helper()
209 __set_bit(*bdata->code, bits); in gpio_keys_attr_show_helper()
212 ret = scnprintf(buf, PAGE_SIZE - 1, "%*pbl", n_events, bits); in gpio_keys_attr_show_helper()
222 * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap
235 const unsigned long *bitmap = get_bm_events_by_type(ddata->input, type); in gpio_keys_attr_store_helper()
242 return -ENOMEM; in gpio_keys_attr_store_helper()
250 error = -EINVAL; in gpio_keys_attr_store_helper()
254 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
255 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
257 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
260 if (test_bit(*bdata->code, bits) && in gpio_keys_attr_store_helper()
261 !bdata->button->can_disable) { in gpio_keys_attr_store_helper()
262 error = -EINVAL; in gpio_keys_attr_store_helper()
267 mutex_lock(&ddata->disable_lock); in gpio_keys_attr_store_helper()
269 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
270 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
272 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
275 if (test_bit(*bdata->code, bits)) in gpio_keys_attr_store_helper()
281 mutex_unlock(&ddata->disable_lock); in gpio_keys_attr_store_helper()
308 * /sys/devices/platform/gpio-keys/keys [ro]
309 * /sys/devices/platform/gpio-keys/switches [ro]
337 * /sys/devices/platform/gpio-keys/disabled_keys [rw]
338 * /sys/devices/platform/gpio-keys/disables_switches [rw]
358 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_report_event()
359 struct input_dev *input = bdata->input; in gpio_keys_gpio_report_event()
360 unsigned int type = button->type ?: EV_KEY; in gpio_keys_gpio_report_event()
363 state = gpiod_get_value_cansleep(bdata->gpiod); in gpio_keys_gpio_report_event()
365 dev_err(input->dev.parent, in gpio_keys_gpio_report_event()
372 input_event(input, type, button->code, button->value); in gpio_keys_gpio_report_event()
374 input_event(input, type, *bdata->code, state); in gpio_keys_gpio_report_event()
386 if (bdata->button->wakeup) in gpio_keys_gpio_work_func()
387 pm_relax(bdata->input->dev.parent); in gpio_keys_gpio_work_func()
394 BUG_ON(irq != bdata->irq); in gpio_keys_gpio_isr()
396 if (bdata->button->wakeup) { in gpio_keys_gpio_isr()
397 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_isr()
399 pm_stay_awake(bdata->input->dev.parent); in gpio_keys_gpio_isr()
400 if (bdata->suspended && in gpio_keys_gpio_isr()
401 (button->type == 0 || button->type == EV_KEY)) { in gpio_keys_gpio_isr()
403 * Simulate wakeup key press in case the key has in gpio_keys_gpio_isr()
407 input_report_key(bdata->input, button->code, 1); in gpio_keys_gpio_isr()
412 &bdata->work, in gpio_keys_gpio_isr()
413 msecs_to_jiffies(bdata->software_debounce)); in gpio_keys_gpio_isr()
421 struct input_dev *input = bdata->input; in gpio_keys_irq_timer()
424 spin_lock_irqsave(&bdata->lock, flags); in gpio_keys_irq_timer()
425 if (bdata->key_pressed) { in gpio_keys_irq_timer()
426 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_timer()
428 bdata->key_pressed = false; in gpio_keys_irq_timer()
430 spin_unlock_irqrestore(&bdata->lock, flags); in gpio_keys_irq_timer()
436 struct input_dev *input = bdata->input; in gpio_keys_irq_isr()
439 BUG_ON(irq != bdata->irq); in gpio_keys_irq_isr()
441 spin_lock_irqsave(&bdata->lock, flags); in gpio_keys_irq_isr()
443 if (!bdata->key_pressed) { in gpio_keys_irq_isr()
444 if (bdata->button->wakeup) in gpio_keys_irq_isr()
445 pm_wakeup_event(bdata->input->dev.parent, 0); in gpio_keys_irq_isr()
447 input_event(input, EV_KEY, *bdata->code, 1); in gpio_keys_irq_isr()
450 if (!bdata->release_delay) { in gpio_keys_irq_isr()
451 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_isr()
456 bdata->key_pressed = true; in gpio_keys_irq_isr()
459 if (bdata->release_delay) in gpio_keys_irq_isr()
460 mod_timer(&bdata->release_timer, in gpio_keys_irq_isr()
461 jiffies + msecs_to_jiffies(bdata->release_delay)); in gpio_keys_irq_isr()
463 spin_unlock_irqrestore(&bdata->lock, flags); in gpio_keys_irq_isr()
471 if (bdata->gpiod) in gpio_keys_quiesce_key()
472 cancel_delayed_work_sync(&bdata->work); in gpio_keys_quiesce_key()
474 del_timer_sync(&bdata->release_timer); in gpio_keys_quiesce_key()
484 const char *desc = button->desc ? button->desc : "gpio_keys"; in gpio_keys_setup_key()
485 struct device *dev = &pdev->dev; in gpio_keys_setup_key()
486 struct gpio_button_data *bdata = &ddata->data[idx]; in gpio_keys_setup_key()
492 bdata->input = input; in gpio_keys_setup_key()
493 bdata->button = button; in gpio_keys_setup_key()
494 spin_lock_init(&bdata->lock); in gpio_keys_setup_key()
497 bdata->gpiod = devm_fwnode_gpiod_get(dev, child, in gpio_keys_setup_key()
499 if (IS_ERR(bdata->gpiod)) { in gpio_keys_setup_key()
500 error = PTR_ERR(bdata->gpiod); in gpio_keys_setup_key()
501 if (error == -ENOENT) { in gpio_keys_setup_key()
504 * purely interrupt-driven setup. in gpio_keys_setup_key()
506 bdata->gpiod = NULL; in gpio_keys_setup_key()
508 if (error != -EPROBE_DEFER) in gpio_keys_setup_key()
514 } else if (gpio_is_valid(button->gpio)) { in gpio_keys_setup_key()
521 if (button->active_low) in gpio_keys_setup_key()
524 error = devm_gpio_request_one(dev, button->gpio, flags, desc); in gpio_keys_setup_key()
527 button->gpio, error); in gpio_keys_setup_key()
531 bdata->gpiod = gpio_to_desc(button->gpio); in gpio_keys_setup_key()
532 if (!bdata->gpiod) in gpio_keys_setup_key()
533 return -EINVAL; in gpio_keys_setup_key()
536 if (bdata->gpiod) { in gpio_keys_setup_key()
537 bool active_low = gpiod_is_active_low(bdata->gpiod); in gpio_keys_setup_key()
539 if (button->debounce_interval) { in gpio_keys_setup_key()
540 error = gpiod_set_debounce(bdata->gpiod, in gpio_keys_setup_key()
541 button->debounce_interval * 1000); in gpio_keys_setup_key()
544 bdata->software_debounce = in gpio_keys_setup_key()
545 button->debounce_interval; in gpio_keys_setup_key()
548 if (button->irq) { in gpio_keys_setup_key()
549 bdata->irq = button->irq; in gpio_keys_setup_key()
551 irq = gpiod_to_irq(bdata->gpiod); in gpio_keys_setup_key()
556 button->gpio, error); in gpio_keys_setup_key()
559 bdata->irq = irq; in gpio_keys_setup_key()
562 INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); in gpio_keys_setup_key()
567 switch (button->wakeup_event_action) { in gpio_keys_setup_key()
569 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
573 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
585 if (!button->irq) { in gpio_keys_setup_key()
587 return -EINVAL; in gpio_keys_setup_key()
590 bdata->irq = button->irq; in gpio_keys_setup_key()
592 if (button->type && button->type != EV_KEY) { in gpio_keys_setup_key()
594 return -EINVAL; in gpio_keys_setup_key()
597 bdata->release_delay = button->debounce_interval; in gpio_keys_setup_key()
598 timer_setup(&bdata->release_timer, gpio_keys_irq_timer, 0); in gpio_keys_setup_key()
605 * So we don't need to reconfigure the trigger type for wakeup. in gpio_keys_setup_key()
609 bdata->code = &ddata->keymap[idx]; in gpio_keys_setup_key()
610 *bdata->code = button->code; in gpio_keys_setup_key()
611 input_set_capability(input, button->type ?: EV_KEY, *bdata->code); in gpio_keys_setup_key()
614 * Install custom action to cancel release timer and in gpio_keys_setup_key()
619 dev_err(dev, "failed to register quiesce action, error: %d\n", in gpio_keys_setup_key()
628 if (!button->can_disable) in gpio_keys_setup_key()
631 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags, in gpio_keys_setup_key()
635 bdata->irq, error); in gpio_keys_setup_key()
644 struct input_dev *input = ddata->input; in gpio_keys_report_state()
647 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_report_state()
648 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_report_state()
649 if (bdata->gpiod) in gpio_keys_report_state()
658 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_open()
661 if (pdata->enable) { in gpio_keys_open()
662 error = pdata->enable(input->dev.parent); in gpio_keys_open()
676 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_close()
678 if (pdata->disable) in gpio_keys_close()
679 pdata->disable(input->dev.parent); in gpio_keys_close()
699 return ERR_PTR(-ENODEV); in gpio_keys_get_devtree_pdata()
705 return ERR_PTR(-ENOMEM); in gpio_keys_get_devtree_pdata()
709 pdata->buttons = button; in gpio_keys_get_devtree_pdata()
710 pdata->nbuttons = nbuttons; in gpio_keys_get_devtree_pdata()
712 pdata->rep = device_property_read_bool(dev, "autorepeat"); in gpio_keys_get_devtree_pdata()
714 device_property_read_string(dev, "label", &pdata->name); in gpio_keys_get_devtree_pdata()
718 button->irq = in gpio_keys_get_devtree_pdata()
722 &button->code)) { in gpio_keys_get_devtree_pdata()
725 return ERR_PTR(-EINVAL); in gpio_keys_get_devtree_pdata()
728 fwnode_property_read_string(child, "label", &button->desc); in gpio_keys_get_devtree_pdata()
730 if (fwnode_property_read_u32(child, "linux,input-type", in gpio_keys_get_devtree_pdata()
731 &button->type)) in gpio_keys_get_devtree_pdata()
732 button->type = EV_KEY; in gpio_keys_get_devtree_pdata()
734 button->wakeup = in gpio_keys_get_devtree_pdata()
735 fwnode_property_read_bool(child, "wakeup-source") || in gpio_keys_get_devtree_pdata()
737 fwnode_property_read_bool(child, "gpio-key,wakeup"); in gpio_keys_get_devtree_pdata()
739 fwnode_property_read_u32(child, "wakeup-event-action", in gpio_keys_get_devtree_pdata()
740 &button->wakeup_event_action); in gpio_keys_get_devtree_pdata()
742 button->can_disable = in gpio_keys_get_devtree_pdata()
743 fwnode_property_read_bool(child, "linux,can-disable"); in gpio_keys_get_devtree_pdata()
745 if (fwnode_property_read_u32(child, "debounce-interval", in gpio_keys_get_devtree_pdata()
746 &button->debounce_interval)) in gpio_keys_get_devtree_pdata()
747 button->debounce_interval = 5; in gpio_keys_get_devtree_pdata()
756 { .compatible = "gpio-keys", },
763 struct device *dev = &pdev->dev; in gpio_keys_probe()
769 int wakeup = 0; in gpio_keys_probe() local
777 ddata = devm_kzalloc(dev, struct_size(ddata, data, pdata->nbuttons), in gpio_keys_probe()
781 return -ENOMEM; in gpio_keys_probe()
784 ddata->keymap = devm_kcalloc(dev, in gpio_keys_probe()
785 pdata->nbuttons, sizeof(ddata->keymap[0]), in gpio_keys_probe()
787 if (!ddata->keymap) in gpio_keys_probe()
788 return -ENOMEM; in gpio_keys_probe()
793 return -ENOMEM; in gpio_keys_probe()
796 ddata->pdata = pdata; in gpio_keys_probe()
797 ddata->input = input; in gpio_keys_probe()
798 mutex_init(&ddata->disable_lock); in gpio_keys_probe()
803 input->name = pdata->name ? : pdev->name; in gpio_keys_probe()
804 input->phys = "gpio-keys/input0"; in gpio_keys_probe()
805 input->dev.parent = dev; in gpio_keys_probe()
806 input->open = gpio_keys_open; in gpio_keys_probe()
807 input->close = gpio_keys_close; in gpio_keys_probe()
809 input->id.bustype = BUS_HOST; in gpio_keys_probe()
810 input->id.vendor = 0x0001; in gpio_keys_probe()
811 input->id.product = 0x0001; in gpio_keys_probe()
812 input->id.version = 0x0100; in gpio_keys_probe()
814 input->keycode = ddata->keymap; in gpio_keys_probe()
815 input->keycodesize = sizeof(ddata->keymap[0]); in gpio_keys_probe()
816 input->keycodemax = pdata->nbuttons; in gpio_keys_probe()
819 if (pdata->rep) in gpio_keys_probe()
820 __set_bit(EV_REP, input->evbit); in gpio_keys_probe()
822 for (i = 0; i < pdata->nbuttons; i++) { in gpio_keys_probe()
823 const struct gpio_keys_button *button = &pdata->buttons[i]; in gpio_keys_probe()
831 return -EINVAL; in gpio_keys_probe()
842 if (button->wakeup) in gpio_keys_probe()
843 wakeup = 1; in gpio_keys_probe()
855 device_init_wakeup(dev, wakeup); in gpio_keys_probe()
865 error = enable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
867 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
868 "failed to configure IRQ %d as wakeup source: %d\n", in gpio_keys_button_enable_wakeup()
869 bdata->irq, error); in gpio_keys_button_enable_wakeup()
873 if (bdata->wakeup_trigger_type) { in gpio_keys_button_enable_wakeup()
874 error = irq_set_irq_type(bdata->irq, in gpio_keys_button_enable_wakeup()
875 bdata->wakeup_trigger_type); in gpio_keys_button_enable_wakeup()
877 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
878 "failed to set wakeup trigger %08x for IRQ %d: %d\n", in gpio_keys_button_enable_wakeup()
879 bdata->wakeup_trigger_type, bdata->irq, error); in gpio_keys_button_enable_wakeup()
880 disable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
894 * The trigger type is always both edges for gpio-based keys and we do in gpio_keys_button_disable_wakeup()
895 * not support changing wakeup trigger for interrupt-based keys. in gpio_keys_button_disable_wakeup()
897 if (bdata->wakeup_trigger_type) { in gpio_keys_button_disable_wakeup()
898 error = irq_set_irq_type(bdata->irq, IRQ_TYPE_EDGE_BOTH); in gpio_keys_button_disable_wakeup()
900 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
902 bdata->irq, error); in gpio_keys_button_disable_wakeup()
905 error = disable_irq_wake(bdata->irq); in gpio_keys_button_disable_wakeup()
907 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
909 bdata->irq, error); in gpio_keys_button_disable_wakeup()
919 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_enable_wakeup()
920 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
921 if (bdata->button->wakeup) { in gpio_keys_enable_wakeup()
926 bdata->suspended = true; in gpio_keys_enable_wakeup()
932 while (i--) { in gpio_keys_enable_wakeup()
933 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
934 if (bdata->button->wakeup) in gpio_keys_enable_wakeup()
936 bdata->suspended = false; in gpio_keys_enable_wakeup()
948 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_disable_wakeup()
949 bdata = &ddata->data[i]; in gpio_keys_disable_wakeup()
950 bdata->suspended = false; in gpio_keys_disable_wakeup()
951 if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq))) in gpio_keys_disable_wakeup()
959 struct input_dev *input = ddata->input; in gpio_keys_suspend()
967 mutex_lock(&input->mutex); in gpio_keys_suspend()
968 if (input->users) in gpio_keys_suspend()
970 mutex_unlock(&input->mutex); in gpio_keys_suspend()
979 struct input_dev *input = ddata->input; in gpio_keys_resume()
985 mutex_lock(&input->mutex); in gpio_keys_resume()
986 if (input->users) in gpio_keys_resume()
988 mutex_unlock(&input->mutex); in gpio_keys_resume()
1004 ret = gpio_keys_suspend(&pdev->dev); in gpio_keys_shutdown()
1006 dev_err(&pdev->dev, "failed to shutdown\n"); in gpio_keys_shutdown()
1013 .name = "gpio-keys",
1036 MODULE_ALIAS("platform:gpio-keys");