H A D | imon.c | 468 static void free_imon_context(struct imon_context *ictx) free_imon_context() argument 470 struct device *dev = ictx->dev; free_imon_context() 472 usb_free_urb(ictx->tx_urb); free_imon_context() 473 usb_free_urb(ictx->rx_urb_intf0); free_imon_context() 474 usb_free_urb(ictx->rx_urb_intf1); free_imon_context() 475 kfree(ictx); free_imon_context() 487 struct imon_context *ictx = NULL; display_open() local 501 ictx = usb_get_intfdata(interface); display_open() 503 if (!ictx) { display_open() 509 mutex_lock(&ictx->lock); display_open() 511 if (!ictx->display_supported) { display_open() 514 } else if (ictx->display_isopen) { display_open() 518 ictx->display_isopen = true; display_open() 519 file->private_data = ictx; display_open() 520 dev_dbg(ictx->dev, "display port opened\n"); display_open() 523 mutex_unlock(&ictx->lock); display_open() 536 struct imon_context *ictx = NULL; display_close() local 539 ictx = file->private_data; display_close() 541 if (!ictx) { display_close() 546 mutex_lock(&ictx->lock); display_close() 548 if (!ictx->display_supported) { display_close() 551 } else if (!ictx->display_isopen) { display_close() 555 ictx->display_isopen = false; display_close() 556 dev_dbg(ictx->dev, "display port closed\n"); display_close() 559 mutex_unlock(&ictx->lock); display_close() 565 * ictx->lock held, or its unlock/lock sequence while waiting for tx 568 static int send_packet(struct imon_context *ictx) send_packet() argument 577 if (!ictx->tx_control) { send_packet() 578 pipe = usb_sndintpipe(ictx->usbdev_intf0, send_packet() 579 ictx->tx_endpoint->bEndpointAddress); send_packet() 580 interval = ictx->tx_endpoint->bInterval; send_packet() 582 usb_fill_int_urb(ictx->tx_urb, ictx->usbdev_intf0, pipe, send_packet() 583 ictx->usb_tx_buf, send_packet() 584 sizeof(ictx->usb_tx_buf), send_packet() 585 usb_tx_callback, ictx, interval); send_packet() 587 ictx->tx_urb->actual_length = 0; send_packet() 603 pipe = usb_sndctrlpipe(ictx->usbdev_intf0, 0); send_packet() 606 usb_fill_control_urb(ictx->tx_urb, ictx->usbdev_intf0, send_packet() 608 ictx->usb_tx_buf, send_packet() 609 sizeof(ictx->usb_tx_buf), send_packet() 610 usb_tx_callback, ictx); send_packet() 611 ictx->tx_urb->actual_length = 0; send_packet() 614 init_completion(&ictx->tx.finished); send_packet() 615 ictx->tx.busy = true; send_packet() 618 retval = usb_submit_urb(ictx->tx_urb, GFP_KERNEL); send_packet() 620 ictx->tx.busy = false; send_packet() 625 mutex_unlock(&ictx->lock); send_packet() 627 &ictx->tx.finished); send_packet() 629 usb_kill_urb(ictx->tx_urb); send_packet() 632 mutex_lock(&ictx->lock); send_packet() 634 retval = ictx->tx.status; send_packet() 646 timeout = msecs_to_jiffies(ictx->send_packet_delay); send_packet() 661 static int send_associate_24g(struct imon_context *ictx) send_associate_24g() argument 667 if (!ictx) { send_associate_24g() 672 if (!ictx->dev_present_intf0) { send_associate_24g() 677 memcpy(ictx->usb_tx_buf, packet, sizeof(packet)); send_associate_24g() 678 retval = send_packet(ictx); send_associate_24g() 690 static int send_set_imon_clock(struct imon_context *ictx, send_set_imon_clock() argument 700 if (!ictx) { send_set_imon_clock() 705 switch (ictx->display_type) { send_set_imon_clock() 723 if (ictx->product == 0xffdc) { send_set_imon_clock() 759 memcpy(ictx->usb_tx_buf, clock_enable_pkt[i], 8); send_set_imon_clock() 760 retval = send_packet(ictx); send_set_imon_clock() 777 struct imon_context *ictx = dev_get_drvdata(d); show_associate_remote() local 779 if (!ictx) show_associate_remote() 782 mutex_lock(&ictx->lock); show_associate_remote() 783 if (ictx->rf_isassociating) show_associate_remote() 791 mutex_unlock(&ictx->lock); show_associate_remote() 799 struct imon_context *ictx; store_associate_remote() local 801 ictx = dev_get_drvdata(d); store_associate_remote() 803 if (!ictx) store_associate_remote() 806 mutex_lock(&ictx->lock); store_associate_remote() 807 ictx->rf_isassociating = true; store_associate_remote() 808 send_associate_24g(ictx); store_associate_remote() 809 mutex_unlock(&ictx->lock); store_associate_remote() 820 struct imon_context *ictx = dev_get_drvdata(d); show_imon_clock() local 823 if (!ictx) show_imon_clock() 826 mutex_lock(&ictx->lock); show_imon_clock() 828 if (!ictx->display_supported) { show_imon_clock() 834 "%s", ictx->display_isopen ? show_imon_clock() 838 mutex_unlock(&ictx->lock); show_imon_clock() 847 struct imon_context *ictx = dev_get_drvdata(d); store_imon_clock() local 851 if (!ictx) store_imon_clock() 854 mutex_lock(&ictx->lock); store_imon_clock() 856 if (!ictx->display_supported) { store_imon_clock() 859 } else if (ictx->display_isopen) { store_imon_clock() 877 retval = send_set_imon_clock(ictx, year, month, day, dow, store_imon_clock() 884 mutex_unlock(&ictx->lock); store_imon_clock() 932 struct imon_context *ictx; vfd_write() local 936 ictx = file->private_data; vfd_write() 937 if (!ictx) { vfd_write() 942 mutex_lock(&ictx->lock); vfd_write() 944 if (!ictx->dev_present_intf0) { vfd_write() 956 if (copy_from_user(ictx->tx.data_buf, buf, n_bytes)) { vfd_write() 963 ictx->tx.data_buf[i] = ' '; vfd_write() 966 ictx->tx.data_buf[i] = 0xFF; vfd_write() 972 memcpy(ictx->usb_tx_buf, ictx->tx.data_buf + offset, 7); vfd_write() 973 ictx->usb_tx_buf[7] = (unsigned char) seq; vfd_write() 975 retval = send_packet(ictx); vfd_write() 987 memcpy(ictx->usb_tx_buf, &vfd_packet6, sizeof(vfd_packet6)); vfd_write() 988 ictx->usb_tx_buf[7] = (unsigned char) seq; vfd_write() 989 retval = send_packet(ictx); vfd_write() 994 mutex_unlock(&ictx->lock); vfd_write() 1016 struct imon_context *ictx; lcd_write() local 1018 ictx = file->private_data; lcd_write() 1019 if (!ictx) { lcd_write() 1024 mutex_lock(&ictx->lock); lcd_write() 1026 if (!ictx->display_supported) { lcd_write() 1039 if (copy_from_user(ictx->usb_tx_buf, buf, 8)) { lcd_write() 1044 retval = send_packet(ictx); lcd_write() 1049 dev_dbg(ictx->dev, "%s: write %d bytes to LCD\n", lcd_write() 1053 mutex_unlock(&ictx->lock); lcd_write() 1062 struct imon_context *ictx; usb_tx_callback() local 1066 ictx = (struct imon_context *)urb->context; usb_tx_callback() 1067 if (!ictx) usb_tx_callback() 1070 ictx->tx.status = urb->status; usb_tx_callback() 1073 ictx->tx.busy = false; usb_tx_callback() 1075 complete(&ictx->tx.finished); usb_tx_callback() 1083 struct imon_context *ictx = (struct imon_context *)data; imon_touch_display_timeout() local 1085 if (ictx->display_type != IMON_DISPLAY_TYPE_VGA) imon_touch_display_timeout() 1088 input_report_abs(ictx->touch, ABS_X, ictx->touch_x); imon_touch_display_timeout() 1089 input_report_abs(ictx->touch, ABS_Y, ictx->touch_y); imon_touch_display_timeout() 1090 input_report_key(ictx->touch, BTN_TOUCH, 0x00); imon_touch_display_timeout() 1091 input_sync(ictx->touch); imon_touch_display_timeout() 1111 struct imon_context *ictx = rc->priv; imon_ir_change_protocol() local 1112 struct device *dev = ictx->dev; imon_ir_change_protocol() 1140 memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet)); imon_ir_change_protocol() 1142 if (!mutex_is_locked(&ictx->lock)) { imon_ir_change_protocol() 1144 mutex_lock(&ictx->lock); imon_ir_change_protocol() 1147 retval = send_packet(ictx); imon_ir_change_protocol() 1151 ictx->rc_type = *rc_type; imon_ir_change_protocol() 1152 ictx->pad_mouse = false; imon_ir_change_protocol() 1156 mutex_unlock(&ictx->lock); imon_ir_change_protocol() 1259 static u32 imon_remote_key_lookup(struct imon_context *ictx, u32 scancode) imon_remote_key_lookup() argument 1266 keycode = rc_g_keycode_from_table(ictx->rdev, scancode); imon_remote_key_lookup() 1267 ictx->rc_toggle = 0x0; imon_remote_key_lookup() 1268 ictx->rc_scancode = scancode; imon_remote_key_lookup() 1273 keycode = rc_g_keycode_from_table(ictx->rdev, release); imon_remote_key_lookup() 1278 ictx->release_code = is_release_code; imon_remote_key_lookup() 1283 static u32 imon_mce_key_lookup(struct imon_context *ictx, u32 scancode) imon_mce_key_lookup() argument 1301 ictx->rc_scancode = scancode; imon_mce_key_lookup() 1302 keycode = rc_g_keycode_from_table(ictx->rdev, scancode); imon_mce_key_lookup() 1305 ictx->release_code = false; imon_mce_key_lookup() 1310 static u32 imon_panel_key_lookup(struct imon_context *ictx, u64 code) imon_panel_key_lookup() argument 1314 struct imon_panel_key_table *key_table = ictx->dev_descr->key_table; imon_panel_key_lookup() 1322 ictx->release_code = false; imon_panel_key_lookup() 1326 static bool imon_mouse_event(struct imon_context *ictx, imon_mouse_event() argument 1335 spin_lock_irqsave(&ictx->kc_lock, flags); imon_mouse_event() 1338 if (ictx->product != 0xffdc && (buf[0] & 0x01) && len == 5) { imon_mouse_event() 1343 } else if (ictx->product == 0xffdc && (buf[0] & 0x40) && imon_mouse_event() 1357 } else if (ictx->product == 0xffdc && (buf[0] == 0x68)) { imon_mouse_event() 1360 } else if (ictx->kc == KEY_CHANNELUP && (buf[2] & 0x40) != 0x40) { imon_mouse_event() 1362 } else if (ictx->kc == KEY_CHANNELDOWN && (buf[2] & 0x40) != 0x40) { imon_mouse_event() 1367 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_mouse_event() 1370 dev_dbg(ictx->dev, "sending mouse data via input subsystem\n"); imon_mouse_event() 1373 input_report_rel(ictx->idev, REL_WHEEL, dir); imon_mouse_event() 1375 input_report_rel(ictx->idev, REL_X, rel_x); imon_mouse_event() 1376 input_report_rel(ictx->idev, REL_Y, rel_y); imon_mouse_event() 1378 input_report_key(ictx->idev, BTN_LEFT, buf[1] & 0x1); imon_mouse_event() 1379 input_report_key(ictx->idev, BTN_RIGHT, imon_mouse_event() 1382 input_sync(ictx->idev); imon_mouse_event() 1383 spin_lock_irqsave(&ictx->kc_lock, flags); imon_mouse_event() 1384 ictx->last_keycode = ictx->kc; imon_mouse_event() 1385 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_mouse_event() 1391 static void imon_touch_event(struct imon_context *ictx, unsigned char *buf) imon_touch_event() argument 1393 mod_timer(&ictx->ttimer, jiffies + TOUCH_TIMEOUT); imon_touch_event() 1394 ictx->touch_x = (buf[0] << 4) | (buf[1] >> 4); imon_touch_event() 1395 ictx->touch_y = 0xfff - ((buf[2] << 4) | (buf[1] & 0xf)); imon_touch_event() 1396 input_report_abs(ictx->touch, ABS_X, ictx->touch_x); imon_touch_event() 1397 input_report_abs(ictx->touch, ABS_Y, ictx->touch_y); imon_touch_event() 1398 input_report_key(ictx->touch, BTN_TOUCH, 0x01); imon_touch_event() 1399 input_sync(ictx->touch); imon_touch_event() 1402 static void imon_pad_to_keys(struct imon_context *ictx, unsigned char *buf) imon_pad_to_keys() argument 1418 if (ictx->product != 0xffdc) { imon_pad_to_keys() 1427 if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) { imon_pad_to_keys() 1432 spin_lock_irqsave(&ictx->kc_lock, imon_pad_to_keys() 1434 ictx->kc = KEY_UNKNOWN; imon_pad_to_keys() 1435 spin_unlock_irqrestore(&ictx->kc_lock, imon_pad_to_keys() 1494 if (ictx->rc_type == RC_BIT_OTHER && pad_stabilize) { imon_pad_to_keys() 1498 spin_lock_irqsave(&ictx->kc_lock, flags); imon_pad_to_keys() 1499 ictx->kc = KEY_UNKNOWN; imon_pad_to_keys() 1500 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_pad_to_keys() 1530 spin_lock_irqsave(&ictx->kc_lock, flags); imon_pad_to_keys() 1531 ictx->kc = imon_remote_key_lookup(ictx, scancode); imon_pad_to_keys() 1532 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_pad_to_keys() 1541 static int imon_parse_press_type(struct imon_context *ictx, imon_parse_press_type() argument 1547 spin_lock_irqsave(&ictx->kc_lock, flags); imon_parse_press_type() 1550 if (ictx->kc == KEY_RESERVED && buf[0] == 0x02 && buf[3] == 0x00) imon_parse_press_type() 1551 ictx->kc = ictx->last_keycode; imon_parse_press_type() 1554 else if (ictx->kc == KEY_RESERVED && buf[0] == 0x68 && buf[1] == 0x82 && imon_parse_press_type() 1556 ictx->kc = ictx->last_keycode; imon_parse_press_type() 1559 else if (ictx->kc == KEY_RESERVED && buf[0] == 0x01 && buf[1] == 0x00 && imon_parse_press_type() 1561 ictx->kc = ictx->last_keycode; imon_parse_press_type() 1565 ictx->rc_toggle = buf[2]; imon_parse_press_type() 1569 } else if (ictx->kc == KEY_RESERVED) imon_parse_press_type() 1573 else if (ictx->release_code) imon_parse_press_type() 1580 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_parse_press_type() 1588 static void imon_incoming_packet(struct imon_context *ictx, imon_incoming_packet() argument 1593 struct device *dev = ictx->dev; imon_incoming_packet() 1612 kc = imon_panel_key_lookup(ictx, scancode); imon_incoming_packet() 1613 ictx->release_code = false; imon_incoming_packet() 1616 if (ictx->rc_type == RC_BIT_RC6_MCE) { imon_incoming_packet() 1620 kc = imon_mce_key_lookup(ictx, scancode); imon_incoming_packet() 1623 kc = imon_remote_key_lookup(ictx, scancode); imon_incoming_packet() 1627 spin_lock_irqsave(&ictx->kc_lock, flags); imon_incoming_packet() 1629 if (kc == KEY_KEYBOARD && !ictx->release_code) { imon_incoming_packet() 1630 ictx->last_keycode = kc; imon_incoming_packet() 1632 ictx->pad_mouse = ~(ictx->pad_mouse) & 0x1; imon_incoming_packet() 1634 ictx->pad_mouse ? "mouse" : "keyboard"); imon_incoming_packet() 1635 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1638 ictx->pad_mouse = false; imon_incoming_packet() 1643 ictx->kc = kc; imon_incoming_packet() 1644 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1647 if (ictx->display_type == IMON_DISPLAY_TYPE_VGA && len == 8 && imon_incoming_packet() 1649 imon_touch_event(ictx, buf); imon_incoming_packet() 1653 } else if (ictx->pad_mouse) { imon_incoming_packet() 1654 if (imon_mouse_event(ictx, buf, len)) imon_incoming_packet() 1663 imon_pad_to_keys(ictx, buf); imon_incoming_packet() 1673 press_type = imon_parse_press_type(ictx, buf, ktype); imon_incoming_packet() 1679 rc_keyup(ictx->rdev); imon_incoming_packet() 1681 if (ictx->rc_type == RC_BIT_RC6_MCE || imon_incoming_packet() 1682 ictx->rc_type == RC_BIT_OTHER) imon_incoming_packet() 1683 rc_keydown(ictx->rdev, imon_incoming_packet() 1684 ictx->rc_type == RC_BIT_RC6_MCE ? RC_TYPE_RC6_MCE : RC_TYPE_OTHER, imon_incoming_packet() 1685 ictx->rc_scancode, ictx->rc_toggle); imon_incoming_packet() 1686 spin_lock_irqsave(&ictx->kc_lock, flags); imon_incoming_packet() 1687 ictx->last_keycode = ictx->kc; imon_incoming_packet() 1688 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1694 spin_lock_irqsave(&ictx->kc_lock, flags); imon_incoming_packet() 1698 if (ictx->kc == KEY_MUTE && ictx->kc == ictx->last_keycode) { imon_incoming_packet() 1700 if (msec < ictx->idev->rep[REP_DELAY]) { imon_incoming_packet() 1701 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1706 kc = ictx->kc; imon_incoming_packet() 1708 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1710 input_report_key(ictx->idev, kc, press_type); imon_incoming_packet() 1711 input_sync(ictx->idev); imon_incoming_packet() 1714 input_report_key(ictx->idev, kc, 0); imon_incoming_packet() 1715 input_sync(ictx->idev); imon_incoming_packet() 1717 spin_lock_irqsave(&ictx->kc_lock, flags); imon_incoming_packet() 1718 ictx->last_keycode = kc; imon_incoming_packet() 1719 spin_unlock_irqrestore(&ictx->kc_lock, flags); imon_incoming_packet() 1740 ictx->rf_isassociating = false; imon_incoming_packet() 1749 struct imon_context *ictx; usb_rx_callback_intf0() local 1755 ictx = (struct imon_context *)urb->context; usb_rx_callback_intf0() 1756 if (!ictx) usb_rx_callback_intf0() 1764 if (!ictx->dev_present_intf0) usb_rx_callback_intf0() 1775 imon_incoming_packet(ictx, urb, intfnum); usb_rx_callback_intf0() 1779 dev_warn(ictx->dev, "imon %s: status(%d): ignored\n", usb_rx_callback_intf0() 1785 usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC); usb_rx_callback_intf0() 1790 struct imon_context *ictx; usb_rx_callback_intf1() local 1796 ictx = (struct imon_context *)urb->context; usb_rx_callback_intf1() 1797 if (!ictx) usb_rx_callback_intf1() 1805 if (!ictx->dev_present_intf1) usb_rx_callback_intf1() 1816 imon_incoming_packet(ictx, urb, intfnum); usb_rx_callback_intf1() 1820 dev_warn(ictx->dev, "imon %s: status(%d): ignored\n", usb_rx_callback_intf1() 1826 usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC); usb_rx_callback_intf1() 1838 static void imon_get_ffdc_type(struct imon_context *ictx) imon_get_ffdc_type() argument 1840 u8 ffdc_cfg_byte = ictx->usb_rx_buf[6]; imon_get_ffdc_type() 1847 dev_info(ictx->dev, "0xffdc iMON Knob, iMON IR"); imon_get_ffdc_type() 1848 ictx->display_supported = false; imon_get_ffdc_type() 1852 dev_info(ictx->dev, "0xffdc iMON 2.4G LT, iMON RF"); imon_get_ffdc_type() 1853 ictx->display_supported = false; imon_get_ffdc_type() 1854 ictx->rf_device = true; imon_get_ffdc_type() 1858 dev_info(ictx->dev, "0xffdc iMON VFD + knob, no IR"); imon_get_ffdc_type() 1864 dev_info(ictx->dev, "0xffdc iMON VFD, iMON IR"); imon_get_ffdc_type() 1871 dev_info(ictx->dev, "0xffdc iMON VFD, MCE IR"); imon_get_ffdc_type() 1877 dev_info(ictx->dev, "0xffdc iMON LCD, MCE IR"); imon_get_ffdc_type() 1882 dev_info(ictx->dev, "Unknown 0xffdc device, " imon_get_ffdc_type() 1893 ictx->display_type = detected_display_type; imon_get_ffdc_type() 1894 ictx->rc_type = allowed_protos; imon_get_ffdc_type() 1897 static void imon_set_display_type(struct imon_context *ictx) imon_set_display_type() argument 1907 switch (ictx->product) { imon_set_display_type() 1910 configured_display_type = ictx->display_type; imon_set_display_type() 1926 ictx->display_supported = false; imon_set_display_type() 1937 ictx->display_supported = false; imon_set_display_type() 1939 ictx->display_supported = true; imon_set_display_type() 1940 dev_info(ictx->dev, "%s: overriding display type to %d via " imon_set_display_type() 1944 ictx->display_type = configured_display_type; imon_set_display_type() 1947 static struct rc_dev *imon_init_rdev(struct imon_context *ictx) imon_init_rdev() argument 1956 dev_err(ictx->dev, "remote control dev allocation failed\n"); imon_init_rdev() 1960 snprintf(ictx->name_rdev, sizeof(ictx->name_rdev), imon_init_rdev() 1961 "iMON Remote (%04x:%04x)", ictx->vendor, ictx->product); imon_init_rdev() 1962 usb_make_path(ictx->usbdev_intf0, ictx->phys_rdev, imon_init_rdev() 1963 sizeof(ictx->phys_rdev)); imon_init_rdev() 1964 strlcat(ictx->phys_rdev, "/input0", sizeof(ictx->phys_rdev)); imon_init_rdev() 1966 rdev->input_name = ictx->name_rdev; imon_init_rdev() 1967 rdev->input_phys = ictx->phys_rdev; imon_init_rdev() 1968 usb_to_input_id(ictx->usbdev_intf0, &rdev->input_id); imon_init_rdev() 1969 rdev->dev.parent = ictx->dev; imon_init_rdev() 1971 rdev->priv = ictx; imon_init_rdev() 1978 memcpy(ictx->usb_tx_buf, &fp_packet, sizeof(fp_packet)); imon_init_rdev() 1979 ret = send_packet(ictx); imon_init_rdev() 1982 dev_info(ictx->dev, "panel buttons/knobs setup failed\n"); imon_init_rdev() 1984 if (ictx->product == 0xffdc) { imon_init_rdev() 1985 imon_get_ffdc_type(ictx); imon_init_rdev() 1986 rdev->allowed_protocols = ictx->rc_type; imon_init_rdev() 1989 imon_set_display_type(ictx); imon_init_rdev() 1991 if (ictx->rc_type == RC_BIT_RC6_MCE) imon_init_rdev() 1998 dev_err(ictx->dev, "remote input dev register failed\n"); imon_init_rdev() 2009 static struct input_dev *imon_init_idev(struct imon_context *ictx) imon_init_idev() argument 2011 struct imon_panel_key_table *key_table = ictx->dev_descr->key_table; imon_init_idev() 2019 snprintf(ictx->name_idev, sizeof(ictx->name_idev), imon_init_idev() 2021 ictx->vendor, ictx->product); imon_init_idev() 2022 idev->name = ictx->name_idev; imon_init_idev() 2024 usb_make_path(ictx->usbdev_intf0, ictx->phys_idev, imon_init_idev() 2025 sizeof(ictx->phys_idev)); imon_init_idev() 2026 strlcat(ictx->phys_idev, "/input1", sizeof(ictx->phys_idev)); imon_init_idev() 2027 idev->phys = ictx->phys_idev; imon_init_idev() 2042 usb_to_input_id(ictx->usbdev_intf0, &idev->id); imon_init_idev() 2043 idev->dev.parent = ictx->dev; imon_init_idev() 2044 input_set_drvdata(idev, ictx); imon_init_idev() 2048 dev_err(ictx->dev, "input dev register failed\n"); imon_init_idev() 2059 static struct input_dev *imon_init_touch(struct imon_context *ictx) imon_init_touch() argument 2068 snprintf(ictx->name_touch, sizeof(ictx->name_touch), imon_init_touch() 2070 ictx->vendor, ictx->product); imon_init_touch() 2071 touch->name = ictx->name_touch; imon_init_touch() 2073 usb_make_path(ictx->usbdev_intf1, ictx->phys_touch, imon_init_touch() 2074 sizeof(ictx->phys_touch)); imon_init_touch() 2075 strlcat(ictx->phys_touch, "/input2", sizeof(ictx->phys_touch)); imon_init_touch() 2076 touch->phys = ictx->phys_touch; imon_init_touch() 2087 input_set_drvdata(touch, ictx); imon_init_touch() 2089 usb_to_input_id(ictx->usbdev_intf1, &touch->id); imon_init_touch() 2090 touch->dev.parent = ictx->dev; imon_init_touch() 2093 dev_info(ictx->dev, "touchscreen input dev register failed\n"); imon_init_touch() 2106 static bool imon_find_endpoints(struct imon_context *ictx, imon_find_endpoints() argument 2134 dev_dbg(ictx->dev, "%s: found IR endpoint\n", __func__); imon_find_endpoints() 2140 dev_dbg(ictx->dev, "%s: found display endpoint\n", __func__); imon_find_endpoints() 2145 ictx->rx_endpoint_intf0 = rx_endpoint; imon_find_endpoints() 2150 ictx->tx_endpoint = tx_endpoint; imon_find_endpoints() 2152 ictx->rx_endpoint_intf1 = rx_endpoint; imon_find_endpoints() 2162 dev_dbg(ictx->dev, "%s: device uses control endpoint, not " imon_find_endpoints() 2171 if (ictx->display_type == IMON_DISPLAY_TYPE_NONE) { imon_find_endpoints() 2173 dev_dbg(ictx->dev, "%s: device has no display\n", __func__); imon_find_endpoints() 2180 if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) { imon_find_endpoints() 2182 dev_dbg(ictx->dev, "%s: iMON Touch device found\n", __func__); imon_find_endpoints() 2189 ictx->tx_control = tx_control; imon_find_endpoints() 2192 ictx->display_supported = true; imon_find_endpoints() 2201 struct imon_context *ictx; imon_init_intf0() local 2208 ictx = kzalloc(sizeof(struct imon_context), GFP_KERNEL); imon_init_intf0() 2209 if (!ictx) { imon_init_intf0() 2225 mutex_init(&ictx->lock); imon_init_intf0() 2226 spin_lock_init(&ictx->kc_lock); imon_init_intf0() 2228 mutex_lock(&ictx->lock); imon_init_intf0() 2230 ictx->dev = dev; imon_init_intf0() 2231 ictx->usbdev_intf0 = usb_get_dev(interface_to_usbdev(intf)); imon_init_intf0() 2232 ictx->rx_urb_intf0 = rx_urb; imon_init_intf0() 2233 ictx->tx_urb = tx_urb; imon_init_intf0() 2234 ictx->rf_device = false; imon_init_intf0() 2236 ictx->vendor = le16_to_cpu(ictx->usbdev_intf0->descriptor.idVendor); imon_init_intf0() 2237 ictx->product = le16_to_cpu(ictx->usbdev_intf0->descriptor.idProduct); imon_init_intf0() 2240 ictx->dev_descr = (struct imon_usb_dev_descr *)id->driver_info; imon_init_intf0() 2242 ictx->send_packet_delay = ictx->dev_descr->flags & imon_init_intf0() 2247 if (!imon_find_endpoints(ictx, iface_desc)) { imon_init_intf0() 2251 usb_fill_int_urb(ictx->rx_urb_intf0, ictx->usbdev_intf0, imon_init_intf0() 2252 usb_rcvintpipe(ictx->usbdev_intf0, imon_init_intf0() 2253 ictx->rx_endpoint_intf0->bEndpointAddress), imon_init_intf0() 2254 ictx->usb_rx_buf, sizeof(ictx->usb_rx_buf), imon_init_intf0() 2255 usb_rx_callback_intf0, ictx, imon_init_intf0() 2256 ictx->rx_endpoint_intf0->bInterval); imon_init_intf0() 2258 ret = usb_submit_urb(ictx->rx_urb_intf0, GFP_KERNEL); imon_init_intf0() 2264 ictx->idev = imon_init_idev(ictx); imon_init_intf0() 2265 if (!ictx->idev) { imon_init_intf0() 2270 ictx->rdev = imon_init_rdev(ictx); imon_init_intf0() 2271 if (!ictx->rdev) { imon_init_intf0() 2276 ictx->dev_present_intf0 = true; imon_init_intf0() 2278 mutex_unlock(&ictx->lock); imon_init_intf0() 2279 return ictx; imon_init_intf0() 2282 input_unregister_device(ictx->idev); imon_init_intf0() 2284 usb_kill_urb(ictx->rx_urb_intf0); imon_init_intf0() 2287 usb_put_dev(ictx->usbdev_intf0); imon_init_intf0() 2288 mutex_unlock(&ictx->lock); imon_init_intf0() 2293 kfree(ictx); imon_init_intf0() 2301 struct imon_context *ictx) imon_init_intf1() 2313 mutex_lock(&ictx->lock); imon_init_intf1() 2315 if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) { imon_init_intf1() 2316 init_timer(&ictx->ttimer); imon_init_intf1() 2317 ictx->ttimer.data = (unsigned long)ictx; imon_init_intf1() 2318 ictx->ttimer.function = imon_touch_display_timeout; imon_init_intf1() 2321 ictx->usbdev_intf1 = usb_get_dev(interface_to_usbdev(intf)); imon_init_intf1() 2322 ictx->rx_urb_intf1 = rx_urb; imon_init_intf1() 2326 if (!imon_find_endpoints(ictx, iface_desc)) imon_init_intf1() 2329 if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) { imon_init_intf1() 2330 ictx->touch = imon_init_touch(ictx); imon_init_intf1() 2331 if (!ictx->touch) imon_init_intf1() 2334 ictx->touch = NULL; imon_init_intf1() 2336 usb_fill_int_urb(ictx->rx_urb_intf1, ictx->usbdev_intf1, imon_init_intf1() 2337 usb_rcvintpipe(ictx->usbdev_intf1, imon_init_intf1() 2338 ictx->rx_endpoint_intf1->bEndpointAddress), imon_init_intf1() 2339 ictx->usb_rx_buf, sizeof(ictx->usb_rx_buf), imon_init_intf1() 2340 usb_rx_callback_intf1, ictx, imon_init_intf1() 2341 ictx->rx_endpoint_intf1->bInterval); imon_init_intf1() 2343 ret = usb_submit_urb(ictx->rx_urb_intf1, GFP_KERNEL); imon_init_intf1() 2350 ictx->dev_present_intf1 = true; imon_init_intf1() 2352 mutex_unlock(&ictx->lock); imon_init_intf1() 2353 return ictx; imon_init_intf1() 2356 if (ictx->touch) imon_init_intf1() 2357 input_unregister_device(ictx->touch); imon_init_intf1() 2360 usb_put_dev(ictx->usbdev_intf1); imon_init_intf1() 2361 mutex_unlock(&ictx->lock); imon_init_intf1() 2364 dev_err(ictx->dev, "unable to initialize intf1, err %d\n", ret); imon_init_intf1() 2369 static void imon_init_display(struct imon_context *ictx, imon_init_display() argument 2374 dev_dbg(ictx->dev, "Registering iMON display with sysfs\n"); imon_init_display() 2379 dev_err(ictx->dev, "Could not create display sysfs " imon_init_display() 2382 if (ictx->display_type == IMON_DISPLAY_TYPE_LCD) imon_init_display() 2388 dev_info(ictx->dev, "could not get a minor number for " imon_init_display() 2405 struct imon_context *ictx = NULL; imon_probe() local 2425 ictx = imon_init_intf0(interface, id); imon_probe() 2426 if (!ictx) { imon_probe() 2441 ictx = imon_init_intf1(interface, first_if_ctx); imon_probe() 2442 if (!ictx) { imon_probe() 2450 usb_set_intfdata(interface, ictx); imon_probe() 2453 mutex_lock(&ictx->lock); imon_probe() 2455 if (product == 0xffdc && ictx->rf_device) { imon_probe() 2463 if (ictx->display_supported) imon_probe() 2464 imon_init_display(ictx, interface); imon_probe() 2466 mutex_unlock(&ictx->lock); imon_probe() 2491 struct imon_context *ictx; imon_disconnect() local 2498 ictx = usb_get_intfdata(interface); imon_disconnect() 2499 dev = ictx->dev; imon_disconnect() 2512 if (ictx->tx.busy) { imon_disconnect() 2513 usb_kill_urb(ictx->tx_urb); imon_disconnect() 2514 complete_all(&ictx->tx.finished); imon_disconnect() 2518 ictx->dev_present_intf0 = false; imon_disconnect() 2519 usb_kill_urb(ictx->rx_urb_intf0); imon_disconnect() 2520 usb_put_dev(ictx->usbdev_intf0); imon_disconnect() 2521 input_unregister_device(ictx->idev); imon_disconnect() 2522 rc_unregister_device(ictx->rdev); imon_disconnect() 2523 if (ictx->display_supported) { imon_disconnect() 2524 if (ictx->display_type == IMON_DISPLAY_TYPE_LCD) imon_disconnect() 2526 else if (ictx->display_type == IMON_DISPLAY_TYPE_VFD) imon_disconnect() 2530 ictx->dev_present_intf1 = false; imon_disconnect() 2531 usb_kill_urb(ictx->rx_urb_intf1); imon_disconnect() 2532 usb_put_dev(ictx->usbdev_intf1); imon_disconnect() 2533 if (ictx->display_type == IMON_DISPLAY_TYPE_VGA) { imon_disconnect() 2534 input_unregister_device(ictx->touch); imon_disconnect() 2535 del_timer_sync(&ictx->ttimer); imon_disconnect() 2539 if (!ictx->dev_present_intf0 && !ictx->dev_present_intf1) imon_disconnect() 2540 free_imon_context(ictx); imon_disconnect() 2550 struct imon_context *ictx = usb_get_intfdata(intf); imon_suspend() local 2554 usb_kill_urb(ictx->rx_urb_intf0); imon_suspend() 2556 usb_kill_urb(ictx->rx_urb_intf1); imon_suspend() 2564 struct imon_context *ictx = usb_get_intfdata(intf); imon_resume() local 2568 usb_fill_int_urb(ictx->rx_urb_intf0, ictx->usbdev_intf0, imon_resume() 2569 usb_rcvintpipe(ictx->usbdev_intf0, imon_resume() 2570 ictx->rx_endpoint_intf0->bEndpointAddress), imon_resume() 2571 ictx->usb_rx_buf, sizeof(ictx->usb_rx_buf), imon_resume() 2572 usb_rx_callback_intf0, ictx, imon_resume() 2573 ictx->rx_endpoint_intf0->bInterval); imon_resume() 2575 rc = usb_submit_urb(ictx->rx_urb_intf0, GFP_ATOMIC); imon_resume() 2578 usb_fill_int_urb(ictx->rx_urb_intf1, ictx->usbdev_intf1, imon_resume() 2579 usb_rcvintpipe(ictx->usbdev_intf1, imon_resume() 2580 ictx->rx_endpoint_intf1->bEndpointAddress), imon_resume() 2581 ictx->usb_rx_buf, sizeof(ictx->usb_rx_buf), imon_resume() 2582 usb_rx_callback_intf1, ictx, imon_resume() 2583 ictx->rx_endpoint_intf1->bInterval); imon_resume() 2585 rc = usb_submit_urb(ictx->rx_urb_intf1, GFP_ATOMIC); imon_resume() 2300 imon_init_intf1(struct usb_interface *intf, struct imon_context *ictx) imon_init_intf1() argument
|