wacom_sys.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /*
  2. * drivers/input/tablet/wacom_sys.c
  3. *
  4. * USB Wacom Graphire and Wacom Intuos tablet support - system specific code
  5. */
  6. /*
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. */
  12. #include "wacom.h"
  13. #include "wacom_wac.h"
  14. #define USB_REQ_GET_REPORT 0x01
  15. #define USB_REQ_SET_REPORT 0x09
  16. static int usb_get_report(struct usb_interface *intf, unsigned char type,
  17. unsigned char id, void *buf, int size)
  18. {
  19. return usb_control_msg(interface_to_usbdev(intf),
  20. usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
  21. USB_REQ_GET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  22. (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
  23. buf, size, 100);
  24. }
  25. static int usb_set_report(struct usb_interface *intf, unsigned char type,
  26. unsigned char id, void *buf, int size)
  27. {
  28. return usb_control_msg(interface_to_usbdev(intf),
  29. usb_sndctrlpipe(interface_to_usbdev(intf), 0),
  30. USB_REQ_SET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
  31. (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber,
  32. buf, size, 1000);
  33. }
  34. static struct input_dev * get_input_dev(struct wacom_combo *wcombo)
  35. {
  36. return wcombo->wacom->dev;
  37. }
  38. static void wacom_sys_irq(struct urb *urb)
  39. {
  40. struct wacom *wacom = urb->context;
  41. struct wacom_combo wcombo;
  42. int retval;
  43. switch (urb->status) {
  44. case 0:
  45. /* success */
  46. break;
  47. case -ECONNRESET:
  48. case -ENOENT:
  49. case -ESHUTDOWN:
  50. /* this urb is terminated, clean up */
  51. dbg("%s - urb shutting down with status: %d", __func__, urb->status);
  52. return;
  53. default:
  54. dbg("%s - nonzero urb status received: %d", __func__, urb->status);
  55. goto exit;
  56. }
  57. wcombo.wacom = wacom;
  58. wcombo.urb = urb;
  59. if (wacom_wac_irq(wacom->wacom_wac, (void *)&wcombo))
  60. input_sync(get_input_dev(&wcombo));
  61. exit:
  62. usb_mark_last_busy(wacom->usbdev);
  63. retval = usb_submit_urb (urb, GFP_ATOMIC);
  64. if (retval)
  65. err ("%s - usb_submit_urb failed with result %d",
  66. __func__, retval);
  67. }
  68. void wacom_report_key(void *wcombo, unsigned int key_type, int key_data)
  69. {
  70. input_report_key(get_input_dev((struct wacom_combo *)wcombo), key_type, key_data);
  71. return;
  72. }
  73. void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data)
  74. {
  75. input_report_abs(get_input_dev((struct wacom_combo *)wcombo), abs_type, abs_data);
  76. return;
  77. }
  78. void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data)
  79. {
  80. input_report_rel(get_input_dev((struct wacom_combo *)wcombo), rel_type, rel_data);
  81. return;
  82. }
  83. void wacom_input_event(void *wcombo, unsigned int type, unsigned int code, int value)
  84. {
  85. input_event(get_input_dev((struct wacom_combo *)wcombo), type, code, value);
  86. return;
  87. }
  88. __u16 wacom_be16_to_cpu(unsigned char *data)
  89. {
  90. __u16 value;
  91. value = be16_to_cpu(*(__be16 *) data);
  92. return value;
  93. }
  94. __u16 wacom_le16_to_cpu(unsigned char *data)
  95. {
  96. __u16 value;
  97. value = le16_to_cpu(*(__le16 *) data);
  98. return value;
  99. }
  100. void wacom_input_sync(void *wcombo)
  101. {
  102. input_sync(get_input_dev((struct wacom_combo *)wcombo));
  103. return;
  104. }
  105. static int wacom_open(struct input_dev *dev)
  106. {
  107. struct wacom *wacom = input_get_drvdata(dev);
  108. mutex_lock(&wacom->lock);
  109. wacom->irq->dev = wacom->usbdev;
  110. if (usb_autopm_get_interface(wacom->intf) < 0) {
  111. mutex_unlock(&wacom->lock);
  112. return -EIO;
  113. }
  114. if (usb_submit_urb(wacom->irq, GFP_KERNEL)) {
  115. usb_autopm_put_interface(wacom->intf);
  116. mutex_unlock(&wacom->lock);
  117. return -EIO;
  118. }
  119. wacom->open = 1;
  120. wacom->intf->needs_remote_wakeup = 1;
  121. mutex_unlock(&wacom->lock);
  122. return 0;
  123. }
  124. static void wacom_close(struct input_dev *dev)
  125. {
  126. struct wacom *wacom = input_get_drvdata(dev);
  127. mutex_lock(&wacom->lock);
  128. usb_kill_urb(wacom->irq);
  129. wacom->open = 0;
  130. wacom->intf->needs_remote_wakeup = 0;
  131. mutex_unlock(&wacom->lock);
  132. }
  133. void input_dev_mo(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  134. {
  135. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_1) |
  136. BIT_MASK(BTN_5);
  137. input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0);
  138. }
  139. void input_dev_g4(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  140. {
  141. input_dev->evbit[0] |= BIT_MASK(EV_MSC);
  142. input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
  143. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER);
  144. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) |
  145. BIT_MASK(BTN_4);
  146. }
  147. void input_dev_g(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  148. {
  149. input_dev->evbit[0] |= BIT_MASK(EV_REL);
  150. input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
  151. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) |
  152. BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
  153. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) |
  154. BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_STYLUS2);
  155. input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0);
  156. }
  157. void input_dev_i3s(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  158. {
  159. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_FINGER);
  160. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_0) |
  161. BIT_MASK(BTN_1) | BIT_MASK(BTN_2) | BIT_MASK(BTN_3);
  162. input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0);
  163. input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0);
  164. }
  165. void input_dev_i3(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  166. {
  167. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_4) |
  168. BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | BIT_MASK(BTN_7);
  169. input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0);
  170. }
  171. void input_dev_bee(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  172. {
  173. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_8) | BIT_MASK(BTN_9);
  174. }
  175. void input_dev_i(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  176. {
  177. input_dev->evbit[0] |= BIT_MASK(EV_MSC) | BIT_MASK(EV_REL);
  178. input_dev->mscbit[0] |= BIT_MASK(MSC_SERIAL);
  179. input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);
  180. input_dev->keybit[BIT_WORD(BTN_LEFT)] |= BIT_MASK(BTN_LEFT) |
  181. BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) |
  182. BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
  183. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER) |
  184. BIT_MASK(BTN_TOOL_MOUSE) | BIT_MASK(BTN_TOOL_BRUSH) |
  185. BIT_MASK(BTN_TOOL_PENCIL) | BIT_MASK(BTN_TOOL_AIRBRUSH) |
  186. BIT_MASK(BTN_TOOL_LENS) | BIT_MASK(BTN_STYLUS2);
  187. input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom_wac->features->distance_max, 0, 0);
  188. input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0);
  189. input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0);
  190. input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0);
  191. input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0);
  192. input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0);
  193. }
  194. void input_dev_pl(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  195. {
  196. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_STYLUS2) |
  197. BIT_MASK(BTN_TOOL_RUBBER);
  198. }
  199. void input_dev_pt(struct input_dev *input_dev, struct wacom_wac *wacom_wac)
  200. {
  201. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_RUBBER);
  202. }
  203. static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
  204. {
  205. struct usb_device *dev = interface_to_usbdev(intf);
  206. struct usb_endpoint_descriptor *endpoint;
  207. struct wacom *wacom;
  208. struct wacom_wac *wacom_wac;
  209. struct input_dev *input_dev;
  210. int error = -ENOMEM;
  211. char rep_data[2], limit = 0;
  212. wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
  213. wacom_wac = kzalloc(sizeof(struct wacom_wac), GFP_KERNEL);
  214. input_dev = input_allocate_device();
  215. if (!wacom || !input_dev || !wacom_wac)
  216. goto fail1;
  217. wacom_wac->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma);
  218. if (!wacom_wac->data)
  219. goto fail1;
  220. wacom->irq = usb_alloc_urb(0, GFP_KERNEL);
  221. if (!wacom->irq)
  222. goto fail2;
  223. wacom->usbdev = dev;
  224. wacom->dev = input_dev;
  225. wacom->intf = intf;
  226. mutex_init(&wacom->lock);
  227. usb_make_path(dev, wacom->phys, sizeof(wacom->phys));
  228. strlcat(wacom->phys, "/input0", sizeof(wacom->phys));
  229. wacom_wac->features = get_wacom_feature(id);
  230. BUG_ON(wacom_wac->features->pktlen > 10);
  231. input_dev->name = wacom_wac->features->name;
  232. wacom->wacom_wac = wacom_wac;
  233. usb_to_input_id(dev, &input_dev->id);
  234. input_dev->dev.parent = &intf->dev;
  235. input_set_drvdata(input_dev, wacom);
  236. input_dev->open = wacom_open;
  237. input_dev->close = wacom_close;
  238. input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
  239. input_dev->keybit[BIT_WORD(BTN_DIGI)] |= BIT_MASK(BTN_TOOL_PEN) |
  240. BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS);
  241. input_set_abs_params(input_dev, ABS_X, 0, wacom_wac->features->x_max, 4, 0);
  242. input_set_abs_params(input_dev, ABS_Y, 0, wacom_wac->features->y_max, 4, 0);
  243. input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom_wac->features->pressure_max, 0, 0);
  244. input_dev->absbit[BIT_WORD(ABS_MISC)] |= BIT_MASK(ABS_MISC);
  245. wacom_init_input_dev(input_dev, wacom_wac);
  246. endpoint = &intf->cur_altsetting->endpoint[0].desc;
  247. usb_fill_int_urb(wacom->irq, dev,
  248. usb_rcvintpipe(dev, endpoint->bEndpointAddress),
  249. wacom_wac->data, wacom_wac->features->pktlen,
  250. wacom_sys_irq, wacom, endpoint->bInterval);
  251. wacom->irq->transfer_dma = wacom->data_dma;
  252. wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
  253. error = input_register_device(wacom->dev);
  254. if (error)
  255. goto fail3;
  256. /* Ask the tablet to report tablet data. Repeat until it succeeds */
  257. do {
  258. rep_data[0] = 2;
  259. rep_data[1] = 2;
  260. usb_set_report(intf, 3, 2, rep_data, 2);
  261. usb_get_report(intf, 3, 2, rep_data, 2);
  262. } while (rep_data[1] != 2 && limit++ < 5);
  263. usb_set_intfdata(intf, wacom);
  264. return 0;
  265. fail3: usb_free_urb(wacom->irq);
  266. fail2: usb_buffer_free(dev, 10, wacom_wac->data, wacom->data_dma);
  267. fail1: input_free_device(input_dev);
  268. kfree(wacom);
  269. kfree(wacom_wac);
  270. return error;
  271. }
  272. static void wacom_disconnect(struct usb_interface *intf)
  273. {
  274. struct wacom *wacom = usb_get_intfdata(intf);
  275. usb_set_intfdata(intf, NULL);
  276. usb_kill_urb(wacom->irq);
  277. input_unregister_device(wacom->dev);
  278. usb_free_urb(wacom->irq);
  279. usb_buffer_free(interface_to_usbdev(intf), 10, wacom->wacom_wac->data, wacom->data_dma);
  280. kfree(wacom->wacom_wac);
  281. kfree(wacom);
  282. }
  283. static int wacom_suspend(struct usb_interface *intf, pm_message_t message)
  284. {
  285. struct wacom *wacom = usb_get_intfdata(intf);
  286. mutex_lock(&wacom->lock);
  287. usb_kill_urb(wacom->irq);
  288. mutex_unlock(&wacom->lock);
  289. return 0;
  290. }
  291. static int wacom_resume(struct usb_interface *intf)
  292. {
  293. struct wacom *wacom = usb_get_intfdata(intf);
  294. int rv;
  295. mutex_lock(&wacom->lock);
  296. if (wacom->open)
  297. rv = usb_submit_urb(wacom->irq, GFP_NOIO);
  298. else
  299. rv = 0;
  300. mutex_unlock(&wacom->lock);
  301. return rv;
  302. }
  303. static int wacom_reset_resume(struct usb_interface *intf)
  304. {
  305. return wacom_resume(intf);
  306. }
  307. static struct usb_driver wacom_driver = {
  308. .name = "wacom",
  309. .probe = wacom_probe,
  310. .disconnect = wacom_disconnect,
  311. .suspend = wacom_suspend,
  312. .resume = wacom_resume,
  313. .reset_resume = wacom_reset_resume,
  314. .supports_autosuspend = 1,
  315. };
  316. static int __init wacom_init(void)
  317. {
  318. int result;
  319. wacom_driver.id_table = get_device_table();
  320. result = usb_register(&wacom_driver);
  321. if (result == 0)
  322. info(DRIVER_VERSION ":" DRIVER_DESC);
  323. return result;
  324. }
  325. static void __exit wacom_exit(void)
  326. {
  327. usb_deregister(&wacom_driver);
  328. }
  329. module_init(wacom_init);
  330. module_exit(wacom_exit);