Lines Matching refs:bdata

141 static void gpio_keys_disable_button(struct gpio_button_data *bdata)  in gpio_keys_disable_button()  argument
143 if (!bdata->disabled) { in gpio_keys_disable_button()
147 disable_irq(bdata->irq); in gpio_keys_disable_button()
149 if (bdata->gpiod) in gpio_keys_disable_button()
150 cancel_delayed_work_sync(&bdata->work); in gpio_keys_disable_button()
152 del_timer_sync(&bdata->release_timer); in gpio_keys_disable_button()
154 bdata->disabled = true; in gpio_keys_disable_button()
168 static void gpio_keys_enable_button(struct gpio_button_data *bdata) in gpio_keys_enable_button() argument
170 if (bdata->disabled) { in gpio_keys_enable_button()
171 enable_irq(bdata->irq); in gpio_keys_enable_button()
172 bdata->disabled = false; in gpio_keys_enable_button()
204 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_show_helper() local
206 if (bdata->button->type != type) in gpio_keys_attr_show_helper()
209 if (only_disabled && !bdata->disabled) in gpio_keys_attr_show_helper()
212 __set_bit(*bdata->code, bits); in gpio_keys_attr_show_helper()
258 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper() local
260 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
263 if (test_bit(*bdata->code, bits) && in gpio_keys_attr_store_helper()
264 !bdata->button->can_disable) { in gpio_keys_attr_store_helper()
273 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper() local
275 if (bdata->button->type != type) in gpio_keys_attr_store_helper()
278 if (test_bit(*bdata->code, bits)) in gpio_keys_attr_store_helper()
279 gpio_keys_disable_button(bdata); in gpio_keys_attr_store_helper()
281 gpio_keys_enable_button(bdata); in gpio_keys_attr_store_helper()
362 static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) in gpio_keys_gpio_report_event() argument
364 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_report_event()
365 struct input_dev *input = bdata->input; in gpio_keys_gpio_report_event()
369 state = gpiod_get_value_cansleep(bdata->gpiod); in gpio_keys_gpio_report_event()
380 input_event(input, type, *bdata->code, state); in gpio_keys_gpio_report_event()
387 struct gpio_button_data *bdata = in gpio_keys_gpio_work_func() local
390 gpio_keys_gpio_report_event(bdata); in gpio_keys_gpio_work_func()
392 if (bdata->button->wakeup) in gpio_keys_gpio_work_func()
393 pm_relax(bdata->input->dev.parent); in gpio_keys_gpio_work_func()
398 struct gpio_button_data *bdata = dev_id; in gpio_keys_gpio_isr() local
400 BUG_ON(irq != bdata->irq); in gpio_keys_gpio_isr()
402 if (bdata->button->wakeup) { in gpio_keys_gpio_isr()
403 const struct gpio_keys_button *button = bdata->button; in gpio_keys_gpio_isr()
405 pm_stay_awake(bdata->input->dev.parent); in gpio_keys_gpio_isr()
406 if (bdata->suspended && in gpio_keys_gpio_isr()
413 input_report_key(bdata->input, button->code, 1); in gpio_keys_gpio_isr()
418 &bdata->work, in gpio_keys_gpio_isr()
419 msecs_to_jiffies(bdata->software_debounce)); in gpio_keys_gpio_isr()
426 struct gpio_button_data *bdata = from_timer(bdata, t, release_timer); in gpio_keys_irq_timer() local
427 struct input_dev *input = bdata->input; in gpio_keys_irq_timer()
430 spin_lock_irqsave(&bdata->lock, flags); in gpio_keys_irq_timer()
431 if (bdata->key_pressed) { in gpio_keys_irq_timer()
432 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_timer()
434 bdata->key_pressed = false; in gpio_keys_irq_timer()
436 spin_unlock_irqrestore(&bdata->lock, flags); in gpio_keys_irq_timer()
441 struct gpio_button_data *bdata = dev_id; in gpio_keys_irq_isr() local
442 struct input_dev *input = bdata->input; in gpio_keys_irq_isr()
445 BUG_ON(irq != bdata->irq); in gpio_keys_irq_isr()
447 spin_lock_irqsave(&bdata->lock, flags); in gpio_keys_irq_isr()
449 if (!bdata->key_pressed) { in gpio_keys_irq_isr()
450 if (bdata->button->wakeup) in gpio_keys_irq_isr()
451 pm_wakeup_event(bdata->input->dev.parent, 0); in gpio_keys_irq_isr()
453 input_event(input, EV_KEY, *bdata->code, 1); in gpio_keys_irq_isr()
456 if (!bdata->release_delay) { in gpio_keys_irq_isr()
457 input_event(input, EV_KEY, *bdata->code, 0); in gpio_keys_irq_isr()
462 bdata->key_pressed = true; in gpio_keys_irq_isr()
465 if (bdata->release_delay) in gpio_keys_irq_isr()
466 mod_timer(&bdata->release_timer, in gpio_keys_irq_isr()
467 jiffies + msecs_to_jiffies(bdata->release_delay)); in gpio_keys_irq_isr()
469 spin_unlock_irqrestore(&bdata->lock, flags); in gpio_keys_irq_isr()
475 struct gpio_button_data *bdata = data; in gpio_keys_quiesce_key() local
477 if (bdata->gpiod) in gpio_keys_quiesce_key()
478 cancel_delayed_work_sync(&bdata->work); in gpio_keys_quiesce_key()
480 del_timer_sync(&bdata->release_timer); in gpio_keys_quiesce_key()
492 struct gpio_button_data *bdata = &ddata->data[idx]; in gpio_keys_setup_key() local
498 bdata->input = input; in gpio_keys_setup_key()
499 bdata->button = button; in gpio_keys_setup_key()
500 spin_lock_init(&bdata->lock); in gpio_keys_setup_key()
503 bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL, in gpio_keys_setup_key()
507 if (IS_ERR(bdata->gpiod)) { in gpio_keys_setup_key()
508 error = PTR_ERR(bdata->gpiod); in gpio_keys_setup_key()
514 bdata->gpiod = NULL; in gpio_keys_setup_key()
539 bdata->gpiod = gpio_to_desc(button->gpio); in gpio_keys_setup_key()
540 if (!bdata->gpiod) in gpio_keys_setup_key()
544 if (bdata->gpiod) { in gpio_keys_setup_key()
545 bool active_low = gpiod_is_active_low(bdata->gpiod); in gpio_keys_setup_key()
548 error = gpiod_set_debounce(bdata->gpiod, in gpio_keys_setup_key()
552 bdata->software_debounce = in gpio_keys_setup_key()
557 bdata->irq = button->irq; in gpio_keys_setup_key()
559 irq = gpiod_to_irq(bdata->gpiod); in gpio_keys_setup_key()
567 bdata->irq = irq; in gpio_keys_setup_key()
570 INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func); in gpio_keys_setup_key()
577 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
581 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
599 bdata->irq = button->irq; in gpio_keys_setup_key()
606 bdata->release_delay = button->debounce_interval; in gpio_keys_setup_key()
607 timer_setup(&bdata->release_timer, gpio_keys_irq_timer, 0); in gpio_keys_setup_key()
618 bdata->code = &ddata->keymap[idx]; in gpio_keys_setup_key()
619 *bdata->code = button->code; in gpio_keys_setup_key()
620 input_set_capability(input, button->type ?: EV_KEY, *bdata->code); in gpio_keys_setup_key()
626 error = devm_add_action(dev, gpio_keys_quiesce_key, bdata); in gpio_keys_setup_key()
640 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags, in gpio_keys_setup_key()
641 desc, bdata); in gpio_keys_setup_key()
644 bdata->irq, error); in gpio_keys_setup_key()
657 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_report_state() local
658 if (bdata->gpiod) in gpio_keys_report_state()
659 gpio_keys_gpio_report_event(bdata); in gpio_keys_report_state()
879 gpio_keys_button_enable_wakeup(struct gpio_button_data *bdata) in gpio_keys_button_enable_wakeup() argument
883 error = enable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
885 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
887 bdata->irq, error); in gpio_keys_button_enable_wakeup()
891 if (bdata->wakeup_trigger_type) { in gpio_keys_button_enable_wakeup()
892 error = irq_set_irq_type(bdata->irq, in gpio_keys_button_enable_wakeup()
893 bdata->wakeup_trigger_type); in gpio_keys_button_enable_wakeup()
895 dev_err(bdata->input->dev.parent, in gpio_keys_button_enable_wakeup()
897 bdata->wakeup_trigger_type, bdata->irq, error); in gpio_keys_button_enable_wakeup()
898 disable_irq_wake(bdata->irq); in gpio_keys_button_enable_wakeup()
907 gpio_keys_button_disable_wakeup(struct gpio_button_data *bdata) in gpio_keys_button_disable_wakeup() argument
915 if (bdata->wakeup_trigger_type) { in gpio_keys_button_disable_wakeup()
916 error = irq_set_irq_type(bdata->irq, IRQ_TYPE_EDGE_BOTH); in gpio_keys_button_disable_wakeup()
918 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
920 bdata->irq, error); in gpio_keys_button_disable_wakeup()
923 error = disable_irq_wake(bdata->irq); in gpio_keys_button_disable_wakeup()
925 dev_warn(bdata->input->dev.parent, in gpio_keys_button_disable_wakeup()
927 bdata->irq, error); in gpio_keys_button_disable_wakeup()
933 struct gpio_button_data *bdata; in gpio_keys_enable_wakeup() local
938 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
939 if (bdata->button->wakeup) { in gpio_keys_enable_wakeup()
940 error = gpio_keys_button_enable_wakeup(bdata); in gpio_keys_enable_wakeup()
944 bdata->suspended = true; in gpio_keys_enable_wakeup()
951 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
952 if (bdata->button->wakeup) in gpio_keys_enable_wakeup()
953 gpio_keys_button_disable_wakeup(bdata); in gpio_keys_enable_wakeup()
954 bdata->suspended = false; in gpio_keys_enable_wakeup()
963 struct gpio_button_data *bdata; in gpio_keys_disable_wakeup() local
967 bdata = &ddata->data[i]; in gpio_keys_disable_wakeup()
968 bdata->suspended = false; in gpio_keys_disable_wakeup()
969 if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq))) in gpio_keys_disable_wakeup()
970 gpio_keys_button_disable_wakeup(bdata); in gpio_keys_disable_wakeup()