Lines Matching refs:rr3

246 static void redrat3_dump_fw_error(struct redrat3_dev *rr3, int code)  in redrat3_dump_fw_error()  argument
248 if (!rr3->transmitting && (code != 0x40)) in redrat3_dump_fw_error()
249 dev_info(rr3->dev, "fw error code 0x%02x: ", code); in redrat3_dump_fw_error()
286 if (!rr3->transmitting) in redrat3_dump_fw_error()
349 static void redrat3_process_ir_data(struct redrat3_dev *rr3) in redrat3_process_ir_data() argument
356 dev = rr3->dev; in redrat3_process_ir_data()
358 mod_freq = redrat3_val_to_mod_freq(&rr3->irdata); in redrat3_process_ir_data()
360 if (mod_freq && rr3->wideband) { in redrat3_process_ir_data()
366 ir_raw_event_store(rr3->rc, &ev); in redrat3_process_ir_data()
370 sig_size = be16_to_cpu(rr3->irdata.sig_size); in redrat3_process_ir_data()
372 offset = rr3->irdata.sigdata[i]; in redrat3_process_ir_data()
373 val = get_unaligned_be16(&rr3->irdata.lens[offset]); in redrat3_process_ir_data()
389 ir_raw_event_store_with_filter(rr3->rc, &rawir); in redrat3_process_ir_data()
395 rawir.duration = rr3->rc->timeout; in redrat3_process_ir_data()
398 ir_raw_event_store_with_filter(rr3->rc, &rawir); in redrat3_process_ir_data()
401 ir_raw_event_handle(rr3->rc); in redrat3_process_ir_data()
405 static int redrat3_send_cmd(int cmd, struct redrat3_dev *rr3) in redrat3_send_cmd() argument
415 udev = rr3->udev; in redrat3_send_cmd()
421 dev_err(rr3->dev, "%s: Error sending rr3 cmd res %d, data %d", in redrat3_send_cmd()
433 static int redrat3_enable_detector(struct redrat3_dev *rr3) in redrat3_enable_detector() argument
435 struct device *dev = rr3->dev; in redrat3_enable_detector()
438 ret = redrat3_send_cmd(RR3_RC_DET_ENABLE, rr3); in redrat3_enable_detector()
443 ret = redrat3_send_cmd(RR3_RC_DET_STATUS, rr3); in redrat3_enable_detector()
450 ret = usb_submit_urb(rr3->narrow_urb, GFP_KERNEL); in redrat3_enable_detector()
452 dev_err(rr3->dev, "narrow band urb failed: %d", ret); in redrat3_enable_detector()
456 ret = usb_submit_urb(rr3->wide_urb, GFP_KERNEL); in redrat3_enable_detector()
458 dev_err(rr3->dev, "wide band urb failed: %d", ret); in redrat3_enable_detector()
463 static inline void redrat3_delete(struct redrat3_dev *rr3, in redrat3_delete() argument
466 usb_kill_urb(rr3->narrow_urb); in redrat3_delete()
467 usb_kill_urb(rr3->wide_urb); in redrat3_delete()
468 usb_kill_urb(rr3->flash_urb); in redrat3_delete()
469 usb_kill_urb(rr3->learn_urb); in redrat3_delete()
470 usb_free_urb(rr3->narrow_urb); in redrat3_delete()
471 usb_free_urb(rr3->wide_urb); in redrat3_delete()
472 usb_free_urb(rr3->flash_urb); in redrat3_delete()
473 usb_free_urb(rr3->learn_urb); in redrat3_delete()
474 usb_free_coherent(udev, le16_to_cpu(rr3->ep_narrow->wMaxPacketSize), in redrat3_delete()
475 rr3->bulk_in_buf, rr3->dma_in); in redrat3_delete()
477 kfree(rr3); in redrat3_delete()
480 static u32 redrat3_get_timeout(struct redrat3_dev *rr3) in redrat3_get_timeout() argument
491 pipe = usb_rcvctrlpipe(rr3->udev, 0); in redrat3_get_timeout()
492 ret = usb_control_msg(rr3->udev, pipe, RR3_GET_IR_PARAM, in redrat3_get_timeout()
496 dev_warn(rr3->dev, "Failed to read timeout from hardware\n"); in redrat3_get_timeout()
500 dev_dbg(rr3->dev, "Got timeout of %d ms\n", timeout / 1000); in redrat3_get_timeout()
510 struct redrat3_dev *rr3 = rc_dev->priv; in redrat3_set_timeout() local
511 struct usb_device *udev = rr3->udev; in redrat3_set_timeout()
512 struct device *dev = rr3->dev; in redrat3_set_timeout()
538 static void redrat3_reset(struct redrat3_dev *rr3) in redrat3_reset() argument
540 struct usb_device *udev = rr3->udev; in redrat3_reset()
541 struct device *dev = rr3->dev; in redrat3_reset()
587 static void redrat3_get_firmware_rev(struct redrat3_dev *rr3) in redrat3_get_firmware_rev() argument
596 rc = usb_control_msg(rr3->udev, usb_rcvctrlpipe(rr3->udev, 0), in redrat3_get_firmware_rev()
602 dev_info(rr3->dev, "Firmware rev: %s", buffer); in redrat3_get_firmware_rev()
604 dev_err(rr3->dev, "Problem fetching firmware ID\n"); in redrat3_get_firmware_rev()
609 static void redrat3_read_packet_start(struct redrat3_dev *rr3, unsigned len) in redrat3_read_packet_start() argument
611 struct redrat3_header *header = rr3->bulk_in_buf; in redrat3_read_packet_start()
618 if (pktlen > sizeof(rr3->irdata)) { in redrat3_read_packet_start()
619 dev_warn(rr3->dev, "packet length %u too large\n", pktlen); in redrat3_read_packet_start()
626 struct redrat3_error *error = rr3->bulk_in_buf; in redrat3_read_packet_start()
628 redrat3_dump_fw_error(rr3, fw_error); in redrat3_read_packet_start()
633 memcpy(&rr3->irdata, rr3->bulk_in_buf, len); in redrat3_read_packet_start()
634 rr3->bytes_read = len; in redrat3_read_packet_start()
635 dev_dbg(rr3->dev, "bytes_read %d, pktlen %d\n", in redrat3_read_packet_start()
636 rr3->bytes_read, pktlen); in redrat3_read_packet_start()
640 dev_dbg(rr3->dev, "ignoring packet with type 0x%02x, len of %d, 0x%02x\n", in redrat3_read_packet_start()
646 static void redrat3_read_packet_continue(struct redrat3_dev *rr3, unsigned len) in redrat3_read_packet_continue() argument
648 void *irdata = &rr3->irdata; in redrat3_read_packet_continue()
650 if (len + rr3->bytes_read > sizeof(rr3->irdata)) { in redrat3_read_packet_continue()
651 dev_warn(rr3->dev, "too much data for packet\n"); in redrat3_read_packet_continue()
652 rr3->bytes_read = 0; in redrat3_read_packet_continue()
656 memcpy(irdata + rr3->bytes_read, rr3->bulk_in_buf, len); in redrat3_read_packet_continue()
658 rr3->bytes_read += len; in redrat3_read_packet_continue()
659 dev_dbg(rr3->dev, "bytes_read %d, pktlen %d\n", rr3->bytes_read, in redrat3_read_packet_continue()
660 be16_to_cpu(rr3->irdata.header.length)); in redrat3_read_packet_continue()
664 static int redrat3_get_ir_data(struct redrat3_dev *rr3, unsigned len) in redrat3_get_ir_data() argument
666 struct device *dev = rr3->dev; in redrat3_get_ir_data()
670 if (rr3->bytes_read == 0 && len >= sizeof(struct redrat3_header)) { in redrat3_get_ir_data()
671 redrat3_read_packet_start(rr3, len); in redrat3_get_ir_data()
672 } else if (rr3->bytes_read != 0) { in redrat3_get_ir_data()
673 redrat3_read_packet_continue(rr3, len); in redrat3_get_ir_data()
674 } else if (rr3->bytes_read == 0) { in redrat3_get_ir_data()
680 if (rr3->bytes_read < be16_to_cpu(rr3->irdata.header.length) + in redrat3_get_ir_data()
686 pkttype = be16_to_cpu(rr3->irdata.header.transfer_type); in redrat3_get_ir_data()
688 redrat3_process_ir_data(rr3); in redrat3_get_ir_data()
694 rr3->bytes_read = 0; in redrat3_get_ir_data()
701 struct redrat3_dev *rr3 = urb->context; in redrat3_handle_async() local
706 ret = redrat3_get_ir_data(rr3, urb->actual_length); in redrat3_handle_async()
707 if (!ret && rr3->wideband && !rr3->learn_urb->hcpriv) { in redrat3_handle_async()
708 ret = usb_submit_urb(rr3->learn_urb, GFP_ATOMIC); in redrat3_handle_async()
710 dev_err(rr3->dev, "Failed to submit learning urb: %d", in redrat3_handle_async()
718 dev_err(rr3->dev, "Failed to resubmit urb: %d", in redrat3_handle_async()
731 dev_warn(rr3->dev, "Error: urb status = %d\n", urb->status); in redrat3_handle_async()
732 rr3->bytes_read = 0; in redrat3_handle_async()
747 struct redrat3_dev *rr3 = rcdev->priv; in redrat3_set_tx_carrier() local
748 struct device *dev = rr3->dev; in redrat3_set_tx_carrier()
754 rr3->carrier = carrier; in redrat3_set_tx_carrier()
762 struct redrat3_dev *rr3 = rcdev->priv; in redrat3_transmit_ir() local
763 struct device *dev = rr3->dev; in redrat3_transmit_ir()
771 if (rr3->transmitting) { in redrat3_transmit_ir()
780 rr3->transmitting = true; in redrat3_transmit_ir()
833 irdata->mod_freq_count = cpu_to_be16(mod_freq_to_val(rr3->carrier)); in redrat3_transmit_ir()
837 pipe = usb_sndbulkpipe(rr3->udev, rr3->ep_out->bEndpointAddress); in redrat3_transmit_ir()
838 ret = usb_bulk_msg(rr3->udev, pipe, irdata, in redrat3_transmit_ir()
843 pipe = usb_rcvctrlpipe(rr3->udev, 0); in redrat3_transmit_ir()
844 ret = usb_control_msg(rr3->udev, pipe, RR3_TX_SEND_SIGNAL, in redrat3_transmit_ir()
857 rr3->transmitting = false; in redrat3_transmit_ir()
866 struct redrat3_dev *rr3 = container_of(led_dev, struct redrat3_dev, in redrat3_brightness_set() local
869 if (brightness != LED_OFF && atomic_cmpxchg(&rr3->flash, 0, 1) == 0) { in redrat3_brightness_set()
870 int ret = usb_submit_urb(rr3->flash_urb, GFP_ATOMIC); in redrat3_brightness_set()
872 dev_dbg(rr3->dev, "%s: unexpected ret of %d\n", in redrat3_brightness_set()
874 atomic_set(&rr3->flash, 0); in redrat3_brightness_set()
881 struct redrat3_dev *rr3 = rcdev->priv; in redrat3_wideband_receiver() local
884 rr3->wideband = enable != 0; in redrat3_wideband_receiver()
887 ret = usb_submit_urb(rr3->learn_urb, GFP_KERNEL); in redrat3_wideband_receiver()
889 dev_err(rr3->dev, "Failed to submit learning urb: %d", in redrat3_wideband_receiver()
898 struct redrat3_dev *rr3 = urb->context; in redrat3_learn_complete() local
910 dev_err(rr3->dev, "Error: learn urb status = %d", urb->status); in redrat3_learn_complete()
917 struct redrat3_dev *rr3 = urb->context; in redrat3_led_complete() local
929 dev_dbg(rr3->dev, "Error: urb status = %d\n", urb->status); in redrat3_led_complete()
933 rr3->led.brightness = LED_OFF; in redrat3_led_complete()
934 atomic_dec(&rr3->flash); in redrat3_led_complete()
937 static struct rc_dev *redrat3_init_rc_dev(struct redrat3_dev *rr3) in redrat3_init_rc_dev() argument
939 struct device *dev = rr3->dev; in redrat3_init_rc_dev()
942 u16 prod = le16_to_cpu(rr3->udev->descriptor.idProduct); in redrat3_init_rc_dev()
948 snprintf(rr3->name, sizeof(rr3->name), in redrat3_init_rc_dev()
952 usb_make_path(rr3->udev, rr3->phys, sizeof(rr3->phys)); in redrat3_init_rc_dev()
954 rc->device_name = rr3->name; in redrat3_init_rc_dev()
955 rc->input_phys = rr3->phys; in redrat3_init_rc_dev()
956 usb_to_input_id(rr3->udev, &rc->input_id); in redrat3_init_rc_dev()
958 rc->priv = rr3; in redrat3_init_rc_dev()
962 rc->timeout = US_TO_NS(redrat3_get_timeout(rr3)); in redrat3_init_rc_dev()
990 struct redrat3_dev *rr3; in redrat3_dev_probe() local
1036 rr3 = kzalloc(sizeof(*rr3), GFP_KERNEL); in redrat3_dev_probe()
1037 if (!rr3) in redrat3_dev_probe()
1040 rr3->dev = &intf->dev; in redrat3_dev_probe()
1041 rr3->ep_narrow = ep_narrow; in redrat3_dev_probe()
1042 rr3->ep_out = ep_out; in redrat3_dev_probe()
1043 rr3->udev = udev; in redrat3_dev_probe()
1046 rr3->narrow_urb = usb_alloc_urb(0, GFP_KERNEL); in redrat3_dev_probe()
1047 if (!rr3->narrow_urb) in redrat3_dev_probe()
1050 rr3->wide_urb = usb_alloc_urb(0, GFP_KERNEL); in redrat3_dev_probe()
1051 if (!rr3->wide_urb) in redrat3_dev_probe()
1054 rr3->bulk_in_buf = usb_alloc_coherent(udev, in redrat3_dev_probe()
1056 GFP_KERNEL, &rr3->dma_in); in redrat3_dev_probe()
1057 if (!rr3->bulk_in_buf) in redrat3_dev_probe()
1061 usb_fill_bulk_urb(rr3->narrow_urb, udev, pipe, rr3->bulk_in_buf, in redrat3_dev_probe()
1063 redrat3_handle_async, rr3); in redrat3_dev_probe()
1064 rr3->narrow_urb->transfer_dma = rr3->dma_in; in redrat3_dev_probe()
1065 rr3->narrow_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in redrat3_dev_probe()
1068 usb_fill_bulk_urb(rr3->wide_urb, udev, pipe, rr3->bulk_in_buf, in redrat3_dev_probe()
1070 redrat3_handle_async, rr3); in redrat3_dev_probe()
1071 rr3->wide_urb->transfer_dma = rr3->dma_in; in redrat3_dev_probe()
1072 rr3->wide_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in redrat3_dev_probe()
1074 redrat3_reset(rr3); in redrat3_dev_probe()
1075 redrat3_get_firmware_rev(rr3); in redrat3_dev_probe()
1078 rr3->carrier = 38000; in redrat3_dev_probe()
1080 atomic_set(&rr3->flash, 0); in redrat3_dev_probe()
1081 rr3->flash_urb = usb_alloc_urb(0, GFP_KERNEL); in redrat3_dev_probe()
1082 if (!rr3->flash_urb) in redrat3_dev_probe()
1086 rr3->learn_urb = usb_alloc_urb(0, GFP_KERNEL); in redrat3_dev_probe()
1087 if (!rr3->learn_urb) in redrat3_dev_probe()
1091 rr3->learn_control.bRequestType = 0xc0; in redrat3_dev_probe()
1092 rr3->learn_control.bRequest = RR3_MODSIG_CAPTURE; in redrat3_dev_probe()
1093 rr3->learn_control.wLength = cpu_to_le16(1); in redrat3_dev_probe()
1095 usb_fill_control_urb(rr3->learn_urb, udev, usb_rcvctrlpipe(udev, 0), in redrat3_dev_probe()
1096 (unsigned char *)&rr3->learn_control, in redrat3_dev_probe()
1097 &rr3->learn_buf, sizeof(rr3->learn_buf), in redrat3_dev_probe()
1098 redrat3_learn_complete, rr3); in redrat3_dev_probe()
1101 rr3->flash_control.bRequestType = 0xc0; in redrat3_dev_probe()
1102 rr3->flash_control.bRequest = RR3_BLINK_LED; in redrat3_dev_probe()
1103 rr3->flash_control.wLength = cpu_to_le16(1); in redrat3_dev_probe()
1105 usb_fill_control_urb(rr3->flash_urb, udev, usb_rcvctrlpipe(udev, 0), in redrat3_dev_probe()
1106 (unsigned char *)&rr3->flash_control, in redrat3_dev_probe()
1107 &rr3->flash_in_buf, sizeof(rr3->flash_in_buf), in redrat3_dev_probe()
1108 redrat3_led_complete, rr3); in redrat3_dev_probe()
1111 rr3->led.name = "redrat3:red:feedback"; in redrat3_dev_probe()
1112 rr3->led.default_trigger = "rc-feedback"; in redrat3_dev_probe()
1113 rr3->led.brightness_set = redrat3_brightness_set; in redrat3_dev_probe()
1114 retval = led_classdev_register(&intf->dev, &rr3->led); in redrat3_dev_probe()
1118 rr3->rc = redrat3_init_rc_dev(rr3); in redrat3_dev_probe()
1119 if (!rr3->rc) { in redrat3_dev_probe()
1125 retval = redrat3_enable_detector(rr3); in redrat3_dev_probe()
1130 usb_set_intfdata(intf, rr3); in redrat3_dev_probe()
1135 led_classdev_unregister(&rr3->led); in redrat3_dev_probe()
1137 redrat3_delete(rr3, rr3->udev); in redrat3_dev_probe()
1146 struct redrat3_dev *rr3 = usb_get_intfdata(intf); in redrat3_dev_disconnect() local
1149 rc_unregister_device(rr3->rc); in redrat3_dev_disconnect()
1150 led_classdev_unregister(&rr3->led); in redrat3_dev_disconnect()
1151 redrat3_delete(rr3, udev); in redrat3_dev_disconnect()
1156 struct redrat3_dev *rr3 = usb_get_intfdata(intf); in redrat3_dev_suspend() local
1158 led_classdev_suspend(&rr3->led); in redrat3_dev_suspend()
1159 usb_kill_urb(rr3->narrow_urb); in redrat3_dev_suspend()
1160 usb_kill_urb(rr3->wide_urb); in redrat3_dev_suspend()
1161 usb_kill_urb(rr3->flash_urb); in redrat3_dev_suspend()
1167 struct redrat3_dev *rr3 = usb_get_intfdata(intf); in redrat3_dev_resume() local
1169 if (usb_submit_urb(rr3->narrow_urb, GFP_ATOMIC)) in redrat3_dev_resume()
1171 if (usb_submit_urb(rr3->wide_urb, GFP_ATOMIC)) in redrat3_dev_resume()
1173 led_classdev_resume(&rr3->led); in redrat3_dev_resume()