aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/input/wacom.c
diff options
context:
space:
mode:
authorPing Cheng <pingc@wacom.com>2005-06-06 03:25:50 -0400
committerDmitry Torokhov <dtor_core@ameritech.net>2005-06-06 03:25:50 -0400
commitb2f86369e3e999a70f98e2a812aa5ec1b3c7bd0b (patch)
tree5bed04a24c349223d7e57bfb798b2a78a907d11a /drivers/usb/input/wacom.c
parent53880546979605dae20ee0404a0e998e188fe7ad (diff)
Input: Wacom driver update
- add support for Cintiq 21UX - fix a Graphire bug - merge wacom_intuos3_irq into wacom_intuos_irq Signed-off-by: Ping Cheng <pingc@wacom.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/usb/input/wacom.c')
-rw-r--r--drivers/usb/input/wacom.c336
1 files changed, 153 insertions, 183 deletions
diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c
index e37d31b57b23..60df242ba67f 100644
--- a/drivers/usb/input/wacom.c
+++ b/drivers/usb/input/wacom.c
@@ -9,7 +9,7 @@
9 * Copyright (c) 2000 Daniel Egger <egger@suse.de> 9 * Copyright (c) 2000 Daniel Egger <egger@suse.de>
10 * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com> 10 * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com>
11 * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be> 11 * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be>
12 * Copyright (c) 2002-2004 Ping Cheng <pingc@wacom.com> 12 * Copyright (c) 2002-2005 Ping Cheng <pingc@wacom.com>
13 * 13 *
14 * ChangeLog: 14 * ChangeLog:
15 * v0.1 (vp) - Initial release 15 * v0.1 (vp) - Initial release
@@ -51,6 +51,9 @@
51 * - Cleanups here and there 51 * - Cleanups here and there
52 * v1.30.1 (pi) - Added Graphire3 support 52 * v1.30.1 (pi) - Added Graphire3 support
53 * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ... 53 * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ...
54 * v1.43 (pc) - Added support for Cintiq 21UX
55 - Fixed a Graphire bug
56 - Merged wacom_intuos3_irq into wacom_intuos_irq
54 */ 57 */
55 58
56/* 59/*
@@ -72,7 +75,7 @@
72/* 75/*
73 * Version Information 76 * Version Information
74 */ 77 */
75#define DRIVER_VERSION "v1.40" 78#define DRIVER_VERSION "v1.43"
76#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" 79#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>"
77#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" 80#define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver"
78#define DRIVER_LICENSE "GPL" 81#define DRIVER_LICENSE "GPL"
@@ -83,6 +86,16 @@ MODULE_LICENSE(DRIVER_LICENSE);
83 86
84#define USB_VENDOR_ID_WACOM 0x056a 87#define USB_VENDOR_ID_WACOM 0x056a
85 88
89enum {
90 PENPARTNER = 0,
91 GRAPHIRE,
92 PL,
93 INTUOS,
94 INTUOS3,
95 CINTIQ,
96 MAX_TYPE
97};
98
86struct wacom_features { 99struct wacom_features {
87 char *name; 100 char *name;
88 int pktlen; 101 int pktlen;
@@ -181,8 +194,8 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs)
181 wacom->tool[1] = BTN_TOOL_PEN; 194 wacom->tool[1] = BTN_TOOL_PEN;
182 } 195 }
183 input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */ 196 input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */
184 input_report_abs(dev, ABS_X, data[3] | ((__u32)data[2] << 7) | ((__u32)(data[1] & 0x03) << 14)); 197 input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
185 input_report_abs(dev, ABS_Y, data[6] | ((__u32)data[5] << 7) | ((__u32)(data[4] & 0x03) << 14)); 198 input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
186 input_report_abs(dev, ABS_PRESSURE, pressure); 199 input_report_abs(dev, ABS_PRESSURE, pressure);
187 200
188 input_report_key(dev, BTN_TOUCH, data[4] & 0x08); 201 input_report_key(dev, BTN_TOUCH, data[4] & 0x08);
@@ -339,44 +352,44 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs)
339 352
340 input_regs(dev, regs); 353 input_regs(dev, regs);
341 354
342 switch ((data[1] >> 5) & 3) { 355 if ( data[1] & 0x10 ) /* in prox */
343 356 {
344 case 0: /* Pen */ 357 switch ((data[1] >> 5) & 3) {
345 input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x80);
346 break;
347
348 case 1: /* Rubber */
349 input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x80);
350 break;
351 358
352 case 2: /* Mouse with wheel */ 359 case 0: /* Pen */
353 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); 360 wacom->tool[0] = BTN_TOOL_PEN;
354 input_report_rel(dev, REL_WHEEL, (signed char) data[6]); 361 break;
355 /* fall through */
356 362
357 case 3: /* Mouse without wheel */ 363 case 1: /* Rubber */
358 input_report_key(dev, BTN_TOOL_MOUSE, data[7] > 24); 364 wacom->tool[0] = BTN_TOOL_RUBBER;
359 input_report_key(dev, BTN_LEFT, data[1] & 0x01); 365 break;
360 input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
361 input_report_abs(dev, ABS_DISTANCE, data[7]);
362 366
363 input_report_abs(dev, ABS_X, x); 367 case 2: /* Mouse with wheel */
364 input_report_abs(dev, ABS_Y, y); 368 input_report_key(dev, BTN_MIDDLE, data[1] & 0x04);
369 input_report_rel(dev, REL_WHEEL, (signed char) data[6]);
370 /* fall through */
365 371
366 input_sync(dev); 372 case 3: /* Mouse without wheel */
367 goto exit; 373 wacom->tool[0] = BTN_TOOL_MOUSE;
374 input_report_key(dev, BTN_LEFT, data[1] & 0x01);
375 input_report_key(dev, BTN_RIGHT, data[1] & 0x02);
376 input_report_abs(dev, ABS_DISTANCE, data[7]);
377 break;
378 }
368 } 379 }
369 380
370 if (data[1] & 0x80) { 381 if (data[1] & 0x80) {
371 input_report_abs(dev, ABS_X, x); 382 input_report_abs(dev, ABS_X, x);
372 input_report_abs(dev, ABS_Y, y); 383 input_report_abs(dev, ABS_Y, y);
373 } 384 }
385 if (wacom->tool[0] != BTN_TOOL_MOUSE) {
386 input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6]));
387 input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
388 input_report_key(dev, BTN_STYLUS, data[1] & 0x02);
389 input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
390 }
374 391
375 input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6])); 392 input_report_key(dev, wacom->tool[0], data[1] & 0x10);
376 input_report_key(dev, BTN_TOUCH, data[1] & 0x01);
377 input_report_key(dev, BTN_STYLUS, data[1] & 0x02);
378 input_report_key(dev, BTN_STYLUS2, data[1] & 0x04);
379
380 input_sync(dev); 393 input_sync(dev);
381 394
382exit: 395exit:
@@ -400,11 +413,11 @@ static int wacom_intuos_inout(struct urb *urb)
400 if ((data[1] & 0xfc) == 0xc0) 413 if ((data[1] & 0xfc) == 0xc0)
401 { 414 {
402 /* serial number of the tool */ 415 /* serial number of the tool */
403 wacom->serial[idx] = ((__u32)(data[3] & 0x0f) << 28) + 416 wacom->serial[idx] = ((data[3] & 0x0f) << 28) +
404 ((__u32)data[4] << 20) + ((__u32)data[5] << 12) + 417 (data[4] << 20) + (data[5] << 12) +
405 ((__u32)data[6] << 4) + (data[7] >> 4); 418 (data[6] << 4) + (data[7] >> 4);
406 419
407 switch (((__u32)data[2] << 4) | (data[3] >> 4)) { 420 switch ((data[2] << 4) | (data[3] >> 4)) {
408 case 0x812: /* Inking pen */ 421 case 0x812: /* Inking pen */
409 case 0x801: /* Intuos3 Inking pen */ 422 case 0x801: /* Intuos3 Inking pen */
410 case 0x012: 423 case 0x012:
@@ -448,7 +461,7 @@ static int wacom_intuos_inout(struct urb *urb)
448 case 0x112: 461 case 0x112:
449 case 0x913: /* Intuos3 Airbrush */ 462 case 0x913: /* Intuos3 Airbrush */
450 wacom->tool[idx] = BTN_TOOL_AIRBRUSH; 463 wacom->tool[idx] = BTN_TOOL_AIRBRUSH;
451 break; /* Airbrush */ 464 break;
452 default: /* Unknown tool */ 465 default: /* Unknown tool */
453 wacom->tool[idx] = BTN_TOOL_PEN; 466 wacom->tool[idx] = BTN_TOOL_PEN;
454 } 467 }
@@ -479,7 +492,7 @@ static void wacom_intuos_general(struct urb *urb)
479 /* general pen packet */ 492 /* general pen packet */
480 if ((data[1] & 0xb8) == 0xa0) 493 if ((data[1] & 0xb8) == 0xa0)
481 { 494 {
482 t = ((__u32)data[6] << 2) | ((data[7] >> 6) & 3); 495 t = (data[6] << 2) | ((data[7] >> 6) & 3);
483 input_report_abs(dev, ABS_PRESSURE, t); 496 input_report_abs(dev, ABS_PRESSURE, t);
484 input_report_abs(dev, ABS_TILT_X, 497 input_report_abs(dev, ABS_TILT_X,
485 ((data[7] << 1) & 0x7e) | (data[8] >> 7)); 498 ((data[7] << 1) & 0x7e) | (data[8] >> 7));
@@ -493,7 +506,7 @@ static void wacom_intuos_general(struct urb *urb)
493 if ((data[1] & 0xbc) == 0xb4) 506 if ((data[1] & 0xbc) == 0xb4)
494 { 507 {
495 input_report_abs(dev, ABS_WHEEL, 508 input_report_abs(dev, ABS_WHEEL,
496 ((__u32)data[6] << 2) | ((data[7] >> 6) & 3)); 509 (data[6] << 2) | ((data[7] >> 6) & 3));
497 input_report_abs(dev, ABS_TILT_X, 510 input_report_abs(dev, ABS_TILT_X,
498 ((data[7] << 1) & 0x7e) | (data[8] >> 7)); 511 ((data[7] << 1) & 0x7e) | (data[8] >> 7));
499 input_report_abs(dev, ABS_TILT_Y, data[8] & 0x7f); 512 input_report_abs(dev, ABS_TILT_Y, data[8] & 0x7f);
@@ -525,7 +538,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
525 goto exit; 538 goto exit;
526 } 539 }
527 540
528 if (data[0] != 2 && data[0] != 5 && data[0] != 6) { 541 if (data[0] != 2 && data[0] != 5 && data[0] != 6 && data[0] != 12) {
529 dbg("wacom_intuos_irq: received unknown report #%d", data[0]); 542 dbg("wacom_intuos_irq: received unknown report #%d", data[0]);
530 goto exit; 543 goto exit;
531 } 544 }
@@ -535,101 +548,6 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs)
535 /* tool number */ 548 /* tool number */
536 idx = data[1] & 0x01; 549 idx = data[1] & 0x01;
537 550
538 /* process in/out prox events */
539 if (wacom_intuos_inout(urb)) goto exit;
540
541 input_report_abs(dev, ABS_X, be16_to_cpu(*(__be16 *) &data[2]));
542 input_report_abs(dev, ABS_Y, be16_to_cpu(*(__be16 *) &data[4]));
543 input_report_abs(dev, ABS_DISTANCE, data[9]);
544
545 /* process general packets */
546 wacom_intuos_general(urb);
547
548 if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) { /* 4D mouse or Lens cursor packets */
549
550 if (data[1] & 0x02) { /* Rotation packet */
551
552 t = ((__u32)data[6] << 3) | ((data[7] >> 5) & 7);
553 input_report_abs(dev, ABS_RZ, (data[7] & 0x20) ? ((t - 1) / 2) : -t / 2);
554
555 } else {
556
557 if ((data[1] & 0x10) == 0) { /* 4D mouse packets */
558
559 input_report_key(dev, BTN_LEFT, data[8] & 0x01);
560 input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
561 input_report_key(dev, BTN_RIGHT, data[8] & 0x04);
562
563 input_report_key(dev, BTN_SIDE, data[8] & 0x20);
564 input_report_key(dev, BTN_EXTRA, data[8] & 0x10);
565 t = ((__u32)data[6] << 2) | ((data[7] >> 6) & 3);
566 input_report_abs(dev, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
567
568 } else {
569 if (wacom->tool[idx] == BTN_TOOL_MOUSE) { /* 2D mouse packets */
570 input_report_key(dev, BTN_LEFT, data[8] & 0x04);
571 input_report_key(dev, BTN_MIDDLE, data[8] & 0x08);
572 input_report_key(dev, BTN_RIGHT, data[8] & 0x10);
573 input_report_rel(dev, REL_WHEEL,
574 (-(__u32)(data[8] & 0x01) + (__u32)((data[8] & 0x02) >> 1)));
575 }
576 else { /* Lens cursor packets */
577 input_report_key(dev, BTN_LEFT, data[8] & 0x01);
578 input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
579 input_report_key(dev, BTN_RIGHT, data[8] & 0x04);
580 input_report_key(dev, BTN_SIDE, data[8] & 0x10);
581 input_report_key(dev, BTN_EXTRA, data[8] & 0x08);
582 }
583 }
584 }
585 }
586
587 input_report_key(dev, wacom->tool[idx], 1);
588 input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]);
589 input_sync(dev);
590
591exit:
592 retval = usb_submit_urb (urb, GFP_ATOMIC);
593 if (retval)
594 err ("%s - usb_submit_urb failed with result %d",
595 __FUNCTION__, retval);
596}
597
598static void wacom_intuos3_irq(struct urb *urb, struct pt_regs *regs)
599{
600 struct wacom *wacom = urb->context;
601 unsigned char *data = wacom->data;
602 struct input_dev *dev = &wacom->dev;
603 unsigned int t;
604 int idx, retval;
605
606 switch (urb->status) {
607 case 0:
608 /* success */
609 break;
610 case -ECONNRESET:
611 case -ENOENT:
612 case -ESHUTDOWN:
613 /* this urb is terminated, clean up */
614 dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status);
615 return;
616 default:
617 dbg("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
618 goto exit;
619 }
620
621 /* check for valid report */
622 if (data[0] != 2 && data[0] != 5 && data[0] != 12)
623 {
624 printk(KERN_INFO "wacom_intuos3_irq: received unknown report #%d\n", data[0]);
625 goto exit;
626 }
627
628 input_regs(dev, regs);
629
630 /* tool index is always 0 here since there is no dual input tool */
631 idx = data[1] & 0x01;
632
633 /* pad packets. Works as a second tool and is always in prox */ 551 /* pad packets. Works as a second tool and is always in prox */
634 if (data[0] == 12) 552 if (data[0] == 12)
635 { 553 {
@@ -657,35 +575,84 @@ static void wacom_intuos3_irq(struct urb *urb, struct pt_regs *regs)
657 /* process in/out prox events */ 575 /* process in/out prox events */
658 if (wacom_intuos_inout(urb)) goto exit; 576 if (wacom_intuos_inout(urb)) goto exit;
659 577
660 input_report_abs(dev, ABS_X, ((__u32)data[2] << 9) | ((__u32)data[3] << 1) | ((data[9] >> 1) & 1)); 578 /* Cintiq doesn't send data when RDY bit isn't set */
661 input_report_abs(dev, ABS_Y, ((__u32)data[4] << 9) | ((__u32)data[5] << 1) | (data[9] & 1)); 579 if ((wacom->features->type == CINTIQ) && !(data[1] & 0x40)) return;
662 input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 2) & 0x3f)); 580
581 if(wacom->features->type >= INTUOS3)
582 {
583 input_report_abs(dev, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1));
584 input_report_abs(dev, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1));
585 input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 2) & 0x3f));
586 }
587 else
588 {
589 input_report_abs(dev, ABS_X, be16_to_cpu(*(__be16 *) &data[2]));
590 input_report_abs(dev, ABS_Y, be16_to_cpu(*(__be16 *) &data[4]));
591 input_report_abs(dev, ABS_DISTANCE, ((data[9] >> 3) & 0x1f));
592 }
663 593
664 /* process general packets */ 594 /* process general packets */
665 wacom_intuos_general(urb); 595 wacom_intuos_general(urb);
666 596
667 if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) 597 /* 4D mouse, 2D mouse, marker pen rotation, or Lens cursor packets */
668 { 598 if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0) {
669 /* Marker pen rotation packet. Reported as wheel due to valuator limitation */ 599 /* Rotation packet */
670 if (data[1] & 0x02) 600 if (data[1] & 0x02)
671 { 601 {
672 t = ((__u32)data[6] << 3) | ((data[7] >> 5) & 7); 602 if(wacom->features->type >= INTUOS3)
673 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) : 603 {
674 ((t-1) / 2 + 450)) : (450 - t / 2) ; 604 /* I3 marker pen rotation reported as wheel
675 input_report_abs(dev, ABS_WHEEL, t); 605 * due to valuator limitation
606 */
607 t = (data[6] << 3) | ((data[7] >> 5) & 7);
608 t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) :
609 ((t-1) / 2 + 450)) : (450 - t / 2) ;
610 input_report_abs(dev, ABS_WHEEL, t);
611 }
612 else
613 {
614 /* 4D mouse rotation packet */
615 t = (data[6] << 3) | ((data[7] >> 5) & 7);
616 input_report_abs(dev, ABS_RZ, (data[7] & 0x20) ?
617 ((t - 1) / 2) : -t / 2);
618 }
619 }
620 /* 4D mouse packets */
621 else if ( !(data[1] & 0x10) && wacom->features->type < INTUOS3)
622 {
623 input_report_key(dev, BTN_LEFT, data[8] & 0x01);
624 input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
625 input_report_key(dev, BTN_RIGHT, data[8] & 0x04);
626
627 input_report_key(dev, BTN_SIDE, data[8] & 0x20);
628 input_report_key(dev, BTN_EXTRA, data[8] & 0x10);
629 t = (data[6] << 2) | ((data[7] >> 6) & 3);
630 input_report_abs(dev, ABS_THROTTLE, (data[8] & 0x08) ? -t : t);
676 } 631 }
677
678 /* 2D mouse packets */ 632 /* 2D mouse packets */
679 if (wacom->tool[idx] == BTN_TOOL_MOUSE) 633 else if (wacom->tool[idx] == BTN_TOOL_MOUSE)
680 { 634 {
681 input_report_key(dev, BTN_LEFT, data[8] & 0x04); 635 input_report_key(dev, BTN_LEFT, data[8] & 0x04);
682 input_report_key(dev, BTN_MIDDLE, data[8] & 0x08); 636 input_report_key(dev, BTN_MIDDLE, data[8] & 0x08);
683 input_report_key(dev, BTN_RIGHT, data[8] & 0x10); 637 input_report_key(dev, BTN_RIGHT, data[8] & 0x10);
684 input_report_key(dev, BTN_SIDE, data[8] & 0x40); 638 input_report_rel(dev, REL_WHEEL, ((data[8] & 0x02) >> 1)
685 input_report_key(dev, BTN_EXTRA, data[8] & 0x20); 639 - (data[8] & 0x01));
686 /* mouse wheel is positive when rolled backwards */ 640
687 input_report_rel(dev, REL_WHEEL, ((__u32)((data[8] & 0x02) >> 1) 641 /* I3 2D mouse side buttons */
688 - (__u32)(data[8] & 0x01))); 642 if (wacom->features->type == INTUOS3)
643 {
644 input_report_key(dev, BTN_SIDE, data[8] & 0x40);
645 input_report_key(dev, BTN_EXTRA, data[8] & 0x20);
646 }
647 }
648 /* Lens cursor packets */
649 else if (wacom->features->type < INTUOS3)
650 {
651 input_report_key(dev, BTN_LEFT, data[8] & 0x01);
652 input_report_key(dev, BTN_MIDDLE, data[8] & 0x02);
653 input_report_key(dev, BTN_RIGHT, data[8] & 0x04);
654 input_report_key(dev, BTN_SIDE, data[8] & 0x10);
655 input_report_key(dev, BTN_EXTRA, data[8] & 0x08);
689 } 656 }
690 } 657 }
691 658
@@ -701,34 +668,35 @@ exit:
701} 668}
702 669
703static struct wacom_features wacom_features[] = { 670static struct wacom_features wacom_features[] = {
704 { "Wacom Penpartner", 7, 5040, 3780, 255, 32, 0, wacom_penpartner_irq }, 671 { "Wacom Penpartner", 7, 5040, 3780, 255, 32, PENPARTNER, wacom_penpartner_irq },
705 { "Wacom Graphire", 8, 10206, 7422, 511, 32, 1, wacom_graphire_irq }, 672 { "Wacom Graphire", 8, 10206, 7422, 511, 32, GRAPHIRE, wacom_graphire_irq },
706 { "Wacom Graphire2 4x5", 8, 10206, 7422, 511, 32, 1, wacom_graphire_irq }, 673 { "Wacom Graphire2 4x5", 8, 10206, 7422, 511, 32, GRAPHIRE, wacom_graphire_irq },
707 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, 1, wacom_graphire_irq }, 674 { "Wacom Graphire2 5x7", 8, 13918, 10206, 511, 32, GRAPHIRE, wacom_graphire_irq },
708 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, 1, wacom_graphire_irq }, 675 { "Wacom Graphire3", 8, 10208, 7424, 511, 32, GRAPHIRE, wacom_graphire_irq },
709 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, 1, wacom_graphire_irq }, 676 { "Wacom Graphire3 6x8", 8, 16704, 12064, 511, 32, GRAPHIRE, wacom_graphire_irq },
710 { "Wacom Intuos 4x5", 10, 12700, 10600, 1023, 15, 2, wacom_intuos_irq }, 677 { "Wacom Intuos 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq },
711 { "Wacom Intuos 6x8", 10, 20320, 16240, 1023, 15, 2, wacom_intuos_irq }, 678 { "Wacom Intuos 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
712 { "Wacom Intuos 9x12", 10, 30480, 24060, 1023, 15, 2, wacom_intuos_irq }, 679 { "Wacom Intuos 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq },
713 { "Wacom Intuos 12x12", 10, 30480, 31680, 1023, 15, 2, wacom_intuos_irq }, 680 { "Wacom Intuos 12x12", 10, 30480, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
714 { "Wacom Intuos 12x18", 10, 45720, 31680, 1023, 15, 2, wacom_intuos_irq }, 681 { "Wacom Intuos 12x18", 10, 45720, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
715 { "Wacom PL400", 8, 5408, 4056, 255, 32, 3, wacom_pl_irq }, 682 { "Wacom PL400", 8, 5408, 4056, 255, 32, PL, wacom_pl_irq },
716 { "Wacom PL500", 8, 6144, 4608, 255, 32, 3, wacom_pl_irq }, 683 { "Wacom PL500", 8, 6144, 4608, 255, 32, PL, wacom_pl_irq },
717 { "Wacom PL600", 8, 6126, 4604, 255, 32, 3, wacom_pl_irq }, 684 { "Wacom PL600", 8, 6126, 4604, 255, 32, PL, wacom_pl_irq },
718 { "Wacom PL600SX", 8, 6260, 5016, 255, 32, 3, wacom_pl_irq }, 685 { "Wacom PL600SX", 8, 6260, 5016, 255, 32, PL, wacom_pl_irq },
719 { "Wacom PL550", 8, 6144, 4608, 511, 32, 3, wacom_pl_irq }, 686 { "Wacom PL550", 8, 6144, 4608, 511, 32, PL, wacom_pl_irq },
720 { "Wacom PL800", 8, 7220, 5780, 511, 32, 3, wacom_pl_irq }, 687 { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq },
721 { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, 2, wacom_intuos_irq }, 688 { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq },
722 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, 2, wacom_intuos_irq }, 689 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
723 { "Wacom Intuos2 9x12", 10, 30480, 24060, 1023, 15, 2, wacom_intuos_irq }, 690 { "Wacom Intuos2 9x12", 10, 30480, 24060, 1023, 15, INTUOS, wacom_intuos_irq },
724 { "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, 2, wacom_intuos_irq }, 691 { "Wacom Intuos2 12x12", 10, 30480, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
725 { "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, 2, wacom_intuos_irq }, 692 { "Wacom Intuos2 12x18", 10, 45720, 31680, 1023, 15, INTUOS, wacom_intuos_irq },
726 { "Wacom Volito", 8, 5104, 3712, 511, 32, 1, wacom_graphire_irq }, 693 { "Wacom Volito", 8, 5104, 3712, 511, 32, GRAPHIRE, wacom_graphire_irq },
727 { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, 3, wacom_ptu_irq }, 694 { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq },
728 { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, 4, wacom_intuos3_irq }, 695 { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq },
729 { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, 4, wacom_intuos3_irq }, 696 { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq },
730 { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, 4, wacom_intuos3_irq }, 697 { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq },
731 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, 2, wacom_intuos_irq }, 698 { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq },
699 { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq },
732 { } 700 { }
733}; 701};
734 702
@@ -760,6 +728,7 @@ static struct usb_device_id wacom_ids[] = {
760 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, 728 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) },
761 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, 729 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) },
762 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, 730 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) },
731 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) },
763 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, 732 { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) },
764 { } 733 { }
765}; 734};
@@ -816,7 +785,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
816 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS); 785 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS);
817 786
818 switch (wacom->features->type) { 787 switch (wacom->features->type) {
819 case 1: 788 case GRAPHIRE:
820 wacom->dev.evbit[0] |= BIT(EV_REL); 789 wacom->dev.evbit[0] |= BIT(EV_REL);
821 wacom->dev.relbit[0] |= BIT(REL_WHEEL); 790 wacom->dev.relbit[0] |= BIT(REL_WHEEL);
822 wacom->dev.absbit[0] |= BIT(ABS_DISTANCE); 791 wacom->dev.absbit[0] |= BIT(ABS_DISTANCE);
@@ -824,13 +793,14 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
824 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2); 793 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2);
825 break; 794 break;
826 795
827 case 4: /* new functions for Intuos3 */ 796 case INTUOS3:
797 case CINTIQ:
828 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); 798 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER);
829 wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); 799 wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7);
830 wacom->dev.absbit[0] |= BIT(ABS_RX) | BIT(ABS_RY); 800 wacom->dev.absbit[0] |= BIT(ABS_RX) | BIT(ABS_RY);
831 /* fall through */ 801 /* fall through */
832 802
833 case 2: 803 case INTUOS:
834 wacom->dev.evbit[0] |= BIT(EV_MSC) | BIT(EV_REL); 804 wacom->dev.evbit[0] |= BIT(EV_MSC) | BIT(EV_REL);
835 wacom->dev.mscbit[0] |= BIT(MSC_SERIAL); 805 wacom->dev.mscbit[0] |= BIT(MSC_SERIAL);
836 wacom->dev.relbit[0] |= BIT(REL_WHEEL); 806 wacom->dev.relbit[0] |= BIT(REL_WHEEL);
@@ -840,7 +810,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
840 wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE); 810 wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE);
841 break; 811 break;
842 812
843 case 3: 813 case PL:
844 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER); 814 wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER);
845 break; 815 break;
846 } 816 }