Lines Matching +full:i2c +full:- +full:polling

1 // SPDX-License-Identifier: GPL-2.0+
43 dev_printk(KERN_DEBUG, &ir->dev->intf->dev, \
48 * Polling structure used by em28xx IR's
65 int polling; member
79 * I2C IR based get keycodes - should be used with ir-kbd-i2c
93 return -EIO; in em28xx_get_key_terratec()
123 return -EIO; in em28xx_get_key_em_haup()
152 return -EIO; in em28xx_get_key_pinnacle_usb_grey()
170 .addr = i2c_dev->addr, in em28xx_get_key_winfast_usbii_deluxe()
174 .addr = i2c_dev->addr, in em28xx_get_key_winfast_usbii_deluxe()
182 if (i2c_transfer(i2c_dev->adapter, msg, 2) != 2) in em28xx_get_key_winfast_usbii_deluxe()
183 return -EIO; in em28xx_get_key_winfast_usbii_deluxe()
189 if (i2c_transfer(i2c_dev->adapter, msg, 2) != 2) in em28xx_get_key_winfast_usbii_deluxe()
190 return -EIO; in em28xx_get_key_winfast_usbii_deluxe()
207 struct em28xx *dev = ir->dev; in default_polling_getkey()
215 rc = dev->em28xx_read_reg_req_len(dev, 0, EM28XX_R45_IR, in default_polling_getkey()
221 poll_result->toggle_bit = (msg[0] >> 7); in default_polling_getkey()
224 poll_result->read_count = (msg[0] & 0x7f); in default_polling_getkey()
227 switch (ir->rc_proto) { in default_polling_getkey()
229 poll_result->protocol = RC_PROTO_RC5; in default_polling_getkey()
230 poll_result->scancode = RC_SCANCODE_RC5(msg[1], msg[2]); in default_polling_getkey()
234 poll_result->protocol = RC_PROTO_NEC; in default_polling_getkey()
235 poll_result->scancode = RC_SCANCODE_NEC(msg[1], msg[2]); in default_polling_getkey()
239 poll_result->protocol = RC_PROTO_UNKNOWN; in default_polling_getkey()
240 poll_result->scancode = msg[1] << 8 | msg[2]; in default_polling_getkey()
250 struct em28xx *dev = ir->dev; in em2874_polling_getkey()
256 * on registers 0x51-55 in em2874_polling_getkey()
258 rc = dev->em28xx_read_reg_req_len(dev, 0, EM2874_R51_IR, in em2874_polling_getkey()
264 poll_result->toggle_bit = (msg[0] >> 7); in em2874_polling_getkey()
267 poll_result->read_count = (msg[0] & 0x7f); in em2874_polling_getkey()
271 * Remote Control Data (Reg 0x53-0x55) in em2874_polling_getkey()
273 switch (ir->rc_proto) { in em2874_polling_getkey()
275 poll_result->protocol = RC_PROTO_RC5; in em2874_polling_getkey()
276 poll_result->scancode = RC_SCANCODE_RC5(msg[1], msg[2]); in em2874_polling_getkey()
280 poll_result->scancode = ir_nec_bytes_to_scancode(msg[1], msg[2], msg[3], msg[4], in em2874_polling_getkey()
281 &poll_result->protocol); in em2874_polling_getkey()
285 poll_result->protocol = RC_PROTO_RC6_0; in em2874_polling_getkey()
286 poll_result->scancode = RC_SCANCODE_RC6_0(msg[1], msg[2]); in em2874_polling_getkey()
290 poll_result->protocol = RC_PROTO_UNKNOWN; in em2874_polling_getkey()
291 poll_result->scancode = (msg[1] << 24) | (msg[2] << 16) | in em2874_polling_getkey()
300 * Polling code for em28xx
309 rc = ir->get_key_i2c(ir->i2c_client, &protocol, &scancode); in em28xx_i2c_ir_handle_key()
311 dprintk("ir->get_key_i2c() failed: %d\n", rc); in em28xx_i2c_ir_handle_key()
318 rc_keydown(ir->rc, protocol, scancode, 0); in em28xx_i2c_ir_handle_key()
329 result = ir->get_key(ir, &poll_result); in em28xx_ir_handle_key()
331 dprintk("ir->get_key() failed: %d\n", result); in em28xx_ir_handle_key()
335 if (unlikely(poll_result.read_count != ir->last_readcount)) { in em28xx_ir_handle_key()
339 if (ir->full_code) in em28xx_ir_handle_key()
340 rc_keydown(ir->rc, in em28xx_ir_handle_key()
345 rc_keydown(ir->rc, in em28xx_ir_handle_key()
350 if (ir->dev->chip_id == CHIP_ID_EM2874 || in em28xx_ir_handle_key()
351 ir->dev->chip_id == CHIP_ID_EM2884) in em28xx_ir_handle_key()
357 * non-zero read count as opposed to a readcount in em28xx_ir_handle_key()
360 ir->last_readcount = 0; in em28xx_ir_handle_key()
362 ir->last_readcount = poll_result.read_count; in em28xx_ir_handle_key()
370 if (ir->i2c_client) /* external i2c device */ in em28xx_ir_work()
374 schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling)); in em28xx_ir_work()
379 struct em28xx_IR *ir = rc->priv; in em28xx_ir_start()
381 INIT_DELAYED_WORK(&ir->work, em28xx_ir_work); in em28xx_ir_start()
382 schedule_delayed_work(&ir->work, 0); in em28xx_ir_start()
389 struct em28xx_IR *ir = rc->priv; in em28xx_ir_stop()
391 cancel_delayed_work_sync(&ir->work); in em28xx_ir_stop()
396 struct em28xx_IR *ir = rc_dev->priv; in em2860_ir_change_protocol()
397 struct em28xx *dev = ir->dev; in em2860_ir_change_protocol()
401 dev->board.xclk |= EM28XX_XCLK_IR_RC5_MODE; in em2860_ir_change_protocol()
402 ir->full_code = 1; in em2860_ir_change_protocol()
405 dev->board.xclk &= ~EM28XX_XCLK_IR_RC5_MODE; in em2860_ir_change_protocol()
406 ir->full_code = 1; in em2860_ir_change_protocol()
411 *rc_proto = ir->rc_proto; in em2860_ir_change_protocol()
412 return -EINVAL; in em2860_ir_change_protocol()
414 em28xx_write_reg_bits(dev, EM28XX_R0F_XCLK, dev->board.xclk, in em2860_ir_change_protocol()
417 ir->rc_proto = *rc_proto; in em2860_ir_change_protocol()
424 struct em28xx_IR *ir = rc_dev->priv; in em2874_ir_change_protocol()
425 struct em28xx *dev = ir->dev; in em2874_ir_change_protocol()
430 dev->board.xclk |= EM28XX_XCLK_IR_RC5_MODE; in em2874_ir_change_protocol()
431 ir->full_code = 1; in em2874_ir_change_protocol()
434 dev->board.xclk &= ~EM28XX_XCLK_IR_RC5_MODE; in em2874_ir_change_protocol()
436 ir->full_code = 1; in em2874_ir_change_protocol()
439 dev->board.xclk |= EM28XX_XCLK_IR_RC5_MODE; in em2874_ir_change_protocol()
441 ir->full_code = 1; in em2874_ir_change_protocol()
446 *rc_proto = ir->rc_proto; in em2874_ir_change_protocol()
447 return -EINVAL; in em2874_ir_change_protocol()
450 em28xx_write_reg_bits(dev, EM28XX_R0F_XCLK, dev->board.xclk, in em2874_ir_change_protocol()
453 ir->rc_proto = *rc_proto; in em2874_ir_change_protocol()
460 struct em28xx_IR *ir = rc_dev->priv; in em28xx_ir_change_protocol()
461 struct em28xx *dev = ir->dev; in em28xx_ir_change_protocol()
464 switch (dev->chip_id) { in em28xx_ir_change_protocol()
474 dev_err(&ir->dev->intf->dev, in em28xx_ir_change_protocol()
476 dev->chip_id); in em28xx_ir_change_protocol()
477 return -EINVAL; in em28xx_ir_change_protocol()
485 * Leadtek winfast tv USBII deluxe can find a non working IR-device in em28xx_probe_i2c_ir()
494 if (i2c_probe_func_quick_read(&dev->i2c_adap[dev->def_i2c_bus], in em28xx_probe_i2c_ir()
500 return -ENODEV; in em28xx_probe_i2c_ir()
517 for (i = 0; i < dev->num_button_polling_addresses; i++) { in em28xx_query_buttons()
519 regval = em28xx_read_reg(dev, dev->button_polling_addresses[i]); in em28xx_query_buttons()
524 while (dev->board.buttons[j].role >= 0 && in em28xx_query_buttons()
525 dev->board.buttons[j].role < EM28XX_NUM_BUTTON_ROLES) { in em28xx_query_buttons()
528 button = &dev->board.buttons[j]; in em28xx_query_buttons()
531 if (button->reg_r != dev->button_polling_addresses[i]) { in em28xx_query_buttons()
536 is_pressed = regval & button->mask; in em28xx_query_buttons()
537 was_pressed = dev->button_polling_last_values[i] in em28xx_query_buttons()
538 & button->mask; in em28xx_query_buttons()
539 if (button->inverted) { in em28xx_query_buttons()
544 if (is_pressed && button->reg_clearing) in em28xx_query_buttons()
545 em28xx_write_reg(dev, button->reg_clearing, in em28xx_query_buttons()
546 (~regval & button->mask) in em28xx_query_buttons()
547 | (regval & ~button->mask)); in em28xx_query_buttons()
553 switch (button->role) { in em28xx_query_buttons()
556 input_report_key(dev->sbutton_input_dev, in em28xx_query_buttons()
559 input_report_key(dev->sbutton_input_dev, in em28xx_query_buttons()
568 led->gpio_reg, in em28xx_query_buttons()
569 led->gpio_mask); in em28xx_query_buttons()
577 /* Save current value for comparison during the next polling */ in em28xx_query_buttons()
578 dev->button_polling_last_values[i] = regval; in em28xx_query_buttons()
581 schedule_delayed_work(&dev->buttons_query_work, in em28xx_query_buttons()
582 msecs_to_jiffies(dev->button_polling_interval)); in em28xx_query_buttons()
587 struct usb_device *udev = interface_to_usbdev(dev->intf); in em28xx_register_snapshot_button()
591 dev_info(&dev->intf->dev, "Registering snapshot button...\n"); in em28xx_register_snapshot_button()
594 return -ENOMEM; in em28xx_register_snapshot_button()
596 usb_make_path(udev, dev->snapshot_button_path, in em28xx_register_snapshot_button()
597 sizeof(dev->snapshot_button_path)); in em28xx_register_snapshot_button()
598 strlcat(dev->snapshot_button_path, "/sbutton", in em28xx_register_snapshot_button()
599 sizeof(dev->snapshot_button_path)); in em28xx_register_snapshot_button()
601 input_dev->name = "em28xx snapshot button"; in em28xx_register_snapshot_button()
602 input_dev->phys = dev->snapshot_button_path; in em28xx_register_snapshot_button()
603 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); in em28xx_register_snapshot_button()
604 set_bit(EM28XX_SNAPSHOT_KEY, input_dev->keybit); in em28xx_register_snapshot_button()
605 input_dev->keycodesize = 0; in em28xx_register_snapshot_button()
606 input_dev->keycodemax = 0; in em28xx_register_snapshot_button()
607 usb_to_input_id(udev, &input_dev->id); in em28xx_register_snapshot_button()
608 input_dev->dev.parent = &dev->intf->dev; in em28xx_register_snapshot_button()
612 dev_err(&dev->intf->dev, "input_register_device failed\n"); in em28xx_register_snapshot_button()
617 dev->sbutton_input_dev = input_dev; in em28xx_register_snapshot_button()
626 dev->button_polling_interval = EM28XX_BUTTONS_DEBOUNCED_QUERY_INTERVAL; in em28xx_init_buttons()
627 while (dev->board.buttons[i].role >= 0 && in em28xx_init_buttons()
628 dev->board.buttons[i].role < EM28XX_NUM_BUTTON_ROLES) { in em28xx_init_buttons()
629 const struct em28xx_button *button = &dev->board.buttons[i]; in em28xx_init_buttons()
631 /* Check if polling address is already on the list */ in em28xx_init_buttons()
633 for (j = 0; j < dev->num_button_polling_addresses; j++) { in em28xx_init_buttons()
634 if (button->reg_r == dev->button_polling_addresses[j]) { in em28xx_init_buttons()
639 /* Check if max. number of polling addresses is exceeded */ in em28xx_init_buttons()
640 if (addr_new && dev->num_button_polling_addresses in em28xx_init_buttons()
642 WARN_ONCE(1, "BUG: maximum number of button polling addresses exceeded."); in em28xx_init_buttons()
646 if (button->role == EM28XX_BUTTON_SNAPSHOT) { in em28xx_init_buttons()
650 } else if (button->role == EM28XX_BUTTON_ILLUMINATION) { in em28xx_init_buttons()
653 dev_err(&dev->intf->dev, in em28xx_init_buttons()
658 /* Add read address to list of polling addresses */ in em28xx_init_buttons()
660 unsigned int index = dev->num_button_polling_addresses; in em28xx_init_buttons()
662 dev->button_polling_addresses[index] = button->reg_r; in em28xx_init_buttons()
663 dev->num_button_polling_addresses++; in em28xx_init_buttons()
665 /* Reduce polling interval if necessary */ in em28xx_init_buttons()
666 if (!button->reg_clearing) in em28xx_init_buttons()
667 dev->button_polling_interval = in em28xx_init_buttons()
674 /* Start polling */ in em28xx_init_buttons()
675 if (dev->num_button_polling_addresses) { in em28xx_init_buttons()
676 memset(dev->button_polling_last_values, 0, in em28xx_init_buttons()
678 schedule_delayed_work(&dev->buttons_query_work, in em28xx_init_buttons()
679 msecs_to_jiffies(dev->button_polling_interval)); in em28xx_init_buttons()
685 /* Cancel polling */ in em28xx_shutdown_buttons()
686 cancel_delayed_work_sync(&dev->buttons_query_work); in em28xx_shutdown_buttons()
687 /* Clear polling addresses list */ in em28xx_shutdown_buttons()
688 dev->num_button_polling_addresses = 0; in em28xx_shutdown_buttons()
690 if (dev->sbutton_input_dev) { in em28xx_shutdown_buttons()
691 dev_info(&dev->intf->dev, "Deregistering snapshot button\n"); in em28xx_shutdown_buttons()
692 input_unregister_device(dev->sbutton_input_dev); in em28xx_shutdown_buttons()
693 dev->sbutton_input_dev = NULL; in em28xx_shutdown_buttons()
699 struct usb_device *udev = interface_to_usbdev(dev->intf); in em28xx_ir_init()
702 int err = -ENOMEM; in em28xx_ir_init()
706 if (dev->is_audio_only) { in em28xx_ir_init()
711 kref_get(&dev->ref); in em28xx_ir_init()
712 INIT_DELAYED_WORK(&dev->buttons_query_work, em28xx_query_buttons); in em28xx_ir_init()
714 if (dev->board.buttons) in em28xx_ir_init()
717 if (dev->board.has_ir_i2c) { in em28xx_ir_init()
720 dev->board.has_ir_i2c = 0; in em28xx_ir_init()
721 dev_warn(&dev->intf->dev, in em28xx_ir_init()
722 "No i2c IR remote control device found.\n"); in em28xx_ir_init()
723 return -ENODEV; in em28xx_ir_init()
727 if (!dev->board.ir_codes && !dev->board.has_ir_i2c) { in em28xx_ir_init()
729 dev_warn(&dev->intf->dev, in em28xx_ir_init()
734 dev_info(&dev->intf->dev, "Registering input extension\n"); in em28xx_ir_init()
738 return -ENOMEM; in em28xx_ir_init()
744 ir->dev = dev; in em28xx_ir_init()
745 dev->ir = ir; in em28xx_ir_init()
746 ir->rc = rc; in em28xx_ir_init()
748 rc->priv = ir; in em28xx_ir_init()
749 rc->open = em28xx_ir_start; in em28xx_ir_init()
750 rc->close = em28xx_ir_stop; in em28xx_ir_init()
752 if (dev->board.has_ir_i2c) { /* external i2c device */ in em28xx_ir_init()
753 switch (dev->model) { in em28xx_ir_init()
756 rc->map_name = RC_MAP_EM_TERRATEC; in em28xx_ir_init()
757 ir->get_key_i2c = em28xx_get_key_terratec; in em28xx_ir_init()
760 rc->map_name = RC_MAP_PINNACLE_GREY; in em28xx_ir_init()
761 ir->get_key_i2c = em28xx_get_key_pinnacle_usb_grey; in em28xx_ir_init()
764 rc->map_name = RC_MAP_HAUPPAUGE; in em28xx_ir_init()
765 ir->get_key_i2c = em28xx_get_key_em_haup; in em28xx_ir_init()
766 rc->allowed_protocols = RC_PROTO_BIT_RC5; in em28xx_ir_init()
769 rc->map_name = RC_MAP_WINFAST_USBII_DELUXE; in em28xx_ir_init()
770 ir->get_key_i2c = em28xx_get_key_winfast_usbii_deluxe; in em28xx_ir_init()
773 err = -ENODEV; in em28xx_ir_init()
777 ir->i2c_client = kzalloc(sizeof(*ir->i2c_client), GFP_KERNEL); in em28xx_ir_init()
778 if (!ir->i2c_client) in em28xx_ir_init()
780 ir->i2c_client->adapter = &ir->dev->i2c_adap[dev->def_i2c_bus]; in em28xx_ir_init()
781 ir->i2c_client->addr = i2c_rc_dev_addr; in em28xx_ir_init()
782 ir->i2c_client->flags = 0; in em28xx_ir_init()
785 switch (dev->chip_id) { in em28xx_ir_init()
788 rc->allowed_protocols = RC_PROTO_BIT_RC5 | in em28xx_ir_init()
790 ir->get_key = default_polling_getkey; in em28xx_ir_init()
796 ir->get_key = em2874_polling_getkey; in em28xx_ir_init()
797 rc->allowed_protocols = RC_PROTO_BIT_RC5 | in em28xx_ir_init()
802 err = -ENODEV; in em28xx_ir_init()
806 rc->change_protocol = em28xx_ir_change_protocol; in em28xx_ir_init()
807 rc->map_name = dev->board.ir_codes; in em28xx_ir_init()
817 ir->polling = 100; /* ms */ in em28xx_ir_init()
819 usb_make_path(udev, ir->phys, sizeof(ir->phys)); in em28xx_ir_init()
820 strlcat(ir->phys, "/input0", sizeof(ir->phys)); in em28xx_ir_init()
822 rc->device_name = em28xx_boards[dev->model].name; in em28xx_ir_init()
823 rc->input_phys = ir->phys; in em28xx_ir_init()
824 usb_to_input_id(udev, &rc->input_id); in em28xx_ir_init()
825 rc->dev.parent = &dev->intf->dev; in em28xx_ir_init()
826 rc->driver_name = MODULE_NAME; in em28xx_ir_init()
833 dev_info(&dev->intf->dev, "Input extension successfully initialized\n"); in em28xx_ir_init()
838 kfree(ir->i2c_client); in em28xx_ir_init()
839 dev->ir = NULL; in em28xx_ir_init()
847 struct em28xx_IR *ir = dev->ir; in em28xx_ir_fini()
849 if (dev->is_audio_only) { in em28xx_ir_fini()
854 dev_info(&dev->intf->dev, "Closing input extension\n"); in em28xx_ir_fini()
862 rc_unregister_device(ir->rc); in em28xx_ir_fini()
864 kfree(ir->i2c_client); in em28xx_ir_fini()
868 dev->ir = NULL; in em28xx_ir_fini()
871 kref_put(&dev->ref, em28xx_free_device); in em28xx_ir_fini()
878 struct em28xx_IR *ir = dev->ir; in em28xx_ir_suspend()
880 if (dev->is_audio_only) in em28xx_ir_suspend()
883 dev_info(&dev->intf->dev, "Suspending input extension\n"); in em28xx_ir_suspend()
885 cancel_delayed_work_sync(&ir->work); in em28xx_ir_suspend()
886 cancel_delayed_work_sync(&dev->buttons_query_work); in em28xx_ir_suspend()
897 struct em28xx_IR *ir = dev->ir; in em28xx_ir_resume()
899 if (dev->is_audio_only) in em28xx_ir_resume()
902 dev_info(&dev->intf->dev, "Resuming input extension\n"); in em28xx_ir_resume()
908 schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling)); in em28xx_ir_resume()
909 if (dev->num_button_polling_addresses) in em28xx_ir_resume()
910 schedule_delayed_work(&dev->buttons_query_work, in em28xx_ir_resume()
911 msecs_to_jiffies(dev->button_polling_interval)); in em28xx_ir_resume()
936 MODULE_DESCRIPTION(DRIVER_DESC " - input interface");