Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branches 'device-groups', 'logitech' and 'multitouch' into for-linus

+287 -89
+32 -23
drivers/hid/hid-lg.c
··· 109 109 static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc, 110 110 unsigned int *rsize) 111 111 { 112 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 112 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev); 113 113 114 - if ((quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 && 114 + if ((drv_data->quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 && 115 115 rdesc[84] == 0x8c && rdesc[85] == 0x02) { 116 116 hid_info(hdev, 117 117 "fixing up Logitech keyboard report descriptor\n"); 118 118 rdesc[84] = rdesc[89] = 0x4d; 119 119 rdesc[85] = rdesc[90] = 0x10; 120 120 } 121 - if ((quirks & LG_RDESC_REL_ABS) && *rsize >= 50 && 121 + if ((drv_data->quirks & LG_RDESC_REL_ABS) && *rsize >= 50 && 122 122 rdesc[32] == 0x81 && rdesc[33] == 0x06 && 123 123 rdesc[49] == 0x81 && rdesc[50] == 0x06) { 124 124 hid_info(hdev, 125 125 "fixing up rel/abs in Logitech report descriptor\n"); 126 126 rdesc[33] = rdesc[50] = 0x02; 127 127 } 128 - if ((quirks & LG_FF4) && *rsize >= 101 && 128 + if ((drv_data->quirks & LG_FF4) && *rsize >= 101 && 129 129 rdesc[41] == 0x95 && rdesc[42] == 0x0B && 130 130 rdesc[47] == 0x05 && rdesc[48] == 0x09) { 131 131 hid_info(hdev, "fixing up Logitech Speed Force Wireless button descriptor\n"); ··· 278 278 0, 0, 0, 0, 0,183,184,185,186,187, 279 279 188,189,190,191,192,193,194, 0, 0, 0 280 280 }; 281 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 281 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev); 282 282 unsigned int hid = usage->hid; 283 283 284 284 if (hdev->product == USB_DEVICE_ID_LOGITECH_RECEIVER && ··· 289 289 lg_dinovo_mapping(hi, usage, bit, max)) 290 290 return 1; 291 291 292 - if ((quirks & LG_WIRELESS) && lg_wireless_mapping(hi, usage, bit, max)) 292 + if ((drv_data->quirks & LG_WIRELESS) && lg_wireless_mapping(hi, usage, bit, max)) 293 293 return 1; 294 294 295 295 if ((hid & HID_USAGE_PAGE) != HID_UP_BUTTON) ··· 299 299 300 300 /* Special handling for Logitech Cordless Desktop */ 301 301 if (field->application == HID_GD_MOUSE) { 302 - if ((quirks & LG_IGNORE_DOUBLED_WHEEL) && 302 + if ((drv_data->quirks & LG_IGNORE_DOUBLED_WHEEL) && 303 303 (hid == 7 || hid == 8)) 304 304 return -1; 305 305 } else { 306 - if ((quirks & LG_EXPANDED_KEYMAP) && 306 + if ((drv_data->quirks & LG_EXPANDED_KEYMAP) && 307 307 hid < ARRAY_SIZE(e_keymap) && 308 308 e_keymap[hid] != 0) { 309 309 hid_map_usage(hi, usage, bit, max, EV_KEY, ··· 319 319 struct hid_field *field, struct hid_usage *usage, 320 320 unsigned long **bit, int *max) 321 321 { 322 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 322 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev); 323 323 324 - if ((quirks & LG_BAD_RELATIVE_KEYS) && usage->type == EV_KEY && 324 + if ((drv_data->quirks & LG_BAD_RELATIVE_KEYS) && usage->type == EV_KEY && 325 325 (field->flags & HID_MAIN_ITEM_RELATIVE)) 326 326 field->flags &= ~HID_MAIN_ITEM_RELATIVE; 327 327 328 - if ((quirks & LG_DUPLICATE_USAGES) && (usage->type == EV_KEY || 328 + if ((drv_data->quirks & LG_DUPLICATE_USAGES) && (usage->type == EV_KEY || 329 329 usage->type == EV_REL || usage->type == EV_ABS)) 330 330 clear_bit(usage->code, *bit); 331 331 ··· 335 335 static int lg_event(struct hid_device *hdev, struct hid_field *field, 336 336 struct hid_usage *usage, __s32 value) 337 337 { 338 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 338 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev); 339 339 340 - if ((quirks & LG_INVERT_HWHEEL) && usage->code == REL_HWHEEL) { 340 + if ((drv_data->quirks & LG_INVERT_HWHEEL) && usage->code == REL_HWHEEL) { 341 341 input_event(field->hidinput->input, usage->type, usage->code, 342 342 -value); 343 343 return 1; ··· 348 348 349 349 static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id) 350 350 { 351 - unsigned long quirks = id->driver_data; 352 351 unsigned int connect_mask = HID_CONNECT_DEFAULT; 352 + struct lg_drv_data *drv_data; 353 353 int ret; 354 354 355 - hid_set_drvdata(hdev, (void *)quirks); 355 + drv_data = kzalloc(sizeof(struct lg_drv_data), GFP_KERNEL); 356 + if (!drv_data) { 357 + hid_err(hdev, "Insufficient memory, cannot allocate driver data\n"); 358 + return -ENOMEM; 359 + } 360 + drv_data->quirks = id->driver_data; 361 + 362 + hid_set_drvdata(hdev, (void *)drv_data); 356 363 357 - if (quirks & LG_NOGET) 364 + if (drv_data->quirks & LG_NOGET) 358 365 hdev->quirks |= HID_QUIRK_NOGET; 359 366 360 367 ret = hid_parse(hdev); ··· 370 363 goto err_free; 371 364 } 372 365 373 - if (quirks & (LG_FF | LG_FF2 | LG_FF3 | LG_FF4)) 366 + if (drv_data->quirks & (LG_FF | LG_FF2 | LG_FF3 | LG_FF4)) 374 367 connect_mask &= ~HID_CONNECT_FF; 375 368 376 369 ret = hid_hw_start(hdev, connect_mask); ··· 399 392 } 400 393 } 401 394 402 - if (quirks & LG_FF) 395 + if (drv_data->quirks & LG_FF) 403 396 lgff_init(hdev); 404 - if (quirks & LG_FF2) 397 + if (drv_data->quirks & LG_FF2) 405 398 lg2ff_init(hdev); 406 - if (quirks & LG_FF3) 399 + if (drv_data->quirks & LG_FF3) 407 400 lg3ff_init(hdev); 408 - if (quirks & LG_FF4) 401 + if (drv_data->quirks & LG_FF4) 409 402 lg4ff_init(hdev); 410 403 411 404 return 0; 412 405 err_free: 406 + kfree(drv_data); 413 407 return ret; 414 408 } 415 409 416 410 static void lg_remove(struct hid_device *hdev) 417 411 { 418 - unsigned long quirks = (unsigned long)hid_get_drvdata(hdev); 419 - if(quirks & LG_FF4) 412 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev); 413 + if (drv_data->quirks & LG_FF4) 420 414 lg4ff_deinit(hdev); 421 415 422 416 hid_hw_stop(hdev); 417 + kfree(drv_data); 423 418 } 424 419 425 420 static const struct hid_device_id lg_devices[] = {
+5
drivers/hid/hid-lg.h
··· 1 1 #ifndef __HID_LG_H 2 2 #define __HID_LG_H 3 3 4 + struct lg_drv_data { 5 + unsigned long quirks; 6 + void *device_props; /* Device specific properties */ 7 + }; 8 + 4 9 #ifdef CONFIG_LOGITECH_FF 5 10 int lgff_init(struct hid_device *hdev); 6 11 #else
+204 -54
drivers/hid/hid-lg4ff.c
··· 1 1 /* 2 - * Force feedback support for Logitech Speed Force Wireless 2 + * Force feedback support for Logitech Gaming Wheels 3 3 * 4 - * http://wiibrew.org/wiki/Logitech_USB_steering_wheel 4 + * Including G27, G25, DFP, DFGT, FFEX, Momo, Momo2 & 5 + * Speed Force Wireless (WiiWheel) 5 6 * 6 7 * Copyright (c) 2010 Simon Wood <simon@mungewell.org> 7 8 */ ··· 52 51 53 52 static DEVICE_ATTR(range, S_IRWXU | S_IRWXG | S_IRWXO, lg4ff_range_show, lg4ff_range_store); 54 53 55 - static bool list_inited; 56 - 57 54 struct lg4ff_device_entry { 58 - char *device_id; /* Use name in respective kobject structure's address as the ID */ 59 55 __u16 range; 60 56 __u16 min_range; 61 57 __u16 max_range; 62 - __u8 leds; 58 + #ifdef CONFIG_LEDS_CLASS 59 + __u8 led_state; 60 + struct led_classdev *led[5]; 61 + #endif 63 62 struct list_head list; 64 63 void (*set_range)(struct hid_device *hid, u16 range); 65 64 }; 66 - 67 - static struct lg4ff_device_entry device_list; 68 65 69 66 static const signed short lg4ff_wheel_effects[] = { 70 67 FF_CONSTANT, ··· 284 285 /* Read current range and display it in terminal */ 285 286 static ssize_t lg4ff_range_show(struct device *dev, struct device_attribute *attr, char *buf) 286 287 { 287 - struct lg4ff_device_entry *uninitialized_var(entry); 288 - struct list_head *h; 289 288 struct hid_device *hid = to_hid_device(dev); 289 + struct lg4ff_device_entry *entry; 290 + struct lg_drv_data *drv_data; 290 291 size_t count; 291 292 292 - list_for_each(h, &device_list.list) { 293 - entry = list_entry(h, struct lg4ff_device_entry, list); 294 - if (strcmp(entry->device_id, (&hid->dev)->kobj.name) == 0) 295 - break; 293 + drv_data = hid_get_drvdata(hid); 294 + if (!drv_data) { 295 + hid_err(hid, "Private driver data not found!\n"); 296 + return 0; 296 297 } 297 - if (h == &device_list.list) { 298 - dbg_hid("Device not found!"); 298 + 299 + entry = drv_data->device_props; 300 + if (!entry) { 301 + hid_err(hid, "Device properties not found!\n"); 299 302 return 0; 300 303 } 301 304 ··· 309 308 * according to the type of the wheel */ 310 309 static ssize_t lg4ff_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) 311 310 { 312 - struct lg4ff_device_entry *uninitialized_var(entry); 313 - struct list_head *h; 314 311 struct hid_device *hid = to_hid_device(dev); 312 + struct lg4ff_device_entry *entry; 313 + struct lg_drv_data *drv_data; 315 314 __u16 range = simple_strtoul(buf, NULL, 10); 316 315 317 - list_for_each(h, &device_list.list) { 318 - entry = list_entry(h, struct lg4ff_device_entry, list); 319 - if (strcmp(entry->device_id, (&hid->dev)->kobj.name) == 0) 320 - break; 316 + drv_data = hid_get_drvdata(hid); 317 + if (!drv_data) { 318 + hid_err(hid, "Private driver data not found!\n"); 319 + return 0; 321 320 } 322 - if (h == &device_list.list) { 323 - dbg_hid("Device not found!"); 324 - return count; 321 + 322 + entry = drv_data->device_props; 323 + if (!entry) { 324 + hid_err(hid, "Device properties not found!\n"); 325 + return 0; 325 326 } 326 327 327 328 if (range == 0) ··· 339 336 return count; 340 337 } 341 338 339 + #ifdef CONFIG_LEDS_CLASS 340 + static void lg4ff_set_leds(struct hid_device *hid, __u8 leds) 341 + { 342 + struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT].report_list; 343 + struct hid_report *report = list_entry(report_list->next, struct hid_report, list); 344 + 345 + report->field[0]->value[0] = 0xf8; 346 + report->field[0]->value[1] = 0x12; 347 + report->field[0]->value[2] = leds; 348 + report->field[0]->value[3] = 0x00; 349 + report->field[0]->value[4] = 0x00; 350 + report->field[0]->value[5] = 0x00; 351 + report->field[0]->value[6] = 0x00; 352 + usbhid_submit_report(hid, report, USB_DIR_OUT); 353 + } 354 + 355 + static void lg4ff_led_set_brightness(struct led_classdev *led_cdev, 356 + enum led_brightness value) 357 + { 358 + struct device *dev = led_cdev->dev->parent; 359 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 360 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hid); 361 + struct lg4ff_device_entry *entry; 362 + int i, state = 0; 363 + 364 + if (!drv_data) { 365 + hid_err(hid, "Device data not found."); 366 + return; 367 + } 368 + 369 + entry = (struct lg4ff_device_entry *)drv_data->device_props; 370 + 371 + if (!entry) { 372 + hid_err(hid, "Device properties not found."); 373 + return; 374 + } 375 + 376 + for (i = 0; i < 5; i++) { 377 + if (led_cdev != entry->led[i]) 378 + continue; 379 + state = (entry->led_state >> i) & 1; 380 + if (value == LED_OFF && state) { 381 + entry->led_state &= ~(1 << i); 382 + lg4ff_set_leds(hid, entry->led_state); 383 + } else if (value != LED_OFF && !state) { 384 + entry->led_state |= 1 << i; 385 + lg4ff_set_leds(hid, entry->led_state); 386 + } 387 + break; 388 + } 389 + } 390 + 391 + static enum led_brightness lg4ff_led_get_brightness(struct led_classdev *led_cdev) 392 + { 393 + struct device *dev = led_cdev->dev->parent; 394 + struct hid_device *hid = container_of(dev, struct hid_device, dev); 395 + struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hid); 396 + struct lg4ff_device_entry *entry; 397 + int i, value = 0; 398 + 399 + if (!drv_data) { 400 + hid_err(hid, "Device data not found."); 401 + return LED_OFF; 402 + } 403 + 404 + entry = (struct lg4ff_device_entry *)drv_data->device_props; 405 + 406 + if (!entry) { 407 + hid_err(hid, "Device properties not found."); 408 + return LED_OFF; 409 + } 410 + 411 + for (i = 0; i < 5; i++) 412 + if (led_cdev == entry->led[i]) { 413 + value = (entry->led_state >> i) & 1; 414 + break; 415 + } 416 + 417 + return value ? LED_FULL : LED_OFF; 418 + } 419 + #endif 420 + 342 421 int lg4ff_init(struct hid_device *hid) 343 422 { 344 423 struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); ··· 429 344 struct hid_report *report; 430 345 struct hid_field *field; 431 346 struct lg4ff_device_entry *entry; 347 + struct lg_drv_data *drv_data; 432 348 struct usb_device_descriptor *udesc; 433 349 int error, i, j; 434 350 __u16 bcdDevice, rev_maj, rev_min; ··· 509 423 dev->ff->set_autocenter(dev, 0); 510 424 } 511 425 512 - /* Initialize device_list if this is the first device to handle by lg4ff */ 513 - if (!list_inited) { 514 - INIT_LIST_HEAD(&device_list.list); 515 - list_inited = 1; 426 + /* Get private driver data */ 427 + drv_data = hid_get_drvdata(hid); 428 + if (!drv_data) { 429 + hid_err(hid, "Cannot add device, private driver data not allocated\n"); 430 + return -1; 516 431 } 517 432 518 - /* Add the device to device_list */ 433 + /* Initialize device properties */ 519 434 entry = kzalloc(sizeof(struct lg4ff_device_entry), GFP_KERNEL); 520 435 if (!entry) { 521 - hid_err(hid, "Cannot add device, insufficient memory.\n"); 436 + hid_err(hid, "Cannot add device, insufficient memory to allocate device properties.\n"); 522 437 return -ENOMEM; 523 438 } 524 - entry->device_id = kstrdup((&hid->dev)->kobj.name, GFP_KERNEL); 525 - if (!entry->device_id) { 526 - hid_err(hid, "Cannot set device_id, insufficient memory.\n"); 527 - kfree(entry); 528 - return -ENOMEM; 529 - } 439 + drv_data->device_props = entry; 440 + 530 441 entry->min_range = lg4ff_devices[i].min_range; 531 442 entry->max_range = lg4ff_devices[i].max_range; 532 443 entry->set_range = lg4ff_devices[i].set_range; 533 - list_add(&entry->list, &device_list.list); 534 444 535 445 /* Create sysfs interface */ 536 446 error = device_create_file(&hid->dev, &dev_attr_range); ··· 539 457 if (entry->set_range != NULL) 540 458 entry->set_range(hid, entry->range); 541 459 542 - hid_info(hid, "Force feedback for Logitech Speed Force Wireless by Simon Wood <simon@mungewell.org>\n"); 460 + #ifdef CONFIG_LEDS_CLASS 461 + /* register led subsystem - G27 only */ 462 + entry->led_state = 0; 463 + for (j = 0; j < 5; j++) 464 + entry->led[j] = NULL; 465 + 466 + if (lg4ff_devices[i].product_id == USB_DEVICE_ID_LOGITECH_G27_WHEEL) { 467 + struct led_classdev *led; 468 + size_t name_sz; 469 + char *name; 470 + 471 + lg4ff_set_leds(hid, 0); 472 + 473 + name_sz = strlen(dev_name(&hid->dev)) + 8; 474 + 475 + for (j = 0; j < 5; j++) { 476 + led = kzalloc(sizeof(struct led_classdev)+name_sz, GFP_KERNEL); 477 + if (!led) { 478 + hid_err(hid, "can't allocate memory for LED %d\n", j); 479 + goto err; 480 + } 481 + 482 + name = (void *)(&led[1]); 483 + snprintf(name, name_sz, "%s::RPM%d", dev_name(&hid->dev), j+1); 484 + led->name = name; 485 + led->brightness = 0; 486 + led->max_brightness = 1; 487 + led->brightness_get = lg4ff_led_get_brightness; 488 + led->brightness_set = lg4ff_led_set_brightness; 489 + 490 + entry->led[j] = led; 491 + error = led_classdev_register(&hid->dev, led); 492 + 493 + if (error) { 494 + hid_err(hid, "failed to register LED %d. Aborting.\n", j); 495 + err: 496 + /* Deregister LEDs (if any) */ 497 + for (j = 0; j < 5; j++) { 498 + led = entry->led[j]; 499 + entry->led[j] = NULL; 500 + if (!led) 501 + continue; 502 + led_classdev_unregister(led); 503 + kfree(led); 504 + } 505 + goto out; /* Let the driver continue without LEDs */ 506 + } 507 + } 508 + } 509 + out: 510 + #endif 511 + hid_info(hid, "Force feedback support for Logitech Gaming Wheels\n"); 543 512 return 0; 544 513 } 545 514 546 515 int lg4ff_deinit(struct hid_device *hid) 547 516 { 548 - bool found = 0; 549 517 struct lg4ff_device_entry *entry; 550 - struct list_head *h, *g; 551 - list_for_each_safe(h, g, &device_list.list) { 552 - entry = list_entry(h, struct lg4ff_device_entry, list); 553 - if (strcmp(entry->device_id, (&hid->dev)->kobj.name) == 0) { 554 - list_del(h); 555 - kfree(entry->device_id); 556 - kfree(entry); 557 - found = 1; 558 - break; 559 - } 560 - } 518 + struct lg_drv_data *drv_data; 561 519 562 - if (!found) { 563 - dbg_hid("Device entry not found!\n"); 520 + device_remove_file(&hid->dev, &dev_attr_range); 521 + 522 + drv_data = hid_get_drvdata(hid); 523 + if (!drv_data) { 524 + hid_err(hid, "Error while deinitializing device, no private driver data.\n"); 525 + return -1; 526 + } 527 + entry = drv_data->device_props; 528 + if (!entry) { 529 + hid_err(hid, "Error while deinitializing device, no device properties data.\n"); 564 530 return -1; 565 531 } 566 532 567 - device_remove_file(&hid->dev, &dev_attr_range); 533 + #ifdef CONFIG_LEDS_CLASS 534 + { 535 + int j; 536 + struct led_classdev *led; 537 + 538 + /* Deregister LEDs (if any) */ 539 + for (j = 0; j < 5; j++) { 540 + 541 + led = entry->led[j]; 542 + entry->led[j] = NULL; 543 + if (!led) 544 + continue; 545 + led_classdev_unregister(led); 546 + kfree(led); 547 + } 548 + } 549 + #endif 550 + 551 + /* Deallocate memory */ 552 + kfree(entry); 553 + 568 554 dbg_hid("Device successfully unregistered\n"); 569 555 return 0; 570 556 }
+46 -12
drivers/hid/hid-multitouch.c
··· 70 70 bool is_indirect; /* true for touchpads */ 71 71 }; 72 72 73 + struct mt_fields { 74 + unsigned usages[HID_MAX_FIELDS]; 75 + unsigned int length; 76 + }; 77 + 73 78 struct mt_device { 74 79 struct mt_slot curdata; /* placeholder of incoming data */ 75 80 struct mt_class mtclass; /* our mt device class */ 81 + struct mt_fields *fields; /* temporary placeholder for storing the 82 + multitouch fields */ 76 83 unsigned last_field_index; /* last field index of the report */ 77 84 unsigned last_slot_field; /* the last field of a slot */ 78 85 __s8 inputmode; /* InputMode HID feature, -1 if non-existent */ ··· 285 278 input_set_abs_params(input, code, fmin, fmax, fuzz, 0); 286 279 } 287 280 288 - static void set_last_slot_field(struct hid_usage *usage, struct mt_device *td, 281 + static void mt_store_field(struct hid_usage *usage, struct mt_device *td, 289 282 struct hid_input *hi) 290 283 { 291 - if (!test_bit(usage->hid, hi->input->absbit)) 292 - td->last_slot_field = usage->hid; 284 + struct mt_fields *f = td->fields; 285 + 286 + if (f->length >= HID_MAX_FIELDS) 287 + return; 288 + 289 + f->usages[f->length++] = usage->hid; 293 290 } 294 291 295 292 static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, ··· 344 333 cls->sn_move); 345 334 /* touchscreen emulation */ 346 335 set_abs(hi->input, ABS_X, field, cls->sn_move); 347 - set_last_slot_field(usage, td, hi); 336 + mt_store_field(usage, td, hi); 348 337 td->last_field_index = field->index; 349 338 return 1; 350 339 case HID_GD_Y: ··· 354 343 cls->sn_move); 355 344 /* touchscreen emulation */ 356 345 set_abs(hi->input, ABS_Y, field, cls->sn_move); 357 - set_last_slot_field(usage, td, hi); 346 + mt_store_field(usage, td, hi); 358 347 td->last_field_index = field->index; 359 348 return 1; 360 349 } ··· 363 352 case HID_UP_DIGITIZER: 364 353 switch (usage->hid) { 365 354 case HID_DG_INRANGE: 366 - set_last_slot_field(usage, td, hi); 355 + mt_store_field(usage, td, hi); 367 356 td->last_field_index = field->index; 368 357 return 1; 369 358 case HID_DG_CONFIDENCE: 370 - set_last_slot_field(usage, td, hi); 359 + mt_store_field(usage, td, hi); 371 360 td->last_field_index = field->index; 372 361 return 1; 373 362 case HID_DG_TIPSWITCH: 374 363 hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); 375 364 input_set_capability(hi->input, EV_KEY, BTN_TOUCH); 376 - set_last_slot_field(usage, td, hi); 365 + mt_store_field(usage, td, hi); 377 366 td->last_field_index = field->index; 378 367 return 1; 379 368 case HID_DG_CONTACTID: 380 369 if (!td->maxcontacts) 381 370 td->maxcontacts = MT_DEFAULT_MAXCONTACT; 382 371 input_mt_init_slots(hi->input, td->maxcontacts); 383 - td->last_slot_field = usage->hid; 372 + mt_store_field(usage, td, hi); 384 373 td->last_field_index = field->index; 385 374 td->touches_by_report++; 386 375 return 1; ··· 389 378 EV_ABS, ABS_MT_TOUCH_MAJOR); 390 379 set_abs(hi->input, ABS_MT_TOUCH_MAJOR, field, 391 380 cls->sn_width); 392 - set_last_slot_field(usage, td, hi); 381 + mt_store_field(usage, td, hi); 393 382 td->last_field_index = field->index; 394 383 return 1; 395 384 case HID_DG_HEIGHT: ··· 399 388 cls->sn_height); 400 389 input_set_abs_params(hi->input, 401 390 ABS_MT_ORIENTATION, 0, 1, 0, 0); 402 - set_last_slot_field(usage, td, hi); 391 + mt_store_field(usage, td, hi); 403 392 td->last_field_index = field->index; 404 393 return 1; 405 394 case HID_DG_TIPPRESSURE: ··· 410 399 /* touchscreen emulation */ 411 400 set_abs(hi->input, ABS_PRESSURE, field, 412 401 cls->sn_pressure); 413 - set_last_slot_field(usage, td, hi); 402 + mt_store_field(usage, td, hi); 414 403 td->last_field_index = field->index; 415 404 return 1; 416 405 case HID_DG_CONTACTCOUNT: ··· 664 653 td->mtclass.quirks = quirks; 665 654 } 666 655 656 + static void mt_post_parse(struct mt_device *td) 657 + { 658 + struct mt_fields *f = td->fields; 659 + 660 + if (td->touches_by_report > 0) { 661 + int field_count_per_touch = f->length / td->touches_by_report; 662 + td->last_slot_field = f->usages[field_count_per_touch - 1]; 663 + } 664 + } 665 + 667 666 static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) 668 667 { 669 668 int ret, i; ··· 704 683 td->maxcontact_report_id = -1; 705 684 hid_set_drvdata(hdev, td); 706 685 686 + td->fields = kzalloc(sizeof(struct mt_fields), GFP_KERNEL); 687 + if (!td->fields) { 688 + dev_err(&hdev->dev, "cannot allocate multitouch fields data\n"); 689 + ret = -ENOMEM; 690 + goto fail; 691 + } 692 + 707 693 ret = hid_parse(hdev); 708 694 if (ret != 0) 709 695 goto fail; ··· 718 690 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); 719 691 if (ret) 720 692 goto fail; 693 + 694 + mt_post_parse(td); 721 695 722 696 if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID) 723 697 mt_post_parse_default_settings(td); ··· 738 708 mt_set_maxcontacts(hdev); 739 709 mt_set_input_mode(hdev); 740 710 711 + kfree(td->fields); 712 + td->fields = NULL; 713 + 741 714 return 0; 742 715 743 716 fail: 717 + kfree(td->fields); 744 718 kfree(td); 745 719 return ret; 746 720 }