Lines Matching refs:bdata
130 struct gpio_button_data *bdata = data;
132 if (!bdata->gpiod)
133 hrtimer_cancel(&bdata->release_timer);
134 else if (bdata->debounce_use_hrtimer)
135 hrtimer_cancel(&bdata->debounce_timer);
137 cancel_delayed_work_sync(&bdata->work);
142 * @bdata: button data for button to be disabled
144 * Disables button pointed by @bdata. This is done by masking
149 * Make sure that @bdata->disable_lock is locked when entering
153 static void gpio_keys_disable_button(struct gpio_button_data *bdata)
155 if (!bdata->disabled) {
159 disable_irq(bdata->irq);
160 gpio_keys_quiesce_key(bdata);
161 bdata->disabled = true;
167 * @bdata: button data for button to be disabled
169 * Enables given button pointed by @bdata.
171 * Make sure that @bdata->disable_lock is locked when entering
175 static void gpio_keys_enable_button(struct gpio_button_data *bdata)
177 if (bdata->disabled) {
178 enable_irq(bdata->irq);
179 bdata->disabled = false;
211 struct gpio_button_data *bdata = &ddata->data[i];
213 if (bdata->button->type != type)
216 if (only_disabled && !bdata->disabled)
219 __set_bit(*bdata->code, bits);
265 struct gpio_button_data *bdata = &ddata->data[i];
267 if (bdata->button->type != type)
270 if (test_bit(*bdata->code, bits) &&
271 !bdata->button->can_disable) {
280 struct gpio_button_data *bdata = &ddata->data[i];
282 if (bdata->button->type != type)
285 if (test_bit(*bdata->code, bits))
286 gpio_keys_disable_button(bdata);
288 gpio_keys_enable_button(bdata);
366 static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)
368 const struct gpio_keys_button *button = bdata->button;
369 struct input_dev *input = bdata->input;
373 state = bdata->debounce_use_hrtimer ?
374 gpiod_get_value(bdata->gpiod) :
375 gpiod_get_value_cansleep(bdata->gpiod);
386 input_event(input, type, *bdata->code, state);
390 static void gpio_keys_debounce_event(struct gpio_button_data *bdata)
392 gpio_keys_gpio_report_event(bdata);
393 input_sync(bdata->input);
395 if (bdata->button->wakeup)
396 pm_relax(bdata->input->dev.parent);
401 struct gpio_button_data *bdata =
404 gpio_keys_debounce_event(bdata);
409 struct gpio_button_data *bdata =
412 gpio_keys_debounce_event(bdata);
419 struct gpio_button_data *bdata = dev_id;
421 BUG_ON(irq != bdata->irq);
423 if (bdata->button->wakeup) {
424 const struct gpio_keys_button *button = bdata->button;
426 pm_stay_awake(bdata->input->dev.parent);
427 if (bdata->suspended &&
434 input_report_key(bdata->input, button->code, 1);
438 if (bdata->debounce_use_hrtimer) {
439 hrtimer_start(&bdata->debounce_timer,
440 ms_to_ktime(bdata->software_debounce),
444 &bdata->work,
445 msecs_to_jiffies(bdata->software_debounce));
453 struct gpio_button_data *bdata = container_of(t,
456 struct input_dev *input = bdata->input;
458 if (bdata->key_pressed) {
459 input_report_key(input, *bdata->code, 0);
461 bdata->key_pressed = false;
469 struct gpio_button_data *bdata = dev_id;
470 struct input_dev *input = bdata->input;
473 BUG_ON(irq != bdata->irq);
475 spin_lock_irqsave(&bdata->lock, flags);
477 if (!bdata->key_pressed) {
478 if (bdata->button->wakeup)
479 pm_wakeup_event(bdata->input->dev.parent, 0);
481 input_report_key(input, *bdata->code, 1);
484 if (!bdata->release_delay) {
485 input_report_key(input, *bdata->code, 0);
490 bdata->key_pressed = true;
493 if (bdata->release_delay)
494 hrtimer_start(&bdata->release_timer,
495 ms_to_ktime(bdata->release_delay),
498 spin_unlock_irqrestore(&bdata->lock, flags);
511 struct gpio_button_data *bdata = &ddata->data[idx];
517 bdata->input = input;
518 bdata->button = button;
519 spin_lock_init(&bdata->lock);
522 bdata->gpiod = devm_fwnode_gpiod_get(dev, child,
524 if (IS_ERR(bdata->gpiod)) {
525 error = PTR_ERR(bdata->gpiod);
534 bdata->gpiod = NULL;
553 bdata->gpiod = gpio_to_desc(button->gpio);
554 if (!bdata->gpiod)
558 if (bdata->gpiod) {
559 bool active_low = gpiod_is_active_low(bdata->gpiod);
562 error = gpiod_set_debounce(bdata->gpiod,
566 bdata->software_debounce =
574 bdata->debounce_use_hrtimer =
575 !gpiod_cansleep(bdata->gpiod);
579 bdata->irq = button->irq;
581 irq = gpiod_to_irq(bdata->gpiod);
589 bdata->irq = irq;
592 INIT_DELAYED_WORK(&bdata->work, gpio_keys_gpio_work_func);
594 hrtimer_init(&bdata->debounce_timer,
596 bdata->debounce_timer.function = gpio_keys_debounce_timer;
603 bdata->wakeup_trigger_type = active_low ?
607 bdata->wakeup_trigger_type = active_low ?
624 bdata->irq = button->irq;
631 bdata->release_delay = button->debounce_interval;
632 hrtimer_init(&bdata->release_timer,
634 bdata->release_timer.function = gpio_keys_irq_timer;
645 bdata->code = &ddata->keymap[idx];
646 *bdata->code = button->code;
647 input_set_capability(input, button->type ?: EV_KEY, *bdata->code);
653 error = devm_add_action(dev, gpio_keys_quiesce_key, bdata);
667 error = devm_request_any_context_irq(dev, bdata->irq, isr, irqflags,
668 desc, bdata);
671 bdata->irq, error);
684 struct gpio_button_data *bdata = &ddata->data[i];
685 if (bdata->gpiod)
686 gpio_keys_gpio_report_event(bdata);
900 gpio_keys_button_enable_wakeup(struct gpio_button_data *bdata)
904 error = enable_irq_wake(bdata->irq);
906 dev_err(bdata->input->dev.parent,
908 bdata->irq, error);
912 if (bdata->wakeup_trigger_type) {
913 error = irq_set_irq_type(bdata->irq,
914 bdata->wakeup_trigger_type);
916 dev_err(bdata->input->dev.parent,
918 bdata->wakeup_trigger_type, bdata->irq, error);
919 disable_irq_wake(bdata->irq);
928 gpio_keys_button_disable_wakeup(struct gpio_button_data *bdata)
936 if (bdata->wakeup_trigger_type) {
937 error = irq_set_irq_type(bdata->irq, IRQ_TYPE_EDGE_BOTH);
939 dev_warn(bdata->input->dev.parent,
941 bdata->irq, error);
944 error = disable_irq_wake(bdata->irq);
946 dev_warn(bdata->input->dev.parent,
948 bdata->irq, error);
954 struct gpio_button_data *bdata;
959 bdata = &ddata->data[i];
960 if (bdata->button->wakeup) {
961 error = gpio_keys_button_enable_wakeup(bdata);
965 bdata->suspended = true;
972 bdata = &ddata->data[i];
973 if (bdata->button->wakeup)
974 gpio_keys_button_disable_wakeup(bdata);
975 bdata->suspended = false;
984 struct gpio_button_data *bdata;
988 bdata = &ddata->data[i];
989 bdata->suspended = false;
990 if (irqd_is_wakeup_set(irq_get_irq_data(bdata->irq)))
991 gpio_keys_button_disable_wakeup(bdata);