Lines Matching +full:gpio +full:- +full:keys +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for keys on GPIO lines capable of generating interrupts.
26 #include <linux/gpio.h>
27 #include <linux/gpio/consumer.h>
31 #include <dt-bindings/input/gpio-keys.h>
41 unsigned int release_delay; /* in msecs, for IRQ-only buttons */
45 unsigned int software_debounce; /* in msecs, for GPIO-driven buttons */
67 * SYSFS interface for enabling/disabling keys and switches:
69 * There are 4 attributes under /sys/devices/platform/gpio-keys/
70 * keys [ro] - bitmap of keys (EV_KEY) which can be
72 * switches [ro] - bitmap of switches (EV_SW) which can be
74 * disabled_keys [rw] - bitmap of keys currently disabled
75 * disabled_switches [rw] - bitmap of switches currently disabled
81 * For example, if we have following switches set up as gpio-keys:
87 * 11-9,5
97 * We can disable only those keys which don't allow sharing the irq.
101 * get_n_events_by_type() - returns maximum number of events per @type
115 * get_bm_events_by_type() - returns bitmap of supported events per @type
127 return (type == EV_KEY) ? dev->keybit : dev->swbit; in get_bm_events_by_type()
134 if (!bdata->gpiod) in gpio_keys_quiesce_key()
135 hrtimer_cancel(&bdata->release_timer); in gpio_keys_quiesce_key()
136 else if (bdata->debounce_use_hrtimer) in gpio_keys_quiesce_key()
137 hrtimer_cancel(&bdata->debounce_timer); in gpio_keys_quiesce_key()
139 cancel_delayed_work_sync(&bdata->work); in gpio_keys_quiesce_key()
143 * gpio_keys_disable_button() - disables given GPIO button
151 * Make sure that @bdata->disable_lock is locked when entering
157 if (!bdata->disabled) { in gpio_keys_disable_button()
161 disable_irq(bdata->irq); in gpio_keys_disable_button()
163 bdata->disabled = true; in gpio_keys_disable_button()
168 * gpio_keys_enable_button() - enables given GPIO button
173 * Make sure that @bdata->disable_lock is locked when entering
179 if (bdata->disabled) { in gpio_keys_enable_button()
180 enable_irq(bdata->irq); in gpio_keys_enable_button()
181 bdata->disabled = false; in gpio_keys_enable_button()
186 * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons
210 return -ENOMEM; in gpio_keys_attr_show_helper()
212 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_show_helper()
213 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_show_helper()
215 if (bdata->button->type != type) in gpio_keys_attr_show_helper()
218 if (only_disabled && !bdata->disabled) in gpio_keys_attr_show_helper()
221 __set_bit(*bdata->code, bits); in gpio_keys_attr_show_helper()
224 ret = scnprintf(buf, PAGE_SIZE - 1, "%*pbl", n_events, bits); in gpio_keys_attr_show_helper()
234 * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap
240 * GPIO buttons accordingly. Returns 0 on success and negative error
247 const unsigned long *bitmap = get_bm_events_by_type(ddata->input, type); in gpio_keys_attr_store_helper()
253 return -ENOMEM; in gpio_keys_attr_store_helper()
261 return -EINVAL; in gpio_keys_attr_store_helper()
263 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
264 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
266 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
269 if (test_bit(*bdata->code, bits) && in gpio_keys_attr_store_helper()
270 !bdata->button->can_disable) { in gpio_keys_attr_store_helper()
271 return -EINVAL; in gpio_keys_attr_store_helper()
275 guard(mutex)(&ddata->disable_lock); in gpio_keys_attr_store_helper()
277 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_attr_store_helper()
278 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper()
280 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
283 if (test_bit(*bdata->code, bits)) in gpio_keys_attr_store_helper()
304 ATTR_SHOW_FN(keys, EV_KEY, false);
312 * /sys/devices/platform/gpio-keys/keys [ro]
313 * /sys/devices/platform/gpio-keys/switches [ro]
315 static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL);
341 * /sys/devices/platform/gpio-keys/disabled_keys [rw]
342 * /sys/devices/platform/gpio-keys/disables_switches [rw]
362 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_report_event()
363 struct input_dev *input = bdata->input; in gpio_keys_gpio_report_event()
364 unsigned int type = button->type ?: EV_KEY; in gpio_keys_gpio_report_event()
365 int state; in gpio_keys_gpio_report_event() local
367 state = bdata->debounce_use_hrtimer ? in gpio_keys_gpio_report_event()
368 gpiod_get_value(bdata->gpiod) : in gpio_keys_gpio_report_event()
369 gpiod_get_value_cansleep(bdata->gpiod); in gpio_keys_gpio_report_event()
370 if (state < 0) { in gpio_keys_gpio_report_event()
371 dev_err(input->dev.parent, in gpio_keys_gpio_report_event()
372 "failed to get gpio state: %d\n", state); in gpio_keys_gpio_report_event()
377 if (state) in gpio_keys_gpio_report_event()
378 input_event(input, type, button->code, button->value); in gpio_keys_gpio_report_event()
380 input_event(input, type, *bdata->code, state); in gpio_keys_gpio_report_event()
387 input_sync(bdata->input); in gpio_keys_debounce_event()
389 if (bdata->button->wakeup) in gpio_keys_debounce_event()
390 pm_relax(bdata->input->dev.parent); in gpio_keys_debounce_event()
415 BUG_ON(irq != bdata->irq); in gpio_keys_gpio_isr()
417 if (bdata->button->wakeup) { in gpio_keys_gpio_isr()
418 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_isr()
420 pm_stay_awake(bdata->input->dev.parent); in gpio_keys_gpio_isr()
421 if (bdata->suspended && in gpio_keys_gpio_isr()
422 (button->type == 0 || button->type == EV_KEY)) { in gpio_keys_gpio_isr()
428 input_report_key(bdata->input, button->code, 1); in gpio_keys_gpio_isr()
432 if (bdata->debounce_use_hrtimer) { in gpio_keys_gpio_isr()
433 hrtimer_start(&bdata->debounce_timer, in gpio_keys_gpio_isr()
434 ms_to_ktime(bdata->software_debounce), in gpio_keys_gpio_isr()
438 &bdata->work, in gpio_keys_gpio_isr()
439 msecs_to_jiffies(bdata->software_debounce)); in gpio_keys_gpio_isr()
450 struct input_dev *input = bdata->input; in gpio_keys_irq_timer()
452 if (bdata->key_pressed) { in gpio_keys_irq_timer()
453 input_report_key(input, *bdata->code, 0); in gpio_keys_irq_timer()
455 bdata->key_pressed = false; in gpio_keys_irq_timer()
464 struct input_dev *input = bdata->input; in gpio_keys_irq_isr()
466 BUG_ON(irq != bdata->irq); in gpio_keys_irq_isr()
468 guard(spinlock_irqsave)(&bdata->lock); in gpio_keys_irq_isr()
470 if (!bdata->key_pressed) { in gpio_keys_irq_isr()
471 if (bdata->button->wakeup) in gpio_keys_irq_isr()
472 pm_wakeup_event(bdata->input->dev.parent, 0); in gpio_keys_irq_isr()
474 input_report_key(input, *bdata->code, 1); in gpio_keys_irq_isr()
477 if (!bdata->release_delay) { in gpio_keys_irq_isr()
478 input_report_key(input, *bdata->code, 0); in gpio_keys_irq_isr()
483 bdata->key_pressed = true; in gpio_keys_irq_isr()
486 if (bdata->release_delay) in gpio_keys_irq_isr()
487 hrtimer_start(&bdata->release_timer, in gpio_keys_irq_isr()
488 ms_to_ktime(bdata->release_delay), in gpio_keys_irq_isr()
501 const char *desc = button->desc ? button->desc : "gpio_keys"; in gpio_keys_setup_key()
502 struct device *dev = &pdev->dev; in gpio_keys_setup_key()
503 struct gpio_button_data *bdata = &ddata->data[idx]; in gpio_keys_setup_key()
510 bdata->input = input; in gpio_keys_setup_key()
511 bdata->button = button; in gpio_keys_setup_key()
512 spin_lock_init(&bdata->lock); in gpio_keys_setup_key()
515 bdata->gpiod = devm_fwnode_gpiod_get(dev, child, in gpio_keys_setup_key()
517 if (IS_ERR(bdata->gpiod)) { in gpio_keys_setup_key()
518 error = PTR_ERR(bdata->gpiod); in gpio_keys_setup_key()
519 if (error != -ENOENT) in gpio_keys_setup_key()
521 "failed to get gpio\n"); in gpio_keys_setup_key()
524 * GPIO is optional, we may be dealing with in gpio_keys_setup_key()
525 * purely interrupt-driven setup. in gpio_keys_setup_key()
527 bdata->gpiod = NULL; in gpio_keys_setup_key()
529 } else if (gpio_is_valid(button->gpio)) { in gpio_keys_setup_key()
531 * Legacy GPIO number, so request the GPIO here and in gpio_keys_setup_key()
534 error = devm_gpio_request_one(dev, button->gpio, GPIOF_IN, desc); in gpio_keys_setup_key()
536 dev_err(dev, "Failed to request GPIO %d, error %d\n", in gpio_keys_setup_key()
537 button->gpio, error); in gpio_keys_setup_key()
541 bdata->gpiod = gpio_to_desc(button->gpio); in gpio_keys_setup_key()
542 if (!bdata->gpiod) in gpio_keys_setup_key()
543 return -EINVAL; in gpio_keys_setup_key()
545 if (button->active_low ^ gpiod_is_active_low(bdata->gpiod)) in gpio_keys_setup_key()
546 gpiod_toggle_active_low(bdata->gpiod); in gpio_keys_setup_key()
549 if (bdata->gpiod) { in gpio_keys_setup_key()
550 bool active_low = gpiod_is_active_low(bdata->gpiod); in gpio_keys_setup_key()
552 if (button->debounce_interval) { in gpio_keys_setup_key()
553 error = gpiod_set_debounce(bdata->gpiod, in gpio_keys_setup_key()
554 button->debounce_interval * 1000); in gpio_keys_setup_key()
557 bdata->software_debounce = in gpio_keys_setup_key()
558 button->debounce_interval; in gpio_keys_setup_key()
561 * If reading the GPIO won't sleep, we can use a in gpio_keys_setup_key()
565 bdata->debounce_use_hrtimer = in gpio_keys_setup_key()
566 !gpiod_cansleep(bdata->gpiod); in gpio_keys_setup_key()
570 * If an interrupt was specified, use it instead of the gpio in gpio_keys_setup_key()
571 * interrupt and use the gpio for reading the state. A separate in gpio_keys_setup_key()
575 * for bdata->wakeirq setup. in gpio_keys_setup_key()
577 if (button->irq) { in gpio_keys_setup_key()
578 bdata->irq = button->irq; in gpio_keys_setup_key()
580 irq = gpiod_to_irq(bdata->gpiod); in gpio_keys_setup_key()
584 "Unable to get irq number for GPIO %d\n", in gpio_keys_setup_key()
585 button->gpio); in gpio_keys_setup_key()
588 bdata->irq = irq; in gpio_keys_setup_key()
591 INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); in gpio_keys_setup_key()
593 hrtimer_setup(&bdata->debounce_timer, gpio_keys_debounce_timer, in gpio_keys_setup_key()
599 switch (button->wakeup_event_action) { in gpio_keys_setup_key()
601 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
605 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
617 if (!button->irq) { in gpio_keys_setup_key()
618 dev_err(dev, "Found button without gpio or irq\n"); in gpio_keys_setup_key()
619 return -EINVAL; in gpio_keys_setup_key()
622 bdata->irq = button->irq; in gpio_keys_setup_key()
624 if (button->type && button->type != EV_KEY) { in gpio_keys_setup_key()
626 return -EINVAL; in gpio_keys_setup_key()
629 bdata->release_delay = button->debounce_interval; in gpio_keys_setup_key()
630 hrtimer_setup(&bdata->release_timer, gpio_keys_irq_timer, in gpio_keys_setup_key()
642 bdata->code = &ddata->keymap[idx]; in gpio_keys_setup_key()
643 *bdata->code = button->code; in gpio_keys_setup_key()
644 input_set_capability(input, button->type ?: EV_KEY, *bdata->code); in gpio_keys_setup_key()
661 if (!button->can_disable) in gpio_keys_setup_key()
664 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags, in gpio_keys_setup_key()
668 bdata->irq, error); in gpio_keys_setup_key()
672 if (!button->wakeirq) in gpio_keys_setup_key()
678 return -ENOMEM; in gpio_keys_setup_key()
680 bdata->wakeirq = button->wakeirq; in gpio_keys_setup_key()
688 error = devm_request_any_context_irq(dev, bdata->wakeirq, isr, in gpio_keys_setup_key()
692 bdata->irq, error); in gpio_keys_setup_key()
698 * IRQF_SHARED was set based on !button->can_disable. in gpio_keys_setup_key()
700 disable_irq(bdata->wakeirq); in gpio_keys_setup_key()
707 struct input_dev *input = ddata->input; in gpio_keys_report_state()
710 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_report_state()
711 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_report_state()
712 if (bdata->gpiod) in gpio_keys_report_state()
721 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_open()
724 if (pdata->enable) { in gpio_keys_open()
725 error = pdata->enable(input->dev.parent); in gpio_keys_open()
730 /* Report current state of buttons that are connected to GPIOs */ in gpio_keys_open()
739 const struct gpio_keys_platform_data *pdata = ddata->pdata; in gpio_keys_close()
741 if (pdata->disable) in gpio_keys_close()
742 pdata->disable(input->dev.parent); in gpio_keys_close()
761 return ERR_PTR(-ENODEV); in gpio_keys_get_devtree_pdata()
767 return ERR_PTR(-ENOMEM); in gpio_keys_get_devtree_pdata()
771 pdata->buttons = button; in gpio_keys_get_devtree_pdata()
772 pdata->nbuttons = nbuttons; in gpio_keys_get_devtree_pdata()
774 pdata->rep = device_property_read_bool(dev, "autorepeat"); in gpio_keys_get_devtree_pdata()
776 device_property_read_string(dev, "label", &pdata->name); in gpio_keys_get_devtree_pdata()
782 button->irq = irq; in gpio_keys_get_devtree_pdata()
786 button->wakeirq = irq; in gpio_keys_get_devtree_pdata()
788 if (!button->irq && !button->wakeirq) in gpio_keys_get_devtree_pdata()
789 button->irq = in gpio_keys_get_devtree_pdata()
794 &button->code)) { in gpio_keys_get_devtree_pdata()
796 return ERR_PTR(-EINVAL); in gpio_keys_get_devtree_pdata()
799 fwnode_property_read_string(child, "label", &button->desc); in gpio_keys_get_devtree_pdata()
801 if (fwnode_property_read_u32(child, "linux,input-type", in gpio_keys_get_devtree_pdata()
802 &button->type)) in gpio_keys_get_devtree_pdata()
803 button->type = EV_KEY; in gpio_keys_get_devtree_pdata()
805 fwnode_property_read_u32(child, "linux,input-value", in gpio_keys_get_devtree_pdata()
806 (u32 *)&button->value); in gpio_keys_get_devtree_pdata()
808 button->wakeup = in gpio_keys_get_devtree_pdata()
809 fwnode_property_read_bool(child, "wakeup-source") || in gpio_keys_get_devtree_pdata()
811 fwnode_property_read_bool(child, "gpio-key,wakeup"); in gpio_keys_get_devtree_pdata()
813 fwnode_property_read_u32(child, "wakeup-event-action", in gpio_keys_get_devtree_pdata()
814 &button->wakeup_event_action); in gpio_keys_get_devtree_pdata()
816 button->can_disable = in gpio_keys_get_devtree_pdata()
817 fwnode_property_read_bool(child, "linux,can-disable"); in gpio_keys_get_devtree_pdata()
819 if (fwnode_property_read_u32(child, "debounce-interval", in gpio_keys_get_devtree_pdata()
820 &button->debounce_interval)) in gpio_keys_get_devtree_pdata()
821 button->debounce_interval = 5; in gpio_keys_get_devtree_pdata()
830 { .compatible = "gpio-keys", },
837 struct device *dev = &pdev->dev; in gpio_keys_probe()
851 ddata = devm_kzalloc(dev, struct_size(ddata, data, pdata->nbuttons), in gpio_keys_probe()
854 dev_err(dev, "failed to allocate state\n"); in gpio_keys_probe()
855 return -ENOMEM; in gpio_keys_probe()
858 ddata->keymap = devm_kcalloc(dev, in gpio_keys_probe()
859 pdata->nbuttons, sizeof(ddata->keymap[0]), in gpio_keys_probe()
861 if (!ddata->keymap) in gpio_keys_probe()
862 return -ENOMEM; in gpio_keys_probe()
867 return -ENOMEM; in gpio_keys_probe()
870 ddata->pdata = pdata; in gpio_keys_probe()
871 ddata->input = input; in gpio_keys_probe()
872 mutex_init(&ddata->disable_lock); in gpio_keys_probe()
877 input->name = pdata->name ? : pdev->name; in gpio_keys_probe()
878 input->phys = "gpio-keys/input0"; in gpio_keys_probe()
879 input->dev.parent = dev; in gpio_keys_probe()
880 input->open = gpio_keys_open; in gpio_keys_probe()
881 input->close = gpio_keys_close; in gpio_keys_probe()
883 input->id.bustype = BUS_HOST; in gpio_keys_probe()
884 input->id.vendor = 0x0001; in gpio_keys_probe()
885 input->id.product = 0x0001; in gpio_keys_probe()
886 input->id.version = 0x0100; in gpio_keys_probe()
888 input->keycode = ddata->keymap; in gpio_keys_probe()
889 input->keycodesize = sizeof(ddata->keymap[0]); in gpio_keys_probe()
890 input->keycodemax = pdata->nbuttons; in gpio_keys_probe()
893 if (pdata->rep) in gpio_keys_probe()
894 __set_bit(EV_REP, input->evbit); in gpio_keys_probe()
896 for (i = 0; i < pdata->nbuttons; i++) { in gpio_keys_probe()
897 const struct gpio_keys_button *button = &pdata->buttons[i]; in gpio_keys_probe()
905 return -EINVAL; in gpio_keys_probe()
916 if (button->wakeup) in gpio_keys_probe()
939 error = enable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
941 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
943 bdata->irq, error); in gpio_keys_button_enable_wakeup()
947 if (bdata->wakeup_trigger_type) { in gpio_keys_button_enable_wakeup()
948 error = irq_set_irq_type(bdata->irq, in gpio_keys_button_enable_wakeup()
949 bdata->wakeup_trigger_type); in gpio_keys_button_enable_wakeup()
951 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
953 bdata->wakeup_trigger_type, bdata->irq, error); in gpio_keys_button_enable_wakeup()
954 disable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
959 if (bdata->wakeirq) { in gpio_keys_button_enable_wakeup()
960 enable_irq(bdata->wakeirq); in gpio_keys_button_enable_wakeup()
961 disable_irq(bdata->irq); in gpio_keys_button_enable_wakeup()
972 if (bdata->wakeirq) { in gpio_keys_button_disable_wakeup()
973 enable_irq(bdata->irq); in gpio_keys_button_disable_wakeup()
974 disable_irq(bdata->wakeirq); in gpio_keys_button_disable_wakeup()
978 * The trigger type is always both edges for gpio-based keys and we do in gpio_keys_button_disable_wakeup()
979 * not support changing wakeup trigger for interrupt-based keys. in gpio_keys_button_disable_wakeup()
981 if (bdata->wakeup_trigger_type) { in gpio_keys_button_disable_wakeup()
982 error = irq_set_irq_type(bdata->irq, IRQ_TYPE_EDGE_BOTH); in gpio_keys_button_disable_wakeup()
984 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
986 bdata->irq, error); in gpio_keys_button_disable_wakeup()
989 error = disable_irq_wake(bdata->irq); in gpio_keys_button_disable_wakeup()
991 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
993 bdata->irq, error); in gpio_keys_button_disable_wakeup()
1003 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_enable_wakeup()
1004 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
1005 if (bdata->button->wakeup) { in gpio_keys_enable_wakeup()
1010 bdata->suspended = true; in gpio_keys_enable_wakeup()
1016 while (i--) { in gpio_keys_enable_wakeup()
1017 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
1018 if (bdata->button->wakeup) in gpio_keys_enable_wakeup()
1020 bdata->suspended = false; in gpio_keys_enable_wakeup()
1032 for (i = 0; i < ddata->pdata->nbuttons; i++) { in gpio_keys_disable_wakeup()
1033 bdata = &ddata->data[i]; in gpio_keys_disable_wakeup()
1034 bdata->suspended = false; in gpio_keys_disable_wakeup()
1035 if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq))) in gpio_keys_disable_wakeup()
1043 struct input_dev *input = ddata->input; in gpio_keys_suspend()
1051 guard(mutex)(&input->mutex); in gpio_keys_suspend()
1063 struct input_dev *input = ddata->input; in gpio_keys_resume()
1069 guard(mutex)(&input->mutex); in gpio_keys_resume()
1088 ret = gpio_keys_suspend(&pdev->dev); in gpio_keys_shutdown()
1090 dev_err(&pdev->dev, "failed to shutdown\n"); in gpio_keys_shutdown()
1097 .name = "gpio-keys",
1120 MODULE_ALIAS("platform:gpio-keys");