Lines Matching refs:xpad

23  *  - ITO Takayuki for providing essential xpad information on his website
727 static int xpad_init_input(struct usb_xpad *xpad);
728 static void xpad_deinit_input(struct usb_xpad *xpad);
729 static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num);
730 static void xpad360w_poweroff_controller(struct usb_xpad *xpad);
741 static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
743 struct input_dev *dev = xpad->dev;
745 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
760 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
769 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
812 static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
820 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
834 if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
835 xpad->xtype == XTYPE_XBOX360W) {
859 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
874 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
885 if (xpad->xtype == XTYPE_XBOX360W) {
886 if (xpad->mode_btn_down_ts > 0 && xpad->pad_present &&
887 ((ktime_get_seconds() - xpad->mode_btn_down_ts) >=
889 xpad360w_poweroff_controller(xpad);
890 xpad->mode_btn_down_ts = 0;
896 xpad->mode_btn_down_ts = ktime_get_seconds();
898 xpad->mode_btn_down_ts = 0;
904 struct usb_xpad *xpad = container_of(work, struct usb_xpad, work);
907 if (xpad->pad_present) {
908 error = xpad_init_input(xpad);
911 dev_err(&xpad->dev->dev,
914 rcu_assign_pointer(xpad->x360w_dev, xpad->dev);
917 RCU_INIT_POINTER(xpad->x360w_dev, NULL);
923 xpad_deinit_input(xpad);
941 static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
950 if (xpad->pad_present != present) {
951 xpad->pad_present = present;
952 schedule_work(&xpad->work);
961 dev = rcu_dereference(xpad->x360w_dev);
963 xpad360_process_packet(xpad, dev, cmd, &data[4]);
976 static void xpadone_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
978 struct input_dev *dev = xpad->dev;
989 xpadone_ack_mode_report(xpad, data[2]);
997 if (xpad->packet_type == PKT_XBE2_FW_5_11) {
1017 if (xpad->mapping & MAP_SELECT_BUTTON)
1027 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1048 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
1063 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1076 if (xpad->mapping & MAP_PROFILE_BUTTON)
1081 if (xpad->mapping & MAP_PADDLES) {
1082 if (xpad->packet_type == PKT_XBE1) {
1095 } else if (xpad->packet_type == PKT_XBE2_FW_OLD) {
1108 } else if (xpad->packet_type == PKT_XBE2_FW_5_EARLY) {
1135 struct usb_xpad *xpad = urb->context;
1136 struct device *dev = &xpad->intf->dev;
1158 switch (xpad->xtype) {
1160 xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
1163 xpad360w_process_packet(xpad, 0, xpad->idata);
1166 xpadone_process_packet(xpad, 0, xpad->idata);
1169 xpad_process_packet(xpad, 0, xpad->idata);
1179 /* Callers must hold xpad->odata_lock spinlock */
1180 static bool xpad_prepare_next_init_packet(struct usb_xpad *xpad)
1184 if (xpad->xtype != XTYPE_XBOXONE)
1188 while (xpad->init_seq < ARRAY_SIZE(xboxone_init_packets)) {
1189 init_packet = &xboxone_init_packets[xpad->init_seq++];
1192 init_packet->idVendor != xpad->dev->id.vendor)
1196 init_packet->idProduct != xpad->dev->id.product)
1200 memcpy(xpad->odata, init_packet->data, init_packet->len);
1201 xpad->irq_out->transfer_buffer_length = init_packet->len;
1204 xpad->odata[2] = xpad->odata_serial++;
1211 /* Callers must hold xpad->odata_lock spinlock */
1212 static bool xpad_prepare_next_out_packet(struct usb_xpad *xpad)
1218 if (xpad_prepare_next_init_packet(xpad))
1222 if (++xpad->last_out_packet >= XPAD_NUM_OUT_PACKETS)
1223 xpad->last_out_packet = 0;
1225 pkt = &xpad->out_packets[xpad->last_out_packet];
1227 dev_dbg(&xpad->intf->dev,
1229 __func__, xpad->last_out_packet);
1236 memcpy(xpad->odata, packet->data, packet->len);
1237 xpad->irq_out->transfer_buffer_length = packet->len;
1245 /* Callers must hold xpad->odata_lock spinlock */
1246 static int xpad_try_sending_next_out_packet(struct usb_xpad *xpad)
1250 if (!xpad->irq_out_active && xpad_prepare_next_out_packet(xpad)) {
1251 usb_anchor_urb(xpad->irq_out, &xpad->irq_out_anchor);
1252 error = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
1254 dev_err(&xpad->intf->dev,
1257 usb_unanchor_urb(xpad->irq_out);
1261 xpad->irq_out_active = true;
1269 struct usb_xpad *xpad = urb->context;
1270 struct device *dev = &xpad->intf->dev;
1275 spin_lock_irqsave(&xpad->odata_lock, flags);
1280 xpad->irq_out_active = xpad_prepare_next_out_packet(xpad);
1289 xpad->irq_out_active = false;
1298 if (xpad->irq_out_active) {
1299 usb_anchor_urb(urb, &xpad->irq_out_anchor);
1306 xpad->irq_out_active = false;
1310 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1313 static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad,
1318 if (xpad->xtype == XTYPE_UNKNOWN)
1321 init_usb_anchor(&xpad->irq_out_anchor);
1323 xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN,
1324 GFP_KERNEL, &xpad->odata_dma);
1325 if (!xpad->odata)
1328 spin_lock_init(&xpad->odata_lock);
1330 xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
1331 if (!xpad->irq_out) {
1336 usb_fill_int_urb(xpad->irq_out, xpad->udev,
1337 usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress),
1338 xpad->odata, XPAD_PKT_LEN,
1339 xpad_irq_out, xpad, ep_irq_out->bInterval);
1340 xpad->irq_out->transfer_dma = xpad->odata_dma;
1341 xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1346 usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma);
1350 static void xpad_stop_output(struct usb_xpad *xpad)
1352 if (xpad->xtype != XTYPE_UNKNOWN) {
1353 if (!usb_wait_anchor_empty_timeout(&xpad->irq_out_anchor,
1355 dev_warn(&xpad->intf->dev,
1357 usb_kill_anchored_urbs(&xpad->irq_out_anchor);
1362 static void xpad_deinit_output(struct usb_xpad *xpad)
1364 if (xpad->xtype != XTYPE_UNKNOWN) {
1365 usb_free_urb(xpad->irq_out);
1366 usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
1367 xpad->odata, xpad->odata_dma);
1371 static int xpad_inquiry_pad_presence(struct usb_xpad *xpad)
1374 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1378 spin_lock_irqsave(&xpad->odata_lock, flags);
1396 xpad->last_out_packet = -1;
1397 retval = xpad_try_sending_next_out_packet(xpad);
1399 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1404 static int xpad_start_xbox_one(struct usb_xpad *xpad)
1409 if (usb_ifnum_to_if(xpad->udev, GIP_WIRED_INTF_AUDIO)) {
1416 retval = usb_set_interface(xpad->udev,
1419 dev_warn(&xpad->dev->dev,
1424 spin_lock_irqsave(&xpad->odata_lock, flags);
1431 xpad->init_seq = 0;
1432 retval = xpad_try_sending_next_out_packet(xpad);
1434 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1439 static void xpadone_ack_mode_report(struct usb_xpad *xpad, u8 seq_num)
1443 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1449 spin_lock_irqsave(&xpad->odata_lock, flags);
1457 xpad->last_out_packet = -1;
1458 xpad_try_sending_next_out_packet(xpad);
1460 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1466 struct usb_xpad *xpad = input_get_drvdata(dev);
1467 struct xpad_output_packet *packet = &xpad->out_packets[XPAD_OUT_FF_IDX];
1479 spin_lock_irqsave(&xpad->odata_lock, flags);
1481 switch (xpad->xtype) {
1526 packet->data[2] = xpad->odata_serial++;
1542 dev_dbg(&xpad->dev->dev,
1543 "%s - rumble command sent to unsupported xpad type: %d\n",
1544 __func__, xpad->xtype);
1549 retval = xpad_try_sending_next_out_packet(xpad);
1552 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1556 static int xpad_init_ff(struct usb_xpad *xpad)
1558 if (xpad->xtype == XTYPE_UNKNOWN)
1561 input_set_capability(xpad->dev, EV_FF, FF_RUMBLE);
1563 return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect);
1567 static int xpad_init_ff(struct usb_xpad *xpad) { return 0; }
1579 struct usb_xpad *xpad;
1602 static void xpad_send_led_command(struct usb_xpad *xpad, int command)
1605 &xpad->out_packets[XPAD_OUT_LED_IDX];
1610 spin_lock_irqsave(&xpad->odata_lock, flags);
1612 switch (xpad->xtype) {
1639 xpad_try_sending_next_out_packet(xpad);
1641 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1648 static void xpad_identify_controller(struct usb_xpad *xpad)
1650 led_set_brightness(&xpad->led->led_cdev, (xpad->pad_nr % 4) + 2);
1659 xpad_send_led_command(xpad_led->xpad, value);
1662 static int xpad_led_probe(struct usb_xpad *xpad)
1668 if (xpad->xtype != XTYPE_XBOX360 && xpad->xtype != XTYPE_XBOX360W)
1671 xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL);
1675 xpad->pad_nr = ida_simple_get(&xpad_pad_seq, 0, 0, GFP_KERNEL);
1676 if (xpad->pad_nr < 0) {
1677 error = xpad->pad_nr;
1681 snprintf(led->name, sizeof(led->name), "xpad%d", xpad->pad_nr);
1682 led->xpad = xpad;
1689 error = led_classdev_register(&xpad->udev->dev, led_cdev);
1693 xpad_identify_controller(xpad);
1698 ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1701 xpad->led = NULL;
1705 static void xpad_led_disconnect(struct usb_xpad *xpad)
1707 struct xpad_led *xpad_led = xpad->led;
1711 ida_simple_remove(&xpad_pad_seq, xpad->pad_nr);
1716 static int xpad_led_probe(struct usb_xpad *xpad) { return 0; }
1717 static void xpad_led_disconnect(struct usb_xpad *xpad) { }
1720 static int xpad_start_input(struct usb_xpad *xpad)
1724 if (usb_submit_urb(xpad->irq_in, GFP_KERNEL))
1727 if (xpad->xtype == XTYPE_XBOXONE) {
1728 error = xpad_start_xbox_one(xpad);
1730 usb_kill_urb(xpad->irq_in);
1734 if (xpad->xtype == XTYPE_XBOX360) {
1741 error = usb_control_msg_recv(xpad->udev, 0,
1751 dev_warn(&xpad->dev->dev,
1759 static void xpad_stop_input(struct usb_xpad *xpad)
1761 usb_kill_urb(xpad->irq_in);
1764 static void xpad360w_poweroff_controller(struct usb_xpad *xpad)
1768 &xpad->out_packets[XPAD_OUT_CMD_IDX];
1770 spin_lock_irqsave(&xpad->odata_lock, flags);
1788 xpad->last_out_packet = -1;
1789 xpad_try_sending_next_out_packet(xpad);
1791 spin_unlock_irqrestore(&xpad->odata_lock, flags);
1794 static int xpad360w_start_input(struct usb_xpad *xpad)
1798 error = usb_submit_urb(xpad->irq_in, GFP_KERNEL);
1809 error = xpad_inquiry_pad_presence(xpad);
1811 usb_kill_urb(xpad->irq_in);
1818 static void xpad360w_stop_input(struct usb_xpad *xpad)
1820 usb_kill_urb(xpad->irq_in);
1823 flush_work(&xpad->work);
1828 struct usb_xpad *xpad = input_get_drvdata(dev);
1830 return xpad_start_input(xpad);
1835 struct usb_xpad *xpad = input_get_drvdata(dev);
1837 xpad_stop_input(xpad);
1842 struct usb_xpad *xpad = input_get_drvdata(input_dev);
1853 if (xpad->xtype == XTYPE_XBOXONE)
1871 static void xpad_deinit_input(struct usb_xpad *xpad)
1873 if (xpad->input_created) {
1874 xpad->input_created = false;
1875 xpad_led_disconnect(xpad);
1876 input_unregister_device(xpad->dev);
1880 static int xpad_init_input(struct usb_xpad *xpad)
1889 xpad->dev = input_dev;
1890 input_dev->name = xpad->name;
1891 input_dev->phys = xpad->phys;
1892 usb_to_input_id(xpad->udev, &input_dev->id);
1894 if (xpad->xtype == XTYPE_XBOX360W) {
1899 input_dev->dev.parent = &xpad->intf->dev;
1901 input_set_drvdata(input_dev, xpad);
1903 if (xpad->xtype != XTYPE_XBOX360W) {
1908 if (!(xpad->mapping & MAP_STICKS_TO_NULL)) {
1919 if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W ||
1920 xpad->xtype == XTYPE_XBOXONE) {
1923 if (xpad->mapping & MAP_SELECT_BUTTON)
1930 if (xpad->mapping & MAP_DPAD_TO_BUTTONS) {
1937 if (xpad->mapping & MAP_PADDLES) {
1948 if (!(xpad->mapping & MAP_DPAD_TO_BUTTONS) ||
1949 xpad->xtype == XTYPE_XBOX360W) {
1954 if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) {
1964 if (xpad->mapping & MAP_PROFILE_BUTTON)
1967 error = xpad_init_ff(xpad);
1971 error = xpad_led_probe(xpad);
1975 error = input_register_device(xpad->dev);
1979 xpad->input_created = true;
1983 xpad_led_disconnect(xpad);
1994 struct usb_xpad *xpad;
2007 xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL);
2008 if (!xpad)
2011 usb_make_path(udev, xpad->phys, sizeof(xpad->phys));
2012 strlcat(xpad->phys, "/input0", sizeof(xpad->phys));
2014 xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN,
2015 GFP_KERNEL, &xpad->idata_dma);
2016 if (!xpad->idata) {
2021 xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL);
2022 if (!xpad->irq_in) {
2027 xpad->udev = udev;
2028 xpad->intf = intf;
2029 xpad->mapping = xpad_device[i].mapping;
2030 xpad->xtype = xpad_device[i].xtype;
2031 xpad->name = xpad_device[i].name;
2032 xpad->packet_type = PKT_XB;
2033 INIT_WORK(&xpad->work, xpad_presence_work);
2035 if (xpad->xtype == XTYPE_UNKNOWN) {
2038 xpad->xtype = XTYPE_XBOX360W;
2040 xpad->xtype = XTYPE_XBOXONE;
2042 xpad->xtype = XTYPE_XBOX360;
2044 xpad->xtype = XTYPE_XBOX;
2048 xpad->mapping |= MAP_DPAD_TO_BUTTONS;
2050 xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS;
2052 xpad->mapping |= MAP_STICKS_TO_NULL;
2055 if (xpad->xtype == XTYPE_XBOXONE &&
2085 error = xpad_init_output(intf, xpad, ep_irq_out);
2089 usb_fill_int_urb(xpad->irq_in, udev,
2091 xpad->idata, XPAD_PKT_LEN, xpad_irq_in,
2092 xpad, ep_irq_in->bInterval);
2093 xpad->irq_in->transfer_dma = xpad->idata_dma;
2094 xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
2096 usb_set_intfdata(intf, xpad);
2104 xpad->packet_type = PKT_XBE1;
2114 xpad->packet_type = PKT_XBE2_FW_OLD;
2120 xpad->packet_type = PKT_XBE2_FW_5_EARLY;
2125 xpad->packet_type = PKT_XBE2_FW_5_11;
2130 if (xpad->xtype == XTYPE_XBOX360W) {
2138 error = xpad360w_start_input(xpad);
2150 error = xpad_init_input(xpad);
2157 xpad_deinit_output(xpad);
2159 usb_free_urb(xpad->irq_in);
2161 usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
2163 kfree(xpad);
2169 struct usb_xpad *xpad = usb_get_intfdata(intf);
2171 if (xpad->xtype == XTYPE_XBOX360W)
2172 xpad360w_stop_input(xpad);
2174 xpad_deinit_input(xpad);
2180 xpad_stop_output(xpad);
2182 xpad_deinit_output(xpad);
2184 usb_free_urb(xpad->irq_in);
2185 usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
2186 xpad->idata, xpad->idata_dma);
2188 kfree(xpad);
2195 struct usb_xpad *xpad = usb_get_intfdata(intf);
2196 struct input_dev *input = xpad->dev;
2198 if (xpad->xtype == XTYPE_XBOX360W) {
2204 xpad360w_stop_input(xpad);
2212 if (auto_poweroff && xpad->pad_present)
2213 xpad360w_poweroff_controller(xpad);
2217 xpad_stop_input(xpad);
2221 xpad_stop_output(xpad);
2228 struct usb_xpad *xpad = usb_get_intfdata(intf);
2229 struct input_dev *input = xpad->dev;
2232 if (xpad->xtype == XTYPE_XBOX360W) {
2233 retval = xpad360w_start_input(xpad);
2237 retval = xpad_start_input(xpad);
2238 } else if (xpad->xtype == XTYPE_XBOXONE) {
2244 retval = xpad_start_xbox_one(xpad);
2253 .name = "xpad",