Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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