diff options
| -rw-r--r-- | drivers/input/tablet/wacom_sys.c | 43 | 
1 files changed, 29 insertions, 14 deletions
| diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c index a9d5031b855e..ea30c983a33e 100644 --- a/drivers/input/tablet/wacom_sys.c +++ b/drivers/input/tablet/wacom_sys.c | |||
| @@ -388,6 +388,32 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi | |||
| 388 | return result; | 388 | return result; | 
| 389 | } | 389 | } | 
| 390 | 390 | ||
| 391 | static int wacom_query_tablet_data(struct usb_interface *intf) | ||
| 392 | { | ||
| 393 | unsigned char *rep_data; | ||
| 394 | int limit = 0; | ||
| 395 | int error; | ||
| 396 | |||
| 397 | rep_data = kmalloc(2, GFP_KERNEL); | ||
| 398 | if (!rep_data) | ||
| 399 | return -ENOMEM; | ||
| 400 | |||
| 401 | do { | ||
| 402 | rep_data[0] = 2; | ||
| 403 | rep_data[1] = 2; | ||
| 404 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 405 | 2, rep_data, 2); | ||
| 406 | if (error >= 0) | ||
| 407 | error = usb_get_report(intf, | ||
| 408 | WAC_HID_FEATURE_REPORT, 2, | ||
| 409 | rep_data, 2); | ||
| 410 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 411 | |||
| 412 | kfree(rep_data); | ||
| 413 | |||
| 414 | return error < 0 ? error : 0; | ||
| 415 | } | ||
| 416 | |||
| 391 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 417 | static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) | 
| 392 | { | 418 | { | 
| 393 | struct usb_device *dev = interface_to_usbdev(intf); | 419 | struct usb_device *dev = interface_to_usbdev(intf); | 
| @@ -398,7 +424,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 398 | struct wacom_features *features; | 424 | struct wacom_features *features; | 
| 399 | struct input_dev *input_dev; | 425 | struct input_dev *input_dev; | 
| 400 | int error = -ENOMEM; | 426 | int error = -ENOMEM; | 
| 401 | char rep_data[2], limit = 0; | ||
| 402 | struct hid_descriptor *hid_desc; | 427 | struct hid_descriptor *hid_desc; | 
| 403 | 428 | ||
| 404 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 429 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 
| @@ -489,20 +514,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 489 | 514 | ||
| 490 | /* | 515 | /* | 
| 491 | * Ask the tablet to report tablet data if it is not a Tablet PC. | 516 | * Ask the tablet to report tablet data if it is not a Tablet PC. | 
| 492 | * Repeat until it succeeds | 517 | * Note that if query fails it is not a hard failure. | 
| 493 | */ | 518 | */ | 
| 494 | if (wacom_wac->features->type != TABLETPC) { | 519 | if (wacom_wac->features->type != TABLETPC) | 
| 495 | do { | 520 | wacom_query_tablet_data(intf); | 
| 496 | rep_data[0] = 2; | ||
| 497 | rep_data[1] = 2; | ||
| 498 | error = usb_set_report(intf, WAC_HID_FEATURE_REPORT, | ||
| 499 | 2, rep_data, 2); | ||
| 500 | if (error >= 0) | ||
| 501 | error = usb_get_report(intf, | ||
| 502 | WAC_HID_FEATURE_REPORT, 2, | ||
| 503 | rep_data, 2); | ||
| 504 | } while ((error < 0 || rep_data[1] != 2) && limit++ < 5); | ||
| 505 | } | ||
| 506 | 521 | ||
| 507 | usb_set_intfdata(intf, wacom); | 522 | usb_set_intfdata(intf, wacom); | 
| 508 | return 0; | 523 | return 0; | 
