Lines Matching +full:input +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0-only
23 #include <linux/input.h>
31 #include <dt-bindings/input/gpio-keys.h>
35 struct input_dev *input; member
41 unsigned int release_delay; /* in msecs, for IRQ-only buttons */
45 unsigned int software_debounce; /* in msecs, for GPIO-driven buttons */
58 struct input_dev *input; member
67 * There are 4 attributes under /sys/devices/platform/gpio-keys/
68 * keys [ro] - bitmap of keys (EV_KEY) which can be
70 * switches [ro] - bitmap of switches (EV_SW) which can be
72 * disabled_keys [rw] - bitmap of keys currently disabled
73 * disabled_switches [rw] - bitmap of switches currently disabled
75 * Userland can change these values and hence disable event generation
79 * For example, if we have following switches set up as gpio-keys:
85 * 11-9,5
86 * Next we want to disable proximity (11) and dock (5), we write:
95 * We can disable only those keys which don't allow sharing the irq.
99 * get_n_events_by_type() - returns maximum number of events per @type
113 * get_bm_events_by_type() - returns bitmap of supported events per @type
114 * @dev: input device from which bitmap is retrieved
125 return (type == EV_KEY) ? dev->keybit : dev->swbit; in get_bm_events_by_type()
132 if (!bdata->gpiod) in gpio_keys_quiesce_key()
133 hrtimer_cancel(&bdata->release_timer); in gpio_keys_quiesce_key()
134 else if (bdata->debounce_use_hrtimer) in gpio_keys_quiesce_key()
135 hrtimer_cancel(&bdata->debounce_timer); in gpio_keys_quiesce_key()
137 cancel_delayed_work_sync(&bdata->work); in gpio_keys_quiesce_key()
141 * gpio_keys_disable_button() - disables given GPIO button
146 * input events anymore. Note that one can only disable buttons
149 * Make sure that @bdata->disable_lock is locked when entering
155 if (!bdata->disabled) { in gpio_keys_disable_button()
157 * Disable IRQ and associated timer/work structure. in gpio_keys_disable_button()
159 disable_irq(bdata->irq); in gpio_keys_disable_button()
161 bdata->disabled = true; in gpio_keys_disable_button()
166 * gpio_keys_enable_button() - enables given GPIO button
171 * Make sure that @bdata->disable_lock is locked when entering
177 if (bdata->disabled) { in gpio_keys_enable_button()
178 enable_irq(bdata->irq); in gpio_keys_enable_button()
179 bdata->disabled = false; in gpio_keys_enable_button()
184 * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons
208 return -ENOMEM; in gpio_keys_attr_show_helper()
210 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_show_helper()
211 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_show_helper()
213 if (bdata->button->type != type) in gpio_keys_attr_show_helper()
216 if (only_disabled && !bdata->disabled) in gpio_keys_attr_show_helper()
219 __set_bit(*bdata->code, bits); in gpio_keys_attr_show_helper()
222 ret = scnprintf(buf, PAGE_SIZE - 1, "%*pbl", n_events, bits); in gpio_keys_attr_show_helper()
232 * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap
245 const unsigned long *bitmap = get_bm_events_by_type(ddata->input, type); in gpio_keys_attr_store_helper()
252 return -ENOMEM; in gpio_keys_attr_store_helper()
260 error = -EINVAL; in gpio_keys_attr_store_helper()
264 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
265 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
267 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
270 if (test_bit(*bdata->code, bits) && in gpio_keys_attr_store_helper()
271 !bdata->button->can_disable) { in gpio_keys_attr_store_helper()
272 error = -EINVAL; in gpio_keys_attr_store_helper()
277 mutex_lock(&ddata->disable_lock); in gpio_keys_attr_store_helper()
279 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
280 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
282 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
285 if (test_bit(*bdata->code, bits)) in gpio_keys_attr_store_helper()
291 mutex_unlock(&ddata->disable_lock); in gpio_keys_attr_store_helper()
318 * /sys/devices/platform/gpio-keys/keys [ro]
319 * /sys/devices/platform/gpio-keys/switches [ro]
347 * /sys/devices/platform/gpio-keys/disabled_keys [rw]
348 * /sys/devices/platform/gpio-keys/disables_switches [rw]
368 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_report_event()
369 struct input_dev *input = bdata->input; in gpio_keys_gpio_report_event() local
370 unsigned int type = button->type ?: EV_KEY; in gpio_keys_gpio_report_event()
373 state = bdata->debounce_use_hrtimer ? in gpio_keys_gpio_report_event()
374 gpiod_get_value(bdata->gpiod) : in gpio_keys_gpio_report_event()
375 gpiod_get_value_cansleep(bdata->gpiod); in gpio_keys_gpio_report_event()
377 dev_err(input->dev.parent, in gpio_keys_gpio_report_event()
384 input_event(input, type, button->code, button->value); in gpio_keys_gpio_report_event()
386 input_event(input, type, *bdata->code, state); in gpio_keys_gpio_report_event()
393 input_sync(bdata->input); in gpio_keys_debounce_event()
395 if (bdata->button->wakeup) in gpio_keys_debounce_event()
396 pm_relax(bdata->input->dev.parent); in gpio_keys_debounce_event()
421 BUG_ON(irq != bdata->irq); in gpio_keys_gpio_isr()
423 if (bdata->button->wakeup) { in gpio_keys_gpio_isr()
424 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_isr()
426 pm_stay_awake(bdata->input->dev.parent); in gpio_keys_gpio_isr()
427 if (bdata->suspended && in gpio_keys_gpio_isr()
428 (button->type == 0 || button->type == EV_KEY)) { in gpio_keys_gpio_isr()
434 input_report_key(bdata->input, button->code, 1); in gpio_keys_gpio_isr()
438 if (bdata->debounce_use_hrtimer) { in gpio_keys_gpio_isr()
439 hrtimer_start(&bdata->debounce_timer, in gpio_keys_gpio_isr()
440 ms_to_ktime(bdata->software_debounce), in gpio_keys_gpio_isr()
444 &bdata->work, in gpio_keys_gpio_isr()
445 msecs_to_jiffies(bdata->software_debounce)); in gpio_keys_gpio_isr()
456 struct input_dev *input = bdata->input; in gpio_keys_irq_timer() local
458 if (bdata->key_pressed) { in gpio_keys_irq_timer()
459 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_timer()
460 input_sync(input); in gpio_keys_irq_timer()
461 bdata->key_pressed = false; in gpio_keys_irq_timer()
470 struct input_dev *input = bdata->input; in gpio_keys_irq_isr() local
473 BUG_ON(irq != bdata->irq); in gpio_keys_irq_isr()
475 spin_lock_irqsave(&bdata->lock, flags); in gpio_keys_irq_isr()
477 if (!bdata->key_pressed) { in gpio_keys_irq_isr()
478 if (bdata->button->wakeup) in gpio_keys_irq_isr()
479 pm_wakeup_event(bdata->input->dev.parent, 0); in gpio_keys_irq_isr()
481 input_event(input, EV_KEY, *bdata->code, 1); in gpio_keys_irq_isr()
482 input_sync(input); in gpio_keys_irq_isr()
484 if (!bdata->release_delay) { in gpio_keys_irq_isr()
485 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_isr()
486 input_sync(input); in gpio_keys_irq_isr()
490 bdata->key_pressed = true; in gpio_keys_irq_isr()
493 if (bdata->release_delay) in gpio_keys_irq_isr()
494 hrtimer_start(&bdata->release_timer, in gpio_keys_irq_isr()
495 ms_to_ktime(bdata->release_delay), in gpio_keys_irq_isr()
498 spin_unlock_irqrestore(&bdata->lock, flags); in gpio_keys_irq_isr()
503 struct input_dev *input, in gpio_keys_setup_key() argument
509 const char *desc = button->desc ? button->desc : "gpio_keys"; in gpio_keys_setup_key()
510 struct device *dev = &pdev->dev; in gpio_keys_setup_key()
511 struct gpio_button_data *bdata = &ddata->data[idx]; in gpio_keys_setup_key()
517 bdata->input = input; in gpio_keys_setup_key()
518 bdata->button = button; in gpio_keys_setup_key()
519 spin_lock_init(&bdata->lock); in gpio_keys_setup_key()
522 bdata->gpiod = devm_fwnode_gpiod_get(dev, child, in gpio_keys_setup_key()
524 if (IS_ERR(bdata->gpiod)) { in gpio_keys_setup_key()
525 error = PTR_ERR(bdata->gpiod); in gpio_keys_setup_key()
526 if (error == -ENOENT) { in gpio_keys_setup_key()
529 * purely interrupt-driven setup. in gpio_keys_setup_key()
531 bdata->gpiod = NULL; in gpio_keys_setup_key()
533 if (error != -EPROBE_DEFER) in gpio_keys_setup_key()
539 } else if (gpio_is_valid(button->gpio)) { in gpio_keys_setup_key()
546 if (button->active_low) in gpio_keys_setup_key()
549 error = devm_gpio_request_one(dev, button->gpio, flags, desc); in gpio_keys_setup_key()
552 button->gpio, error); in gpio_keys_setup_key()
556 bdata->gpiod = gpio_to_desc(button->gpio); in gpio_keys_setup_key()
557 if (!bdata->gpiod) in gpio_keys_setup_key()
558 return -EINVAL; in gpio_keys_setup_key()
561 if (bdata->gpiod) { in gpio_keys_setup_key()
562 bool active_low = gpiod_is_active_low(bdata->gpiod); in gpio_keys_setup_key()
564 if (button->debounce_interval) { in gpio_keys_setup_key()
565 error = gpiod_set_debounce(bdata->gpiod, in gpio_keys_setup_key()
566 button->debounce_interval * 1000); in gpio_keys_setup_key()
569 bdata->software_debounce = in gpio_keys_setup_key()
570 button->debounce_interval; in gpio_keys_setup_key()
577 bdata->debounce_use_hrtimer = in gpio_keys_setup_key()
578 !gpiod_cansleep(bdata->gpiod); in gpio_keys_setup_key()
581 if (button->irq) { in gpio_keys_setup_key()
582 bdata->irq = button->irq; in gpio_keys_setup_key()
584 irq = gpiod_to_irq(bdata->gpiod); in gpio_keys_setup_key()
589 button->gpio, error); in gpio_keys_setup_key()
592 bdata->irq = irq; in gpio_keys_setup_key()
595 INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); in gpio_keys_setup_key()
597 hrtimer_init(&bdata->debounce_timer, in gpio_keys_setup_key()
599 bdata->debounce_timer.function = gpio_keys_debounce_timer; in gpio_keys_setup_key()
604 switch (button->wakeup_event_action) { in gpio_keys_setup_key()
606 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
610 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
622 if (!button->irq) { in gpio_keys_setup_key()
624 return -EINVAL; in gpio_keys_setup_key()
627 bdata->irq = button->irq; in gpio_keys_setup_key()
629 if (button->type && button->type != EV_KEY) { in gpio_keys_setup_key()
631 return -EINVAL; in gpio_keys_setup_key()
634 bdata->release_delay = button->debounce_interval; in gpio_keys_setup_key()
635 hrtimer_init(&bdata->release_timer, in gpio_keys_setup_key()
637 bdata->release_timer.function = gpio_keys_irq_timer; in gpio_keys_setup_key()
648 bdata->code = &ddata->keymap[idx]; in gpio_keys_setup_key()
649 *bdata->code = button->code; in gpio_keys_setup_key()
650 input_set_capability(input, button->type ?: EV_KEY, *bdata->code); in gpio_keys_setup_key()
667 if (!button->can_disable) in gpio_keys_setup_key()
670 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags, in gpio_keys_setup_key()
674 bdata->irq, error); in gpio_keys_setup_key()
683 struct input_dev *input = ddata->input; in gpio_keys_report_state() local
686 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_report_state()
687 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_report_state()
688 if (bdata->gpiod) in gpio_keys_report_state()
691 input_sync(input); in gpio_keys_report_state()
694 static int gpio_keys_open(struct input_dev *input) in gpio_keys_open() argument
696 struct gpio_keys_drvdata *ddata = input_get_drvdata(input); in gpio_keys_open()
697 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_open()
700 if (pdata->enable) { in gpio_keys_open()
701 error = pdata->enable(input->dev.parent); in gpio_keys_open()
712 static void gpio_keys_close(struct input_dev *input) in gpio_keys_close() argument
714 struct gpio_keys_drvdata *ddata = input_get_drvdata(input); in gpio_keys_close()
715 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_close()
717 if (pdata->disable) in gpio_keys_close()
718 pdata->disable(input->dev.parent); in gpio_keys_close()
738 return ERR_PTR(-ENODEV); in gpio_keys_get_devtree_pdata()
744 return ERR_PTR(-ENOMEM); in gpio_keys_get_devtree_pdata()
748 pdata->buttons = button; in gpio_keys_get_devtree_pdata()
749 pdata->nbuttons = nbuttons; in gpio_keys_get_devtree_pdata()
751 pdata->rep = device_property_read_bool(dev, "autorepeat"); in gpio_keys_get_devtree_pdata()
753 device_property_read_string(dev, "label", &pdata->name); in gpio_keys_get_devtree_pdata()
757 button->irq = in gpio_keys_get_devtree_pdata()
761 &button->code)) { in gpio_keys_get_devtree_pdata()
764 return ERR_PTR(-EINVAL); in gpio_keys_get_devtree_pdata()
767 fwnode_property_read_string(child, "label", &button->desc); in gpio_keys_get_devtree_pdata()
769 if (fwnode_property_read_u32(child, "linux,input-type", in gpio_keys_get_devtree_pdata()
770 &button->type)) in gpio_keys_get_devtree_pdata()
771 button->type = EV_KEY; in gpio_keys_get_devtree_pdata()
773 button->wakeup = in gpio_keys_get_devtree_pdata()
774 fwnode_property_read_bool(child, "wakeup-source") || in gpio_keys_get_devtree_pdata()
776 fwnode_property_read_bool(child, "gpio-key,wakeup"); in gpio_keys_get_devtree_pdata()
778 fwnode_property_read_u32(child, "wakeup-event-action", in gpio_keys_get_devtree_pdata()
779 &button->wakeup_event_action); in gpio_keys_get_devtree_pdata()
781 button->can_disable = in gpio_keys_get_devtree_pdata()
782 fwnode_property_read_bool(child, "linux,can-disable"); in gpio_keys_get_devtree_pdata()
784 if (fwnode_property_read_u32(child, "debounce-interval", in gpio_keys_get_devtree_pdata()
785 &button->debounce_interval)) in gpio_keys_get_devtree_pdata()
786 button->debounce_interval = 5; in gpio_keys_get_devtree_pdata()
795 { .compatible = "gpio-keys", },
802 struct device *dev = &pdev->dev; in gpio_keys_probe()
806 struct input_dev *input; in gpio_keys_probe() local
816 ddata = devm_kzalloc(dev, struct_size(ddata, data, pdata->nbuttons), in gpio_keys_probe()
820 return -ENOMEM; in gpio_keys_probe()
823 ddata->keymap = devm_kcalloc(dev, in gpio_keys_probe()
824 pdata->nbuttons, sizeof(ddata->keymap[0]), in gpio_keys_probe()
826 if (!ddata->keymap) in gpio_keys_probe()
827 return -ENOMEM; in gpio_keys_probe()
829 input = devm_input_allocate_device(dev); in gpio_keys_probe()
830 if (!input) { in gpio_keys_probe()
831 dev_err(dev, "failed to allocate input device\n"); in gpio_keys_probe()
832 return -ENOMEM; in gpio_keys_probe()
835 ddata->pdata = pdata; in gpio_keys_probe()
836 ddata->input = input; in gpio_keys_probe()
837 mutex_init(&ddata->disable_lock); in gpio_keys_probe()
840 input_set_drvdata(input, ddata); in gpio_keys_probe()
842 input->name = pdata->name ? : pdev->name; in gpio_keys_probe()
843 input->phys = "gpio-keys/input0"; in gpio_keys_probe()
844 input->dev.parent = dev; in gpio_keys_probe()
845 input->open = gpio_keys_open; in gpio_keys_probe()
846 input->close = gpio_keys_close; in gpio_keys_probe()
848 input->id.bustype = BUS_HOST; in gpio_keys_probe()
849 input->id.vendor = 0x0001; in gpio_keys_probe()
850 input->id.product = 0x0001; in gpio_keys_probe()
851 input->id.version = 0x0100; in gpio_keys_probe()
853 input->keycode = ddata->keymap; in gpio_keys_probe()
854 input->keycodesize = sizeof(ddata->keymap[0]); in gpio_keys_probe()
855 input->keycodemax = pdata->nbuttons; in gpio_keys_probe()
857 /* Enable auto repeat feature of Linux input subsystem */ in gpio_keys_probe()
858 if (pdata->rep) in gpio_keys_probe()
859 __set_bit(EV_REP, input->evbit); in gpio_keys_probe()
861 for (i = 0; i < pdata->nbuttons; i++) { in gpio_keys_probe()
862 const struct gpio_keys_button *button = &pdata->buttons[i]; in gpio_keys_probe()
870 return -EINVAL; in gpio_keys_probe()
874 error = gpio_keys_setup_key(pdev, input, ddata, in gpio_keys_probe()
881 if (button->wakeup) in gpio_keys_probe()
887 error = input_register_device(input); in gpio_keys_probe()
889 dev_err(dev, "Unable to register input device, error: %d\n", in gpio_keys_probe()
904 error = enable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
906 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
908 bdata->irq, error); in gpio_keys_button_enable_wakeup()
912 if (bdata->wakeup_trigger_type) { in gpio_keys_button_enable_wakeup()
913 error = irq_set_irq_type(bdata->irq, in gpio_keys_button_enable_wakeup()
914 bdata->wakeup_trigger_type); in gpio_keys_button_enable_wakeup()
916 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
918 bdata->wakeup_trigger_type, bdata->irq, error); in gpio_keys_button_enable_wakeup()
919 disable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
933 * The trigger type is always both edges for gpio-based keys and we do in gpio_keys_button_disable_wakeup()
934 * not support changing wakeup trigger for interrupt-based keys. in gpio_keys_button_disable_wakeup()
936 if (bdata->wakeup_trigger_type) { in gpio_keys_button_disable_wakeup()
937 error = irq_set_irq_type(bdata->irq, IRQ_TYPE_EDGE_BOTH); in gpio_keys_button_disable_wakeup()
939 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
941 bdata->irq, error); in gpio_keys_button_disable_wakeup()
944 error = disable_irq_wake(bdata->irq); in gpio_keys_button_disable_wakeup()
946 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
947 "failed to disable IRQ %d as wake source: %d\n", in gpio_keys_button_disable_wakeup()
948 bdata->irq, error); in gpio_keys_button_disable_wakeup()
958 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_enable_wakeup()
959 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
960 if (bdata->button->wakeup) { in gpio_keys_enable_wakeup()
965 bdata->suspended = true; in gpio_keys_enable_wakeup()
971 while (i--) { in gpio_keys_enable_wakeup()
972 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
973 if (bdata->button->wakeup) in gpio_keys_enable_wakeup()
975 bdata->suspended = false; in gpio_keys_enable_wakeup()
987 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_disable_wakeup()
988 bdata = &ddata->data[i]; in gpio_keys_disable_wakeup()
989 bdata->suspended = false; in gpio_keys_disable_wakeup()
990 if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq))) in gpio_keys_disable_wakeup()
998 struct input_dev *input = ddata->input; in gpio_keys_suspend() local
1006 mutex_lock(&input->mutex); in gpio_keys_suspend()
1007 if (input_device_enabled(input)) in gpio_keys_suspend()
1008 gpio_keys_close(input); in gpio_keys_suspend()
1009 mutex_unlock(&input->mutex); in gpio_keys_suspend()
1018 struct input_dev *input = ddata->input; in gpio_keys_resume() local
1024 mutex_lock(&input->mutex); in gpio_keys_resume()
1025 if (input_device_enabled(input)) in gpio_keys_resume()
1026 error = gpio_keys_open(input); in gpio_keys_resume()
1027 mutex_unlock(&input->mutex); in gpio_keys_resume()
1043 ret = gpio_keys_suspend(&pdev->dev); in gpio_keys_shutdown()
1045 dev_err(&pdev->dev, "failed to shutdown\n"); in gpio_keys_shutdown()
1052 .name = "gpio-keys",
1075 MODULE_ALIAS("platform:gpio-keys");