Lines Matching refs:ir
595 static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, in mceusb_dev_printdata() argument
601 struct device *dev = ir->dev; in mceusb_dev_printdata()
606 if (ir->flags.microsoft_gen1 && !out && !offset) in mceusb_dev_printdata()
750 dev_dbg(dev, "Raw IR data, %d pulse/space samples", ir->rem); in mceusb_dev_printdata()
760 static void mceusb_defer_kevent(struct mceusb_dev *ir, int kevent) in mceusb_defer_kevent() argument
762 set_bit(kevent, &ir->kevent_flags); in mceusb_defer_kevent()
763 if (!schedule_work(&ir->kevent)) in mceusb_defer_kevent()
764 dev_err(ir->dev, "kevent %d may have been dropped", kevent); in mceusb_defer_kevent()
766 dev_dbg(ir->dev, "kevent %d scheduled", kevent); in mceusb_defer_kevent()
771 struct mceusb_dev *ir; in mce_async_callback() local
777 ir = urb->context; in mce_async_callback()
784 mceusb_dev_printdata(ir, urb->transfer_buffer, len, in mce_async_callback()
795 dev_err(ir->dev, "Error: request urb status = %d (TX HALT)", in mce_async_callback()
797 mceusb_defer_kevent(ir, EVENT_TX_HALT); in mce_async_callback()
801 dev_err(ir->dev, "Error: request urb status = %d", urb->status); in mce_async_callback()
811 static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data, in mce_request_packet() argument
816 struct device *dev = ir->dev; in mce_request_packet()
832 if (usb_endpoint_xfer_int(ir->usb_ep_out)) in mce_request_packet()
833 usb_fill_int_urb(async_urb, ir->usbdev, ir->pipe_out, in mce_request_packet()
834 async_buf, size, mce_async_callback, ir, in mce_request_packet()
835 ir->usb_ep_out->bInterval); in mce_request_packet()
837 usb_fill_bulk_urb(async_urb, ir->usbdev, ir->pipe_out, in mce_request_packet()
838 async_buf, size, mce_async_callback, ir); in mce_request_packet()
854 static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) in mce_async_out() argument
858 if (ir->need_reset) { in mce_async_out()
859 ir->need_reset = false; in mce_async_out()
860 mce_request_packet(ir, DEVICE_RESUME, rsize); in mce_async_out()
864 mce_request_packet(ir, data, size); in mce_async_out()
871 struct mceusb_dev *ir = dev->priv; in mceusb_tx_ir() local
879 cmdbuf[cmdcount++] = ir->tx_mask; in mceusb_tx_ir()
882 mce_async_out(ir, cmdbuf, cmdcount); in mceusb_tx_ir()
925 mce_async_out(ir, cmdbuf, cmdcount); in mceusb_tx_ir()
934 struct mceusb_dev *ir = dev->priv; in mceusb_set_tx_mask() local
937 int emitters = ir->num_txports ? ir->num_txports : 2; in mceusb_set_tx_mask()
942 if (ir->flags.tx_mask_normal) in mceusb_set_tx_mask()
943 ir->tx_mask = mask; in mceusb_set_tx_mask()
945 ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ? in mceusb_set_tx_mask()
954 struct mceusb_dev *ir = dev->priv; in mceusb_set_tx_carrier() local
961 if (ir->carrier != carrier) { in mceusb_set_tx_carrier()
964 ir->carrier = carrier; in mceusb_set_tx_carrier()
967 dev_dbg(ir->dev, "disabling carrier modulation"); in mceusb_set_tx_carrier()
968 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_tx_carrier()
975 ir->carrier = carrier; in mceusb_set_tx_carrier()
978 dev_dbg(ir->dev, "requesting %u HZ carrier", in mceusb_set_tx_carrier()
982 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_tx_carrier()
997 struct mceusb_dev *ir = dev->priv; in mceusb_set_timeout() local
1005 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_timeout()
1008 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); in mceusb_set_timeout()
1020 struct mceusb_dev *ir = dev->priv; in mceusb_set_rx_wideband() local
1024 dev_dbg(ir->dev, "select %s-range receive sensor", in mceusb_set_rx_wideband()
1027 ir->wideband_rx_enabled = true; in mceusb_set_rx_wideband()
1030 ir->wideband_rx_enabled = false; in mceusb_set_rx_wideband()
1033 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_rx_wideband()
1046 struct mceusb_dev *ir = dev->priv; in mceusb_set_rx_carrier_report() local
1050 dev_dbg(ir->dev, "%s short-range receiver carrier reporting", in mceusb_set_rx_carrier_report()
1053 ir->carrier_report_enabled = true; in mceusb_set_rx_carrier_report()
1054 if (!ir->learning_active) { in mceusb_set_rx_carrier_report()
1056 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_rx_carrier_report()
1059 ir->carrier_report_enabled = false; in mceusb_set_rx_carrier_report()
1065 if (ir->learning_active && !ir->wideband_rx_enabled) { in mceusb_set_rx_carrier_report()
1067 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_set_rx_carrier_report()
1079 static void mceusb_handle_command(struct mceusb_dev *ir, int index) in mceusb_handle_command() argument
1082 u8 hi = ir->buf_in[index + 1] & 0xff; in mceusb_handle_command()
1083 u8 lo = ir->buf_in[index + 2] & 0xff; in mceusb_handle_command()
1087 switch (ir->buf_in[index]) { in mceusb_handle_command()
1090 if ((ir->buf_in[index + 4] & 0xff) == 0x00) in mceusb_handle_command()
1091 ir->txports_cabled |= 1 << hi; in mceusb_handle_command()
1096 ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT); in mceusb_handle_command()
1099 ir->num_txports = hi; in mceusb_handle_command()
1100 ir->num_rxports = lo; in mceusb_handle_command()
1111 if (ir->carrier_report_enabled && ir->learning_active && in mceusb_handle_command()
1112 ir->pulse_tunit > 0) { in mceusb_handle_command()
1118 cycles_fix = ir->flags.rx2 == 2 ? ir->pulse_count : 0; in mceusb_handle_command()
1122 ir->pulse_tunit; in mceusb_handle_command()
1123 …dev_dbg(ir->dev, "RX carrier frequency %u Hz (pulse count = %u, cycles = %u, duration = %u, rx2 = … in mceusb_handle_command()
1124 rawir.carrier, ir->pulse_count, carrier_cycles, in mceusb_handle_command()
1125 ir->pulse_tunit, ir->flags.rx2); in mceusb_handle_command()
1126 ir_raw_event_store(ir->rc, &rawir); in mceusb_handle_command()
1132 ir->emver = hi; in mceusb_handle_command()
1135 ir->tx_mask = hi; in mceusb_handle_command()
1138 ir->learning_active = ((hi & 0x02) == 0x02); in mceusb_handle_command()
1139 if (ir->rxports_active != hi) { in mceusb_handle_command()
1140 dev_info(ir->dev, "%s-range (0x%x) receiver active", in mceusb_handle_command()
1141 ir->learning_active ? "short" : "long", hi); in mceusb_handle_command()
1142 ir->rxports_active = hi; in mceusb_handle_command()
1146 ir->need_reset = true; in mceusb_handle_command()
1153 static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) in mceusb_process_ir_data() argument
1160 if (ir->flags.microsoft_gen1) in mceusb_process_ir_data()
1168 switch (ir->parser_state) { in mceusb_process_ir_data()
1170 ir->rem = mceusb_cmd_datasize(ir->cmd, ir->buf_in[i]); in mceusb_process_ir_data()
1171 mceusb_dev_printdata(ir, ir->buf_in, buf_len, i - 1, in mceusb_process_ir_data()
1172 ir->rem + 2, false); in mceusb_process_ir_data()
1173 mceusb_handle_command(ir, i); in mceusb_process_ir_data()
1174 ir->parser_state = CMD_DATA; in mceusb_process_ir_data()
1177 ir->rem--; in mceusb_process_ir_data()
1179 rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); in mceusb_process_ir_data()
1180 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK); in mceusb_process_ir_data()
1182 dev_warn(ir->dev, "nonsensical irdata %02x with duration 0", in mceusb_process_ir_data()
1183 ir->buf_in[i]); in mceusb_process_ir_data()
1187 ir->pulse_tunit += rawir.duration; in mceusb_process_ir_data()
1188 ir->pulse_count++; in mceusb_process_ir_data()
1192 dev_dbg(ir->dev, "Storing %s %u ns (%02x)", in mceusb_process_ir_data()
1194 rawir.duration, ir->buf_in[i]); in mceusb_process_ir_data()
1196 if (ir_raw_event_store_with_filter(ir->rc, &rawir)) in mceusb_process_ir_data()
1200 ir->rem--; in mceusb_process_ir_data()
1205 ir->cmd = ir->buf_in[i]; in mceusb_process_ir_data()
1206 if ((ir->cmd == MCE_CMD_PORT_IR) || in mceusb_process_ir_data()
1207 ((ir->cmd & MCE_PORT_MASK) != in mceusb_process_ir_data()
1209 ir->parser_state = SUBCMD; in mceusb_process_ir_data()
1212 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); in mceusb_process_ir_data()
1213 mceusb_dev_printdata(ir, ir->buf_in, buf_len, in mceusb_process_ir_data()
1214 i, ir->rem + 1, false); in mceusb_process_ir_data()
1215 if (ir->rem) { in mceusb_process_ir_data()
1216 ir->parser_state = PARSE_IRDATA; in mceusb_process_ir_data()
1220 rawir.duration = ir->rc->timeout; in mceusb_process_ir_data()
1221 if (ir_raw_event_store_with_filter(ir->rc, in mceusb_process_ir_data()
1224 ir->pulse_tunit = 0; in mceusb_process_ir_data()
1225 ir->pulse_count = 0; in mceusb_process_ir_data()
1230 if (ir->parser_state != CMD_HEADER && !ir->rem) in mceusb_process_ir_data()
1231 ir->parser_state = CMD_HEADER; in mceusb_process_ir_data()
1234 dev_dbg(ir->dev, "processed IR data"); in mceusb_process_ir_data()
1235 ir_raw_event_handle(ir->rc); in mceusb_process_ir_data()
1241 struct mceusb_dev *ir; in mceusb_dev_recv() local
1246 ir = urb->context; in mceusb_dev_recv()
1247 if (!ir) { in mceusb_dev_recv()
1255 mceusb_process_ir_data(ir, urb->actual_length); in mceusb_dev_recv()
1266 dev_err(ir->dev, "Error: urb status = %d (RX HALT)", in mceusb_dev_recv()
1268 mceusb_defer_kevent(ir, EVENT_RX_HALT); in mceusb_dev_recv()
1272 dev_err(ir->dev, "Error: urb status = %d", urb->status); in mceusb_dev_recv()
1279 static void mceusb_get_emulator_version(struct mceusb_dev *ir) in mceusb_get_emulator_version() argument
1282 ir->emver = 1; in mceusb_get_emulator_version()
1283 mce_async_out(ir, GET_EMVER, sizeof(GET_EMVER)); in mceusb_get_emulator_version()
1286 static void mceusb_gen1_init(struct mceusb_dev *ir) in mceusb_gen1_init() argument
1289 struct device *dev = ir->dev; in mceusb_gen1_init()
1302 ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0), in mceusb_gen1_init()
1310 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), in mceusb_gen1_init()
1317 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), in mceusb_gen1_init()
1323 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), in mceusb_gen1_init()
1329 mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); in mceusb_gen1_init()
1332 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); in mceusb_gen1_init()
1337 static void mceusb_gen2_init(struct mceusb_dev *ir) in mceusb_gen2_init() argument
1340 mce_async_out(ir, DEVICE_RESUME, sizeof(DEVICE_RESUME)); in mceusb_gen2_init()
1343 mce_async_out(ir, GET_WAKEVERSION, sizeof(GET_WAKEVERSION)); in mceusb_gen2_init()
1346 mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); in mceusb_gen2_init()
1349 static void mceusb_get_parameters(struct mceusb_dev *ir) in mceusb_get_parameters() argument
1356 ir->num_txports = 2; in mceusb_get_parameters()
1357 ir->num_rxports = 2; in mceusb_get_parameters()
1360 mce_async_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS)); in mceusb_get_parameters()
1363 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); in mceusb_get_parameters()
1365 if (ir->num_txports && !ir->flags.no_tx) in mceusb_get_parameters()
1367 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); in mceusb_get_parameters()
1370 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); in mceusb_get_parameters()
1373 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); in mceusb_get_parameters()
1375 for (i = 0; i < ir->num_txports; i++) { in mceusb_get_parameters()
1377 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); in mceusb_get_parameters()
1381 static void mceusb_flash_led(struct mceusb_dev *ir) in mceusb_flash_led() argument
1383 if (ir->emver < 2) in mceusb_flash_led()
1386 mce_async_out(ir, FLASH_LED, sizeof(FLASH_LED)); in mceusb_flash_led()
1398 struct mceusb_dev *ir = in mceusb_deferred_kevent() local
1402 if (test_bit(EVENT_RX_HALT, &ir->kevent_flags)) { in mceusb_deferred_kevent()
1403 usb_unlink_urb(ir->urb_in); in mceusb_deferred_kevent()
1404 status = usb_clear_halt(ir->usbdev, ir->pipe_in); in mceusb_deferred_kevent()
1406 dev_err(ir->dev, "rx clear halt error %d", in mceusb_deferred_kevent()
1409 clear_bit(EVENT_RX_HALT, &ir->kevent_flags); in mceusb_deferred_kevent()
1411 status = usb_submit_urb(ir->urb_in, GFP_KERNEL); in mceusb_deferred_kevent()
1413 dev_err(ir->dev, in mceusb_deferred_kevent()
1420 if (test_bit(EVENT_TX_HALT, &ir->kevent_flags)) { in mceusb_deferred_kevent()
1421 status = usb_clear_halt(ir->usbdev, ir->pipe_out); in mceusb_deferred_kevent()
1423 dev_err(ir->dev, "tx clear halt error %d", status); in mceusb_deferred_kevent()
1424 clear_bit(EVENT_TX_HALT, &ir->kevent_flags); in mceusb_deferred_kevent()
1428 static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) in mceusb_init_rc_dev() argument
1430 struct usb_device *udev = ir->usbdev; in mceusb_init_rc_dev()
1431 struct device *dev = ir->dev; in mceusb_init_rc_dev()
1441 snprintf(ir->name, sizeof(ir->name), "%s (%04x:%04x)", in mceusb_init_rc_dev()
1442 mceusb_model[ir->model].name ? in mceusb_init_rc_dev()
1443 mceusb_model[ir->model].name : in mceusb_init_rc_dev()
1445 le16_to_cpu(ir->usbdev->descriptor.idVendor), in mceusb_init_rc_dev()
1446 le16_to_cpu(ir->usbdev->descriptor.idProduct)); in mceusb_init_rc_dev()
1448 usb_make_path(ir->usbdev, ir->phys, sizeof(ir->phys)); in mceusb_init_rc_dev()
1450 rc->device_name = ir->name; in mceusb_init_rc_dev()
1451 rc->input_phys = ir->phys; in mceusb_init_rc_dev()
1452 usb_to_input_id(ir->usbdev, &rc->input_id); in mceusb_init_rc_dev()
1454 rc->priv = ir; in mceusb_init_rc_dev()
1458 if (!mceusb_model[ir->model].broken_irtimeout) { in mceusb_init_rc_dev()
1468 if (!ir->flags.no_tx) { in mceusb_init_rc_dev()
1473 if (ir->flags.rx2 > 0) { in mceusb_init_rc_dev()
1489 if (mceusb_model[ir->model].rc_map) in mceusb_init_rc_dev()
1490 rc->map_name = mceusb_model[ir->model].rc_map; in mceusb_init_rc_dev()
1513 struct mceusb_dev *ir = NULL; in mceusb_dev_probe() local
1572 ir = kzalloc(sizeof(struct mceusb_dev), GFP_KERNEL); in mceusb_dev_probe()
1573 if (!ir) in mceusb_dev_probe()
1576 ir->pipe_in = pipe; in mceusb_dev_probe()
1577 ir->buf_in = usb_alloc_coherent(dev, maxp, GFP_ATOMIC, &ir->dma_in); in mceusb_dev_probe()
1578 if (!ir->buf_in) in mceusb_dev_probe()
1581 ir->urb_in = usb_alloc_urb(0, GFP_KERNEL); in mceusb_dev_probe()
1582 if (!ir->urb_in) in mceusb_dev_probe()
1585 ir->usbdev = usb_get_dev(dev); in mceusb_dev_probe()
1586 ir->dev = &intf->dev; in mceusb_dev_probe()
1587 ir->len_in = maxp; in mceusb_dev_probe()
1588 ir->flags.microsoft_gen1 = is_microsoft_gen1; in mceusb_dev_probe()
1589 ir->flags.tx_mask_normal = tx_mask_normal; in mceusb_dev_probe()
1590 ir->flags.no_tx = mceusb_model[model].no_tx; in mceusb_dev_probe()
1591 ir->flags.rx2 = mceusb_model[model].rx2; in mceusb_dev_probe()
1592 ir->model = model; in mceusb_dev_probe()
1595 ir->usb_ep_out = ep_out; in mceusb_dev_probe()
1597 ir->pipe_out = usb_sndintpipe(ir->usbdev, in mceusb_dev_probe()
1600 ir->pipe_out = usb_sndbulkpipe(ir->usbdev, in mceusb_dev_probe()
1617 INIT_WORK(&ir->kevent, mceusb_deferred_kevent); in mceusb_dev_probe()
1619 ir->rc = mceusb_init_rc_dev(ir); in mceusb_dev_probe()
1620 if (!ir->rc) in mceusb_dev_probe()
1625 usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp, in mceusb_dev_probe()
1626 mceusb_dev_recv, ir, ep_in->bInterval); in mceusb_dev_probe()
1628 usb_fill_bulk_urb(ir->urb_in, dev, pipe, ir->buf_in, maxp, in mceusb_dev_probe()
1629 mceusb_dev_recv, ir); in mceusb_dev_probe()
1631 ir->urb_in->transfer_dma = ir->dma_in; in mceusb_dev_probe()
1632 ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; in mceusb_dev_probe()
1636 res = usb_submit_urb(ir->urb_in, GFP_KERNEL); in mceusb_dev_probe()
1641 mceusb_get_emulator_version(ir); in mceusb_dev_probe()
1644 if (ir->flags.microsoft_gen1) in mceusb_dev_probe()
1645 mceusb_gen1_init(ir); in mceusb_dev_probe()
1647 mceusb_gen2_init(ir); in mceusb_dev_probe()
1649 mceusb_get_parameters(ir); in mceusb_dev_probe()
1651 mceusb_flash_led(ir); in mceusb_dev_probe()
1653 if (!ir->flags.no_tx) in mceusb_dev_probe()
1654 mceusb_set_tx_mask(ir->rc, MCE_DEFAULT_TX_MASK); in mceusb_dev_probe()
1656 usb_set_intfdata(intf, ir); in mceusb_dev_probe()
1659 device_set_wakeup_capable(ir->dev, true); in mceusb_dev_probe()
1660 device_set_wakeup_enable(ir->dev, true); in mceusb_dev_probe()
1663 name, ir->emver); in mceusb_dev_probe()
1665 ir->num_txports, ir->txports_cabled, in mceusb_dev_probe()
1666 ir->num_rxports, ir->rxports_active); in mceusb_dev_probe()
1672 cancel_work_sync(&ir->kevent); in mceusb_dev_probe()
1673 usb_put_dev(ir->usbdev); in mceusb_dev_probe()
1674 usb_kill_urb(ir->urb_in); in mceusb_dev_probe()
1675 usb_free_urb(ir->urb_in); in mceusb_dev_probe()
1677 usb_free_coherent(dev, maxp, ir->buf_in, ir->dma_in); in mceusb_dev_probe()
1679 kfree(ir); in mceusb_dev_probe()
1690 struct mceusb_dev *ir = usb_get_intfdata(intf); in mceusb_dev_disconnect() local
1694 if (!ir) in mceusb_dev_disconnect()
1697 ir->usbdev = NULL; in mceusb_dev_disconnect()
1698 cancel_work_sync(&ir->kevent); in mceusb_dev_disconnect()
1699 rc_unregister_device(ir->rc); in mceusb_dev_disconnect()
1700 usb_kill_urb(ir->urb_in); in mceusb_dev_disconnect()
1701 usb_free_urb(ir->urb_in); in mceusb_dev_disconnect()
1702 usb_free_coherent(dev, ir->len_in, ir->buf_in, ir->dma_in); in mceusb_dev_disconnect()
1705 kfree(ir); in mceusb_dev_disconnect()
1710 struct mceusb_dev *ir = usb_get_intfdata(intf); in mceusb_dev_suspend() local
1711 dev_info(ir->dev, "suspend"); in mceusb_dev_suspend()
1712 usb_kill_urb(ir->urb_in); in mceusb_dev_suspend()
1718 struct mceusb_dev *ir = usb_get_intfdata(intf); in mceusb_dev_resume() local
1719 dev_info(ir->dev, "resume"); in mceusb_dev_resume()
1720 if (usb_submit_urb(ir->urb_in, GFP_ATOMIC)) in mceusb_dev_resume()