Lines Matching defs:xpad

23  *  - ITO Takayuki for providing essential xpad information on his website
745 static int xpad_init_input(struct usb_xpad *xpad);
746 static void xpad_deinit_input(struct usb_xpad *xpad);
747 static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
748 static void xpad360w_poweroff_controller(struct usb_xpad *xpad);
759 static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
761 struct input_dev *dev = xpad->dev;
763 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
778 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
787 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
830 static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
838 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
852 if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
853 xpad->xtype == XTYPE_XBOX360W) {
877 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
892 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
903 if (xpad->xtype == XTYPE_XBOX360W) {
904 if (xpad->mode_btn_down_ts > 0 && xpad->pad_present &&
905 ((ktime_get_seconds() - xpad->mode_btn_down_ts) >=
907 xpad360w_poweroff_controller(xpad);
908 xpad->mode_btn_down_ts = 0;
914 xpad->mode_btn_down_ts = ktime_get_seconds();
916 xpad->mode_btn_down_ts = 0;
922 struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
925 if (xpad->pad_present) {
926 error = xpad_init_input(xpad);
929 dev_err(&xpad->dev->dev,
932 rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
935 RCU_INIT_POINTER(xpad->x360w_dev, NULL);
941 xpad_deinit_input(xpad);
959 static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
968 if (xpad->pad_present != present) {
969 xpad->pad_present = present;
970 schedule_work(&xpad->work);
979 dev = rcu_dereference(xpad->x360w_dev);
981 xpad360_process_packet(xpad, dev, cmd, &data[4]);
994 static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
996 struct input_dev *dev = xpad->dev;
1007 xpadone_ack_mode_report(xpad, data[2]);
1015 if (xpad->packet_type == PKT_XBE2_FW_5_11) {
1035 if (xpad->mapping & MAP_SELECT_BUTTON)
1045 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1066 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
1081 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1094 if (xpad->mapping & MAP_PROFILE_BUTTON)
1099 if (xpad->mapping & MAP_PADDLES) {
1100 if (xpad->packet_type == PKT_XBE1) {
1113 } else if (xpad->packet_type == PKT_XBE2_FW_OLD) {
1126 } else if (xpad->packet_type == PKT_XBE2_FW_5_EARLY) {
1153 struct usb_xpad *xpad = urb->context;
1154 struct device *dev = &xpad->intf->dev;
1176 switch (xpad->xtype) {
1178 xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
1181 xpad360w_process_packet(xpad, 0, xpad->idata);
1184 xpadone_process_packet(xpad, 0, xpad->idata);
1187 xpad_process_packet(xpad, 0, xpad->idata);
1197 /* Callers must hold xpad->odata_lock spinlock */
1198 static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
1202 if (xpad->xtype != XTYPE_XBOXONE)
1206 while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
1207 init_packet = &xboxone_init_packets[xpad->init_seq++];
1210 init_packet->idVendor != xpad->dev->id.vendor)
1214 init_packet->idProduct != xpad->dev->id.product)
1218 memcpy(xpad->odata, init_packet->data, init_packet->len);
1219 xpad->irq_out->transfer_buffer_length = init_packet->len;
1222 xpad->odata[2] = xpad->odata_serial++;
1229 /* Callers must hold xpad->odata_lock spinlock */
1230 static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
1236 if (xpad_prepare_next_init_packet(xpad))
1240 if (++xpad->last_out_packet >= XPAD_NUM_OUT_PACKETS)
1241 xpad->last_out_packet = 0;
1243 pkt = &xpad->out_packets[xpad->last_out_packet];
1245 dev_dbg(&xpad->intf->dev,
1247 __func__, xpad->last_out_packet);
1254 memcpy(xpad->odata, packet->data, packet->len);
1255 xpad->irq_out->transfer_buffer_length = packet->len;
1263 /* Callers must hold xpad->odata_lock spinlock */
1264 static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)
1268 if (!xpad->irq_out_active && xpad_prepare_next_out_packet(xpad)) {
1269 usb_anchor_urb(xpad->irq_out, &xpad->irq_out_anchor);
1270 error = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
1272 dev_err(&xpad->intf->dev,
1275 usb_unanchor_urb(xpad->irq_out);
1279 xpad->irq_out_active = true;
1287 struct usb_xpad *xpad = urb->context;
1288 struct device *dev = &xpad->intf->dev;
1293 spin_lock_irqsave(&xpad->odata_lock, flags);
1298 xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
1307 xpad->irq_out_active = false;
1316 if (xpad->irq_out_active) {
1317 usb_anchor_urb(urb, &xpad->irq_out_anchor);
1324 xpad->irq_out_active = false;
1328 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1331 static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad,
1336 if (xpad->xtype == XTYPE_UNKNOWN)
1339 init_usb_anchor(&xpad->irq_out_anchor);
1341 xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
1342 GFP_KERNEL, &xpad->odata_dma);
1343 if (!xpad->odata)
1346 spin_lock_init(&xpad->odata_lock);
1348 xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
1349 if (!xpad->irq_out) {
1354 usb_fill_int_urb(xpad->irq_out, xpad->udev,
1355 usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
1356 xpad->odata, XPAD_PKT_LEN,
1357 xpad_irq_out, xpad, ep_irq_out->bInterval);
1358 xpad->irq_out->transfer_dma = xpad->odata_dma;
1359 xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1364 usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
1368 static void xpad_stop_output(struct usb_xpad *xpad)
1370 if (xpad->xtype != XTYPE_UNKNOWN) {
1371 if (!usb_wait_anchor_empty_timeout(&xpad->irq_out_anchor,
1373 dev_warn(&xpad->intf->dev,
1375 usb_kill_anchored_urbs(&xpad->irq_out_anchor);
1380 static void xpad_deinit_output(struct usb_xpad *xpad)
1382 if (xpad->xtype != XTYPE_UNKNOWN) {
1383 usb_free_urb(xpad->irq_out);
1384 usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1385 xpad->odata, xpad->odata_dma);
1389 static int xpad_inquiry_pad_presence(struct usb_xpad *xpad)
1392 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1396 spin_lock_irqsave(&xpad->odata_lock, flags);
1414 xpad->last_out_packet = -1;
1415 retval = xpad_try_sending_next_out_packet(xpad);
1417 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1422 static int xpad_start_xbox_one(struct usb_xpad *xpad)
1427 if (usb_ifnum_to_if(xpad->udev, GIP_WIRED_INTF_AUDIO)) {
1434 retval = usb_set_interface(xpad->udev,
1437 dev_warn(&xpad->dev->dev,
1442 spin_lock_irqsave(&xpad->odata_lock, flags);
1449 xpad->init_seq = 0;
1450 retval = xpad_try_sending_next_out_packet(xpad);
1452 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1457 static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num)
1461 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1467 spin_lock_irqsave(&xpad->odata_lock, flags);
1475 xpad->last_out_packet = -1;
1476 xpad_try_sending_next_out_packet(xpad);
1478 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1484 struct usb_xpad *xpad = input_get_drvdata(dev);
1485 struct xpad_output_packet *packet = &xpad->out_packets[XPAD_OUT_FF_IDX];
1497 spin_lock_irqsave(&xpad->odata_lock, flags);
1499 switch (xpad->xtype) {
1544 packet->data[2] = xpad->odata_serial++;
1560 dev_dbg(&xpad->dev->dev,
1561 "%s - rumble command sent to unsupported xpad type: %d\n",
1562 __func__, xpad->xtype);
1567 retval = xpad_try_sending_next_out_packet(xpad);
1570 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1574 static int xpad_init_ff(struct usb_xpad *xpad)
1576 if (xpad->xtype == XTYPE_UNKNOWN)
1579 input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
1581 return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
1585 static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
1597 struct usb_xpad *xpad;
1620 static void xpad_send_led_command(struct usb_xpad *xpad, int command)
1623 &xpad->out_packets[XPAD_OUT_LED_IDX];
1628 spin_lock_irqsave(&xpad->odata_lock, flags);
1630 switch (xpad->xtype) {
1657 xpad_try_sending_next_out_packet(xpad);
1659 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1666 static void xpad_identify_controller(struct usb_xpad *xpad)
1668 led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
1677 xpad_send_led_command(xpad_led->xpad, value);
1680 static int xpad_led_probe(struct usb_xpad *xpad)
1686 if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W)
1689 xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
1693 xpad->pad_nr = ida_alloc(&xpad_pad_seq, GFP_KERNEL);
1694 if (xpad->pad_nr < 0) {
1695 error = xpad->pad_nr;
1699 snprintf(led->name, sizeof(led->name), "xpad%d", xpad->pad_nr);
1700 led->xpad = xpad;
1707 error = led_classdev_register(&xpad->udev->dev, led_cdev);
1711 xpad_identify_controller(xpad);
1716 ida_free(&xpad_pad_seq, xpad->pad_nr);
1719 xpad->led = NULL;
1723 static void xpad_led_disconnect(struct usb_xpad *xpad)
1725 struct xpad_led *xpad_led = xpad->led;
1729 ida_free(&xpad_pad_seq, xpad->pad_nr);
1734 static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
1735 static void xpad_led_disconnect(struct usb_xpad *xpad) { }
1738 static int xpad_start_input(struct usb_xpad *xpad)
1742 if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
1745 if (xpad->xtype == XTYPE_XBOXONE) {
1746 error = xpad_start_xbox_one(xpad);
1748 usb_kill_urb(xpad->irq_in);
1752 if (xpad->xtype == XTYPE_XBOX360) {
1759 error = usb_control_msg_recv(xpad->udev, 0,
1769 dev_warn(&xpad->dev->dev,
1777 static void xpad_stop_input(struct usb_xpad *xpad)
1779 usb_kill_urb(xpad->irq_in);
1782 static void xpad360w_poweroff_controller(struct usb_xpad *xpad)
1786 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1788 spin_lock_irqsave(&xpad->odata_lock, flags);
1806 xpad->last_out_packet = -1;
1807 xpad_try_sending_next_out_packet(xpad);
1809 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1812 static int xpad360w_start_input(struct usb_xpad *xpad)
1816 error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
1827 error = xpad_inquiry_pad_presence(xpad);
1829 usb_kill_urb(xpad->irq_in);
1836 static void xpad360w_stop_input(struct usb_xpad *xpad)
1838 usb_kill_urb(xpad->irq_in);
1841 flush_work(&xpad->work);
1846 struct usb_xpad *xpad = input_get_drvdata(dev);
1848 return xpad_start_input(xpad);
1853 struct usb_xpad *xpad = input_get_drvdata(dev);
1855 xpad_stop_input(xpad);
1860 struct usb_xpad *xpad = input_get_drvdata(input_dev);
1871 if (xpad->xtype == XTYPE_XBOXONE)
1889 static void xpad_deinit_input(struct usb_xpad *xpad)
1891 if (xpad->input_created) {
1892 xpad->input_created = false;
1893 xpad_led_disconnect(xpad);
1894 input_unregister_device(xpad->dev);
1898 static int xpad_init_input(struct usb_xpad *xpad)
1907 xpad->dev = input_dev;
1908 input_dev->name = xpad->name;
1909 input_dev->phys = xpad->phys;
1910 usb_to_input_id(xpad->udev, &input_dev->id);
1912 if (xpad->xtype == XTYPE_XBOX360W) {
1917 input_dev->dev.parent = &xpad->intf->dev;
1919 input_set_drvdata(input_dev, xpad);
1921 if (xpad->xtype != XTYPE_XBOX360W) {
1926 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
1937 if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W ||
1938 xpad->xtype == XTYPE_XBOXONE) {
1941 if (xpad->mapping & MAP_SELECT_BUTTON)
1948 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1955 if (xpad->mapping & MAP_PADDLES) {
1966 if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
1967 xpad->xtype == XTYPE_XBOX360W) {
1972 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1982 if (xpad->mapping & MAP_PROFILE_BUTTON)
1985 error = xpad_init_ff(xpad);
1989 error = xpad_led_probe(xpad);
1993 error = input_register_device(xpad->dev);
1997 xpad->input_created = true;
2001 xpad_led_disconnect(xpad);
2012 struct usb_xpad *xpad;
2025 xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
2026 if (!xpad)
2029 usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
2030 strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
2032 xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
2033 GFP_KERNEL, &xpad->idata_dma);
2034 if (!xpad->idata) {
2039 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
2040 if (!xpad->irq_in) {
2045 xpad->udev = udev;
2046 xpad->intf = intf;
2047 xpad->mapping = xpad_device[i].mapping;
2048 xpad->xtype = xpad_device[i].xtype;
2049 xpad->name = xpad_device[i].name;
2050 xpad->packet_type = PKT_XB;
2051 INIT_WORK(&xpad->work, xpad_presence_work);
2053 if (xpad->xtype == XTYPE_UNKNOWN) {
2056 xpad->xtype = XTYPE_XBOX360W;
2058 xpad->xtype = XTYPE_XBOXONE;
2060 xpad->xtype = XTYPE_XBOX360;
2062 xpad->xtype = XTYPE_XBOX;
2066 xpad->mapping |= MAP_DPAD_TO_BUTTONS;
2068 xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS;
2070 xpad->mapping |= MAP_STICKS_TO_NULL;
2073 if (xpad->xtype == XTYPE_XBOXONE &&
2103 error = xpad_init_output(intf, xpad, ep_irq_out);
2107 usb_fill_int_urb(xpad->irq_in, udev,
2109 xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
2110 xpad, ep_irq_in->bInterval);
2111 xpad->irq_in->transfer_dma = xpad->idata_dma;
2112 xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
2114 usb_set_intfdata(intf, xpad);
2122 xpad->packet_type = PKT_XBE1;
2132 xpad->packet_type = PKT_XBE2_FW_OLD;
2138 xpad->packet_type = PKT_XBE2_FW_5_EARLY;
2143 xpad->packet_type = PKT_XBE2_FW_5_11;
2148 if (xpad->xtype == XTYPE_XBOX360W) {
2156 error = xpad360w_start_input(xpad);
2168 error = xpad_init_input(xpad);
2175 xpad_deinit_output(xpad);
2177 usb_free_urb(xpad->irq_in);
2179 usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
2181 kfree(xpad);
2187 struct usb_xpad *xpad = usb_get_intfdata(intf);
2189 if (xpad->xtype == XTYPE_XBOX360W)
2190 xpad360w_stop_input(xpad);
2192 xpad_deinit_input(xpad);
2198 xpad_stop_output(xpad);
2200 xpad_deinit_output(xpad);
2202 usb_free_urb(xpad->irq_in);
2203 usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
2204 xpad->idata, xpad->idata_dma);
2206 kfree(xpad);
2213 struct usb_xpad *xpad = usb_get_intfdata(intf);
2214 struct input_dev *input = xpad->dev;
2216 if (xpad->xtype == XTYPE_XBOX360W) {
2222 xpad360w_stop_input(xpad);
2230 if (auto_poweroff && xpad->pad_present)
2231 xpad360w_poweroff_controller(xpad);
2235 xpad_stop_input(xpad);
2239 xpad_stop_output(xpad);
2246 struct usb_xpad *xpad = usb_get_intfdata(intf);
2247 struct input_dev *input = xpad->dev;
2250 if (xpad->xtype == XTYPE_XBOX360W) {
2251 retval = xpad360w_start_input(xpad);
2255 retval = xpad_start_input(xpad);
2256 } else if (xpad->xtype == XTYPE_XBOXONE) {
2262 retval = xpad_start_xbox_one(xpad);
2271 .name = "xpad",