Lines Matching refs:bdata
138 static void gpio_keys_disable_button(struct gpio_button_data *bdata) in gpio_keys_disable_button() argument
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()
165 static void gpio_keys_enable_button(struct gpio_button_data *bdata) in gpio_keys_enable_button() argument
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()
201 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_show_helper() local
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()
255 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper() local
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()
270 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_attr_store_helper() local
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()
276 gpio_keys_disable_button(bdata); in gpio_keys_attr_store_helper()
278 gpio_keys_enable_button(bdata); in gpio_keys_attr_store_helper()
356 static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) in gpio_keys_gpio_report_event() argument
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()
363 state = gpiod_get_value_cansleep(bdata->gpiod); in gpio_keys_gpio_report_event()
374 input_event(input, type, *bdata->code, state); in gpio_keys_gpio_report_event()
381 struct gpio_button_data *bdata = in gpio_keys_gpio_work_func() local
384 gpio_keys_gpio_report_event(bdata); in gpio_keys_gpio_work_func()
386 if (bdata->button->wakeup) in gpio_keys_gpio_work_func()
387 pm_relax(bdata->input->dev.parent); in gpio_keys_gpio_work_func()
392 struct gpio_button_data *bdata = dev_id; in gpio_keys_gpio_isr() local
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()
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()
420 struct gpio_button_data *bdata = from_timer(bdata, t, release_timer); in gpio_keys_irq_timer() local
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()
435 struct gpio_button_data *bdata = dev_id; in gpio_keys_irq_isr() local
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()
469 struct gpio_button_data *bdata = data; in gpio_keys_quiesce_key() local
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()
486 struct gpio_button_data *bdata = &ddata->data[idx]; in gpio_keys_setup_key() local
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()
506 bdata->gpiod = NULL; 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()
536 if (bdata->gpiod) { in gpio_keys_setup_key()
537 bool active_low = gpiod_is_active_low(bdata->gpiod); in gpio_keys_setup_key()
540 error = gpiod_set_debounce(bdata->gpiod, in gpio_keys_setup_key()
544 bdata->software_debounce = 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()
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()
569 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
573 bdata->wakeup_trigger_type = active_low ? in gpio_keys_setup_key()
590 bdata->irq = button->irq; 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()
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()
617 error = devm_add_action(dev, gpio_keys_quiesce_key, bdata); in gpio_keys_setup_key()
631 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags, in gpio_keys_setup_key()
632 desc, bdata); in gpio_keys_setup_key()
635 bdata->irq, error); in gpio_keys_setup_key()
648 struct gpio_button_data *bdata = &ddata->data[i]; in gpio_keys_report_state() local
649 if (bdata->gpiod) in gpio_keys_report_state()
650 gpio_keys_gpio_report_event(bdata); in gpio_keys_report_state()
861 gpio_keys_button_enable_wakeup(struct gpio_button_data *bdata) in gpio_keys_button_enable_wakeup() argument
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()
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()
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()
889 gpio_keys_button_disable_wakeup(struct gpio_button_data *bdata) in gpio_keys_button_disable_wakeup() argument
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()
915 struct gpio_button_data *bdata; in gpio_keys_enable_wakeup() local
920 bdata = &ddata->data[i]; in gpio_keys_enable_wakeup()
921 if (bdata->button->wakeup) { in gpio_keys_enable_wakeup()
922 error = gpio_keys_button_enable_wakeup(bdata); in gpio_keys_enable_wakeup()
926 bdata->suspended = true; 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()
935 gpio_keys_button_disable_wakeup(bdata); in gpio_keys_enable_wakeup()
936 bdata->suspended = false; in gpio_keys_enable_wakeup()
945 struct gpio_button_data *bdata; in gpio_keys_disable_wakeup() local
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()
952 gpio_keys_button_disable_wakeup(bdata); in gpio_keys_disable_wakeup()