diff options
| -rw-r--r-- | drivers/input/tablet/wacom_sys.c | 36 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.c | 28 | ||||
| -rw-r--r-- | drivers/input/tablet/wacom_wac.h | 4 |
3 files changed, 62 insertions, 6 deletions
diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index f6da2f8a9c18..d8cc9ce165ff 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -422,6 +422,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat | |||
| 422 | report_id, rep_data, 4, 1); | 422 | report_id, rep_data, 4, 1); |
| 423 | } while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES); | 423 | } while ((error < 0 || rep_data[1] != 4) && limit++ < WAC_MSG_RETRIES); |
| 424 | } else if (features->type != TABLETPC && | 424 | } else if (features->type != TABLETPC && |
| 425 | features->type != WIRELESS && | ||
| 425 | features->device_type == BTN_TOOL_PEN) { | 426 | features->device_type == BTN_TOOL_PEN) { |
| 426 | do { | 427 | do { |
| 427 | rep_data[0] = 2; | 428 | rep_data[0] = 2; |
| @@ -454,6 +455,21 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, | |||
| 454 | features->pressure_fuzz = 0; | 455 | features->pressure_fuzz = 0; |
| 455 | features->distance_fuzz = 0; | 456 | features->distance_fuzz = 0; |
| 456 | 457 | ||
| 458 | /* | ||
| 459 | * The wireless device HID is basic and layout conflicts with | ||
| 460 | * other tablets (monitor and touch interface can look like pen). | ||
| 461 | * Skip the query for this type and modify defaults based on | ||
| 462 | * interface number. | ||
| 463 | */ | ||
| 464 | if (features->type == WIRELESS) { | ||
| 465 | if (intf->cur_altsetting->desc.bInterfaceNumber == 0) { | ||
| 466 | features->device_type = 0; | ||
| 467 | } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) { | ||
| 468 | features->device_type = BTN_TOOL_DOUBLETAP; | ||
| 469 | features->pktlen = WACOM_PKGLEN_BBTOUCH3; | ||
| 470 | } | ||
| 471 | } | ||
| 472 | |||
| 457 | /* only Tablet PCs and Bamboo P&T need to retrieve the info */ | 473 | /* only Tablet PCs and Bamboo P&T need to retrieve the info */ |
| 458 | if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) && | 474 | if ((features->type != TABLETPC) && (features->type != TABLETPC2FG) && |
| 459 | (features->type != BAMBOO_PT)) | 475 | (features->type != BAMBOO_PT)) |
| @@ -928,14 +944,22 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 928 | if (error) | 944 | if (error) |
| 929 | goto fail4; | 945 | goto fail4; |
| 930 | 946 | ||
| 931 | error = wacom_register_input(wacom); | 947 | if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { |
| 932 | if (error) | 948 | error = wacom_register_input(wacom); |
| 933 | goto fail5; | 949 | if (error) |
| 950 | goto fail5; | ||
| 951 | } | ||
| 934 | 952 | ||
| 935 | /* Note that if query fails it is not a hard failure */ | 953 | /* Note that if query fails it is not a hard failure */ |
| 936 | wacom_query_tablet_data(intf, features); | 954 | wacom_query_tablet_data(intf, features); |
| 937 | 955 | ||
| 938 | usb_set_intfdata(intf, wacom); | 956 | usb_set_intfdata(intf, wacom); |
| 957 | |||
| 958 | if (features->quirks & WACOM_QUIRK_MONITOR) { | ||
| 959 | if (usb_submit_urb(wacom->irq, GFP_KERNEL)) | ||
| 960 | goto fail5; | ||
| 961 | } | ||
| 962 | |||
| 939 | return 0; | 963 | return 0; |
| 940 | 964 | ||
| 941 | fail5: wacom_destroy_leds(wacom); | 965 | fail5: wacom_destroy_leds(wacom); |
| @@ -953,7 +977,8 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
| 953 | usb_set_intfdata(intf, NULL); | 977 | usb_set_intfdata(intf, NULL); |
| 954 | 978 | ||
| 955 | usb_kill_urb(wacom->irq); | 979 | usb_kill_urb(wacom->irq); |
| 956 | input_unregister_device(wacom->wacom_wac.input); | 980 | if (wacom->wacom_wac.input) |
| 981 | input_unregister_device(wacom->wacom_wac.input); | ||
| 957 | wacom_destroy_leds(wacom); | 982 | wacom_destroy_leds(wacom); |
| 958 | usb_free_urb(wacom->irq); | 983 | usb_free_urb(wacom->irq); |
| 959 | usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, | 984 | usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, |
| @@ -985,7 +1010,8 @@ static int wacom_resume(struct usb_interface *intf) | |||
| 985 | wacom_query_tablet_data(intf, features); | 1010 | wacom_query_tablet_data(intf, features); |
| 986 | wacom_led_control(wacom); | 1011 | wacom_led_control(wacom); |
| 987 | 1012 | ||
| 988 | if (wacom->open && usb_submit_urb(wacom->irq, GFP_NOIO) < 0) | 1013 | if ((wacom->open || features->quirks & WACOM_QUIRK_MONITOR) |
| 1014 | && usb_submit_urb(wacom->irq, GFP_NOIO) < 0) | ||
| 989 | rv = -EIO; | 1015 | rv = -EIO; |
| 990 | 1016 | ||
| 991 | mutex_unlock(&wacom->lock); | 1017 | mutex_unlock(&wacom->lock); |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 07a1f218b5c1..6264e6a8d513 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1044,6 +1044,14 @@ static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) | |||
| 1044 | return 0; | 1044 | return 0; |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len) | ||
| 1048 | { | ||
| 1049 | if (len != WACOM_PKGLEN_WIRELESS) | ||
| 1050 | return 0; | ||
| 1051 | |||
| 1052 | return 0; | ||
| 1053 | } | ||
| 1054 | |||
| 1047 | void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) | 1055 | void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) |
| 1048 | { | 1056 | { |
| 1049 | bool sync; | 1057 | bool sync; |
| @@ -1094,6 +1102,10 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) | |||
| 1094 | sync = wacom_bpt_irq(wacom_wac, len); | 1102 | sync = wacom_bpt_irq(wacom_wac, len); |
| 1095 | break; | 1103 | break; |
| 1096 | 1104 | ||
| 1105 | case WIRELESS: | ||
| 1106 | sync = wacom_wireless_irq(wacom_wac, len); | ||
| 1107 | break; | ||
| 1108 | |||
| 1097 | default: | 1109 | default: |
| 1098 | sync = false; | 1110 | sync = false; |
| 1099 | break; | 1111 | break; |
| @@ -1155,7 +1167,7 @@ void wacom_setup_device_quirks(struct wacom_features *features) | |||
| 1155 | 1167 | ||
| 1156 | /* these device have multiple inputs */ | 1168 | /* these device have multiple inputs */ |
| 1157 | if (features->type == TABLETPC || features->type == TABLETPC2FG || | 1169 | if (features->type == TABLETPC || features->type == TABLETPC2FG || |
| 1158 | features->type == BAMBOO_PT) | 1170 | features->type == BAMBOO_PT || features->type == WIRELESS) |
| 1159 | features->quirks |= WACOM_QUIRK_MULTI_INPUT; | 1171 | features->quirks |= WACOM_QUIRK_MULTI_INPUT; |
| 1160 | 1172 | ||
| 1161 | /* quirk for bamboo touch with 2 low res touches */ | 1173 | /* quirk for bamboo touch with 2 low res touches */ |
| @@ -1167,6 +1179,16 @@ void wacom_setup_device_quirks(struct wacom_features *features) | |||
| 1167 | features->y_fuzz <<= 5; | 1179 | features->y_fuzz <<= 5; |
| 1168 | features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES; | 1180 | features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES; |
| 1169 | } | 1181 | } |
| 1182 | |||
| 1183 | if (features->type == WIRELESS) { | ||
| 1184 | |||
| 1185 | /* monitor never has input and pen/touch have delayed create */ | ||
| 1186 | features->quirks |= WACOM_QUIRK_NO_INPUT; | ||
| 1187 | |||
| 1188 | /* must be monitor interface if no device_type set */ | ||
| 1189 | if (!features->device_type) | ||
| 1190 | features->quirks |= WACOM_QUIRK_MONITOR; | ||
| 1191 | } | ||
| 1170 | } | 1192 | } |
| 1171 | 1193 | ||
| 1172 | static unsigned int wacom_calculate_touch_res(unsigned int logical_max, | 1194 | static unsigned int wacom_calculate_touch_res(unsigned int logical_max, |
| @@ -1640,6 +1662,9 @@ static const struct wacom_features wacom_features_0xEC = | |||
| 1640 | static const struct wacom_features wacom_features_0x47 = | 1662 | static const struct wacom_features wacom_features_0x47 = |
| 1641 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, | 1663 | { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, |
| 1642 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 1664 | 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
| 1665 | static const struct wacom_features wacom_features_0x84 = | ||
| 1666 | { "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0, | ||
| 1667 | 0, WIRELESS, 0, 0 }; | ||
| 1643 | static const struct wacom_features wacom_features_0xD0 = | 1668 | static const struct wacom_features wacom_features_0xD0 = |
| 1644 | { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, | 1669 | { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, |
| 1645 | 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 1670 | 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
| @@ -1766,6 +1791,7 @@ const struct usb_device_id wacom_ids[] = { | |||
| 1766 | { USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID, | 1791 | { USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID, |
| 1767 | USB_INTERFACE_SUBCLASS_BOOT, | 1792 | USB_INTERFACE_SUBCLASS_BOOT, |
| 1768 | USB_INTERFACE_PROTOCOL_MOUSE) }, | 1793 | USB_INTERFACE_PROTOCOL_MOUSE) }, |
| 1794 | { USB_DEVICE_WACOM(0x84) }, | ||
| 1769 | { USB_DEVICE_WACOM(0xD0) }, | 1795 | { USB_DEVICE_WACOM(0xD0) }, |
| 1770 | { USB_DEVICE_WACOM(0xD1) }, | 1796 | { USB_DEVICE_WACOM(0xD1) }, |
| 1771 | { USB_DEVICE_WACOM(0xD2) }, | 1797 | { USB_DEVICE_WACOM(0xD2) }, |
diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h index 4f0ba21b0196..2c04b6248a56 100644 --- a/drivers/input/tablet/wacom_wac.h +++ b/drivers/input/tablet/wacom_wac.h | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #define WACOM_PKGLEN_BBTOUCH 20 | 24 | #define WACOM_PKGLEN_BBTOUCH 20 |
| 25 | #define WACOM_PKGLEN_BBTOUCH3 64 | 25 | #define WACOM_PKGLEN_BBTOUCH3 64 |
| 26 | #define WACOM_PKGLEN_BBPEN 10 | 26 | #define WACOM_PKGLEN_BBPEN 10 |
| 27 | #define WACOM_PKGLEN_WIRELESS 32 | ||
| 27 | 28 | ||
| 28 | /* device IDs */ | 29 | /* device IDs */ |
| 29 | #define STYLUS_DEVICE_ID 0x02 | 30 | #define STYLUS_DEVICE_ID 0x02 |
| @@ -45,6 +46,8 @@ | |||
| 45 | /* device quirks */ | 46 | /* device quirks */ |
| 46 | #define WACOM_QUIRK_MULTI_INPUT 0x0001 | 47 | #define WACOM_QUIRK_MULTI_INPUT 0x0001 |
| 47 | #define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 | 48 | #define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 |
| 49 | #define WACOM_QUIRK_NO_INPUT 0x0004 | ||
| 50 | #define WACOM_QUIRK_MONITOR 0x0008 | ||
| 48 | 51 | ||
| 49 | enum { | 52 | enum { |
| 50 | PENPARTNER = 0, | 53 | PENPARTNER = 0, |
| @@ -54,6 +57,7 @@ enum { | |||
| 54 | PL, | 57 | PL, |
| 55 | DTU, | 58 | DTU, |
| 56 | BAMBOO_PT, | 59 | BAMBOO_PT, |
| 60 | WIRELESS, | ||
| 57 | INTUOS, | 61 | INTUOS, |
| 58 | INTUOS3S, | 62 | INTUOS3S, |
| 59 | INTUOS3, | 63 | INTUOS3, |
