diff options
| -rw-r--r-- | drivers/hid/hid-ids.h | 1 | ||||
| -rw-r--r-- | drivers/hid/hid-magicmouse.c | 66 | ||||
| -rw-r--r-- | drivers/hid/hid-wacom.c | 22 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hid-quirks.c | 1 |
4 files changed, 67 insertions, 23 deletions
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 7d27d2b0445a..7484e1b67249 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -277,6 +277,7 @@ | |||
| 277 | #define USB_DEVICE_ID_PENPOWER 0x00f4 | 277 | #define USB_DEVICE_ID_PENPOWER 0x00f4 |
| 278 | 278 | ||
| 279 | #define USB_VENDOR_ID_GREENASIA 0x0e8f | 279 | #define USB_VENDOR_ID_GREENASIA 0x0e8f |
| 280 | #define USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD 0x3013 | ||
| 280 | 281 | ||
| 281 | #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 | 282 | #define USB_VENDOR_ID_GRETAGMACBETH 0x0971 |
| 282 | #define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005 | 283 | #define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005 |
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c index 0ec91c18a421..f0fbd7bd239e 100644 --- a/drivers/hid/hid-magicmouse.c +++ b/drivers/hid/hid-magicmouse.c | |||
| @@ -81,6 +81,28 @@ MODULE_PARM_DESC(report_undeciphered, "Report undeciphered multi-touch state fie | |||
| 81 | #define NO_TOUCHES -1 | 81 | #define NO_TOUCHES -1 |
| 82 | #define SINGLE_TOUCH_UP -2 | 82 | #define SINGLE_TOUCH_UP -2 |
| 83 | 83 | ||
| 84 | /* Touch surface information. Dimension is in hundredths of a mm, min and max | ||
| 85 | * are in units. */ | ||
| 86 | #define MOUSE_DIMENSION_X (float)9056 | ||
| 87 | #define MOUSE_MIN_X -1100 | ||
| 88 | #define MOUSE_MAX_X 1258 | ||
| 89 | #define MOUSE_RES_X ((MOUSE_MAX_X - MOUSE_MIN_X) / (MOUSE_DIMENSION_X / 100)) | ||
| 90 | #define MOUSE_DIMENSION_Y (float)5152 | ||
| 91 | #define MOUSE_MIN_Y -1589 | ||
| 92 | #define MOUSE_MAX_Y 2047 | ||
| 93 | #define MOUSE_RES_Y ((MOUSE_MAX_Y - MOUSE_MIN_Y) / (MOUSE_DIMENSION_Y / 100)) | ||
| 94 | |||
| 95 | #define TRACKPAD_DIMENSION_X (float)13000 | ||
| 96 | #define TRACKPAD_MIN_X -2909 | ||
| 97 | #define TRACKPAD_MAX_X 3167 | ||
| 98 | #define TRACKPAD_RES_X \ | ||
| 99 | ((TRACKPAD_MAX_X - TRACKPAD_MIN_X) / (TRACKPAD_DIMENSION_X / 100)) | ||
| 100 | #define TRACKPAD_DIMENSION_Y (float)11000 | ||
| 101 | #define TRACKPAD_MIN_Y -2456 | ||
| 102 | #define TRACKPAD_MAX_Y 2565 | ||
| 103 | #define TRACKPAD_RES_Y \ | ||
| 104 | ((TRACKPAD_MAX_Y - TRACKPAD_MIN_Y) / (TRACKPAD_DIMENSION_Y / 100)) | ||
| 105 | |||
| 84 | /** | 106 | /** |
| 85 | * struct magicmouse_sc - Tracks Magic Mouse-specific data. | 107 | * struct magicmouse_sc - Tracks Magic Mouse-specific data. |
| 86 | * @input: Input device through which we report events. | 108 | * @input: Input device through which we report events. |
| @@ -406,17 +428,31 @@ static void magicmouse_setup_input(struct input_dev *input, struct hid_device *h | |||
| 406 | * inverse of the reported Y. | 428 | * inverse of the reported Y. |
| 407 | */ | 429 | */ |
| 408 | if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) { | 430 | if (input->id.product == USB_DEVICE_ID_APPLE_MAGICMOUSE) { |
| 409 | input_set_abs_params(input, ABS_MT_POSITION_X, -1100, | 431 | input_set_abs_params(input, ABS_MT_POSITION_X, |
| 410 | 1358, 4, 0); | 432 | MOUSE_MIN_X, MOUSE_MAX_X, 4, 0); |
| 411 | input_set_abs_params(input, ABS_MT_POSITION_Y, -1589, | 433 | input_set_abs_params(input, ABS_MT_POSITION_Y, |
| 412 | 2047, 4, 0); | 434 | MOUSE_MIN_Y, MOUSE_MAX_Y, 4, 0); |
| 435 | |||
| 436 | input_abs_set_res(input, ABS_MT_POSITION_X, | ||
| 437 | MOUSE_RES_X); | ||
| 438 | input_abs_set_res(input, ABS_MT_POSITION_Y, | ||
| 439 | MOUSE_RES_Y); | ||
| 413 | } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ | 440 | } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ |
| 414 | input_set_abs_params(input, ABS_X, -2909, 3167, 4, 0); | 441 | input_set_abs_params(input, ABS_X, TRACKPAD_MIN_X, |
| 415 | input_set_abs_params(input, ABS_Y, -2456, 2565, 4, 0); | 442 | TRACKPAD_MAX_X, 4, 0); |
| 416 | input_set_abs_params(input, ABS_MT_POSITION_X, -2909, | 443 | input_set_abs_params(input, ABS_Y, TRACKPAD_MIN_Y, |
| 417 | 3167, 4, 0); | 444 | TRACKPAD_MAX_Y, 4, 0); |
| 418 | input_set_abs_params(input, ABS_MT_POSITION_Y, -2456, | 445 | input_set_abs_params(input, ABS_MT_POSITION_X, |
| 419 | 2565, 4, 0); | 446 | TRACKPAD_MIN_X, TRACKPAD_MAX_X, 4, 0); |
| 447 | input_set_abs_params(input, ABS_MT_POSITION_Y, | ||
| 448 | TRACKPAD_MIN_Y, TRACKPAD_MAX_Y, 4, 0); | ||
| 449 | |||
| 450 | input_abs_set_res(input, ABS_X, TRACKPAD_RES_X); | ||
| 451 | input_abs_set_res(input, ABS_Y, TRACKPAD_RES_Y); | ||
| 452 | input_abs_set_res(input, ABS_MT_POSITION_X, | ||
| 453 | TRACKPAD_RES_X); | ||
| 454 | input_abs_set_res(input, ABS_MT_POSITION_Y, | ||
| 455 | TRACKPAD_RES_Y); | ||
| 420 | } | 456 | } |
| 421 | 457 | ||
| 422 | input_set_events_per_packet(input, 60); | 458 | input_set_events_per_packet(input, 60); |
| @@ -501,9 +537,17 @@ static int magicmouse_probe(struct hid_device *hdev, | |||
| 501 | } | 537 | } |
| 502 | report->size = 6; | 538 | report->size = 6; |
| 503 | 539 | ||
| 540 | /* | ||
| 541 | * Some devices repond with 'invalid report id' when feature | ||
| 542 | * report switching it into multitouch mode is sent to it. | ||
| 543 | * | ||
| 544 | * This results in -EIO from the _raw low-level transport callback, | ||
| 545 | * but there seems to be no other way of switching the mode. | ||
| 546 | * Thus the super-ugly hacky success check below. | ||
| 547 | */ | ||
| 504 | ret = hdev->hid_output_raw_report(hdev, feature, sizeof(feature), | 548 | ret = hdev->hid_output_raw_report(hdev, feature, sizeof(feature), |
| 505 | HID_FEATURE_REPORT); | 549 | HID_FEATURE_REPORT); |
| 506 | if (ret != sizeof(feature)) { | 550 | if (ret != -EIO && ret != sizeof(feature)) { |
| 507 | hid_err(hdev, "unable to request touch data (%d)\n", ret); | 551 | hid_err(hdev, "unable to request touch data (%d)\n", ret); |
| 508 | goto err_stop_hw; | 552 | goto err_stop_hw; |
| 509 | } | 553 | } |
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index 06888323828c..a597039d0755 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
| @@ -353,11 +353,7 @@ static int wacom_probe(struct hid_device *hdev, | |||
| 353 | if (ret) { | 353 | if (ret) { |
| 354 | hid_warn(hdev, "can't create sysfs battery attribute, err: %d\n", | 354 | hid_warn(hdev, "can't create sysfs battery attribute, err: %d\n", |
| 355 | ret); | 355 | ret); |
| 356 | /* | 356 | goto err_battery; |
| 357 | * battery attribute is not critical for the tablet, but if it | ||
| 358 | * failed then there is no need to create ac attribute | ||
| 359 | */ | ||
| 360 | goto move_on; | ||
| 361 | } | 357 | } |
| 362 | 358 | ||
| 363 | wdata->ac.properties = wacom_ac_props; | 359 | wdata->ac.properties = wacom_ac_props; |
| @@ -371,14 +367,8 @@ static int wacom_probe(struct hid_device *hdev, | |||
| 371 | if (ret) { | 367 | if (ret) { |
| 372 | hid_warn(hdev, | 368 | hid_warn(hdev, |
| 373 | "can't create ac battery attribute, err: %d\n", ret); | 369 | "can't create ac battery attribute, err: %d\n", ret); |
| 374 | /* | 370 | goto err_ac; |
| 375 | * ac attribute is not critical for the tablet, but if it | ||
| 376 | * failed then we don't want to battery attribute to exist | ||
| 377 | */ | ||
| 378 | power_supply_unregister(&wdata->battery); | ||
| 379 | } | 371 | } |
| 380 | |||
| 381 | move_on: | ||
| 382 | #endif | 372 | #endif |
| 383 | hidinput = list_entry(hdev->inputs.next, struct hid_input, list); | 373 | hidinput = list_entry(hdev->inputs.next, struct hid_input, list); |
| 384 | input = hidinput->input; | 374 | input = hidinput->input; |
| @@ -416,6 +406,13 @@ move_on: | |||
| 416 | 406 | ||
| 417 | return 0; | 407 | return 0; |
| 418 | 408 | ||
| 409 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY | ||
| 410 | err_ac: | ||
| 411 | power_supply_unregister(&wdata->battery); | ||
| 412 | err_battery: | ||
| 413 | device_remove_file(&hdev->dev, &dev_attr_speed); | ||
| 414 | hid_hw_stop(hdev); | ||
| 415 | #endif | ||
| 419 | err_free: | 416 | err_free: |
| 420 | kfree(wdata); | 417 | kfree(wdata); |
| 421 | return ret; | 418 | return ret; |
| @@ -426,6 +423,7 @@ static void wacom_remove(struct hid_device *hdev) | |||
| 426 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY | 423 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY |
| 427 | struct wacom_data *wdata = hid_get_drvdata(hdev); | 424 | struct wacom_data *wdata = hid_get_drvdata(hdev); |
| 428 | #endif | 425 | #endif |
| 426 | device_remove_file(&hdev->dev, &dev_attr_speed); | ||
| 429 | hid_hw_stop(hdev); | 427 | hid_hw_stop(hdev); |
| 430 | 428 | ||
| 431 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY | 429 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 4bdb5d46c52c..3146fdcda272 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -47,6 +47,7 @@ static const struct hid_blacklist { | |||
| 47 | { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL }, | 47 | { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL }, |
| 48 | 48 | ||
| 49 | { USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH, HID_QUIRK_MULTI_INPUT }, | 49 | { USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH, HID_QUIRK_MULTI_INPUT }, |
| 50 | { USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD, HID_QUIRK_MULTI_INPUT }, | ||
| 50 | { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, | 51 | { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, |
| 51 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, | 52 | { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, |
| 52 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, | 53 | { USB_VENDOR_ID_TOUCHPACK, USB_DEVICE_ID_TOUCHPACK_RTS, HID_QUIRK_MULTI_INPUT }, |
