diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-10-25 03:58:12 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-10-25 03:58:12 -0400 |
| commit | f6f12427844516bc8e9cf84f43aca7bbbaa48157 (patch) | |
| tree | c3ac710e02d65fc08629b25fcfba0e79e0092910 | |
| parent | b0eae38cebc54e618896d3e6a799939da51a8cac (diff) | |
| parent | bca621421c53caf73f36e181d6e5fe41fe0da7a7 (diff) | |
Merge branch 'upstream-fixes' into for-linus
Conflicts:
drivers/hid/hid-wacom.c
| -rw-r--r-- | drivers/hid/hid-magicmouse.c | 7 | ||||
| -rw-r--r-- | drivers/hid/hid-wacom.c | 81 | ||||
| -rw-r--r-- | drivers/hid/hidraw.c | 8 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hid-core.c | 2 | ||||
| -rw-r--r-- | drivers/hid/usbhid/hiddev.c | 2 |
5 files changed, 58 insertions, 42 deletions
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c index f0fbd7bd239e..2ab71758e2e2 100644 --- a/drivers/hid/hid-magicmouse.c +++ b/drivers/hid/hid-magicmouse.c | |||
| @@ -405,6 +405,13 @@ static void magicmouse_setup_input(struct input_dev *input, struct hid_device *h | |||
| 405 | __set_bit(REL_HWHEEL, input->relbit); | 405 | __set_bit(REL_HWHEEL, input->relbit); |
| 406 | } | 406 | } |
| 407 | } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ | 407 | } else { /* USB_DEVICE_ID_APPLE_MAGICTRACKPAD */ |
| 408 | /* input->keybit is initialized with incorrect button info | ||
| 409 | * for Magic Trackpad. There really is only one physical | ||
| 410 | * button (BTN_LEFT == BTN_MOUSE). Make sure we don't | ||
| 411 | * advertise buttons that don't exist... | ||
| 412 | */ | ||
| 413 | __clear_bit(BTN_RIGHT, input->keybit); | ||
| 414 | __clear_bit(BTN_MIDDLE, input->keybit); | ||
| 408 | __set_bit(BTN_MOUSE, input->keybit); | 415 | __set_bit(BTN_MOUSE, input->keybit); |
| 409 | __set_bit(BTN_TOOL_FINGER, input->keybit); | 416 | __set_bit(BTN_TOOL_FINGER, input->keybit); |
| 410 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); | 417 | __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); |
diff --git a/drivers/hid/hid-wacom.c b/drivers/hid/hid-wacom.c index 72ca689b6474..17bb88f782b6 100644 --- a/drivers/hid/hid-wacom.c +++ b/drivers/hid/hid-wacom.c | |||
| @@ -304,11 +304,51 @@ static int wacom_raw_event(struct hid_device *hdev, struct hid_report *report, | |||
| 304 | return 1; | 304 | return 1; |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | static int wacom_input_mapped(struct hid_device *hdev, struct hid_input *hi, | ||
| 308 | struct hid_field *field, struct hid_usage *usage, unsigned long **bit, | ||
| 309 | int *max) | ||
| 310 | { | ||
| 311 | struct input_dev *input = hi->input; | ||
| 312 | |||
| 313 | __set_bit(INPUT_PROP_POINTER, input->propbit); | ||
| 314 | |||
| 315 | /* Basics */ | ||
| 316 | input->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_REL); | ||
| 317 | |||
| 318 | __set_bit(REL_WHEEL, input->relbit); | ||
| 319 | |||
| 320 | __set_bit(BTN_TOOL_PEN, input->keybit); | ||
| 321 | __set_bit(BTN_TOUCH, input->keybit); | ||
| 322 | __set_bit(BTN_STYLUS, input->keybit); | ||
| 323 | __set_bit(BTN_STYLUS2, input->keybit); | ||
| 324 | __set_bit(BTN_LEFT, input->keybit); | ||
| 325 | __set_bit(BTN_RIGHT, input->keybit); | ||
| 326 | __set_bit(BTN_MIDDLE, input->keybit); | ||
| 327 | |||
| 328 | /* Pad */ | ||
| 329 | input->evbit[0] |= BIT(EV_MSC); | ||
| 330 | |||
| 331 | __set_bit(MSC_SERIAL, input->mscbit); | ||
| 332 | |||
| 333 | __set_bit(BTN_0, input->keybit); | ||
| 334 | __set_bit(BTN_1, input->keybit); | ||
| 335 | __set_bit(BTN_TOOL_FINGER, input->keybit); | ||
| 336 | |||
| 337 | /* Distance, rubber and mouse */ | ||
| 338 | __set_bit(BTN_TOOL_RUBBER, input->keybit); | ||
| 339 | __set_bit(BTN_TOOL_MOUSE, input->keybit); | ||
| 340 | |||
| 341 | input_set_abs_params(input, ABS_X, 0, 16704, 4, 0); | ||
| 342 | input_set_abs_params(input, ABS_Y, 0, 12064, 4, 0); | ||
| 343 | input_set_abs_params(input, ABS_PRESSURE, 0, 511, 0, 0); | ||
| 344 | input_set_abs_params(input, ABS_DISTANCE, 0, 32, 0, 0); | ||
| 345 | |||
| 346 | return 0; | ||
| 347 | } | ||
| 348 | |||
| 307 | static int wacom_probe(struct hid_device *hdev, | 349 | static int wacom_probe(struct hid_device *hdev, |
| 308 | const struct hid_device_id *id) | 350 | const struct hid_device_id *id) |
| 309 | { | 351 | { |
| 310 | struct hid_input *hidinput; | ||
| 311 | struct input_dev *input; | ||
| 312 | struct wacom_data *wdata; | 352 | struct wacom_data *wdata; |
| 313 | int ret; | 353 | int ret; |
| 314 | 354 | ||
| @@ -370,42 +410,6 @@ static int wacom_probe(struct hid_device *hdev, | |||
| 370 | goto err_ac; | 410 | goto err_ac; |
| 371 | } | 411 | } |
| 372 | #endif | 412 | #endif |
| 373 | hidinput = list_entry(hdev->inputs.next, struct hid_input, list); | ||
| 374 | input = hidinput->input; | ||
| 375 | |||
| 376 | __set_bit(INPUT_PROP_POINTER, input->propbit); | ||
| 377 | |||
| 378 | /* Basics */ | ||
| 379 | input->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_REL); | ||
| 380 | |||
| 381 | __set_bit(REL_WHEEL, input->relbit); | ||
| 382 | |||
| 383 | __set_bit(BTN_TOOL_PEN, input->keybit); | ||
| 384 | __set_bit(BTN_TOUCH, input->keybit); | ||
| 385 | __set_bit(BTN_STYLUS, input->keybit); | ||
| 386 | __set_bit(BTN_STYLUS2, input->keybit); | ||
| 387 | __set_bit(BTN_LEFT, input->keybit); | ||
| 388 | __set_bit(BTN_RIGHT, input->keybit); | ||
| 389 | __set_bit(BTN_MIDDLE, input->keybit); | ||
| 390 | |||
| 391 | /* Pad */ | ||
| 392 | input->evbit[0] |= BIT(EV_MSC); | ||
| 393 | |||
| 394 | __set_bit(MSC_SERIAL, input->mscbit); | ||
| 395 | |||
| 396 | __set_bit(BTN_0, input->keybit); | ||
| 397 | __set_bit(BTN_1, input->keybit); | ||
| 398 | __set_bit(BTN_TOOL_FINGER, input->keybit); | ||
| 399 | |||
| 400 | /* Distance, rubber and mouse */ | ||
| 401 | __set_bit(BTN_TOOL_RUBBER, input->keybit); | ||
| 402 | __set_bit(BTN_TOOL_MOUSE, input->keybit); | ||
| 403 | |||
| 404 | input_set_abs_params(input, ABS_X, 0, 16704, 4, 0); | ||
| 405 | input_set_abs_params(input, ABS_Y, 0, 12064, 4, 0); | ||
| 406 | input_set_abs_params(input, ABS_PRESSURE, 0, 511, 0, 0); | ||
| 407 | input_set_abs_params(input, ABS_DISTANCE, 0, 32, 0, 0); | ||
| 408 | |||
| 409 | return 0; | 413 | return 0; |
| 410 | 414 | ||
| 411 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY | 415 | #ifdef CONFIG_HID_WACOM_POWER_SUPPLY |
| @@ -448,6 +452,7 @@ static struct hid_driver wacom_driver = { | |||
| 448 | .probe = wacom_probe, | 452 | .probe = wacom_probe, |
| 449 | .remove = wacom_remove, | 453 | .remove = wacom_remove, |
| 450 | .raw_event = wacom_raw_event, | 454 | .raw_event = wacom_raw_event, |
| 455 | .input_mapped = wacom_input_mapped, | ||
| 451 | }; | 456 | }; |
| 452 | 457 | ||
| 453 | static int __init wacom_init(void) | 458 | static int __init wacom_init(void) |
diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c index c79578b5a788..6d65d4e35120 100644 --- a/drivers/hid/hidraw.c +++ b/drivers/hid/hidraw.c | |||
| @@ -272,8 +272,10 @@ static int hidraw_open(struct inode *inode, struct file *file) | |||
| 272 | dev = hidraw_table[minor]; | 272 | dev = hidraw_table[minor]; |
| 273 | if (!dev->open++) { | 273 | if (!dev->open++) { |
| 274 | err = hid_hw_power(dev->hid, PM_HINT_FULLON); | 274 | err = hid_hw_power(dev->hid, PM_HINT_FULLON); |
| 275 | if (err < 0) | 275 | if (err < 0) { |
| 276 | dev->open--; | ||
| 276 | goto out_unlock; | 277 | goto out_unlock; |
| 278 | } | ||
| 277 | 279 | ||
| 278 | err = hid_hw_open(dev->hid); | 280 | err = hid_hw_open(dev->hid); |
| 279 | if (err < 0) { | 281 | if (err < 0) { |
| @@ -510,13 +512,12 @@ void hidraw_disconnect(struct hid_device *hid) | |||
| 510 | { | 512 | { |
| 511 | struct hidraw *hidraw = hid->hidraw; | 513 | struct hidraw *hidraw = hid->hidraw; |
| 512 | 514 | ||
| 515 | mutex_lock(&minors_lock); | ||
| 513 | hidraw->exist = 0; | 516 | hidraw->exist = 0; |
| 514 | 517 | ||
| 515 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); | 518 | device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); |
| 516 | 519 | ||
| 517 | mutex_lock(&minors_lock); | ||
| 518 | hidraw_table[hidraw->minor] = NULL; | 520 | hidraw_table[hidraw->minor] = NULL; |
| 519 | mutex_unlock(&minors_lock); | ||
| 520 | 521 | ||
| 521 | if (hidraw->open) { | 522 | if (hidraw->open) { |
| 522 | hid_hw_close(hid); | 523 | hid_hw_close(hid); |
| @@ -524,6 +525,7 @@ void hidraw_disconnect(struct hid_device *hid) | |||
| 524 | } else { | 525 | } else { |
| 525 | kfree(hidraw); | 526 | kfree(hidraw); |
| 526 | } | 527 | } |
| 528 | mutex_unlock(&minors_lock); | ||
| 527 | } | 529 | } |
| 528 | EXPORT_SYMBOL_GPL(hidraw_disconnect); | 530 | EXPORT_SYMBOL_GPL(hidraw_disconnect); |
| 529 | 531 | ||
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index ad978f5748d3..77e705c2209c 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
| @@ -1270,7 +1270,7 @@ static void hid_cancel_delayed_stuff(struct usbhid_device *usbhid) | |||
| 1270 | 1270 | ||
| 1271 | static void hid_cease_io(struct usbhid_device *usbhid) | 1271 | static void hid_cease_io(struct usbhid_device *usbhid) |
| 1272 | { | 1272 | { |
| 1273 | del_timer(&usbhid->io_retry); | 1273 | del_timer_sync(&usbhid->io_retry); |
| 1274 | usb_kill_urb(usbhid->urbin); | 1274 | usb_kill_urb(usbhid->urbin); |
| 1275 | usb_kill_urb(usbhid->urbctrl); | 1275 | usb_kill_urb(usbhid->urbctrl); |
| 1276 | usb_kill_urb(usbhid->urbout); | 1276 | usb_kill_urb(usbhid->urbout); |
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 7c1188b53c3e..4ef02b269a71 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c | |||
| @@ -641,6 +641,8 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 641 | struct usb_device *dev = hid_to_usb_dev(hid); | 641 | struct usb_device *dev = hid_to_usb_dev(hid); |
| 642 | struct usbhid_device *usbhid = hid->driver_data; | 642 | struct usbhid_device *usbhid = hid->driver_data; |
| 643 | 643 | ||
| 644 | memset(&dinfo, 0, sizeof(dinfo)); | ||
| 645 | |||
| 644 | dinfo.bustype = BUS_USB; | 646 | dinfo.bustype = BUS_USB; |
| 645 | dinfo.busnum = dev->bus->busnum; | 647 | dinfo.busnum = dev->bus->busnum; |
| 646 | dinfo.devnum = dev->devnum; | 648 | dinfo.devnum = dev->devnum; |
