summaryrefslogtreecommitdiff
path: root/usr
diff options
context:
space:
mode:
Diffstat (limited to 'usr')
-rw-r--r--usr/src/dkms_source_tree/KERNEL_SOURCE_VERSION2
-rw-r--r--usr/src/dkms_source_tree/Makefile7
-rw-r--r--usr/src/dkms_source_tree/dkms.conf2
-rw-r--r--usr/src/dkms_source_tree/hid-core.c1466
-rw-r--r--usr/src/dkms_source_tree/hid-debug.c465
-rw-r--r--usr/src/dkms_source_tree/hid-ids.h531
-rw-r--r--usr/src/dkms_source_tree/hid-input-quirks.c484
-rw-r--r--usr/src/dkms_source_tree/hid-input.c975
-rw-r--r--usr/src/dkms_source_tree/hid.mod.c76
-rw-r--r--usr/src/dkms_source_tree/hidraw.c153
-rw-r--r--usr/src/dkms_source_tree/patches/10-expose-and-dashboard.patch17
11 files changed, 2578 insertions, 1600 deletions
diff --git a/usr/src/dkms_source_tree/KERNEL_SOURCE_VERSION b/usr/src/dkms_source_tree/KERNEL_SOURCE_VERSION
index 9cd2822..2c689b1 100644
--- a/usr/src/dkms_source_tree/KERNEL_SOURCE_VERSION
+++ b/usr/src/dkms_source_tree/KERNEL_SOURCE_VERSION
@@ -1 +1 @@
2.6.27-7-generic 2.6.35-19-generic
diff --git a/usr/src/dkms_source_tree/Makefile b/usr/src/dkms_source_tree/Makefile
index 2537695..2da5113 100644
--- a/usr/src/dkms_source_tree/Makefile
+++ b/usr/src/dkms_source_tree/Makefile
@@ -1,9 +1,12 @@
1# 1#
2# Makefile for the HID driver 2# Makefile for the HID driver
3# 3#
4hid-objs := hid-core.o hid-input.o hid-input-quirks.o 4hid-objs := hid-core.o hid-input.o
5
6ifdef CONFIG_DEBUG_FS
7 hid-objs += hid-debug.o
8endif
5 9
6obj-$(CONFIG_HID) += hid.o 10obj-$(CONFIG_HID) += hid.o
7 11
8hid-$(CONFIG_HID_DEBUG) += hid-debug.o
9hid-$(CONFIG_HIDRAW) += hidraw.o 12hid-$(CONFIG_HIDRAW) += hidraw.o
diff --git a/usr/src/dkms_source_tree/dkms.conf b/usr/src/dkms_source_tree/dkms.conf
index 46a66a3..111cc05 100644
--- a/usr/src/dkms_source_tree/dkms.conf
+++ b/usr/src/dkms_source_tree/dkms.conf
@@ -1,5 +1,5 @@
1NAME=hid 1NAME=hid
2VERSION=0.11.1 2VERSION=1.0.0
3PACKAGE_NAME="$NAME" 3PACKAGE_NAME="$NAME"
4PACKAGE_VERSION="$VERSION" 4PACKAGE_VERSION="$VERSION"
5MAKE[0]="make -C ${kernel_source_dir} 5MAKE[0]="make -C ${kernel_source_dir}
diff --git a/usr/src/dkms_source_tree/hid-core.c b/usr/src/dkms_source_tree/hid-core.c
index 426ac5a..79fc152 100644
--- a/usr/src/dkms_source_tree/hid-core.c
+++ b/usr/src/dkms_source_tree/hid-core.c
@@ -4,7 +4,7 @@
4 * Copyright (c) 1999 Andreas Gal 4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> 5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc 6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006-2007 Jiri Kosina 7 * Copyright (c) 2006-2010 Jiri Kosina
8 */ 8 */
9 9
10/* 10/*
@@ -33,27 +33,25 @@
33#include <linux/hid-debug.h> 33#include <linux/hid-debug.h>
34#include <linux/hidraw.h> 34#include <linux/hidraw.h>
35 35
36#include "hid-ids.h"
37
36/* 38/*
37 * Version Information 39 * Version Information
38 */ 40 */
39 41
40#define DRIVER_VERSION "v2.6"
41#define DRIVER_AUTHOR "Andreas Gal, Vojtech Pavlik, Jiri Kosina"
42#define DRIVER_DESC "HID core driver" 42#define DRIVER_DESC "HID core driver"
43#define DRIVER_LICENSE "GPL" 43#define DRIVER_LICENSE "GPL"
44 44
45#ifdef CONFIG_HID_DEBUG
46int hid_debug = 0; 45int hid_debug = 0;
47module_param_named(debug, hid_debug, int, 0600); 46module_param_named(debug, hid_debug, int, 0600);
48MODULE_PARM_DESC(debug, "HID debugging (0=off, 1=probing info, 2=continuous data dumping)"); 47MODULE_PARM_DESC(debug, "toggle HID debugging messages");
49EXPORT_SYMBOL_GPL(hid_debug); 48EXPORT_SYMBOL_GPL(hid_debug);
50#endif
51 49
52/* 50/*
53 * Register a new report for a device. 51 * Register a new report for a device.
54 */ 52 */
55 53
56static struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id) 54struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id)
57{ 55{
58 struct hid_report_enum *report_enum = device->report_enum + type; 56 struct hid_report_enum *report_enum = device->report_enum + type;
59 struct hid_report *report; 57 struct hid_report *report;
@@ -77,6 +75,7 @@ static struct hid_report *hid_register_report(struct hid_device *device, unsigne
77 75
78 return report; 76 return report;
79} 77}
78EXPORT_SYMBOL_GPL(hid_register_report);
80 79
81/* 80/*
82 * Register a new field for this report. 81 * Register a new field for this report.
@@ -268,9 +267,9 @@ static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsign
268static u32 item_udata(struct hid_item *item) 267static u32 item_udata(struct hid_item *item)
269{ 268{
270 switch (item->size) { 269 switch (item->size) {
271 case 1: return item->data.u8; 270 case 1: return item->data.u8;
272 case 2: return item->data.u16; 271 case 2: return item->data.u16;
273 case 4: return item->data.u32; 272 case 4: return item->data.u32;
274 } 273 }
275 return 0; 274 return 0;
276} 275}
@@ -278,9 +277,9 @@ static u32 item_udata(struct hid_item *item)
278static s32 item_sdata(struct hid_item *item) 277static s32 item_sdata(struct hid_item *item)
279{ 278{
280 switch (item->size) { 279 switch (item->size) {
281 case 1: return item->data.s8; 280 case 1: return item->data.s8;
282 case 2: return item->data.s16; 281 case 2: return item->data.s16;
283 case 4: return item->data.s32; 282 case 4: return item->data.s32;
284 } 283 }
285 return 0; 284 return 0;
286} 285}
@@ -292,87 +291,91 @@ static s32 item_sdata(struct hid_item *item)
292static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) 291static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
293{ 292{
294 switch (item->tag) { 293 switch (item->tag) {
294 case HID_GLOBAL_ITEM_TAG_PUSH:
295 295
296 case HID_GLOBAL_ITEM_TAG_PUSH: 296 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) {
297 297 dbg_hid("global enviroment stack overflow\n");
298 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) { 298 return -1;
299 dbg_hid("global enviroment stack overflow\n"); 299 }
300 return -1;
301 }
302
303 memcpy(parser->global_stack + parser->global_stack_ptr++,
304 &parser->global, sizeof(struct hid_global));
305 return 0;
306 300
307 case HID_GLOBAL_ITEM_TAG_POP: 301 memcpy(parser->global_stack + parser->global_stack_ptr++,
302 &parser->global, sizeof(struct hid_global));
303 return 0;
308 304
309 if (!parser->global_stack_ptr) { 305 case HID_GLOBAL_ITEM_TAG_POP:
310 dbg_hid("global enviroment stack underflow\n");
311 return -1;
312 }
313 306
314 memcpy(&parser->global, parser->global_stack + --parser->global_stack_ptr, 307 if (!parser->global_stack_ptr) {
315 sizeof(struct hid_global)); 308 dbg_hid("global enviroment stack underflow\n");
316 return 0; 309 return -1;
310 }
317 311
318 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE: 312 memcpy(&parser->global, parser->global_stack +
319 parser->global.usage_page = item_udata(item); 313 --parser->global_stack_ptr, sizeof(struct hid_global));
320 return 0; 314 return 0;
321 315
322 case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM: 316 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
323 parser->global.logical_minimum = item_sdata(item); 317 parser->global.usage_page = item_udata(item);
324 return 0; 318 return 0;
325 319
326 case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM: 320 case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
327 if (parser->global.logical_minimum < 0) 321 parser->global.logical_minimum = item_sdata(item);
328 parser->global.logical_maximum = item_sdata(item); 322 return 0;
329 else
330 parser->global.logical_maximum = item_udata(item);
331 return 0;
332 323
333 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM: 324 case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
334 parser->global.physical_minimum = item_sdata(item); 325 if (parser->global.logical_minimum < 0)
335 return 0; 326 parser->global.logical_maximum = item_sdata(item);
327 else
328 parser->global.logical_maximum = item_udata(item);
329 return 0;
336 330
337 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM: 331 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
338 if (parser->global.physical_minimum < 0) 332 parser->global.physical_minimum = item_sdata(item);
339 parser->global.physical_maximum = item_sdata(item); 333 return 0;
340 else
341 parser->global.physical_maximum = item_udata(item);
342 return 0;
343 334
344 case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT: 335 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
345 parser->global.unit_exponent = item_sdata(item); 336 if (parser->global.physical_minimum < 0)
346 return 0; 337 parser->global.physical_maximum = item_sdata(item);
338 else
339 parser->global.physical_maximum = item_udata(item);
340 return 0;
347 341
348 case HID_GLOBAL_ITEM_TAG_UNIT: 342 case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
349 parser->global.unit = item_udata(item); 343 parser->global.unit_exponent = item_sdata(item);
350 return 0; 344 return 0;
351 345
352 case HID_GLOBAL_ITEM_TAG_REPORT_SIZE: 346 case HID_GLOBAL_ITEM_TAG_UNIT:
353 if ((parser->global.report_size = item_udata(item)) > 32) { 347 parser->global.unit = item_udata(item);
354 dbg_hid("invalid report_size %d\n", parser->global.report_size); 348 return 0;
355 return -1;
356 }
357 return 0;
358 349
359 case HID_GLOBAL_ITEM_TAG_REPORT_COUNT: 350 case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
360 if ((parser->global.report_count = item_udata(item)) > HID_MAX_USAGES) { 351 parser->global.report_size = item_udata(item);
361 dbg_hid("invalid report_count %d\n", parser->global.report_count); 352 if (parser->global.report_size > 32) {
362 return -1; 353 dbg_hid("invalid report_size %d\n",
363 } 354 parser->global.report_size);
364 return 0; 355 return -1;
356 }
357 return 0;
365 358
366 case HID_GLOBAL_ITEM_TAG_REPORT_ID: 359 case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
367 if ((parser->global.report_id = item_udata(item)) == 0) { 360 parser->global.report_count = item_udata(item);
368 dbg_hid("report_id 0 is invalid\n"); 361 if (parser->global.report_count > HID_MAX_USAGES) {
369 return -1; 362 dbg_hid("invalid report_count %d\n",
370 } 363 parser->global.report_count);
371 return 0; 364 return -1;
365 }
366 return 0;
372 367
373 default: 368 case HID_GLOBAL_ITEM_TAG_REPORT_ID:
374 dbg_hid("unknown global tag 0x%x\n", item->tag); 369 parser->global.report_id = item_udata(item);
370 if (parser->global.report_id == 0) {
371 dbg_hid("report_id 0 is invalid\n");
375 return -1; 372 return -1;
373 }
374 return 0;
375
376 default:
377 dbg_hid("unknown global tag 0x%x\n", item->tag);
378 return -1;
376 } 379 }
377} 380}
378 381
@@ -385,7 +388,8 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
385 __u32 data; 388 __u32 data;
386 unsigned n; 389 unsigned n;
387 390
388 if (item->size == 0) { 391 /* Local delimiter could have value 0, which allows size to be 0 */
392 if (item->size == 0 && item->tag != HID_LOCAL_ITEM_TAG_DELIMITER) {
389 dbg_hid("item data expected for local item\n"); 393 dbg_hid("item data expected for local item\n");
390 return -1; 394 return -1;
391 } 395 }
@@ -393,77 +397,76 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
393 data = item_udata(item); 397 data = item_udata(item);
394 398
395 switch (item->tag) { 399 switch (item->tag) {
396 400 case HID_LOCAL_ITEM_TAG_DELIMITER:
397 case HID_LOCAL_ITEM_TAG_DELIMITER: 401
398 402 if (data) {
399 if (data) { 403 /*
400 /* 404 * We treat items before the first delimiter
401 * We treat items before the first delimiter 405 * as global to all usage sets (branch 0).
402 * as global to all usage sets (branch 0). 406 * In the moment we process only these global
403 * In the moment we process only these global 407 * items and the first delimiter set.
404 * items and the first delimiter set. 408 */
405 */ 409 if (parser->local.delimiter_depth != 0) {
406 if (parser->local.delimiter_depth != 0) { 410 dbg_hid("nested delimiters\n");
407 dbg_hid("nested delimiters\n"); 411 return -1;
408 return -1;
409 }
410 parser->local.delimiter_depth++;
411 parser->local.delimiter_branch++;
412 } else {
413 if (parser->local.delimiter_depth < 1) {
414 dbg_hid("bogus close delimiter\n");
415 return -1;
416 }
417 parser->local.delimiter_depth--;
418 } 412 }
419 return 1; 413 parser->local.delimiter_depth++;
420 414 parser->local.delimiter_branch++;
421 case HID_LOCAL_ITEM_TAG_USAGE: 415 } else {
422 416 if (parser->local.delimiter_depth < 1) {
423 if (parser->local.delimiter_branch > 1) { 417 dbg_hid("bogus close delimiter\n");
424 dbg_hid("alternative usage ignored\n"); 418 return -1;
425 return 0;
426 } 419 }
420 parser->local.delimiter_depth--;
421 }
422 return 1;
427 423
428 if (item->size <= 2) 424 case HID_LOCAL_ITEM_TAG_USAGE:
429 data = (parser->global.usage_page << 16) + data;
430 425
431 return hid_add_usage(parser, data); 426 if (parser->local.delimiter_branch > 1) {
427 dbg_hid("alternative usage ignored\n");
428 return 0;
429 }
432 430
433 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM: 431 if (item->size <= 2)
432 data = (parser->global.usage_page << 16) + data;
434 433
435 if (parser->local.delimiter_branch > 1) { 434 return hid_add_usage(parser, data);
436 dbg_hid("alternative usage ignored\n");
437 return 0;
438 }
439 435
440 if (item->size <= 2) 436 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
441 data = (parser->global.usage_page << 16) + data;
442 437
443 parser->local.usage_minimum = data; 438 if (parser->local.delimiter_branch > 1) {
439 dbg_hid("alternative usage ignored\n");
444 return 0; 440 return 0;
441 }
445 442
446 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM: 443 if (item->size <= 2)
444 data = (parser->global.usage_page << 16) + data;
447 445
448 if (parser->local.delimiter_branch > 1) { 446 parser->local.usage_minimum = data;
449 dbg_hid("alternative usage ignored\n"); 447 return 0;
450 return 0;
451 }
452 448
453 if (item->size <= 2) 449 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
454 data = (parser->global.usage_page << 16) + data;
455 450
456 for (n = parser->local.usage_minimum; n <= data; n++) 451 if (parser->local.delimiter_branch > 1) {
457 if (hid_add_usage(parser, n)) { 452 dbg_hid("alternative usage ignored\n");
458 dbg_hid("hid_add_usage failed\n");
459 return -1;
460 }
461 return 0; 453 return 0;
454 }
462 455
463 default: 456 if (item->size <= 2)
457 data = (parser->global.usage_page << 16) + data;
464 458
465 dbg_hid("unknown local item tag 0x%x\n", item->tag); 459 for (n = parser->local.usage_minimum; n <= data; n++)
466 return 0; 460 if (hid_add_usage(parser, n)) {
461 dbg_hid("hid_add_usage failed\n");
462 return -1;
463 }
464 return 0;
465
466 default:
467
468 dbg_hid("unknown local item tag 0x%x\n", item->tag);
469 return 0;
467 } 470 }
468 return 0; 471 return 0;
469} 472}
@@ -480,24 +483,24 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
480 data = item_udata(item); 483 data = item_udata(item);
481 484
482 switch (item->tag) { 485 switch (item->tag) {
483 case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION: 486 case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
484 ret = open_collection(parser, data & 0xff); 487 ret = open_collection(parser, data & 0xff);
485 break; 488 break;
486 case HID_MAIN_ITEM_TAG_END_COLLECTION: 489 case HID_MAIN_ITEM_TAG_END_COLLECTION:
487 ret = close_collection(parser); 490 ret = close_collection(parser);
488 break; 491 break;
489 case HID_MAIN_ITEM_TAG_INPUT: 492 case HID_MAIN_ITEM_TAG_INPUT:
490 ret = hid_add_field(parser, HID_INPUT_REPORT, data); 493 ret = hid_add_field(parser, HID_INPUT_REPORT, data);
491 break; 494 break;
492 case HID_MAIN_ITEM_TAG_OUTPUT: 495 case HID_MAIN_ITEM_TAG_OUTPUT:
493 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data); 496 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data);
494 break; 497 break;
495 case HID_MAIN_ITEM_TAG_FEATURE: 498 case HID_MAIN_ITEM_TAG_FEATURE:
496 ret = hid_add_field(parser, HID_FEATURE_REPORT, data); 499 ret = hid_add_field(parser, HID_FEATURE_REPORT, data);
497 break; 500 break;
498 default: 501 default:
499 dbg_hid("unknown main item tag 0x%x\n", item->tag); 502 dbg_hid("unknown main item tag 0x%x\n", item->tag);
500 ret = 0; 503 ret = 0;
501 } 504 }
502 505
503 memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */ 506 memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */
@@ -534,9 +537,10 @@ static void hid_free_report(struct hid_report *report)
534 * Free a device structure, all reports, and all fields. 537 * Free a device structure, all reports, and all fields.
535 */ 538 */
536 539
537void hid_free_device(struct hid_device *device) 540static void hid_device_release(struct device *dev)
538{ 541{
539 unsigned i,j; 542 struct hid_device *device = container_of(dev, struct hid_device, dev);
543 unsigned i, j;
540 544
541 for (i = 0; i < HID_REPORT_TYPES; i++) { 545 for (i = 0; i < HID_REPORT_TYPES; i++) {
542 struct hid_report_enum *report_enum = device->report_enum + i; 546 struct hid_report_enum *report_enum = device->report_enum + i;
@@ -552,7 +556,6 @@ void hid_free_device(struct hid_device *device)
552 kfree(device->collection); 556 kfree(device->collection);
553 kfree(device); 557 kfree(device);
554} 558}
555EXPORT_SYMBOL_GPL(hid_free_device);
556 559
557/* 560/*
558 * Fetch a report description item from the data stream. We support long 561 * Fetch a report description item from the data stream. We support long
@@ -593,47 +596,52 @@ static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
593 item->size = b & 3; 596 item->size = b & 3;
594 597
595 switch (item->size) { 598 switch (item->size) {
599 case 0:
600 return start;
596 601
597 case 0: 602 case 1:
598 return start; 603 if ((end - start) < 1)
599 604 return NULL;
600 case 1: 605 item->data.u8 = *start++;
601 if ((end - start) < 1) 606 return start;
602 return NULL;
603 item->data.u8 = *start++;
604 return start;
605 607
606 case 2: 608 case 2:
607 if ((end - start) < 2) 609 if ((end - start) < 2)
608 return NULL; 610 return NULL;
609 item->data.u16 = get_unaligned_le16(start); 611 item->data.u16 = get_unaligned_le16(start);
610 start = (__u8 *)((__le16 *)start + 1); 612 start = (__u8 *)((__le16 *)start + 1);
611 return start; 613 return start;
612 614
613 case 3: 615 case 3:
614 item->size++; 616 item->size++;
615 if ((end - start) < 4) 617 if ((end - start) < 4)
616 return NULL; 618 return NULL;
617 item->data.u32 = get_unaligned_le32(start); 619 item->data.u32 = get_unaligned_le32(start);
618 start = (__u8 *)((__le32 *)start + 1); 620 start = (__u8 *)((__le32 *)start + 1);
619 return start; 621 return start;
620 } 622 }
621 623
622 return NULL; 624 return NULL;
623} 625}
624 626
625/* 627/**
628 * hid_parse_report - parse device report
629 *
630 * @device: hid device
631 * @start: report start
632 * @size: report size
633 *
626 * Parse a report description into a hid_device structure. Reports are 634 * Parse a report description into a hid_device structure. Reports are
627 * enumerated, fields are attached to these reports. 635 * enumerated, fields are attached to these reports.
636 * 0 returned on success, otherwise nonzero error value.
628 */ 637 */
629 638int hid_parse_report(struct hid_device *device, __u8 *start,
630struct hid_device *hid_parse_report(__u8 *start, unsigned size) 639 unsigned size)
631{ 640{
632 struct hid_device *device;
633 struct hid_parser *parser; 641 struct hid_parser *parser;
634 struct hid_item item; 642 struct hid_item item;
635 __u8 *end; 643 __u8 *end;
636 unsigned i; 644 int ret;
637 static int (*dispatch_type[])(struct hid_parser *parser, 645 static int (*dispatch_type[])(struct hid_parser *parser,
638 struct hid_item *item) = { 646 struct hid_item *item) = {
639 hid_parser_main, 647 hid_parser_main,
@@ -642,76 +650,56 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size)
642 hid_parser_reserved 650 hid_parser_reserved
643 }; 651 };
644 652
645 if (!(device = kzalloc(sizeof(struct hid_device), GFP_KERNEL))) 653 if (device->driver->report_fixup)
646 return NULL; 654 device->driver->report_fixup(device, start, size);
647
648 if (!(device->collection = kzalloc(sizeof(struct hid_collection) *
649 HID_DEFAULT_NUM_COLLECTIONS, GFP_KERNEL))) {
650 kfree(device);
651 return NULL;
652 }
653 device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
654 655
655 for (i = 0; i < HID_REPORT_TYPES; i++) 656 device->rdesc = kmemdup(start, size, GFP_KERNEL);
656 INIT_LIST_HEAD(&device->report_enum[i].report_list); 657 if (device->rdesc == NULL)
657 658 return -ENOMEM;
658 if (!(device->rdesc = kmalloc(size, GFP_KERNEL))) {
659 kfree(device->collection);
660 kfree(device);
661 return NULL;
662 }
663 memcpy(device->rdesc, start, size);
664 device->rsize = size; 659 device->rsize = size;
665 660
666 if (!(parser = vmalloc(sizeof(struct hid_parser)))) { 661 parser = vmalloc(sizeof(struct hid_parser));
667 kfree(device->rdesc); 662 if (!parser) {
668 kfree(device->collection); 663 ret = -ENOMEM;
669 kfree(device); 664 goto err;
670 return NULL;
671 } 665 }
666
672 memset(parser, 0, sizeof(struct hid_parser)); 667 memset(parser, 0, sizeof(struct hid_parser));
673 parser->device = device; 668 parser->device = device;
674 669
675 end = start + size; 670 end = start + size;
671 ret = -EINVAL;
676 while ((start = fetch_item(start, end, &item)) != NULL) { 672 while ((start = fetch_item(start, end, &item)) != NULL) {
677 673
678 if (item.format != HID_ITEM_FORMAT_SHORT) { 674 if (item.format != HID_ITEM_FORMAT_SHORT) {
679 dbg_hid("unexpected long global item\n"); 675 dbg_hid("unexpected long global item\n");
680 hid_free_device(device); 676 goto err;
681 vfree(parser);
682 return NULL;
683 } 677 }
684 678
685 if (dispatch_type[item.type](parser, &item)) { 679 if (dispatch_type[item.type](parser, &item)) {
686 dbg_hid("item %u %u %u %u parsing failed\n", 680 dbg_hid("item %u %u %u %u parsing failed\n",
687 item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); 681 item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag);
688 hid_free_device(device); 682 goto err;
689 vfree(parser);
690 return NULL;
691 } 683 }
692 684
693 if (start == end) { 685 if (start == end) {
694 if (parser->collection_stack_ptr) { 686 if (parser->collection_stack_ptr) {
695 dbg_hid("unbalanced collection at end of report description\n"); 687 dbg_hid("unbalanced collection at end of report description\n");
696 hid_free_device(device); 688 goto err;
697 vfree(parser);
698 return NULL;
699 } 689 }
700 if (parser->local.delimiter_depth) { 690 if (parser->local.delimiter_depth) {
701 dbg_hid("unbalanced delimiter at end of report description\n"); 691 dbg_hid("unbalanced delimiter at end of report description\n");
702 hid_free_device(device); 692 goto err;
703 vfree(parser);
704 return NULL;
705 } 693 }
706 vfree(parser); 694 vfree(parser);
707 return device; 695 return 0;
708 } 696 }
709 } 697 }
710 698
711 dbg_hid("item fetching failed at offset %d\n", (int)(end - start)); 699 dbg_hid("item fetching failed at offset %d\n", (int)(end - start));
712 hid_free_device(device); 700err:
713 vfree(parser); 701 vfree(parser);
714 return NULL; 702 return ret;
715} 703}
716EXPORT_SYMBOL_GPL(hid_parse_report); 704EXPORT_SYMBOL_GPL(hid_parse_report);
717 705
@@ -724,9 +712,9 @@ EXPORT_SYMBOL_GPL(hid_parse_report);
724static s32 snto32(__u32 value, unsigned n) 712static s32 snto32(__u32 value, unsigned n)
725{ 713{
726 switch (n) { 714 switch (n) {
727 case 8: return ((__s8)value); 715 case 8: return ((__s8)value);
728 case 16: return ((__s16)value); 716 case 16: return ((__s16)value);
729 case 32: return ((__s32)value); 717 case 32: return ((__s32)value);
730 } 718 }
731 return value & (1 << (n - 1)) ? value | (-1 << n) : value; 719 return value & (1 << (n - 1)) ? value | (-1 << n) : value;
732} 720}
@@ -815,9 +803,73 @@ static __inline__ int search(__s32 *array, __s32 value, unsigned n)
815 return -1; 803 return -1;
816} 804}
817 805
818static void hid_process_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value, int interrupt) 806/**
807 * hid_match_report - check if driver's raw_event should be called
808 *
809 * @hid: hid device
810 * @report_type: type to match against
811 *
812 * compare hid->driver->report_table->report_type to report->type
813 */
814static int hid_match_report(struct hid_device *hid, struct hid_report *report)
815{
816 const struct hid_report_id *id = hid->driver->report_table;
817
818 if (!id) /* NULL means all */
819 return 1;
820
821 for (; id->report_type != HID_TERMINATOR; id++)
822 if (id->report_type == HID_ANY_ID ||
823 id->report_type == report->type)
824 return 1;
825 return 0;
826}
827
828/**
829 * hid_match_usage - check if driver's event should be called
830 *
831 * @hid: hid device
832 * @usage: usage to match against
833 *
834 * compare hid->driver->usage_table->usage_{type,code} to
835 * usage->usage_{type,code}
836 */
837static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage)
838{
839 const struct hid_usage_id *id = hid->driver->usage_table;
840
841 if (!id) /* NULL means all */
842 return 1;
843
844 for (; id->usage_type != HID_ANY_ID - 1; id++)
845 if ((id->usage_hid == HID_ANY_ID ||
846 id->usage_hid == usage->hid) &&
847 (id->usage_type == HID_ANY_ID ||
848 id->usage_type == usage->type) &&
849 (id->usage_code == HID_ANY_ID ||
850 id->usage_code == usage->code))
851 return 1;
852 return 0;
853}
854
855static void hid_process_event(struct hid_device *hid, struct hid_field *field,
856 struct hid_usage *usage, __s32 value, int interrupt)
819{ 857{
820 hid_dump_input(usage, value); 858 struct hid_driver *hdrv = hid->driver;
859 int ret;
860
861 hid_dump_input(hid, usage, value);
862
863 if (hdrv && hdrv->event && hid_match_usage(hid, usage)) {
864 ret = hdrv->event(hid, field, usage, value);
865 if (ret != 0) {
866 if (ret < 0)
867 dbg_hid("%s's event failed with %d\n",
868 hdrv->name, ret);
869 return;
870 }
871 }
872
821 if (hid->claimed & HID_CLAIMED_INPUT) 873 if (hid->claimed & HID_CLAIMED_INPUT)
822 hidinput_hid_event(hid, field, usage, value); 874 hidinput_hid_event(hid, field, usage, value);
823 if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event) 875 if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event)
@@ -887,13 +939,8 @@ static void hid_output_field(struct hid_field *field, __u8 *data)
887 unsigned count = field->report_count; 939 unsigned count = field->report_count;
888 unsigned offset = field->report_offset; 940 unsigned offset = field->report_offset;
889 unsigned size = field->report_size; 941 unsigned size = field->report_size;
890 unsigned bitsused = offset + count * size;
891 unsigned n; 942 unsigned n;
892 943
893 /* make sure the unused bits in the last byte are zeros */
894 if (count > 0 && size > 0 && (bitsused % 8) != 0)
895 data[(bitsused-1)/8] &= (1 << (bitsused % 8)) - 1;
896
897 for (n = 0; n < count; n++) { 944 for (n = 0; n < count; n++) {
898 if (field->logical_minimum < 0) /* signed values */ 945 if (field->logical_minimum < 0) /* signed values */
899 implement(data, offset + n * size, size, s32ton(field->value[n], size)); 946 implement(data, offset + n * size, size, s32ton(field->value[n], size));
@@ -913,6 +960,7 @@ void hid_output_report(struct hid_report *report, __u8 *data)
913 if (report->id > 0) 960 if (report->id > 0)
914 *data++ = report->id; 961 *data++ = report->id;
915 962
963 memset(data, 0, ((report->size - 1) >> 3) + 1);
916 for (n = 0; n < report->maxfield; n++) 964 for (n = 0; n < report->maxfield; n++)
917 hid_output_field(report->field[n], data); 965 hid_output_field(report->field[n], data);
918} 966}
@@ -928,11 +976,10 @@ int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
928{ 976{
929 unsigned size = field->report_size; 977 unsigned size = field->report_size;
930 978
931 hid_dump_input(field->usage + offset, value); 979 hid_dump_input(field->report->device, field->usage + offset, value);
932 980
933 if (offset >= field->report_count) { 981 if (offset >= field->report_count) {
934 dbg_hid("offset (%d) exceeds report_count (%d)\n", offset, field->report_count); 982 dbg_hid("offset (%d) exceeds report_count (%d)\n", offset, field->report_count);
935 hid_dump_field(field, 8);
936 return -1; 983 return -1;
937 } 984 }
938 if (field->logical_minimum < 0) { 985 if (field->logical_minimum < 0) {
@@ -946,78 +993,969 @@ int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
946} 993}
947EXPORT_SYMBOL_GPL(hid_set_field); 994EXPORT_SYMBOL_GPL(hid_set_field);
948 995
949int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt) 996static struct hid_report *hid_get_report(struct hid_report_enum *report_enum,
997 const u8 *data)
998{
999 struct hid_report *report;
1000 unsigned int n = 0; /* Normally report number is 0 */
1001
1002 /* Device uses numbered reports, data[0] is report number */
1003 if (report_enum->numbered)
1004 n = *data;
1005
1006 report = report_enum->report_id_hash[n];
1007 if (report == NULL)
1008 dbg_hid("undefined report_id %u received\n", n);
1009
1010 return report;
1011}
1012
1013void hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
1014 int interrupt)
950{ 1015{
951 struct hid_report_enum *report_enum = hid->report_enum + type; 1016 struct hid_report_enum *report_enum = hid->report_enum + type;
952 struct hid_report *report; 1017 struct hid_report *report;
953 int n, rsize, i; 1018 unsigned int a;
1019 int rsize, csize = size;
1020 u8 *cdata = data;
1021
1022 report = hid_get_report(report_enum, data);
1023 if (!report)
1024 return;
1025
1026 if (report_enum->numbered) {
1027 cdata++;
1028 csize--;
1029 }
1030
1031 rsize = ((report->size - 1) >> 3) + 1;
1032
1033 if (csize < rsize) {
1034 dbg_hid("report %d is too short, (%d < %d)\n", report->id,
1035 csize, rsize);
1036 memset(cdata + csize, 0, rsize - csize);
1037 }
1038
1039 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
1040 hid->hiddev_report_event(hid, report);
1041 if (hid->claimed & HID_CLAIMED_HIDRAW)
1042 hidraw_report_event(hid, data, size);
1043
1044 for (a = 0; a < report->maxfield; a++)
1045 hid_input_field(hid, report->field[a], cdata, interrupt);
1046
1047 if (hid->claimed & HID_CLAIMED_INPUT)
1048 hidinput_report_event(hid, report);
1049}
1050EXPORT_SYMBOL_GPL(hid_report_raw_event);
1051
1052/**
1053 * hid_input_report - report data from lower layer (usb, bt...)
1054 *
1055 * @hid: hid device
1056 * @type: HID report type (HID_*_REPORT)
1057 * @data: report contents
1058 * @size: size of data parameter
1059 * @interrupt: distinguish between interrupt and control transfers
1060 *
1061 * This is data entry for lower layers.
1062 */
1063int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
1064{
1065 struct hid_report_enum *report_enum;
1066 struct hid_driver *hdrv;
1067 struct hid_report *report;
1068 char *buf;
1069 unsigned int i;
1070 int ret;
954 1071
955 if (!hid) 1072 if (!hid || !hid->driver)
956 return -ENODEV; 1073 return -ENODEV;
1074 report_enum = hid->report_enum + type;
1075 hdrv = hid->driver;
957 1076
958 if (!size) { 1077 if (!size) {
959 dbg_hid("empty report\n"); 1078 dbg_hid("empty report\n");
960 return -1; 1079 return -1;
961 } 1080 }
962 1081
963 dbg_hid("report (size %u) (%snumbered)\n", size, report_enum->numbered ? "" : "un"); 1082 buf = kmalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC);
964 1083
965 n = 0; /* Normally report number is 0 */ 1084 if (!buf)
966 if (report_enum->numbered) { /* Device uses numbered reports, data[0] is report number */ 1085 goto nomem;
967 n = *data++;
968 size--;
969 }
970 1086
971 /* dump the report */ 1087 /* dump the report */
972 dbg_hid("report %d (size %u) = ", n, size); 1088 snprintf(buf, HID_DEBUG_BUFSIZE - 1,
973 for (i = 0; i < size; i++) 1089 "\nreport (size %u) (%snumbered) = ", size, report_enum->numbered ? "" : "un");
974 dbg_hid_line(" %02x", data[i]); 1090 hid_debug_event(hid, buf);
975 dbg_hid_line("\n"); 1091
1092 for (i = 0; i < size; i++) {
1093 snprintf(buf, HID_DEBUG_BUFSIZE - 1,
1094 " %02x", data[i]);
1095 hid_debug_event(hid, buf);
1096 }
1097 hid_debug_event(hid, "\n");
1098 kfree(buf);
1099
1100nomem:
1101 report = hid_get_report(report_enum, data);
976 1102
977 if (!(report = report_enum->report_id_hash[n])) { 1103 if (!report)
978 dbg_hid("undefined report_id %d received\n", n);
979 return -1; 1104 return -1;
1105
1106 if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
1107 ret = hdrv->raw_event(hid, report, data, size);
1108 if (ret != 0)
1109 return ret < 0 ? ret : 0;
980 } 1110 }
981 1111
982 rsize = ((report->size - 1) >> 3) + 1; 1112 hid_report_raw_event(hid, type, data, size, interrupt);
1113
1114 return 0;
1115}
1116EXPORT_SYMBOL_GPL(hid_input_report);
1117
1118static bool hid_match_one_id(struct hid_device *hdev,
1119 const struct hid_device_id *id)
1120{
1121 return id->bus == hdev->bus &&
1122 (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
1123 (id->product == HID_ANY_ID || id->product == hdev->product);
1124}
1125
1126static const struct hid_device_id *hid_match_id(struct hid_device *hdev,
1127 const struct hid_device_id *id)
1128{
1129 for (; id->bus; id++)
1130 if (hid_match_one_id(hdev, id))
1131 return id;
1132
1133 return NULL;
1134}
1135
1136static const struct hid_device_id hid_hiddev_list[] = {
1137 { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS) },
1138 { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1) },
1139 { }
1140};
1141
1142static bool hid_hiddev(struct hid_device *hdev)
1143{
1144 return !!hid_match_id(hdev, hid_hiddev_list);
1145}
983 1146
984 if (size < rsize) { 1147int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
985 dbg_hid("report %d is too short, (%d < %d)\n", report->id, size, rsize); 1148{
986 memset(data + size, 0, rsize - size); 1149 static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
1150 "Joystick", "Gamepad", "Keyboard", "Keypad",
1151 "Multi-Axis Controller"
1152 };
1153 const char *type, *bus;
1154 char buf[64];
1155 unsigned int i;
1156 int len;
1157
1158 if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
1159 connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
1160 if (hdev->bus != BUS_USB)
1161 connect_mask &= ~HID_CONNECT_HIDDEV;
1162 if (hid_hiddev(hdev))
1163 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
1164
1165 if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
1166 connect_mask & HID_CONNECT_HIDINPUT_FORCE))
1167 hdev->claimed |= HID_CLAIMED_INPUT;
1168 if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
1169 !hdev->hiddev_connect(hdev,
1170 connect_mask & HID_CONNECT_HIDDEV_FORCE))
1171 hdev->claimed |= HID_CLAIMED_HIDDEV;
1172 if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev))
1173 hdev->claimed |= HID_CLAIMED_HIDRAW;
1174
1175 if (!hdev->claimed) {
1176 dev_err(&hdev->dev, "claimed by neither input, hiddev nor "
1177 "hidraw\n");
1178 return -ENODEV;
987 } 1179 }
988 1180
989 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event) 1181 if ((hdev->claimed & HID_CLAIMED_INPUT) &&
990 hid->hiddev_report_event(hid, report); 1182 (connect_mask & HID_CONNECT_FF) && hdev->ff_init)
991 if (hid->claimed & HID_CLAIMED_HIDRAW) { 1183 hdev->ff_init(hdev);
992 /* numbered reports need to be passed with the report num */ 1184
993 if (report_enum->numbered) 1185 len = 0;
994 hidraw_report_event(hid, data - 1, size + 1); 1186 if (hdev->claimed & HID_CLAIMED_INPUT)
995 else 1187 len += sprintf(buf + len, "input");
996 hidraw_report_event(hid, data, size); 1188 if (hdev->claimed & HID_CLAIMED_HIDDEV)
1189 len += sprintf(buf + len, "%shiddev%d", len ? "," : "",
1190 hdev->minor);
1191 if (hdev->claimed & HID_CLAIMED_HIDRAW)
1192 len += sprintf(buf + len, "%shidraw%d", len ? "," : "",
1193 ((struct hidraw *)hdev->hidraw)->minor);
1194
1195 type = "Device";
1196 for (i = 0; i < hdev->maxcollection; i++) {
1197 struct hid_collection *col = &hdev->collection[i];
1198 if (col->type == HID_COLLECTION_APPLICATION &&
1199 (col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK &&
1200 (col->usage & 0xffff) < ARRAY_SIZE(types)) {
1201 type = types[col->usage & 0xffff];
1202 break;
1203 }
997 } 1204 }
998 1205
999 for (n = 0; n < report->maxfield; n++) 1206 switch (hdev->bus) {
1000 hid_input_field(hid, report->field[n], data, interrupt); 1207 case BUS_USB:
1208 bus = "USB";
1209 break;
1210 case BUS_BLUETOOTH:
1211 bus = "BLUETOOTH";
1212 break;
1213 default:
1214 bus = "<UNKNOWN>";
1215 }
1001 1216
1002 if (hid->claimed & HID_CLAIMED_INPUT) 1217 dev_info(&hdev->dev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
1003 hidinput_report_event(hid, report); 1218 buf, bus, hdev->version >> 8, hdev->version & 0xff,
1219 type, hdev->name, hdev->phys);
1004 1220
1005 return 0; 1221 return 0;
1006} 1222}
1007EXPORT_SYMBOL_GPL(hid_input_report); 1223EXPORT_SYMBOL_GPL(hid_connect);
1224
1225void hid_disconnect(struct hid_device *hdev)
1226{
1227 if (hdev->claimed & HID_CLAIMED_INPUT)
1228 hidinput_disconnect(hdev);
1229 if (hdev->claimed & HID_CLAIMED_HIDDEV)
1230 hdev->hiddev_disconnect(hdev);
1231 if (hdev->claimed & HID_CLAIMED_HIDRAW)
1232 hidraw_disconnect(hdev);
1233}
1234EXPORT_SYMBOL_GPL(hid_disconnect);
1235
1236/* a list of devices for which there is a specialized driver on HID bus */
1237static const struct hid_device_id hid_blacklist[] = {
1238 { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M1968) },
1239 { HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
1240 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
1241 { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
1242 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) },
1243 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
1244 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
1245 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
1246 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
1247 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
1248 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
1249 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
1250 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) },
1251 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) },
1252 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) },
1253 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) },
1254 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) },
1255 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) },
1256 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) },
1257 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) },
1258 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI) },
1259 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO) },
1260 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS) },
1261 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI) },
1262 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO) },
1263 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS) },
1264 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
1265 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
1266 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
1267 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) },
1268 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) },
1269 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) },
1270 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) },
1271 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) },
1272 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) },
1273 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
1274 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
1275 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
1276 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
1277 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
1278 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
1279 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
1280 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
1281 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
1282 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
1283 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
1284 { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
1285 { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
1286 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) },
1287 { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) },
1288 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
1289 { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
1290 { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
1291 { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
1292 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
1293 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
1294 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
1295 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
1296 { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
1297 { HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
1298 { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
1299 { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
1300 { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
1301 { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
1302 { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
1303 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
1304 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
1305 { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
1306 { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
1307 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
1308 { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
1309 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
1310 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
1311 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
1312 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) },
1313 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
1314 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
1315 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
1316 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
1317 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
1318 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
1319 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) },
1320 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
1321 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
1322 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
1323 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) },
1324 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
1325 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940) },
1326 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
1327 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
1328 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
1329 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
1330 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
1331 { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
1332 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
1333 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
1334 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
1335 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
1336 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) },
1337 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) },
1338 { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) },
1339 { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
1340 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
1341 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) },
1342 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) },
1343 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3) },
1344 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4) },
1345 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5) },
1346 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6) },
1347 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7) },
1348 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8) },
1349 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9) },
1350 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10) },
1351 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11) },
1352 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12) },
1353 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13) },
1354 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14) },
1355 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15) },
1356 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) },
1357 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) },
1358 { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
1359 { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
1360 { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
1361 { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
1362 { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
1363 { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
1364 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
1365 { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
1366 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
1367 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
1368 { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
1369 { HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
1370 { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
1371 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
1372 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
1373 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) },
1374 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) },
1375 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
1376 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
1377 { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
1378 { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
1379 { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
1380 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
1381 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
1382 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
1383 { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
1384 { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
1385 { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
1386
1387 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
1388 { }
1389};
1390
1391struct hid_dynid {
1392 struct list_head list;
1393 struct hid_device_id id;
1394};
1395
1396/**
1397 * store_new_id - add a new HID device ID to this driver and re-probe devices
1398 * @driver: target device driver
1399 * @buf: buffer for scanning device ID data
1400 * @count: input size
1401 *
1402 * Adds a new dynamic hid device ID to this driver,
1403 * and causes the driver to probe for all devices again.
1404 */
1405static ssize_t store_new_id(struct device_driver *drv, const char *buf,
1406 size_t count)
1407{
1408 struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
1409 struct hid_dynid *dynid;
1410 __u32 bus, vendor, product;
1411 unsigned long driver_data = 0;
1412 int ret;
1413
1414 ret = sscanf(buf, "%x %x %x %lx",
1415 &bus, &vendor, &product, &driver_data);
1416 if (ret < 3)
1417 return -EINVAL;
1418
1419 dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
1420 if (!dynid)
1421 return -ENOMEM;
1422
1423 dynid->id.bus = bus;
1424 dynid->id.vendor = vendor;
1425 dynid->id.product = product;
1426 dynid->id.driver_data = driver_data;
1427
1428 spin_lock(&hdrv->dyn_lock);
1429 list_add_tail(&dynid->list, &hdrv->dyn_list);
1430 spin_unlock(&hdrv->dyn_lock);
1431
1432 ret = 0;
1433 if (get_driver(&hdrv->driver)) {
1434 ret = driver_attach(&hdrv->driver);
1435 put_driver(&hdrv->driver);
1436 }
1437
1438 return ret ? : count;
1439}
1440static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
1441
1442static void hid_free_dynids(struct hid_driver *hdrv)
1443{
1444 struct hid_dynid *dynid, *n;
1445
1446 spin_lock(&hdrv->dyn_lock);
1447 list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) {
1448 list_del(&dynid->list);
1449 kfree(dynid);
1450 }
1451 spin_unlock(&hdrv->dyn_lock);
1452}
1453
1454static const struct hid_device_id *hid_match_device(struct hid_device *hdev,
1455 struct hid_driver *hdrv)
1456{
1457 struct hid_dynid *dynid;
1458
1459 spin_lock(&hdrv->dyn_lock);
1460 list_for_each_entry(dynid, &hdrv->dyn_list, list) {
1461 if (hid_match_one_id(hdev, &dynid->id)) {
1462 spin_unlock(&hdrv->dyn_lock);
1463 return &dynid->id;
1464 }
1465 }
1466 spin_unlock(&hdrv->dyn_lock);
1467
1468 return hid_match_id(hdev, hdrv->id_table);
1469}
1470
1471static int hid_bus_match(struct device *dev, struct device_driver *drv)
1472{
1473 struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
1474 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1475
1476 if (!hid_match_device(hdev, hdrv))
1477 return 0;
1478
1479 /* generic wants all non-blacklisted */
1480 if (!strncmp(hdrv->name, "generic-", 8))
1481 return !hid_match_id(hdev, hid_blacklist);
1482
1483 return 1;
1484}
1485
1486static int hid_device_probe(struct device *dev)
1487{
1488 struct hid_driver *hdrv = container_of(dev->driver,
1489 struct hid_driver, driver);
1490 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1491 const struct hid_device_id *id;
1492 int ret = 0;
1493
1494 if (!hdev->driver) {
1495 id = hid_match_device(hdev, hdrv);
1496 if (id == NULL)
1497 return -ENODEV;
1498
1499 hdev->driver = hdrv;
1500 if (hdrv->probe) {
1501 ret = hdrv->probe(hdev, id);
1502 } else { /* default probe */
1503 ret = hid_parse(hdev);
1504 if (!ret)
1505 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
1506 }
1507 if (ret)
1508 hdev->driver = NULL;
1509 }
1510 return ret;
1511}
1512
1513static int hid_device_remove(struct device *dev)
1514{
1515 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1516 struct hid_driver *hdrv = hdev->driver;
1517
1518 if (hdrv) {
1519 if (hdrv->remove)
1520 hdrv->remove(hdev);
1521 else /* default remove */
1522 hid_hw_stop(hdev);
1523 hdev->driver = NULL;
1524 }
1525
1526 return 0;
1527}
1528
1529static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
1530{
1531 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
1532
1533 if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X",
1534 hdev->bus, hdev->vendor, hdev->product))
1535 return -ENOMEM;
1536
1537 if (add_uevent_var(env, "HID_NAME=%s", hdev->name))
1538 return -ENOMEM;
1539
1540 if (add_uevent_var(env, "HID_PHYS=%s", hdev->phys))
1541 return -ENOMEM;
1542
1543 if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
1544 return -ENOMEM;
1545
1546 if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X",
1547 hdev->bus, hdev->vendor, hdev->product))
1548 return -ENOMEM;
1549
1550 return 0;
1551}
1552
1553static struct bus_type hid_bus_type = {
1554 .name = "hid",
1555 .match = hid_bus_match,
1556 .probe = hid_device_probe,
1557 .remove = hid_device_remove,
1558 .uevent = hid_uevent,
1559};
1560
1561/* a list of devices that shouldn't be handled by HID core at all */
1562static const struct hid_device_id hid_ignore_list[] = {
1563 { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) },
1564 { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) },
1565 { HID_USB_DEVICE(USB_VENDOR_ID_ADS_TECH, USB_DEVICE_ID_ADS_TECH_RADIO_SI470X) },
1566 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01) },
1567 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10) },
1568 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20) },
1569 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21) },
1570 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22) },
1571 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23) },
1572 { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) },
1573 { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) },
1574 { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
1575 { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT)},
1576 { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)},
1577 { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)},
1578 { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
1579 { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
1580 { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
1581 { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) },
1582 { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) },
1583 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) },
1584 { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) },
1585 { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) },
1586 { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) },
1587 { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
1588 { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
1589 { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) },
1590 { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) },
1591 { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) },
1592 { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) },
1593 { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) },
1594 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) },
1595 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) },
1596 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT) },
1597 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT) },
1598 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT) },
1599 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT) },
1600 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT) },
1601 { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL) },
1602 { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) },
1603 { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) },
1604 { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) },
1605 { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) },
1606 { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) },
1607 { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) },
1608 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) },
1609 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) },
1610 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) },
1611 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103) },
1612 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104) },
1613 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105) },
1614 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106) },
1615 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107) },
1616 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108) },
1617 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200) },
1618 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201) },
1619 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202) },
1620 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203) },
1621 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204) },
1622 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205) },
1623 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206) },
1624 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207) },
1625 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300) },
1626 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301) },
1627 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302) },
1628 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303) },
1629 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304) },
1630 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305) },
1631 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306) },
1632 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307) },
1633 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308) },
1634 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309) },
1635 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400) },
1636 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401) },
1637 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402) },
1638 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403) },
1639 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404) },
1640 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405) },
1641 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500) },
1642 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501) },
1643 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502) },
1644 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503) },
1645 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504) },
1646 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000) },
1647 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001) },
1648 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002) },
1649 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003) },
1650 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004) },
1651 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005) },
1652 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) },
1653 { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) },
1654 { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) },
1655 { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) },
1656 { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) },
1657 { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) },
1658 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) },
1659 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) },
1660 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) },
1661 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) },
1662 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
1663 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
1664 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
1665 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1) },
1666 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) },
1667 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) },
1668 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) },
1669 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) },
1670 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) },
1671 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) },
1672 { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) },
1673 { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) },
1674 { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) },
1675 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
1676 { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) },
1677 { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) },
1678 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) },
1679 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) },
1680 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30) },
1681 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100) },
1682 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108) },
1683 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118) },
1684 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200) },
1685 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300) },
1686 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400) },
1687 { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500) },
1688 { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0001) },
1689 { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) },
1690 { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) },
1691 { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
1692 { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) },
1693 { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
1694 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
1695 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
1696 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
1697 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) },
1698 { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) },
1699 { HID_USB_DEVICE(USB_VENDOR_ID_WACOM, HID_ANY_ID) },
1700 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) },
1701 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) },
1702 { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
1703 { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
1704 { }
1705};
1706
1707/**
1708 * hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer
1709 *
1710 * There are composite devices for which we want to ignore only a certain
1711 * interface. This is a list of devices for which only the mouse interface will
1712 * be ignored. This allows a dedicated driver to take care of the interface.
1713 */
1714static const struct hid_device_id hid_mouse_ignore_list[] = {
1715 /* appletouch driver */
1716 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
1717 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
1718 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
1719 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) },
1720 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) },
1721 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) },
1722 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) },
1723 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) },
1724 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) },
1725 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) },
1726 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) },
1727 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
1728 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
1729 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
1730 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) },
1731 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) },
1732 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) },
1733 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
1734 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
1735 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
1736 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
1737 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
1738 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
1739 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
1740 { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
1741 { }
1742};
1743
1744static bool hid_ignore(struct hid_device *hdev)
1745{
1746 switch (hdev->vendor) {
1747 case USB_VENDOR_ID_CODEMERCS:
1748 /* ignore all Code Mercenaries IOWarrior devices */
1749 if (hdev->product >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
1750 hdev->product <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
1751 return true;
1752 break;
1753 case USB_VENDOR_ID_LOGITECH:
1754 if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
1755 hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST)
1756 return true;
1757 break;
1758 case USB_VENDOR_ID_SOUNDGRAPH:
1759 if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST &&
1760 hdev->product <= USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST)
1761 return true;
1762 break;
1763 }
1764
1765 if (hdev->type == HID_TYPE_USBMOUSE &&
1766 hid_match_id(hdev, hid_mouse_ignore_list))
1767 return true;
1768
1769 return !!hid_match_id(hdev, hid_ignore_list);
1770}
1771
1772int hid_add_device(struct hid_device *hdev)
1773{
1774 static atomic_t id = ATOMIC_INIT(0);
1775 int ret;
1776
1777 if (WARN_ON(hdev->status & HID_STAT_ADDED))
1778 return -EBUSY;
1779
1780 /* we need to kill them here, otherwise they will stay allocated to
1781 * wait for coming driver */
1782 if (!(hdev->quirks & HID_QUIRK_NO_IGNORE)
1783 && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE)))
1784 return -ENODEV;
1785
1786 /* XXX hack, any other cleaner solution after the driver core
1787 * is converted to allow more than 20 bytes as the device name? */
1788 dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
1789 hdev->vendor, hdev->product, atomic_inc_return(&id));
1790
1791 hid_debug_register(hdev, dev_name(&hdev->dev));
1792 ret = device_add(&hdev->dev);
1793 if (!ret)
1794 hdev->status |= HID_STAT_ADDED;
1795 else
1796 hid_debug_unregister(hdev);
1797
1798 return ret;
1799}
1800EXPORT_SYMBOL_GPL(hid_add_device);
1801
1802/**
1803 * hid_allocate_device - allocate new hid device descriptor
1804 *
1805 * Allocate and initialize hid device, so that hid_destroy_device might be
1806 * used to free it.
1807 *
1808 * New hid_device pointer is returned on success, otherwise ERR_PTR encoded
1809 * error value.
1810 */
1811struct hid_device *hid_allocate_device(void)
1812{
1813 struct hid_device *hdev;
1814 unsigned int i;
1815 int ret = -ENOMEM;
1816
1817 hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
1818 if (hdev == NULL)
1819 return ERR_PTR(ret);
1820
1821 device_initialize(&hdev->dev);
1822 hdev->dev.release = hid_device_release;
1823 hdev->dev.bus = &hid_bus_type;
1824
1825 hdev->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
1826 sizeof(struct hid_collection), GFP_KERNEL);
1827 if (hdev->collection == NULL)
1828 goto err;
1829 hdev->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
1830
1831 for (i = 0; i < HID_REPORT_TYPES; i++)
1832 INIT_LIST_HEAD(&hdev->report_enum[i].report_list);
1833
1834 init_waitqueue_head(&hdev->debug_wait);
1835 INIT_LIST_HEAD(&hdev->debug_list);
1836
1837 return hdev;
1838err:
1839 put_device(&hdev->dev);
1840 return ERR_PTR(ret);
1841}
1842EXPORT_SYMBOL_GPL(hid_allocate_device);
1843
1844static void hid_remove_device(struct hid_device *hdev)
1845{
1846 if (hdev->status & HID_STAT_ADDED) {
1847 device_del(&hdev->dev);
1848 hid_debug_unregister(hdev);
1849 hdev->status &= ~HID_STAT_ADDED;
1850 }
1851}
1852
1853/**
1854 * hid_destroy_device - free previously allocated device
1855 *
1856 * @hdev: hid device
1857 *
1858 * If you allocate hid_device through hid_allocate_device, you should ever
1859 * free by this function.
1860 */
1861void hid_destroy_device(struct hid_device *hdev)
1862{
1863 hid_remove_device(hdev);
1864 put_device(&hdev->dev);
1865}
1866EXPORT_SYMBOL_GPL(hid_destroy_device);
1867
1868int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
1869 const char *mod_name)
1870{
1871 int ret;
1872
1873 hdrv->driver.name = hdrv->name;
1874 hdrv->driver.bus = &hid_bus_type;
1875 hdrv->driver.owner = owner;
1876 hdrv->driver.mod_name = mod_name;
1877
1878 INIT_LIST_HEAD(&hdrv->dyn_list);
1879 spin_lock_init(&hdrv->dyn_lock);
1880
1881 ret = driver_register(&hdrv->driver);
1882 if (ret)
1883 return ret;
1884
1885 ret = driver_create_file(&hdrv->driver, &driver_attr_new_id);
1886 if (ret)
1887 driver_unregister(&hdrv->driver);
1888
1889 return ret;
1890}
1891EXPORT_SYMBOL_GPL(__hid_register_driver);
1892
1893void hid_unregister_driver(struct hid_driver *hdrv)
1894{
1895 driver_remove_file(&hdrv->driver, &driver_attr_new_id);
1896 driver_unregister(&hdrv->driver);
1897 hid_free_dynids(hdrv);
1898}
1899EXPORT_SYMBOL_GPL(hid_unregister_driver);
1900
1901int hid_check_keys_pressed(struct hid_device *hid)
1902{
1903 struct hid_input *hidinput;
1904 int i;
1905
1906 if (!(hid->claimed & HID_CLAIMED_INPUT))
1907 return 0;
1908
1909 list_for_each_entry(hidinput, &hid->inputs, list) {
1910 for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
1911 if (hidinput->input->key[i])
1912 return 1;
1913 }
1914
1915 return 0;
1916}
1917
1918EXPORT_SYMBOL_GPL(hid_check_keys_pressed);
1008 1919
1009static int __init hid_init(void) 1920static int __init hid_init(void)
1010{ 1921{
1011 return hidraw_init(); 1922 int ret;
1923
1924 if (hid_debug)
1925 printk(KERN_WARNING "HID: hid_debug is now used solely for parser and driver debugging.\n"
1926 "HID: debugfs is now used for inspecting the device (report descriptor, reports)\n");
1927
1928 ret = bus_register(&hid_bus_type);
1929 if (ret) {
1930 printk(KERN_ERR "HID: can't register hid bus\n");
1931 goto err;
1932 }
1933
1934 ret = hidraw_init();
1935 if (ret)
1936 goto err_bus;
1937
1938 hid_debug_init();
1939
1940 return 0;
1941err_bus:
1942 bus_unregister(&hid_bus_type);
1943err:
1944 return ret;
1012} 1945}
1013 1946
1014static void __exit hid_exit(void) 1947static void __exit hid_exit(void)
1015{ 1948{
1949 hid_debug_exit();
1016 hidraw_exit(); 1950 hidraw_exit();
1951 bus_unregister(&hid_bus_type);
1017} 1952}
1018 1953
1019module_init(hid_init); 1954module_init(hid_init);
1020module_exit(hid_exit); 1955module_exit(hid_exit);
1021 1956
1957MODULE_AUTHOR("Andreas Gal");
1958MODULE_AUTHOR("Vojtech Pavlik");
1959MODULE_AUTHOR("Jiri Kosina");
1022MODULE_LICENSE(DRIVER_LICENSE); 1960MODULE_LICENSE(DRIVER_LICENSE);
1023 1961
diff --git a/usr/src/dkms_source_tree/hid-debug.c b/usr/src/dkms_source_tree/hid-debug.c
index 47ac1a7..850d02a 100644
--- a/usr/src/dkms_source_tree/hid-debug.c
+++ b/usr/src/dkms_source_tree/hid-debug.c
@@ -1,9 +1,9 @@
1/* 1/*
2 * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de> 2 * (c) 1999 Andreas Gal <gal@cs.uni-magdeburg.de>
3 * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz> 3 * (c) 2000-2001 Vojtech Pavlik <vojtech@ucw.cz>
4 * (c) 2007 Jiri Kosina 4 * (c) 2007-2009 Jiri Kosina
5 * 5 *
6 * Some debug stuff for the HID parser. 6 * HID debugging support
7 */ 7 */
8 8
9/* 9/*
@@ -26,9 +26,18 @@
26 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic 26 * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
27 */ 27 */
28 28
29#include <linux/debugfs.h>
30#include <linux/seq_file.h>
31#include <linux/sched.h>
32#include <linux/slab.h>
33#include <linux/uaccess.h>
34#include <linux/poll.h>
35
29#include <linux/hid.h> 36#include <linux/hid.h>
30#include <linux/hid-debug.h> 37#include <linux/hid-debug.h>
31 38
39static struct dentry *hid_debug_root;
40
32struct hid_usage_entry { 41struct hid_usage_entry {
33 unsigned page; 42 unsigned page;
34 unsigned usage; 43 unsigned usage;
@@ -137,6 +146,14 @@ static const struct hid_usage_entry hid_usage_table[] = {
137 {0, 0x44, "BarrelSwitch"}, 146 {0, 0x44, "BarrelSwitch"},
138 {0, 0x45, "Eraser"}, 147 {0, 0x45, "Eraser"},
139 {0, 0x46, "TabletPick"}, 148 {0, 0x46, "TabletPick"},
149 {0, 0x47, "Confidence"},
150 {0, 0x48, "Width"},
151 {0, 0x49, "Height"},
152 {0, 0x51, "ContactID"},
153 {0, 0x52, "InputMode"},
154 {0, 0x53, "DeviceIndex"},
155 {0, 0x54, "ContactCount"},
156 {0, 0x55, "ContactMaximumNumber"},
140 { 15, 0, "PhysicalInterfaceDevice" }, 157 { 15, 0, "PhysicalInterfaceDevice" },
141 {0, 0x00, "Undefined"}, 158 {0, 0x00, "Undefined"},
142 {0, 0x01, "Physical_Interface_Device"}, 159 {0, 0x01, "Physical_Interface_Device"},
@@ -331,72 +348,120 @@ static const struct hid_usage_entry hid_usage_table[] = {
331 { 0, 0, NULL } 348 { 0, 0, NULL }
332}; 349};
333 350
334static void resolv_usage_page(unsigned page) { 351/* Either output directly into simple seq_file, or (if f == NULL)
352 * allocate a separate buffer that will then be passed to the 'events'
353 * ringbuffer.
354 *
355 * This is because these functions can be called both for "one-shot"
356 * "rdesc" while resolving, or for blocking "events".
357 *
358 * This holds both for resolv_usage_page() and hid_resolv_usage().
359 */
360static char *resolv_usage_page(unsigned page, struct seq_file *f) {
335 const struct hid_usage_entry *p; 361 const struct hid_usage_entry *p;
362 char *buf = NULL;
363
364 if (!f) {
365 buf = kzalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_ATOMIC);
366 if (!buf)
367 return ERR_PTR(-ENOMEM);
368 }
336 369
337 for (p = hid_usage_table; p->description; p++) 370 for (p = hid_usage_table; p->description; p++)
338 if (p->page == page) { 371 if (p->page == page) {
339 printk("%s", p->description); 372 if (!f) {
340 return; 373 snprintf(buf, HID_DEBUG_BUFSIZE, "%s",
374 p->description);
375 return buf;
376 }
377 else {
378 seq_printf(f, "%s", p->description);
379 return NULL;
380 }
341 } 381 }
342 printk("%04x", page); 382 if (!f)
383 snprintf(buf, HID_DEBUG_BUFSIZE, "%04x", page);
384 else
385 seq_printf(f, "%04x", page);
386 return buf;
343} 387}
344 388
345void hid_resolv_usage(unsigned usage) { 389char *hid_resolv_usage(unsigned usage, struct seq_file *f) {
346 const struct hid_usage_entry *p; 390 const struct hid_usage_entry *p;
391 char *buf = NULL;
392 int len = 0;
393
394 buf = resolv_usage_page(usage >> 16, f);
395 if (IS_ERR(buf)) {
396 printk(KERN_ERR "error allocating HID debug buffer\n");
397 return NULL;
398 }
347 399
348 if (!hid_debug)
349 return;
350 400
351 resolv_usage_page(usage >> 16); 401 if (!f) {
352 printk("."); 402 len = strlen(buf);
403 snprintf(buf+len, max(0, HID_DEBUG_BUFSIZE - len), ".");
404 len++;
405 }
406 else {
407 seq_printf(f, ".");
408 }
353 for (p = hid_usage_table; p->description; p++) 409 for (p = hid_usage_table; p->description; p++)
354 if (p->page == (usage >> 16)) { 410 if (p->page == (usage >> 16)) {
355 for(++p; p->description && p->usage != 0; p++) 411 for(++p; p->description && p->usage != 0; p++)
356 if (p->usage == (usage & 0xffff)) { 412 if (p->usage == (usage & 0xffff)) {
357 printk("%s", p->description); 413 if (!f)
358 return; 414 snprintf(buf + len,
415 max(0,HID_DEBUG_BUFSIZE - len - 1),
416 "%s", p->description);
417 else
418 seq_printf(f,
419 "%s",
420 p->description);
421 return buf;
359 } 422 }
360 break; 423 break;
361 } 424 }
362 printk("%04x", usage & 0xffff); 425 if (!f)
426 snprintf(buf + len, max(0, HID_DEBUG_BUFSIZE - len - 1),
427 "%04x", usage & 0xffff);
428 else
429 seq_printf(f, "%04x", usage & 0xffff);
430 return buf;
363} 431}
364EXPORT_SYMBOL_GPL(hid_resolv_usage); 432EXPORT_SYMBOL_GPL(hid_resolv_usage);
365 433
366static void tab(int n) { 434static void tab(int n, struct seq_file *f) {
367 printk(KERN_DEBUG "%*s", n, ""); 435 seq_printf(f, "%*s", n, "");
368} 436}
369 437
370void hid_dump_field(struct hid_field *field, int n) { 438void hid_dump_field(struct hid_field *field, int n, struct seq_file *f) {
371 int j; 439 int j;
372 440
373 if (!hid_debug)
374 return;
375
376 if (field->physical) { 441 if (field->physical) {
377 tab(n); 442 tab(n, f);
378 printk("Physical("); 443 seq_printf(f, "Physical(");
379 hid_resolv_usage(field->physical); printk(")\n"); 444 hid_resolv_usage(field->physical, f); seq_printf(f, ")\n");
380 } 445 }
381 if (field->logical) { 446 if (field->logical) {
382 tab(n); 447 tab(n, f);
383 printk("Logical("); 448 seq_printf(f, "Logical(");
384 hid_resolv_usage(field->logical); printk(")\n"); 449 hid_resolv_usage(field->logical, f); seq_printf(f, ")\n");
385 } 450 }
386 tab(n); printk("Usage(%d)\n", field->maxusage); 451 tab(n, f); seq_printf(f, "Usage(%d)\n", field->maxusage);
387 for (j = 0; j < field->maxusage; j++) { 452 for (j = 0; j < field->maxusage; j++) {
388 tab(n+2); hid_resolv_usage(field->usage[j].hid); printk("\n"); 453 tab(n+2, f); hid_resolv_usage(field->usage[j].hid, f); seq_printf(f, "\n");
389 } 454 }
390 if (field->logical_minimum != field->logical_maximum) { 455 if (field->logical_minimum != field->logical_maximum) {
391 tab(n); printk("Logical Minimum(%d)\n", field->logical_minimum); 456 tab(n, f); seq_printf(f, "Logical Minimum(%d)\n", field->logical_minimum);
392 tab(n); printk("Logical Maximum(%d)\n", field->logical_maximum); 457 tab(n, f); seq_printf(f, "Logical Maximum(%d)\n", field->logical_maximum);
393 } 458 }
394 if (field->physical_minimum != field->physical_maximum) { 459 if (field->physical_minimum != field->physical_maximum) {
395 tab(n); printk("Physical Minimum(%d)\n", field->physical_minimum); 460 tab(n, f); seq_printf(f, "Physical Minimum(%d)\n", field->physical_minimum);
396 tab(n); printk("Physical Maximum(%d)\n", field->physical_maximum); 461 tab(n, f); seq_printf(f, "Physical Maximum(%d)\n", field->physical_maximum);
397 } 462 }
398 if (field->unit_exponent) { 463 if (field->unit_exponent) {
399 tab(n); printk("Unit Exponent(%d)\n", field->unit_exponent); 464 tab(n, f); seq_printf(f, "Unit Exponent(%d)\n", field->unit_exponent);
400 } 465 }
401 if (field->unit) { 466 if (field->unit) {
402 static const char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" }; 467 static const char *systems[5] = { "None", "SI Linear", "SI Rotation", "English Linear", "English Rotation" };
@@ -417,77 +482,75 @@ void hid_dump_field(struct hid_field *field, int n) {
417 data >>= 4; 482 data >>= 4;
418 483
419 if(sys > 4) { 484 if(sys > 4) {
420 tab(n); printk("Unit(Invalid)\n"); 485 tab(n, f); seq_printf(f, "Unit(Invalid)\n");
421 } 486 }
422 else { 487 else {
423 int earlier_unit = 0; 488 int earlier_unit = 0;
424 489
425 tab(n); printk("Unit(%s : ", systems[sys]); 490 tab(n, f); seq_printf(f, "Unit(%s : ", systems[sys]);
426 491
427 for (i=1 ; i<sizeof(__u32)*2 ; i++) { 492 for (i=1 ; i<sizeof(__u32)*2 ; i++) {
428 char nibble = data & 0xf; 493 char nibble = data & 0xf;
429 data >>= 4; 494 data >>= 4;
430 if (nibble != 0) { 495 if (nibble != 0) {
431 if(earlier_unit++ > 0) 496 if(earlier_unit++ > 0)
432 printk("*"); 497 seq_printf(f, "*");
433 printk("%s", units[sys][i]); 498 seq_printf(f, "%s", units[sys][i]);
434 if(nibble != 1) { 499 if(nibble != 1) {
435 /* This is a _signed_ nibble(!) */ 500 /* This is a _signed_ nibble(!) */
436 501
437 int val = nibble & 0x7; 502 int val = nibble & 0x7;
438 if(nibble & 0x08) 503 if(nibble & 0x08)
439 val = -((0x7 & ~val) +1); 504 val = -((0x7 & ~val) +1);
440 printk("^%d", val); 505 seq_printf(f, "^%d", val);
441 } 506 }
442 } 507 }
443 } 508 }
444 printk(")\n"); 509 seq_printf(f, ")\n");
445 } 510 }
446 } 511 }
447 tab(n); printk("Report Size(%u)\n", field->report_size); 512 tab(n, f); seq_printf(f, "Report Size(%u)\n", field->report_size);
448 tab(n); printk("Report Count(%u)\n", field->report_count); 513 tab(n, f); seq_printf(f, "Report Count(%u)\n", field->report_count);
449 tab(n); printk("Report Offset(%u)\n", field->report_offset); 514 tab(n, f); seq_printf(f, "Report Offset(%u)\n", field->report_offset);
450 515
451 tab(n); printk("Flags( "); 516 tab(n, f); seq_printf(f, "Flags( ");
452 j = field->flags; 517 j = field->flags;
453 printk("%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : ""); 518 seq_printf(f, "%s", HID_MAIN_ITEM_CONSTANT & j ? "Constant " : "");
454 printk("%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array "); 519 seq_printf(f, "%s", HID_MAIN_ITEM_VARIABLE & j ? "Variable " : "Array ");
455 printk("%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute "); 520 seq_printf(f, "%s", HID_MAIN_ITEM_RELATIVE & j ? "Relative " : "Absolute ");
456 printk("%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : ""); 521 seq_printf(f, "%s", HID_MAIN_ITEM_WRAP & j ? "Wrap " : "");
457 printk("%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : ""); 522 seq_printf(f, "%s", HID_MAIN_ITEM_NONLINEAR & j ? "NonLinear " : "");
458 printk("%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPreferredState " : ""); 523 seq_printf(f, "%s", HID_MAIN_ITEM_NO_PREFERRED & j ? "NoPreferredState " : "");
459 printk("%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : ""); 524 seq_printf(f, "%s", HID_MAIN_ITEM_NULL_STATE & j ? "NullState " : "");
460 printk("%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : ""); 525 seq_printf(f, "%s", HID_MAIN_ITEM_VOLATILE & j ? "Volatile " : "");
461 printk("%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : ""); 526 seq_printf(f, "%s", HID_MAIN_ITEM_BUFFERED_BYTE & j ? "BufferedByte " : "");
462 printk(")\n"); 527 seq_printf(f, ")\n");
463} 528}
464EXPORT_SYMBOL_GPL(hid_dump_field); 529EXPORT_SYMBOL_GPL(hid_dump_field);
465 530
466void hid_dump_device(struct hid_device *device) { 531void hid_dump_device(struct hid_device *device, struct seq_file *f)
532{
467 struct hid_report_enum *report_enum; 533 struct hid_report_enum *report_enum;
468 struct hid_report *report; 534 struct hid_report *report;
469 struct list_head *list; 535 struct list_head *list;
470 unsigned i,k; 536 unsigned i,k;
471 static const char *table[] = {"INPUT", "OUTPUT", "FEATURE"}; 537 static const char *table[] = {"INPUT", "OUTPUT", "FEATURE"};
472 538
473 if (!hid_debug)
474 return;
475
476 for (i = 0; i < HID_REPORT_TYPES; i++) { 539 for (i = 0; i < HID_REPORT_TYPES; i++) {
477 report_enum = device->report_enum + i; 540 report_enum = device->report_enum + i;
478 list = report_enum->report_list.next; 541 list = report_enum->report_list.next;
479 while (list != &report_enum->report_list) { 542 while (list != &report_enum->report_list) {
480 report = (struct hid_report *) list; 543 report = (struct hid_report *) list;
481 tab(2); 544 tab(2, f);
482 printk("%s", table[i]); 545 seq_printf(f, "%s", table[i]);
483 if (report->id) 546 if (report->id)
484 printk("(%d)", report->id); 547 seq_printf(f, "(%d)", report->id);
485 printk("[%s]", table[report->type]); 548 seq_printf(f, "[%s]", table[report->type]);
486 printk("\n"); 549 seq_printf(f, "\n");
487 for (k = 0; k < report->maxfield; k++) { 550 for (k = 0; k < report->maxfield; k++) {
488 tab(4); 551 tab(4, f);
489 printk("Field(%d)\n", k); 552 seq_printf(f, "Field(%d)\n", k);
490 hid_dump_field(report->field[k], 6); 553 hid_dump_field(report->field[k], 6, f);
491 } 554 }
492 list = list->next; 555 list = list->next;
493 } 556 }
@@ -495,13 +558,37 @@ void hid_dump_device(struct hid_device *device) {
495} 558}
496EXPORT_SYMBOL_GPL(hid_dump_device); 559EXPORT_SYMBOL_GPL(hid_dump_device);
497 560
498void hid_dump_input(struct hid_usage *usage, __s32 value) { 561/* enqueue string to 'events' ring buffer */
499 if (hid_debug < 2) 562void hid_debug_event(struct hid_device *hdev, char *buf)
563{
564 int i;
565 struct hid_debug_list *list;
566
567 list_for_each_entry(list, &hdev->debug_list, node) {
568 for (i = 0; i < strlen(buf); i++)
569 list->hid_debug_buf[(list->tail + i) % HID_DEBUG_BUFSIZE] =
570 buf[i];
571 list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE;
572 }
573}
574EXPORT_SYMBOL_GPL(hid_debug_event);
575
576void hid_dump_input(struct hid_device *hdev, struct hid_usage *usage, __s32 value)
577{
578 char *buf;
579 int len;
580
581 buf = hid_resolv_usage(usage->hid, NULL);
582 if (!buf)
500 return; 583 return;
584 len = strlen(buf);
585 snprintf(buf + len, HID_DEBUG_BUFSIZE - len - 1, " = %d\n", value);
586
587 hid_debug_event(hdev, buf);
588
589 kfree(buf);
590 wake_up_interruptible(&hdev->debug_wait);
501 591
502 printk(KERN_DEBUG "hid-debug: input ");
503 hid_resolv_usage(usage->hid);
504 printk(" = %d\n", value);
505} 592}
506EXPORT_SYMBOL_GPL(hid_dump_input); 593EXPORT_SYMBOL_GPL(hid_dump_input);
507 594
@@ -514,9 +601,11 @@ static const char *events[EV_MAX + 1] = {
514 [EV_FF_STATUS] = "ForceFeedbackStatus", 601 [EV_FF_STATUS] = "ForceFeedbackStatus",
515}; 602};
516 603
517static const char *syncs[2] = { 604static const char *syncs[3] = {
518 [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config", 605 [SYN_REPORT] = "Report", [SYN_CONFIG] = "Config",
606 [SYN_MT_REPORT] = "MT Report",
519}; 607};
608
520static const char *keys[KEY_MAX + 1] = { 609static const char *keys[KEY_MAX + 1] = {
521 [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc", 610 [KEY_RESERVED] = "Reserved", [KEY_ESC] = "Esc",
522 [KEY_1] = "1", [KEY_2] = "2", 611 [KEY_1] = "1", [KEY_2] = "2",
@@ -722,7 +811,7 @@ static const char *relatives[REL_MAX + 1] = {
722 [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc", 811 [REL_WHEEL] = "Wheel", [REL_MISC] = "Misc",
723}; 812};
724 813
725static const char *absolutes[ABS_MAX + 1] = { 814static const char *absolutes[ABS_CNT] = {
726 [ABS_X] = "X", [ABS_Y] = "Y", 815 [ABS_X] = "X", [ABS_Y] = "Y",
727 [ABS_Z] = "Z", [ABS_RX] = "Rx", 816 [ABS_Z] = "Z", [ABS_RX] = "Rx",
728 [ABS_RY] = "Ry", [ABS_RZ] = "Rz", 817 [ABS_RY] = "Ry", [ABS_RZ] = "Rz",
@@ -734,8 +823,17 @@ static const char *absolutes[ABS_MAX + 1] = {
734 [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X", 823 [ABS_HAT2Y] = "Hat2Y", [ABS_HAT3X] = "Hat3X",
735 [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure", 824 [ABS_HAT3Y] = "Hat 3Y", [ABS_PRESSURE] = "Pressure",
736 [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt", 825 [ABS_DISTANCE] = "Distance", [ABS_TILT_X] = "XTilt",
737 [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "Tool Width", 826 [ABS_TILT_Y] = "YTilt", [ABS_TOOL_WIDTH] = "ToolWidth",
738 [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc", 827 [ABS_VOLUME] = "Volume", [ABS_MISC] = "Misc",
828 [ABS_MT_TOUCH_MAJOR] = "MTMajor",
829 [ABS_MT_TOUCH_MINOR] = "MTMinor",
830 [ABS_MT_WIDTH_MAJOR] = "MTMajorW",
831 [ABS_MT_WIDTH_MINOR] = "MTMinorW",
832 [ABS_MT_ORIENTATION] = "MTOrientation",
833 [ABS_MT_POSITION_X] = "MTPositionX",
834 [ABS_MT_POSITION_Y] = "MTPositionY",
835 [ABS_MT_TOOL_TYPE] = "MTToolType",
836 [ABS_MT_BLOB_ID] = "MTBlobID",
739}; 837};
740 838
741static const char *misc[MSC_MAX + 1] = { 839static const char *misc[MSC_MAX + 1] = {
@@ -767,12 +865,221 @@ static const char **names[EV_MAX + 1] = {
767 [EV_SND] = sounds, [EV_REP] = repeats, 865 [EV_SND] = sounds, [EV_REP] = repeats,
768}; 866};
769 867
770void hid_resolv_event(__u8 type, __u16 code) { 868static void hid_resolv_event(__u8 type, __u16 code, struct seq_file *f)
869{
870 seq_printf(f, "%s.%s", events[type] ? events[type] : "?",
871 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
872}
771 873
772 if (!hid_debug) 874static void hid_dump_input_mapping(struct hid_device *hid, struct seq_file *f)
773 return; 875{
876 int i, j, k;
877 struct hid_report *report;
878 struct hid_usage *usage;
879
880 for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) {
881 list_for_each_entry(report, &hid->report_enum[k].report_list, list) {
882 for (i = 0; i < report->maxfield; i++) {
883 for ( j = 0; j < report->field[i]->maxusage; j++) {
884 usage = report->field[i]->usage + j;
885 hid_resolv_usage(usage->hid, f);
886 seq_printf(f, " ---> ");
887 hid_resolv_event(usage->type, usage->code, f);
888 seq_printf(f, "\n");
889 }
890 }
891 }
892 }
774 893
775 printk("%s.%s", events[type] ? events[type] : "?",
776 names[type] ? (names[type][code] ? names[type][code] : "?") : "?");
777} 894}
778EXPORT_SYMBOL_GPL(hid_resolv_event); 895
896
897static int hid_debug_rdesc_show(struct seq_file *f, void *p)
898{
899 struct hid_device *hdev = f->private;
900 int i;
901
902 /* dump HID report descriptor */
903 for (i = 0; i < hdev->rsize; i++)
904 seq_printf(f, "%02x ", hdev->rdesc[i]);
905 seq_printf(f, "\n\n");
906
907 /* dump parsed data and input mappings */
908 hid_dump_device(hdev, f);
909 seq_printf(f, "\n");
910 hid_dump_input_mapping(hdev, f);
911
912 return 0;
913}
914
915static int hid_debug_rdesc_open(struct inode *inode, struct file *file)
916{
917 return single_open(file, hid_debug_rdesc_show, inode->i_private);
918}
919
920static int hid_debug_events_open(struct inode *inode, struct file *file)
921{
922 int err = 0;
923 struct hid_debug_list *list;
924
925 if (!(list = kzalloc(sizeof(struct hid_debug_list), GFP_KERNEL))) {
926 err = -ENOMEM;
927 goto out;
928 }
929
930 if (!(list->hid_debug_buf = kzalloc(sizeof(char) * HID_DEBUG_BUFSIZE, GFP_KERNEL))) {
931 err = -ENOMEM;
932 kfree(list);
933 goto out;
934 }
935 list->hdev = (struct hid_device *) inode->i_private;
936 file->private_data = list;
937 mutex_init(&list->read_mutex);
938
939 list_add_tail(&list->node, &list->hdev->debug_list);
940
941out:
942 return err;
943}
944
945static ssize_t hid_debug_events_read(struct file *file, char __user *buffer,
946 size_t count, loff_t *ppos)
947{
948 struct hid_debug_list *list = file->private_data;
949 int ret = 0, len;
950 DECLARE_WAITQUEUE(wait, current);
951
952 mutex_lock(&list->read_mutex);
953 while (ret == 0) {
954 if (list->head == list->tail) {
955 add_wait_queue(&list->hdev->debug_wait, &wait);
956 set_current_state(TASK_INTERRUPTIBLE);
957
958 while (list->head == list->tail) {
959 if (file->f_flags & O_NONBLOCK) {
960 ret = -EAGAIN;
961 break;
962 }
963 if (signal_pending(current)) {
964 ret = -ERESTARTSYS;
965 break;
966 }
967
968 if (!list->hdev || !list->hdev->debug) {
969 ret = -EIO;
970 break;
971 }
972
973 /* allow O_NONBLOCK from other threads */
974 mutex_unlock(&list->read_mutex);
975 schedule();
976 mutex_lock(&list->read_mutex);
977 set_current_state(TASK_INTERRUPTIBLE);
978 }
979
980 set_current_state(TASK_RUNNING);
981 remove_wait_queue(&list->hdev->debug_wait, &wait);
982 }
983
984 if (ret)
985 goto out;
986
987 /* pass the ringbuffer contents to userspace */
988copy_rest:
989 if (list->tail == list->head)
990 goto out;
991 if (list->tail > list->head) {
992 len = list->tail - list->head;
993
994 if (copy_to_user(buffer + ret, &list->hid_debug_buf[list->head], len)) {
995 ret = -EFAULT;
996 goto out;
997 }
998 ret += len;
999 list->head += len;
1000 } else {
1001 len = HID_DEBUG_BUFSIZE - list->head;
1002
1003 if (copy_to_user(buffer, &list->hid_debug_buf[list->head], len)) {
1004 ret = -EFAULT;
1005 goto out;
1006 }
1007 list->head = 0;
1008 ret += len;
1009 goto copy_rest;
1010 }
1011
1012 }
1013out:
1014 mutex_unlock(&list->read_mutex);
1015 return ret;
1016}
1017
1018static unsigned int hid_debug_events_poll(struct file *file, poll_table *wait)
1019{
1020 struct hid_debug_list *list = file->private_data;
1021
1022 poll_wait(file, &list->hdev->debug_wait, wait);
1023 if (list->head != list->tail)
1024 return POLLIN | POLLRDNORM;
1025 if (!list->hdev->debug)
1026 return POLLERR | POLLHUP;
1027 return 0;
1028}
1029
1030static int hid_debug_events_release(struct inode *inode, struct file *file)
1031{
1032 struct hid_debug_list *list = file->private_data;
1033
1034 list_del(&list->node);
1035 kfree(list->hid_debug_buf);
1036 kfree(list);
1037
1038 return 0;
1039}
1040
1041static const struct file_operations hid_debug_rdesc_fops = {
1042 .open = hid_debug_rdesc_open,
1043 .read = seq_read,
1044 .llseek = seq_lseek,
1045 .release = single_release,
1046};
1047
1048static const struct file_operations hid_debug_events_fops = {
1049 .owner = THIS_MODULE,
1050 .open = hid_debug_events_open,
1051 .read = hid_debug_events_read,
1052 .poll = hid_debug_events_poll,
1053 .release = hid_debug_events_release,
1054};
1055
1056
1057void hid_debug_register(struct hid_device *hdev, const char *name)
1058{
1059 hdev->debug_dir = debugfs_create_dir(name, hid_debug_root);
1060 hdev->debug_rdesc = debugfs_create_file("rdesc", 0400,
1061 hdev->debug_dir, hdev, &hid_debug_rdesc_fops);
1062 hdev->debug_events = debugfs_create_file("events", 0400,
1063 hdev->debug_dir, hdev, &hid_debug_events_fops);
1064 hdev->debug = 1;
1065}
1066
1067void hid_debug_unregister(struct hid_device *hdev)
1068{
1069 hdev->debug = 0;
1070 wake_up_interruptible(&hdev->debug_wait);
1071 debugfs_remove(hdev->debug_rdesc);
1072 debugfs_remove(hdev->debug_events);
1073 debugfs_remove(hdev->debug_dir);
1074}
1075
1076void hid_debug_init(void)
1077{
1078 hid_debug_root = debugfs_create_dir("hid", NULL);
1079}
1080
1081void hid_debug_exit(void)
1082{
1083 debugfs_remove_recursive(hid_debug_root);
1084}
1085
diff --git a/usr/src/dkms_source_tree/hid-ids.h b/usr/src/dkms_source_tree/hid-ids.h
new file mode 100644
index 0000000..631d902
--- /dev/null
+++ b/usr/src/dkms_source_tree/hid-ids.h
@@ -0,0 +1,531 @@
1/*
2 * USB HID quirks support for Linux
3 *
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
7 * Copyright (c) 2006-2007 Jiri Kosina
8 * Copyright (c) 2007 Paul Walmsley
9 */
10
11/*
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#ifndef HID_IDS_H_FILE
19#define HID_IDS_H_FILE
20
21#define USB_VENDOR_ID_3M 0x0596
22#define USB_DEVICE_ID_3M1968 0x0500
23#define USB_DEVICE_ID_3M2256 0x0502
24
25#define USB_VENDOR_ID_A4TECH 0x09da
26#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
27#define USB_DEVICE_ID_A4TECH_X5_005D 0x000a
28
29#define USB_VENDOR_ID_AASHIMA 0x06d6
30#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
31#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026
32
33#define USB_VENDOR_ID_ACECAD 0x0460
34#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004
35#define USB_DEVICE_ID_ACECAD_302 0x0008
36
37#define USB_VENDOR_ID_ADS_TECH 0x06e1
38#define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155
39
40#define USB_VENDOR_ID_AFATECH 0x15a4
41#define USB_DEVICE_ID_AFATECH_AF9016 0x9016
42
43#define USB_VENDOR_ID_AIPTEK 0x08ca
44#define USB_DEVICE_ID_AIPTEK_01 0x0001
45#define USB_DEVICE_ID_AIPTEK_10 0x0010
46#define USB_DEVICE_ID_AIPTEK_20 0x0020
47#define USB_DEVICE_ID_AIPTEK_21 0x0021
48#define USB_DEVICE_ID_AIPTEK_22 0x0022
49#define USB_DEVICE_ID_AIPTEK_23 0x0023
50#define USB_DEVICE_ID_AIPTEK_24 0x0024
51
52#define USB_VENDOR_ID_AIRCABLE 0x16CA
53#define USB_DEVICE_ID_AIRCABLE1 0x1502
54
55#define USB_VENDOR_ID_ALCOR 0x058f
56#define USB_DEVICE_ID_ALCOR_USBRS232 0x9720
57
58#define USB_VENDOR_ID_ALPS 0x0433
59#define USB_DEVICE_ID_IBM_GAMEPAD 0x1101
60
61#define USB_VENDOR_ID_APPLE 0x05ac
62#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304
63#define USB_DEVICE_ID_APPLE_MAGICMOUSE 0x030d
64#define USB_DEVICE_ID_APPLE_MAGICTRACKPAD 0x030e
65#define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e
66#define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f
67#define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214
68#define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215
69#define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216
70#define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217
71#define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218
72#define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219
73#define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a
74#define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b
75#define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c
76#define USB_DEVICE_ID_APPLE_ALU_MINI_ANSI 0x021d
77#define USB_DEVICE_ID_APPLE_ALU_MINI_ISO 0x021e
78#define USB_DEVICE_ID_APPLE_ALU_MINI_JIS 0x021f
79#define USB_DEVICE_ID_APPLE_ALU_ANSI 0x0220
80#define USB_DEVICE_ID_APPLE_ALU_ISO 0x0221
81#define USB_DEVICE_ID_APPLE_ALU_JIS 0x0222
82#define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223
83#define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224
84#define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225
85#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229
86#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a
87#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b
88#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI 0x022c
89#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO 0x022d
90#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS 0x022e
91#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230
92#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231
93#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232
94#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
95#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
96#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
97#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
98#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
99#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
100#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
101#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
102#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
103#define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242
104
105#define USB_VENDOR_ID_ASUS 0x0486
106#define USB_DEVICE_ID_ASUS_T91MT 0x0185
107
108#define USB_VENDOR_ID_ASUSTEK 0x0b05
109#define USB_DEVICE_ID_ASUSTEK_LCM 0x1726
110#define USB_DEVICE_ID_ASUSTEK_LCM2 0x175b
111
112#define USB_VENDOR_ID_ATEN 0x0557
113#define USB_DEVICE_ID_ATEN_UC100KM 0x2004
114#define USB_DEVICE_ID_ATEN_CS124U 0x2202
115#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
116#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
117#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
118
119#define USB_VENDOR_ID_AVERMEDIA 0x07ca
120#define USB_DEVICE_ID_AVER_FM_MR800 0xb800
121
122#define USB_VENDOR_ID_BELKIN 0x050d
123#define USB_DEVICE_ID_FLIP_KVM 0x3201
124
125#define USB_VENDOR_ID_BERKSHIRE 0x0c98
126#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
127
128#define USB_VENDOR_ID_BTC 0x046e
129#define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578
130
131#define USB_VENDOR_ID_CANDO 0x2087
132#define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01
133#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03
134
135#define USB_VENDOR_ID_CH 0x068e
136#define USB_DEVICE_ID_CH_PRO_PEDALS 0x00f2
137#define USB_DEVICE_ID_CH_COMBATSTICK 0x00f4
138#define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051
139#define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff
140#define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3
141
142#define USB_VENDOR_ID_CHERRY 0x046a
143#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
144#define USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR 0x0027
145
146#define USB_VENDOR_ID_CHIC 0x05fe
147#define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014
148
149#define USB_VENDOR_ID_CHICONY 0x04f2
150#define USB_DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418
151
152#define USB_VENDOR_ID_CIDC 0x1677
153
154#define USB_VENDOR_ID_CMEDIA 0x0d8c
155#define USB_DEVICE_ID_CM109 0x000e
156
157#define USB_VENDOR_ID_CODEMERCS 0x07c0
158#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500
159#define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff
160
161#define USB_VENDOR_ID_CREATIVELABS 0x041e
162#define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801
163
164#define USB_VENDOR_ID_CYGNAL 0x10c4
165#define USB_DEVICE_ID_CYGNAL_RADIO_SI470X 0x818a
166
167#define USB_VENDOR_ID_CYPRESS 0x04b4
168#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001
169#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500
170#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
171#define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61
172#define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64
173#define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1
174
175#define USB_VENDOR_ID_DEALEXTREAME 0x10c5
176#define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a
177
178#define USB_VENDOR_ID_DELORME 0x1163
179#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100
180#define USB_DEVICE_ID_DELORME_EM_LT20 0x0200
181
182#define USB_VENDOR_ID_DMI 0x0c0b
183#define USB_DEVICE_ID_DMI_ENC 0x5fab
184
185#define USB_VENDOR_ID_DRAGONRISE 0x0079
186
187#define USB_VENDOR_ID_DWAV 0x0eef
188#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
189#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d
190
191#define USB_VENDOR_ID_ELO 0x04E7
192#define USB_DEVICE_ID_ELO_TS2700 0x0020
193
194#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
195#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
196
197#define USB_VENDOR_ID_ETURBOTOUCH 0x22b9
198#define USB_DEVICE_ID_ETURBOTOUCH 0x0006
199
200#define USB_VENDOR_ID_ETT 0x0664
201#define USB_DEVICE_ID_TC5UH 0x0309
202
203#define USB_VENDOR_ID_EZKEY 0x0518
204#define USB_DEVICE_ID_BTC_8193 0x0002
205
206#define USB_VENDOR_ID_GAMERON 0x0810
207#define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001
208#define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002
209
210#define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc
211
212#define USB_VENDOR_ID_GLAB 0x06c2
213#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
214#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039
215#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040
216#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044
217#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045
218#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051
219#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053
220#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058
221
222#define USB_VENDOR_ID_GOTOP 0x08f2
223#define USB_DEVICE_ID_SUPER_Q2 0x007f
224#define USB_DEVICE_ID_GOGOPEN 0x00ce
225#define USB_DEVICE_ID_PENPOWER 0x00f4
226
227#define USB_VENDOR_ID_GREENASIA 0x0e8f
228
229#define USB_VENDOR_ID_GRETAGMACBETH 0x0971
230#define USB_DEVICE_ID_GRETAGMACBETH_HUEY 0x2005
231
232#define USB_VENDOR_ID_GRIFFIN 0x077d
233#define USB_DEVICE_ID_POWERMATE 0x0410
234#define USB_DEVICE_ID_SOUNDKNOB 0x04AA
235
236#define USB_VENDOR_ID_GTCO 0x078c
237#define USB_DEVICE_ID_GTCO_90 0x0090
238#define USB_DEVICE_ID_GTCO_100 0x0100
239#define USB_DEVICE_ID_GTCO_101 0x0101
240#define USB_DEVICE_ID_GTCO_103 0x0103
241#define USB_DEVICE_ID_GTCO_104 0x0104
242#define USB_DEVICE_ID_GTCO_105 0x0105
243#define USB_DEVICE_ID_GTCO_106 0x0106
244#define USB_DEVICE_ID_GTCO_107 0x0107
245#define USB_DEVICE_ID_GTCO_108 0x0108
246#define USB_DEVICE_ID_GTCO_200 0x0200
247#define USB_DEVICE_ID_GTCO_201 0x0201
248#define USB_DEVICE_ID_GTCO_202 0x0202
249#define USB_DEVICE_ID_GTCO_203 0x0203
250#define USB_DEVICE_ID_GTCO_204 0x0204
251#define USB_DEVICE_ID_GTCO_205 0x0205
252#define USB_DEVICE_ID_GTCO_206 0x0206
253#define USB_DEVICE_ID_GTCO_207 0x0207
254#define USB_DEVICE_ID_GTCO_300 0x0300
255#define USB_DEVICE_ID_GTCO_301 0x0301
256#define USB_DEVICE_ID_GTCO_302 0x0302
257#define USB_DEVICE_ID_GTCO_303 0x0303
258#define USB_DEVICE_ID_GTCO_304 0x0304
259#define USB_DEVICE_ID_GTCO_305 0x0305
260#define USB_DEVICE_ID_GTCO_306 0x0306
261#define USB_DEVICE_ID_GTCO_307 0x0307
262#define USB_DEVICE_ID_GTCO_308 0x0308
263#define USB_DEVICE_ID_GTCO_309 0x0309
264#define USB_DEVICE_ID_GTCO_400 0x0400
265#define USB_DEVICE_ID_GTCO_401 0x0401
266#define USB_DEVICE_ID_GTCO_402 0x0402
267#define USB_DEVICE_ID_GTCO_403 0x0403
268#define USB_DEVICE_ID_GTCO_404 0x0404
269#define USB_DEVICE_ID_GTCO_405 0x0405
270#define USB_DEVICE_ID_GTCO_500 0x0500
271#define USB_DEVICE_ID_GTCO_501 0x0501
272#define USB_DEVICE_ID_GTCO_502 0x0502
273#define USB_DEVICE_ID_GTCO_503 0x0503
274#define USB_DEVICE_ID_GTCO_504 0x0504
275#define USB_DEVICE_ID_GTCO_1000 0x1000
276#define USB_DEVICE_ID_GTCO_1001 0x1001
277#define USB_DEVICE_ID_GTCO_1002 0x1002
278#define USB_DEVICE_ID_GTCO_1003 0x1003
279#define USB_DEVICE_ID_GTCO_1004 0x1004
280#define USB_DEVICE_ID_GTCO_1005 0x1005
281#define USB_DEVICE_ID_GTCO_1006 0x1006
282#define USB_DEVICE_ID_GTCO_1007 0x1007
283
284#define USB_VENDOR_ID_GYRATION 0x0c16
285#define USB_DEVICE_ID_GYRATION_REMOTE 0x0002
286#define USB_DEVICE_ID_GYRATION_REMOTE_2 0x0003
287#define USB_DEVICE_ID_GYRATION_REMOTE_3 0x0008
288
289#define USB_VENDOR_ID_HAPP 0x078b
290#define USB_DEVICE_ID_UGCI_DRIVING 0x0010
291#define USB_DEVICE_ID_UGCI_FLYING 0x0020
292#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030
293
294#define USB_VENDOR_ID_IMATION 0x0718
295#define USB_DEVICE_ID_DISC_STAKKA 0xd000
296
297#define USB_VENDOR_ID_KBGEAR 0x084e
298#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
299
300#define USB_VENDOR_ID_KWORLD 0x1b80
301#define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700
302
303#define USB_VENDOR_ID_LABTEC 0x1020
304#define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006
305
306#define USB_VENDOR_ID_LD 0x0f11
307#define USB_DEVICE_ID_LD_CASSY 0x1000
308#define USB_DEVICE_ID_LD_POCKETCASSY 0x1010
309#define USB_DEVICE_ID_LD_MOBILECASSY 0x1020
310#define USB_DEVICE_ID_LD_JWM 0x1080
311#define USB_DEVICE_ID_LD_DMMP 0x1081
312#define USB_DEVICE_ID_LD_UMIP 0x1090
313#define USB_DEVICE_ID_LD_XRAY1 0x1100
314#define USB_DEVICE_ID_LD_XRAY2 0x1101
315#define USB_DEVICE_ID_LD_VIDEOCOM 0x1200
316#define USB_DEVICE_ID_LD_COM3LAB 0x2000
317#define USB_DEVICE_ID_LD_TELEPORT 0x2010
318#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020
319#define USB_DEVICE_ID_LD_POWERCONTROL 0x2030
320#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
321
322#define USB_VENDOR_ID_KENSINGTON 0x047d
323#define USB_DEVICE_ID_KS_SLIMBLADE 0x2041
324
325#define USB_VENDOR_ID_LOGITECH 0x046d
326#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
327#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110
328#define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
329#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211
330#define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215
331#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2 0xc218
332#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2 0xc219
333#define USB_DEVICE_ID_LOGITECH_WINGMAN_F3D 0xc283
334#define USB_DEVICE_ID_LOGITECH_FORCE3D_PRO 0xc286
335#define USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940 0xc287
336#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294
337#define USB_DEVICE_ID_LOGITECH_WINGMAN_FFG 0xc293
338#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295
339#define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299
340#define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a
341#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
342#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
343#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
344#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
345#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
346#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
347#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
348#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
349#define USB_DEVICE_ID_DINOVO_MINI 0xc71f
350#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2 0xca03
351
352#define USB_VENDOR_ID_MCC 0x09db
353#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
354#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a
355
356#define USB_VENDOR_ID_MGE 0x0463
357#define USB_DEVICE_ID_MGE_UPS 0xffff
358#define USB_DEVICE_ID_MGE_UPS1 0x0001
359
360#define USB_VENDOR_ID_MICROCHIP 0x04d8
361#define USB_DEVICE_ID_PICKIT1 0x0032
362#define USB_DEVICE_ID_PICKIT2 0x0033
363#define USB_DEVICE_ID_PICOLCD 0xc002
364#define USB_DEVICE_ID_PICOLCD_BOOTLOADER 0xf002
365
366#define USB_VENDOR_ID_MICROSOFT 0x045e
367#define USB_DEVICE_ID_SIDEWINDER_GV 0x003b
368#define USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0 0x009d
369#define USB_DEVICE_ID_MS_NE4K 0x00db
370#define USB_DEVICE_ID_MS_LK6K 0x00f9
371#define USB_DEVICE_ID_MS_PRESENTER_8K_BT 0x0701
372#define USB_DEVICE_ID_MS_PRESENTER_8K_USB 0x0713
373
374#define USB_VENDOR_ID_MOJO 0x8282
375#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
376
377#define USB_VENDOR_ID_MONTEREY 0x0566
378#define USB_DEVICE_ID_GENIUS_KB29E 0x3004
379
380#define USB_VENDOR_ID_NCR 0x0404
381#define USB_DEVICE_ID_NCR_FIRST 0x0300
382#define USB_DEVICE_ID_NCR_LAST 0x03ff
383
384#define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
385#define USB_DEVICE_ID_N_S_HARMONY 0xc359
386
387#define USB_VENDOR_ID_NATSU 0x08b7
388#define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001
389
390#define USB_VENDOR_ID_NEC 0x073e
391#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
392
393#define USB_VENDOR_ID_NEXTWINDOW 0x1926
394#define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003
395
396#define USB_VENDOR_ID_NTRIG 0x1b96
397#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001
398#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1 0x0003
399#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2 0x0004
400#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3 0x0005
401#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4 0x0006
402#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5 0x0007
403#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6 0x0008
404#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7 0x0009
405#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8 0x000A
406#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9 0x000B
407#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10 0x000C
408#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11 0x000D
409#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12 0x000E
410#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13 0x000F
411#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14 0x0010
412#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15 0x0011
413#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16 0x0012
414#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17 0x0013
415#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18 0x0014
416
417#define USB_VENDOR_ID_ONTRAK 0x0a07
418#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064
419
420#define USB_VENDOR_ID_ORTEK 0x05a4
421#define USB_DEVICE_ID_ORTEK_WKB2000 0x2000
422
423#define USB_VENDOR_ID_PANJIT 0x134c
424
425#define USB_VENDOR_ID_PANTHERLORD 0x0810
426#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001
427
428#define USB_VENDOR_ID_PETALYNX 0x18b1
429#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
430
431#define USB_VENDOR_ID_PHILIPS 0x0471
432#define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
433
434#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
435#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
436
437#define USB_VENDOR_ID_POWERCOM 0x0d9f
438#define USB_DEVICE_ID_POWERCOM_UPS 0x0002
439
440#define USB_VENDOR_ID_PRODIGE 0x05af
441#define USB_DEVICE_ID_PRODIGE_CORDLESS 0x3062
442
443#define USB_VENDOR_ID_ROCCAT 0x1e7d
444#define USB_DEVICE_ID_ROCCAT_KONE 0x2ced
445
446#define USB_VENDOR_ID_SAITEK 0x06a3
447#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
448
449#define USB_VENDOR_ID_QUANTA 0x0408
450#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000
451#define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001
452
453#define USB_VENDOR_ID_SAMSUNG 0x0419
454#define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001
455#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600
456
457#define USB_VENDOR_ID_SONY 0x054c
458#define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b
459#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
460
461#define USB_VENDOR_ID_SOUNDGRAPH 0x15c2
462#define USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST 0x0034
463#define USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST 0x0046
464
465#define USB_VENDOR_ID_STANTUM 0x1f87
466#define USB_DEVICE_ID_MTP 0x0002
467
468#define USB_VENDOR_ID_SUN 0x0430
469#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
470
471#define USB_VENDOR_ID_SUNPLUS 0x04fc
472#define USB_DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8
473
474#define USB_VENDOR_ID_THRUSTMASTER 0x044f
475
476#define USB_VENDOR_ID_TOUCHPACK 0x1bfd
477#define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688
478
479#define USB_VENDOR_ID_TOPMAX 0x0663
480#define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103
481
482#define USB_VENDOR_ID_TOPSEED 0x0766
483#define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204
484
485#define USB_VENDOR_ID_TURBOX 0x062a
486#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
487
488#define USB_VENDOR_ID_TWINHAN 0x6253
489#define USB_DEVICE_ID_TWINHAN_IR_REMOTE 0x0100
490
491#define USB_VENDOR_ID_UCLOGIC 0x5543
492#define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042
493#define USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U 0x0003
494
495#define USB_VENDOR_ID_VERNIER 0x08f7
496#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001
497#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002
498#define USB_DEVICE_ID_VERNIER_SKIP 0x0003
499#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004
500#define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006
501
502#define USB_VENDOR_ID_WACOM 0x056a
503#define USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH 0x81
504#define USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH 0xbd
505
506#define USB_VENDOR_ID_WISEGROUP 0x0925
507#define USB_DEVICE_ID_SMARTJOY_PLUS 0x0005
508#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101
509#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104
510#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201
511#define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800
512#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866
513
514#define USB_VENDOR_ID_WISEGROUP_LTD 0x6666
515#define USB_VENDOR_ID_WISEGROUP_LTD2 0x6677
516#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802
517
518#define USB_VENDOR_ID_YEALINK 0x6993
519#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001
520
521#define USB_VENDOR_ID_ZEROPLUS 0x0c12
522
523#define USB_VENDOR_ID_ZYDACRON 0x13EC
524#define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006
525
526#define USB_VENDOR_ID_KYE 0x0458
527#define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
528#define USB_DEVICE_ID_KYE_GPEN_560 0x5003
529
530
531#endif
diff --git a/usr/src/dkms_source_tree/hid-input-quirks.c b/usr/src/dkms_source_tree/hid-input-quirks.c
deleted file mode 100644
index 16feea0..0000000
--- a/usr/src/dkms_source_tree/hid-input-quirks.c
+++ /dev/null
@@ -1,484 +0,0 @@
1/*
2 * HID-input usage mapping quirks
3 *
4 * This is used to handle HID-input mappings for devices violating
5 * HUT 1.12 specification.
6 *
7 * Copyright (c) 2007-2008 Jiri Kosina
8 */
9
10/*
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation; either version 2 of the License
14 */
15
16#include <linux/input.h>
17#include <linux/hid.h>
18
19#define map_abs(c) do { usage->code = c; usage->type = EV_ABS; *bit = input->absbit; *max = ABS_MAX; } while (0)
20#define map_rel(c) do { usage->code = c; usage->type = EV_REL; *bit = input->relbit; *max = REL_MAX; } while (0)
21#define map_key(c) do { usage->code = c; usage->type = EV_KEY; *bit = input->keybit; *max = KEY_MAX; } while (0)
22#define map_led(c) do { usage->code = c; usage->type = EV_LED; *bit = input->ledbit; *max = LED_MAX; } while (0)
23
24#define map_abs_clear(c) do { map_abs(c); clear_bit(c, *bit); } while (0)
25#define map_key_clear(c) do { map_key(c); clear_bit(c, *bit); } while (0)
26
27static int quirk_belkin_wkbd(struct hid_usage *usage, struct input_dev *input,
28 unsigned long **bit, int *max)
29{
30 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
31 return 0;
32
33 switch (usage->hid & HID_USAGE) {
34 case 0x03a: map_key_clear(KEY_SOUND); break;
35 case 0x03b: map_key_clear(KEY_CAMERA); break;
36 case 0x03c: map_key_clear(KEY_DOCUMENTS); break;
37 default:
38 return 0;
39 }
40 return 1;
41}
42
43static int quirk_cherry_cymotion(struct hid_usage *usage, struct input_dev *input,
44 unsigned long **bit, int *max)
45{
46 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
47 return 0;
48
49 switch (usage->hid & HID_USAGE) {
50 case 0x301: map_key_clear(KEY_PROG1); break;
51 case 0x302: map_key_clear(KEY_PROG2); break;
52 case 0x303: map_key_clear(KEY_PROG3); break;
53 default:
54 return 0;
55 }
56 return 1;
57}
58
59static int quirk_logitech_ultrax_remote(struct hid_usage *usage, struct input_dev *input,
60 unsigned long **bit, int *max)
61{
62 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
63 return 0;
64
65 set_bit(EV_REP, input->evbit);
66 switch(usage->hid & HID_USAGE) {
67 /* Reported on Logitech Ultra X Media Remote */
68 case 0x004: map_key_clear(KEY_AGAIN); break;
69 case 0x00d: map_key_clear(KEY_HOME); break;
70 case 0x024: map_key_clear(KEY_SHUFFLE); break;
71 case 0x025: map_key_clear(KEY_TV); break;
72 case 0x026: map_key_clear(KEY_MENU); break;
73 case 0x031: map_key_clear(KEY_AUDIO); break;
74 case 0x032: map_key_clear(KEY_TEXT); break;
75 case 0x033: map_key_clear(KEY_LAST); break;
76 case 0x047: map_key_clear(KEY_MP3); break;
77 case 0x048: map_key_clear(KEY_DVD); break;
78 case 0x049: map_key_clear(KEY_MEDIA); break;
79 case 0x04a: map_key_clear(KEY_VIDEO); break;
80 case 0x04b: map_key_clear(KEY_ANGLE); break;
81 case 0x04c: map_key_clear(KEY_LANGUAGE); break;
82 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
83 case 0x051: map_key_clear(KEY_RED); break;
84 case 0x052: map_key_clear(KEY_CLOSE); break;
85
86 default:
87 return 0;
88 }
89 return 1;
90}
91
92static int quirk_gyration_remote(struct hid_usage *usage, struct input_dev *input,
93 unsigned long **bit, int *max)
94{
95 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
96 return 0;
97
98 set_bit(EV_REP, input->evbit);
99 switch(usage->hid & HID_USAGE) {
100 /* Reported on Gyration MCE Remote */
101 case 0x00d: map_key_clear(KEY_HOME); break;
102 case 0x024: map_key_clear(KEY_DVD); break;
103 case 0x025: map_key_clear(KEY_PVR); break;
104 case 0x046: map_key_clear(KEY_MEDIA); break;
105 case 0x047: map_key_clear(KEY_MP3); break;
106 case 0x049: map_key_clear(KEY_CAMERA); break;
107 case 0x04a: map_key_clear(KEY_VIDEO); break;
108
109 default:
110 return 0;
111 }
112 return 1;
113}
114
115static int quirk_chicony_tactical_pad(struct hid_usage *usage, struct input_dev *input,
116 unsigned long **bit, int *max)
117{
118 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR)
119 return 0;
120
121 set_bit(EV_REP, input->evbit);
122 switch (usage->hid & HID_USAGE) {
123 case 0xff01: map_key_clear(BTN_1); break;
124 case 0xff02: map_key_clear(BTN_2); break;
125 case 0xff03: map_key_clear(BTN_3); break;
126 case 0xff04: map_key_clear(BTN_4); break;
127 case 0xff05: map_key_clear(BTN_5); break;
128 case 0xff06: map_key_clear(BTN_6); break;
129 case 0xff07: map_key_clear(BTN_7); break;
130 case 0xff08: map_key_clear(BTN_8); break;
131 case 0xff09: map_key_clear(BTN_9); break;
132 case 0xff0a: map_key_clear(BTN_A); break;
133 case 0xff0b: map_key_clear(BTN_B); break;
134 default:
135 return 0;
136 }
137 return 1;
138}
139
140static int quirk_microsoft_ergonomy_kb(struct hid_usage *usage, struct input_dev *input,
141 unsigned long **bit, int *max)
142{
143 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR)
144 return 0;
145
146 switch(usage->hid & HID_USAGE) {
147 case 0xfd06: map_key_clear(KEY_CHAT); break;
148 case 0xfd07: map_key_clear(KEY_PHONE); break;
149 case 0xff05:
150 set_bit(EV_REP, input->evbit);
151 map_key_clear(KEY_F13);
152 set_bit(KEY_F14, input->keybit);
153 set_bit(KEY_F15, input->keybit);
154 set_bit(KEY_F16, input->keybit);
155 set_bit(KEY_F17, input->keybit);
156 set_bit(KEY_F18, input->keybit);
157 default:
158 return 0;
159 }
160 return 1;
161}
162
163static int quirk_microsoft_presenter_8k(struct hid_usage *usage, struct input_dev *input,
164 unsigned long **bit, int *max)
165{
166 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_MSVENDOR)
167 return 0;
168
169 set_bit(EV_REP, input->evbit);
170 switch(usage->hid & HID_USAGE) {
171 case 0xfd08: map_key_clear(KEY_FORWARD); break;
172 case 0xfd09: map_key_clear(KEY_BACK); break;
173 case 0xfd0b: map_key_clear(KEY_PLAYPAUSE); break;
174 case 0xfd0e: map_key_clear(KEY_CLOSE); break;
175 case 0xfd0f: map_key_clear(KEY_PLAY); break;
176 default:
177 return 0;
178 }
179 return 1;
180}
181
182static int quirk_petalynx_remote(struct hid_usage *usage, struct input_dev *input,
183 unsigned long **bit, int *max)
184{
185 if (((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) &&
186 ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER))
187 return 0;
188
189 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_LOGIVENDOR)
190 switch(usage->hid & HID_USAGE) {
191 case 0x05a: map_key_clear(KEY_TEXT); break;
192 case 0x05b: map_key_clear(KEY_RED); break;
193 case 0x05c: map_key_clear(KEY_GREEN); break;
194 case 0x05d: map_key_clear(KEY_YELLOW); break;
195 case 0x05e: map_key_clear(KEY_BLUE); break;
196 default:
197 return 0;
198 }
199
200 if ((usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER)
201 switch(usage->hid & HID_USAGE) {
202 case 0x0f6: map_key_clear(KEY_NEXT); break;
203 case 0x0fa: map_key_clear(KEY_BACK); break;
204 default:
205 return 0;
206 }
207 return 1;
208}
209
210static int quirk_logitech_wireless(struct hid_usage *usage, struct input_dev *input,
211 unsigned long **bit, int *max)
212{
213 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
214 return 0;
215
216 switch (usage->hid & HID_USAGE) {
217 case 0x1001: map_key_clear(KEY_MESSENGER); break;
218 case 0x1003: map_key_clear(KEY_SOUND); break;
219 case 0x1004: map_key_clear(KEY_VIDEO); break;
220 case 0x1005: map_key_clear(KEY_AUDIO); break;
221 case 0x100a: map_key_clear(KEY_DOCUMENTS); break;
222 case 0x1011: map_key_clear(KEY_PREVIOUSSONG); break;
223 case 0x1012: map_key_clear(KEY_NEXTSONG); break;
224 case 0x1013: map_key_clear(KEY_CAMERA); break;
225 case 0x1014: map_key_clear(KEY_MESSENGER); break;
226 case 0x1015: map_key_clear(KEY_RECORD); break;
227 case 0x1016: map_key_clear(KEY_PLAYER); break;
228 case 0x1017: map_key_clear(KEY_EJECTCD); break;
229 case 0x1018: map_key_clear(KEY_MEDIA); break;
230 case 0x1019: map_key_clear(KEY_PROG1); break;
231 case 0x101a: map_key_clear(KEY_PROG2); break;
232 case 0x101b: map_key_clear(KEY_PROG3); break;
233 case 0x101f: map_key_clear(KEY_ZOOMIN); break;
234 case 0x1020: map_key_clear(KEY_ZOOMOUT); break;
235 case 0x1021: map_key_clear(KEY_ZOOMRESET); break;
236 case 0x1023: map_key_clear(KEY_CLOSE); break;
237 case 0x1027: map_key_clear(KEY_MENU); break;
238 /* this one is marked as 'Rotate' */
239 case 0x1028: map_key_clear(KEY_ANGLE); break;
240 case 0x1029: map_key_clear(KEY_SHUFFLE); break;
241 case 0x102a: map_key_clear(KEY_BACK); break;
242 case 0x102b: map_key_clear(KEY_CYCLEWINDOWS); break;
243 case 0x1041: map_key_clear(KEY_BATTERY); break;
244 case 0x1042: map_key_clear(KEY_WORDPROCESSOR); break;
245 case 0x1043: map_key_clear(KEY_SPREADSHEET); break;
246 case 0x1044: map_key_clear(KEY_PRESENTATION); break;
247 case 0x1045: map_key_clear(KEY_UNDO); break;
248 case 0x1046: map_key_clear(KEY_REDO); break;
249 case 0x1047: map_key_clear(KEY_PRINT); break;
250 case 0x1048: map_key_clear(KEY_SAVE); break;
251 case 0x1049: map_key_clear(KEY_PROG1); break;
252 case 0x104a: map_key_clear(KEY_PROG2); break;
253 case 0x104b: map_key_clear(KEY_PROG3); break;
254 case 0x104c: map_key_clear(KEY_PROG4); break;
255
256 default:
257 return 0;
258 }
259 return 1;
260}
261
262static int quirk_cherry_genius_29e(struct hid_usage *usage, struct input_dev *input,
263 unsigned long **bit, int *max)
264{
265 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
266 return 0;
267
268 switch (usage->hid & HID_USAGE) {
269 case 0x156: map_key_clear(KEY_WORDPROCESSOR); break;
270 case 0x157: map_key_clear(KEY_SPREADSHEET); break;
271 case 0x158: map_key_clear(KEY_PRESENTATION); break;
272 case 0x15c: map_key_clear(KEY_STOP); break;
273
274 default:
275 return 0;
276 }
277 return 1;
278}
279
280static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
281 unsigned long **bit, int *max)
282{
283 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
284 return 0;
285
286 switch (usage->hid & HID_USAGE) {
287 case 0x230: map_key(BTN_MOUSE); break;
288 case 0x231: map_rel(REL_WHEEL); break;
289 /*
290 * this keyboard has a scrollwheel implemented in
291 * totally broken way. We map this usage temporarily
292 * to HWHEEL and handle it in the event quirk handler
293 */
294 case 0x232: map_rel(REL_HWHEEL); break;
295
296 default:
297 return 0;
298 }
299 return 1;
300}
301
302static int quirk_sunplus_wdesktop(struct hid_usage *usage, struct input_dev *input,
303 unsigned long **bit, int *max)
304{
305 if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
306 return 0;
307
308 switch (usage->hid & HID_USAGE) {
309 case 0x2003: map_key_clear(KEY_ZOOMIN); break;
310 case 0x2103: map_key_clear(KEY_ZOOMOUT); break;
311 default:
312 return 0;
313 }
314 return 1;
315}
316
317#define VENDOR_ID_BELKIN 0x1020
318#define DEVICE_ID_BELKIN_WIRELESS_KEYBOARD 0x0006
319
320#define VENDOR_ID_CHERRY 0x046a
321#define DEVICE_ID_CHERRY_CYMOTION 0x0023
322
323#define VENDOR_ID_CHICONY 0x04f2
324#define DEVICE_ID_CHICONY_TACTICAL_PAD 0x0418
325
326#define VENDOR_ID_EZKEY 0x0518
327#define DEVICE_ID_BTC_8193 0x0002
328
329#define VENDOR_ID_GYRATION 0x0c16
330#define DEVICE_ID_GYRATION_REMOTE 0x0002
331
332#define VENDOR_ID_LOGITECH 0x046d
333#define DEVICE_ID_LOGITECH_RECEIVER 0xc101
334#define DEVICE_ID_S510_RECEIVER 0xc50c
335#define DEVICE_ID_S510_RECEIVER_2 0xc517
336#define DEVICE_ID_MX3000_RECEIVER 0xc513
337
338#define VENDOR_ID_MICROSOFT 0x045e
339#define DEVICE_ID_MS4K 0x00db
340#define DEVICE_ID_MS6K 0x00f9
341#define DEVICE_IS_MS_PRESENTER_8K_BT 0x0701
342#define DEVICE_ID_MS_PRESENTER_8K_USB 0x0713
343
344#define VENDOR_ID_MONTEREY 0x0566
345#define DEVICE_ID_GENIUS_KB29E 0x3004
346
347#define VENDOR_ID_PETALYNX 0x18b1
348#define DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
349
350#define VENDOR_ID_SUNPLUS 0x04fc
351#define DEVICE_ID_SUNPLUS_WDESKTOP 0x05d8
352
353static const struct hid_input_blacklist {
354 __u16 idVendor;
355 __u16 idProduct;
356 int (*quirk)(struct hid_usage *, struct input_dev *, unsigned long **, int *);
357} hid_input_blacklist[] = {
358 { VENDOR_ID_BELKIN, DEVICE_ID_BELKIN_WIRELESS_KEYBOARD, quirk_belkin_wkbd },
359
360 { VENDOR_ID_CHERRY, DEVICE_ID_CHERRY_CYMOTION, quirk_cherry_cymotion },
361
362 { VENDOR_ID_CHICONY, DEVICE_ID_CHICONY_TACTICAL_PAD, quirk_chicony_tactical_pad },
363
364 { VENDOR_ID_EZKEY, DEVICE_ID_BTC_8193, quirk_btc_8193 },
365
366 { VENDOR_ID_GYRATION, DEVICE_ID_GYRATION_REMOTE, quirk_gyration_remote },
367
368 { VENDOR_ID_LOGITECH, DEVICE_ID_LOGITECH_RECEIVER, quirk_logitech_ultrax_remote },
369 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER, quirk_logitech_wireless },
370 { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER_2, quirk_logitech_wireless },
371 { VENDOR_ID_LOGITECH, DEVICE_ID_MX3000_RECEIVER, quirk_logitech_wireless },
372
373 { VENDOR_ID_MICROSOFT, DEVICE_ID_MS4K, quirk_microsoft_ergonomy_kb },
374 { VENDOR_ID_MICROSOFT, DEVICE_ID_MS6K, quirk_microsoft_ergonomy_kb },
375 { VENDOR_ID_MICROSOFT, DEVICE_IS_MS_PRESENTER_8K_BT, quirk_microsoft_presenter_8k },
376 { VENDOR_ID_MICROSOFT, DEVICE_ID_MS_PRESENTER_8K_USB, quirk_microsoft_presenter_8k },
377
378 { VENDOR_ID_MONTEREY, DEVICE_ID_GENIUS_KB29E, quirk_cherry_genius_29e },
379
380 { VENDOR_ID_PETALYNX, DEVICE_ID_PETALYNX_MAXTER_REMOTE, quirk_petalynx_remote },
381
382 { VENDOR_ID_SUNPLUS, DEVICE_ID_SUNPLUS_WDESKTOP, quirk_sunplus_wdesktop },
383
384 { 0, 0, NULL }
385};
386
387int hidinput_mapping_quirks(struct hid_usage *usage,
388 struct input_dev *input,
389 unsigned long **bit, int *max)
390{
391 struct hid_device *device = input_get_drvdata(input);
392 int i = 0;
393
394 while (hid_input_blacklist[i].quirk) {
395 if (hid_input_blacklist[i].idVendor == device->vendor &&
396 hid_input_blacklist[i].idProduct == device->product)
397 return hid_input_blacklist[i].quirk(usage, input, bit, max);
398 i++;
399 }
400 return 0;
401}
402
403int hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
404{
405 struct input_dev *input;
406
407 input = field->hidinput->input;
408
409 if (((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
410 || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) {
411 if (value) hid->quirks |= HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
412 else hid->quirks &= ~HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
413 return 1;
414 }
415
416 if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_B8) &&
417 (usage->type == EV_REL) &&
418 (usage->code == REL_WHEEL)) {
419 hid->delayed_value = value;
420 return 1;
421 }
422
423 if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_B8) &&
424 (usage->hid == 0x000100b8)) {
425 input_event(input, EV_REL, value ? REL_HWHEEL : REL_WHEEL, hid->delayed_value);
426 return 1;
427 }
428
429 if ((hid->quirks & HID_QUIRK_INVERT_HWHEEL) && (usage->code == REL_HWHEEL)) {
430 input_event(input, usage->type, usage->code, -value);
431 return 1;
432 }
433
434 if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) {
435 input_event(input, usage->type, REL_HWHEEL, value);
436 return 1;
437 }
438
439 if ((hid->quirks & HID_QUIRK_APPLE_HAS_FN) && hidinput_apple_event(hid, input, usage, value))
440 return 1;
441
442 /* Handling MS keyboards special buttons */
443 if (hid->quirks & HID_QUIRK_MICROSOFT_KEYS &&
444 usage->hid == (HID_UP_MSVENDOR | 0xff05)) {
445 int key = 0;
446 static int last_key = 0;
447 switch (value) {
448 case 0x01: key = KEY_F14; break;
449 case 0x02: key = KEY_F15; break;
450 case 0x04: key = KEY_F16; break;
451 case 0x08: key = KEY_F17; break;
452 case 0x10: key = KEY_F18; break;
453 default: break;
454 }
455 if (key) {
456 input_event(input, usage->type, key, 1);
457 last_key = key;
458 } else {
459 input_event(input, usage->type, last_key, 0);
460 }
461 }
462
463 /* handle the temporary quirky mapping to HWHEEL */
464 if (hid->quirks & HID_QUIRK_HWHEEL_WHEEL_INVERT &&
465 usage->type == EV_REL && usage->code == REL_HWHEEL) {
466 input_event(input, usage->type, REL_WHEEL, -value);
467 return 1;
468 }
469
470 /* Gyration MCE remote "Sleep" key */
471 if (hid->vendor == VENDOR_ID_GYRATION &&
472 hid->product == DEVICE_ID_GYRATION_REMOTE &&
473 (usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK &&
474 (usage->hid & 0xff) == 0x82) {
475 input_event(input, usage->type, usage->code, 1);
476 input_sync(input);
477 input_event(input, usage->type, usage->code, 0);
478 input_sync(input);
479 return 1;
480 }
481 return 0;
482}
483
484
diff --git a/usr/src/dkms_source_tree/hid-input.c b/usr/src/dkms_source_tree/hid-input.c
index 782048d..9d97934 100644
--- a/usr/src/dkms_source_tree/hid-input.c
+++ b/usr/src/dkms_source_tree/hid-input.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (c) 2000-2001 Vojtech Pavlik 2 * Copyright (c) 2000-2001 Vojtech Pavlik
3 * Copyright (c) 2006-2007 Jiri Kosina 3 * Copyright (c) 2006-2010 Jiri Kosina
4 * 4 *
5 * HID to Linux Input mapping 5 * HID to Linux Input mapping
6 */ 6 */
@@ -32,11 +32,6 @@
32#include <linux/hid.h> 32#include <linux/hid.h>
33#include <linux/hid-debug.h> 33#include <linux/hid-debug.h>
34 34
35static int hid_apple_fnmode = 1;
36module_param_named(pb_fnmode, hid_apple_fnmode, int, 0644);
37MODULE_PARM_DESC(pb_fnmode,
38 "Mode of fn key on Apple keyboards (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)");
39
40#define unk KEY_UNKNOWN 35#define unk KEY_UNKNOWN
41 36
42static const unsigned char hid_keyboard[256] = { 37static const unsigned char hid_keyboard[256] = {
@@ -58,245 +53,40 @@ static const unsigned char hid_keyboard[256] = {
58 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk 53 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
59}; 54};
60 55
61/* extended mapping for certain Logitech hardware (Logitech cordless desktop LX500) */
62#define LOGITECH_EXPANDED_KEYMAP_SIZE 80
63static int logitech_expanded_keymap[LOGITECH_EXPANDED_KEYMAP_SIZE] = {
64 0,216, 0,213,175,156, 0, 0, 0, 0,
65 144, 0, 0, 0, 0, 0, 0, 0, 0,212,
66 174,167,152,161,112, 0, 0, 0,154, 0,
67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70 0, 0, 0, 0, 0,183,184,185,186,187,
71 188,189,190,191,192,193,194, 0, 0, 0
72};
73
74static const struct { 56static const struct {
75 __s32 x; 57 __s32 x;
76 __s32 y; 58 __s32 y;
77} hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; 59} hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}};
78 60
79#define map_abs(c) do { usage->code = c; usage->type = EV_ABS; bit = input->absbit; max = ABS_MAX; } while (0) 61#define map_abs(c) hid_map_usage(hidinput, usage, &bit, &max, EV_ABS, (c))
80#define map_rel(c) do { usage->code = c; usage->type = EV_REL; bit = input->relbit; max = REL_MAX; } while (0) 62#define map_rel(c) hid_map_usage(hidinput, usage, &bit, &max, EV_REL, (c))
81#define map_key(c) do { usage->code = c; usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX; } while (0) 63#define map_key(c) hid_map_usage(hidinput, usage, &bit, &max, EV_KEY, (c))
82#define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0) 64#define map_led(c) hid_map_usage(hidinput, usage, &bit, &max, EV_LED, (c))
83
84#define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0)
85#define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0)
86
87#ifdef CONFIG_USB_HIDINPUT_POWERBOOK
88
89struct hidinput_key_translation {
90 u16 from;
91 u16 to;
92 u8 flags;
93};
94
95#define APPLE_FLAG_FKEY 0x01
96
97static struct hidinput_key_translation apple_fn_keys[] = {
98 { KEY_BACKSPACE, KEY_DELETE },
99 { KEY_ENTER, KEY_INSERT },
100 { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
101 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
102 { KEY_F3, KEY_CYCLEWINDOWS, APPLE_FLAG_FKEY }, /* Exposé */
103 { KEY_F4, KEY_CALC, APPLE_FLAG_FKEY }, /* Dashboard */
104 { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
105 { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
106 { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
107 { KEY_F8, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
108 { KEY_F9, KEY_NEXTSONG, APPLE_FLAG_FKEY },
109 { KEY_F10, KEY_MUTE, APPLE_FLAG_FKEY },
110 { KEY_F11, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
111 { KEY_F12, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
112 { KEY_UP, KEY_PAGEUP },
113 { KEY_DOWN, KEY_PAGEDOWN },
114 { KEY_LEFT, KEY_HOME },
115 { KEY_RIGHT, KEY_END },
116 { }
117};
118
119static struct hidinput_key_translation powerbook_fn_keys[] = {
120 { KEY_BACKSPACE, KEY_DELETE },
121 { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
122 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
123 { KEY_F3, KEY_MUTE, APPLE_FLAG_FKEY },
124 { KEY_F4, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
125 { KEY_F5, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
126 { KEY_F6, KEY_NUMLOCK, APPLE_FLAG_FKEY },
127 { KEY_F7, KEY_SWITCHVIDEOMODE, APPLE_FLAG_FKEY },
128 { KEY_F8, KEY_KBDILLUMTOGGLE, APPLE_FLAG_FKEY },
129 { KEY_F9, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
130 { KEY_F10, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
131 { KEY_UP, KEY_PAGEUP },
132 { KEY_DOWN, KEY_PAGEDOWN },
133 { KEY_LEFT, KEY_HOME },
134 { KEY_RIGHT, KEY_END },
135 { }
136};
137
138static struct hidinput_key_translation powerbook_numlock_keys[] = {
139 { KEY_J, KEY_KP1 },
140 { KEY_K, KEY_KP2 },
141 { KEY_L, KEY_KP3 },
142 { KEY_U, KEY_KP4 },
143 { KEY_I, KEY_KP5 },
144 { KEY_O, KEY_KP6 },
145 { KEY_7, KEY_KP7 },
146 { KEY_8, KEY_KP8 },
147 { KEY_9, KEY_KP9 },
148 { KEY_M, KEY_KP0 },
149 { KEY_DOT, KEY_KPDOT },
150 { KEY_SLASH, KEY_KPPLUS },
151 { KEY_SEMICOLON, KEY_KPMINUS },
152 { KEY_P, KEY_KPASTERISK },
153 { KEY_MINUS, KEY_KPEQUAL },
154 { KEY_0, KEY_KPSLASH },
155 { KEY_F6, KEY_NUMLOCK },
156 { KEY_KPENTER, KEY_KPENTER },
157 { KEY_BACKSPACE, KEY_BACKSPACE },
158 { }
159};
160
161static struct hidinput_key_translation apple_iso_keyboard[] = {
162 { KEY_GRAVE, KEY_102ND },
163 { KEY_102ND, KEY_GRAVE },
164 { }
165};
166
167static struct hidinput_key_translation *find_translation(struct hidinput_key_translation *table, u16 from)
168{
169 struct hidinput_key_translation *trans;
170
171 /* Look for the translation */
172 for (trans = table; trans->from; trans++)
173 if (trans->from == from)
174 return trans;
175
176 return NULL;
177}
178
179int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
180 struct hid_usage *usage, __s32 value)
181{
182 struct hidinput_key_translation *trans;
183
184 if (usage->code == KEY_FN) {
185 if (value) hid->quirks |= HID_QUIRK_APPLE_FN_ON;
186 else hid->quirks &= ~HID_QUIRK_APPLE_FN_ON;
187
188 input_event(input, usage->type, usage->code, value);
189
190 return 1;
191 }
192
193 if (hid_apple_fnmode) {
194 int do_translate;
195
196 trans = find_translation((hid->product < 0x220 ||
197 hid->product >= 0x300) ?
198 powerbook_fn_keys : apple_fn_keys,
199 usage->code);
200 if (trans) {
201 if (test_bit(usage->code, hid->apple_pressed_fn))
202 do_translate = 1;
203 else if (trans->flags & APPLE_FLAG_FKEY)
204 do_translate =
205 (hid_apple_fnmode == 2 && (hid->quirks & HID_QUIRK_APPLE_FN_ON)) ||
206 (hid_apple_fnmode == 1 && !(hid->quirks & HID_QUIRK_APPLE_FN_ON));
207 else
208 do_translate = (hid->quirks & HID_QUIRK_APPLE_FN_ON);
209
210 if (do_translate) {
211 if (value)
212 set_bit(usage->code, hid->apple_pressed_fn);
213 else
214 clear_bit(usage->code, hid->apple_pressed_fn);
215
216 input_event(input, usage->type, trans->to, value);
217
218 return 1;
219 }
220 }
221
222 if (hid->quirks & HID_QUIRK_APPLE_NUMLOCK_EMULATION && (
223 test_bit(usage->code, hid->pb_pressed_numlock) ||
224 test_bit(LED_NUML, input->led))) {
225 trans = find_translation(powerbook_numlock_keys, usage->code);
226
227 if (trans) {
228 if (value)
229 set_bit(usage->code, hid->pb_pressed_numlock);
230 else
231 clear_bit(usage->code, hid->pb_pressed_numlock);
232
233 input_event(input, usage->type, trans->to, value);
234 }
235
236 return 1;
237 }
238 }
239
240 if (hid->quirks & HID_QUIRK_APPLE_ISO_KEYBOARD) {
241 trans = find_translation(apple_iso_keyboard, usage->code);
242 if (trans) {
243 input_event(input, usage->type, trans->to, value);
244 return 1;
245 }
246 }
247 65
248 return 0; 66#define map_abs_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \
249} 67 &max, EV_ABS, (c))
68#define map_key_clear(c) hid_map_usage_clear(hidinput, usage, &bit, \
69 &max, EV_KEY, (c))
250 70
251static void hidinput_apple_setup(struct input_dev *input) 71static inline int match_scancode(unsigned int code, unsigned int scancode)
252{
253 struct hidinput_key_translation *trans;
254
255 set_bit(KEY_NUMLOCK, input->keybit);
256
257 /* Enable all needed keys */
258 for (trans = apple_fn_keys; trans->from; trans++)
259 set_bit(trans->to, input->keybit);
260
261 for (trans = powerbook_fn_keys; trans->from; trans++)
262 set_bit(trans->to, input->keybit);
263
264 for (trans = powerbook_numlock_keys; trans->from; trans++)
265 set_bit(trans->to, input->keybit);
266
267 for (trans = apple_iso_keyboard; trans->from; trans++)
268 set_bit(trans->to, input->keybit);
269
270}
271#else
272inline int hidinput_apple_event(struct hid_device *hid,
273 struct input_dev *input,
274 struct hid_usage *usage, __s32 value)
275{
276 return 0;
277}
278
279static inline void hidinput_apple_setup(struct input_dev *input)
280{
281}
282#endif
283
284static inline int match_scancode(int code, int scancode)
285{ 72{
286 if (scancode == 0) 73 if (scancode == 0)
287 return 1; 74 return 1;
288 return ((code & (HID_USAGE_PAGE | HID_USAGE)) == scancode); 75
76 return (code & (HID_USAGE_PAGE | HID_USAGE)) == scancode;
289} 77}
290 78
291static inline int match_keycode(int code, int keycode) 79static inline int match_keycode(unsigned int code, unsigned int keycode)
292{ 80{
293 if (keycode == 0) 81 if (keycode == 0)
294 return 1; 82 return 1;
295 return (code == keycode); 83
84 return code == keycode;
296} 85}
297 86
298static struct hid_usage *hidinput_find_key(struct hid_device *hid, 87static struct hid_usage *hidinput_find_key(struct hid_device *hid,
299 int scancode, int keycode) 88 unsigned int scancode,
89 unsigned int keycode)
300{ 90{
301 int i, j, k; 91 int i, j, k;
302 struct hid_report *report; 92 struct hid_report *report;
@@ -318,8 +108,8 @@ static struct hid_usage *hidinput_find_key(struct hid_device *hid,
318 return NULL; 108 return NULL;
319} 109}
320 110
321static int hidinput_getkeycode(struct input_dev *dev, int scancode, 111static int hidinput_getkeycode(struct input_dev *dev,
322 int *keycode) 112 unsigned int scancode, unsigned int *keycode)
323{ 113{
324 struct hid_device *hid = input_get_drvdata(dev); 114 struct hid_device *hid = input_get_drvdata(dev);
325 struct hid_usage *usage; 115 struct hid_usage *usage;
@@ -332,16 +122,13 @@ static int hidinput_getkeycode(struct input_dev *dev, int scancode,
332 return -EINVAL; 122 return -EINVAL;
333} 123}
334 124
335static int hidinput_setkeycode(struct input_dev *dev, int scancode, 125static int hidinput_setkeycode(struct input_dev *dev,
336 int keycode) 126 unsigned int scancode, unsigned int keycode)
337{ 127{
338 struct hid_device *hid = input_get_drvdata(dev); 128 struct hid_device *hid = input_get_drvdata(dev);
339 struct hid_usage *usage; 129 struct hid_usage *usage;
340 int old_keycode; 130 int old_keycode;
341 131
342 if (keycode < 0 || keycode > KEY_MAX)
343 return -EINVAL;
344
345 usage = hidinput_find_key(hid, scancode, 0); 132 usage = hidinput_find_key(hid, scancode, 0);
346 if (usage) { 133 if (usage) {
347 old_keycode = usage->code; 134 old_keycode = usage->code;
@@ -367,425 +154,365 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
367{ 154{
368 struct input_dev *input = hidinput->input; 155 struct input_dev *input = hidinput->input;
369 struct hid_device *device = input_get_drvdata(input); 156 struct hid_device *device = input_get_drvdata(input);
370 int max = 0, code, ret; 157 int max = 0, code;
371 unsigned long *bit = NULL; 158 unsigned long *bit = NULL;
372 159
373 field->hidinput = hidinput; 160 field->hidinput = hidinput;
374 161
375 dbg_hid("Mapping: ");
376 hid_resolv_usage(usage->hid);
377 dbg_hid_line(" ---> ");
378
379 if (field->flags & HID_MAIN_ITEM_CONSTANT) 162 if (field->flags & HID_MAIN_ITEM_CONSTANT)
380 goto ignore; 163 goto ignore;
381 164
382 /* only LED usages are supported in output fields */ 165 /* only LED usages are supported in output fields */
383 if (field->report_type == HID_OUTPUT_REPORT && 166 if (field->report_type == HID_OUTPUT_REPORT &&
384 (usage->hid & HID_USAGE_PAGE) != HID_UP_LED) { 167 (usage->hid & HID_USAGE_PAGE) != HID_UP_LED) {
385 dbg_hid_line(" [non-LED output field] ");
386 goto ignore; 168 goto ignore;
387 } 169 }
388 170
389 /* handle input mappings for quirky devices */ 171 if (device->driver->input_mapping) {
390 ret = hidinput_mapping_quirks(usage, input, &bit, &max); 172 int ret = device->driver->input_mapping(device, hidinput, field,
391 if (ret) 173 usage, &bit, &max);
392 goto mapped; 174 if (ret > 0)
393 175 goto mapped;
394 switch (usage->hid & HID_USAGE_PAGE) { 176 if (ret < 0)
395
396 case HID_UP_UNDEFINED:
397 goto ignore; 177 goto ignore;
178 }
398 179
399 case HID_UP_KEYBOARD: 180 switch (usage->hid & HID_USAGE_PAGE) {
400 181 case HID_UP_UNDEFINED:
401 set_bit(EV_REP, input->evbit); 182 goto ignore;
402
403 if ((usage->hid & HID_USAGE) < 256) {
404 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
405 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
406 } else
407 map_key(KEY_UNKNOWN);
408
409 break;
410
411 case HID_UP_BUTTON:
412
413 code = ((usage->hid - 1) & 0xf);
414
415 switch (field->application) {
416 case HID_GD_MOUSE:
417 case HID_GD_POINTER: code += 0x110; break;
418 case HID_GD_JOYSTICK: code += 0x120; break;
419 case HID_GD_GAMEPAD: code += 0x130; break;
420 default:
421 switch (field->physical) {
422 case HID_GD_MOUSE:
423 case HID_GD_POINTER: code += 0x110; break;
424 case HID_GD_JOYSTICK: code += 0x120; break;
425 case HID_GD_GAMEPAD: code += 0x130; break;
426 default: code += 0x100;
427 }
428 }
429 183
430 /* Special handling for Logitech Cordless Desktop */ 184 case HID_UP_KEYBOARD:
431 if (field->application != HID_GD_MOUSE) { 185 set_bit(EV_REP, input->evbit);
432 if (device->quirks & HID_QUIRK_LOGITECH_EXPANDED_KEYMAP) { 186
433 int hid = usage->hid & HID_USAGE; 187 if ((usage->hid & HID_USAGE) < 256) {
434 if (hid < LOGITECH_EXPANDED_KEYMAP_SIZE && logitech_expanded_keymap[hid] != 0) 188 if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
435 code = logitech_expanded_keymap[hid]; 189 map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
436 } 190 } else
437 } else { 191 map_key(KEY_UNKNOWN);
438 if (device->quirks & HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL) { 192
439 int hid = usage->hid & HID_USAGE; 193 break;
440 if (hid == 7 || hid == 8) 194
441 goto ignore; 195 case HID_UP_BUTTON:
442 } 196 code = ((usage->hid - 1) & HID_USAGE);
197
198 switch (field->application) {
199 case HID_GD_MOUSE:
200 case HID_GD_POINTER: code += 0x110; break;
201 case HID_GD_JOYSTICK:
202 if (code <= 0xf)
203 code += BTN_JOYSTICK;
204 else
205 code += BTN_TRIGGER_HAPPY;
206 break;
207 case HID_GD_GAMEPAD: code += 0x130; break;
208 default:
209 switch (field->physical) {
210 case HID_GD_MOUSE:
211 case HID_GD_POINTER: code += 0x110; break;
212 case HID_GD_JOYSTICK: code += 0x120; break;
213 case HID_GD_GAMEPAD: code += 0x130; break;
214 default: code += 0x100;
443 } 215 }
216 }
444 217
445 map_key(code); 218 map_key(code);
446 break; 219 break;
447 220
448 221 case HID_UP_SIMULATION:
449 case HID_UP_SIMULATION: 222 switch (usage->hid & 0xffff) {
450 223 case 0xba: map_abs(ABS_RUDDER); break;
451 switch (usage->hid & 0xffff) { 224 case 0xbb: map_abs(ABS_THROTTLE); break;
452 case 0xba: map_abs(ABS_RUDDER); break; 225 case 0xc4: map_abs(ABS_GAS); break;
453 case 0xbb: map_abs(ABS_THROTTLE); break; 226 case 0xc5: map_abs(ABS_BRAKE); break;
454 case 0xc4: map_abs(ABS_GAS); break; 227 case 0xc8: map_abs(ABS_WHEEL); break;
455 case 0xc5: map_abs(ABS_BRAKE); break; 228 default: goto ignore;
456 case 0xc8: map_abs(ABS_WHEEL); break; 229 }
457 default: goto ignore; 230 break;
231
232 case HID_UP_GENDESK:
233 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
234 switch (usage->hid & 0xf) {
235 case 0x1: map_key_clear(KEY_POWER); break;
236 case 0x2: map_key_clear(KEY_SLEEP); break;
237 case 0x3: map_key_clear(KEY_WAKEUP); break;
238 default: goto unknown;
458 } 239 }
459 break; 240 break;
241 }
460 242
461 case HID_UP_GENDESK: 243 if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
462
463 if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */
464 switch (usage->hid & 0xf) {
465 case 0x1: map_key_clear(KEY_POWER); break;
466 case 0x2: map_key_clear(KEY_SLEEP); break;
467 case 0x3: map_key_clear(KEY_WAKEUP); break;
468 default: goto unknown;
469 }
470 break;
471 }
472
473 if ((usage->hid & 0xf0) == 0x90) { /* D-pad */
474 switch (usage->hid) {
475 case HID_GD_UP: usage->hat_dir = 1; break;
476 case HID_GD_DOWN: usage->hat_dir = 5; break;
477 case HID_GD_RIGHT: usage->hat_dir = 3; break;
478 case HID_GD_LEFT: usage->hat_dir = 7; break;
479 default: goto unknown;
480 }
481 if (field->dpad) {
482 map_abs(field->dpad);
483 goto ignore;
484 }
485 map_abs(ABS_HAT0X);
486 break;
487 }
488
489 switch (usage->hid) { 244 switch (usage->hid) {
490 245 case HID_GD_UP: usage->hat_dir = 1; break;
491 /* These usage IDs map directly to the usage codes. */ 246 case HID_GD_DOWN: usage->hat_dir = 5; break;
492 case HID_GD_X: case HID_GD_Y: case HID_GD_Z: 247 case HID_GD_RIGHT: usage->hat_dir = 3; break;
493 case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ: 248 case HID_GD_LEFT: usage->hat_dir = 7; break;
494 case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL: 249 default: goto unknown;
495 if (field->flags & HID_MAIN_ITEM_RELATIVE)
496 map_rel(usage->hid & 0xf);
497 else
498 map_abs(usage->hid & 0xf);
499 break;
500
501 case HID_GD_HATSWITCH:
502 usage->hat_min = field->logical_minimum;
503 usage->hat_max = field->logical_maximum;
504 map_abs(ABS_HAT0X);
505 break;
506
507 case HID_GD_START: map_key_clear(BTN_START); break;
508 case HID_GD_SELECT: map_key_clear(BTN_SELECT); break;
509
510 default: goto unknown;
511 } 250 }
512 251 if (field->dpad) {
513 break; 252 map_abs(field->dpad);
514 253 goto ignore;
515 case HID_UP_LED:
516
517 switch (usage->hid & 0xffff) { /* HID-Value: */
518 case 0x01: map_led (LED_NUML); break; /* "Num Lock" */
519 case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */
520 case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */
521 case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */
522 case 0x05: map_led (LED_KANA); break; /* "Kana" */
523 case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */
524 case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */
525 case 0x09: map_led (LED_MUTE); break; /* "Mute" */
526 case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */
527 case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */
528 case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */
529
530 default: goto ignore;
531 } 254 }
255 map_abs(ABS_HAT0X);
532 break; 256 break;
257 }
533 258
534 case HID_UP_DIGITIZER: 259 switch (usage->hid) {
535 260 /* These usage IDs map directly to the usage codes. */
536 switch (usage->hid & 0xff) { 261 case HID_GD_X: case HID_GD_Y: case HID_GD_Z:
537 262 case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
538 case 0x30: /* TipPressure */ 263 case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL:
539 if (!test_bit(BTN_TOUCH, input->keybit)) { 264 if (field->flags & HID_MAIN_ITEM_RELATIVE)
540 device->quirks |= HID_QUIRK_NOTOUCH; 265 map_rel(usage->hid & 0xf);
541 set_bit(EV_KEY, input->evbit); 266 else
542 set_bit(BTN_TOUCH, input->keybit); 267 map_abs(usage->hid & 0xf);
543 } 268 break;
544
545 map_abs_clear(ABS_PRESSURE);
546 break;
547
548 case 0x32: /* InRange */
549 switch (field->physical & 0xff) {
550 case 0x21: map_key(BTN_TOOL_MOUSE); break;
551 case 0x22: map_key(BTN_TOOL_FINGER); break;
552 default: map_key(BTN_TOOL_PEN); break;
553 }
554 break;
555 269
556 case 0x3c: /* Invert */ 270 case HID_GD_HATSWITCH:
557 map_key_clear(BTN_TOOL_RUBBER); 271 usage->hat_min = field->logical_minimum;
558 break; 272 usage->hat_max = field->logical_maximum;
273 map_abs(ABS_HAT0X);
274 break;
559 275
560 case 0x33: /* Touch */ 276 case HID_GD_START: map_key_clear(BTN_START); break;
561 case 0x42: /* TipSwitch */ 277 case HID_GD_SELECT: map_key_clear(BTN_SELECT); break;
562 case 0x43: /* TipSwitch2 */
563 device->quirks &= ~HID_QUIRK_NOTOUCH;
564 map_key_clear(BTN_TOUCH);
565 break;
566 278
567 case 0x44: /* BarrelSwitch */ 279 default: goto unknown;
568 map_key_clear(BTN_STYLUS); 280 }
569 break;
570 281
571 default: goto unknown; 282 break;
283
284 case HID_UP_LED:
285 switch (usage->hid & 0xffff) { /* HID-Value: */
286 case 0x01: map_led (LED_NUML); break; /* "Num Lock" */
287 case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */
288 case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */
289 case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */
290 case 0x05: map_led (LED_KANA); break; /* "Kana" */
291 case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */
292 case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */
293 case 0x09: map_led (LED_MUTE); break; /* "Mute" */
294 case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */
295 case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */
296 case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */
297
298 default: goto ignore;
299 }
300 break;
301
302 case HID_UP_DIGITIZER:
303 switch (usage->hid & 0xff) {
304 case 0x30: /* TipPressure */
305 if (!test_bit(BTN_TOUCH, input->keybit)) {
306 device->quirks |= HID_QUIRK_NOTOUCH;
307 set_bit(EV_KEY, input->evbit);
308 set_bit(BTN_TOUCH, input->keybit);
572 } 309 }
310 map_abs_clear(ABS_PRESSURE);
573 break; 311 break;
574 312
575 case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */ 313 case 0x32: /* InRange */
576 314 switch (field->physical & 0xff) {
577 switch (usage->hid & HID_USAGE) { 315 case 0x21: map_key(BTN_TOOL_MOUSE); break;
578 case 0x000: goto ignore; 316 case 0x22: map_key(BTN_TOOL_FINGER); break;
579 case 0x034: map_key_clear(KEY_SLEEP); break; 317 default: map_key(BTN_TOOL_PEN); break;
580 case 0x036: map_key_clear(BTN_MISC); break;
581
582 case 0x040: map_key_clear(KEY_MENU); break;
583 case 0x045: map_key_clear(KEY_RADIO); break;
584
585 case 0x083: map_key_clear(KEY_LAST); break;
586 case 0x088: map_key_clear(KEY_PC); break;
587 case 0x089: map_key_clear(KEY_TV); break;
588 case 0x08a: map_key_clear(KEY_WWW); break;
589 case 0x08b: map_key_clear(KEY_DVD); break;
590 case 0x08c: map_key_clear(KEY_PHONE); break;
591 case 0x08d: map_key_clear(KEY_PROGRAM); break;
592 case 0x08e: map_key_clear(KEY_VIDEOPHONE); break;
593 case 0x08f: map_key_clear(KEY_GAMES); break;
594 case 0x090: map_key_clear(KEY_MEMO); break;
595 case 0x091: map_key_clear(KEY_CD); break;
596 case 0x092: map_key_clear(KEY_VCR); break;
597 case 0x093: map_key_clear(KEY_TUNER); break;
598 case 0x094: map_key_clear(KEY_EXIT); break;
599 case 0x095: map_key_clear(KEY_HELP); break;
600 case 0x096: map_key_clear(KEY_TAPE); break;
601 case 0x097: map_key_clear(KEY_TV2); break;
602 case 0x098: map_key_clear(KEY_SAT); break;
603 case 0x09a: map_key_clear(KEY_PVR); break;
604
605 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
606 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
607 case 0x0a0: map_key_clear(KEY_VCR2); break;
608
609 case 0x0b0: map_key_clear(KEY_PLAY); break;
610 case 0x0b1: map_key_clear(KEY_PAUSE); break;
611 case 0x0b2: map_key_clear(KEY_RECORD); break;
612 case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
613 case 0x0b4: map_key_clear(KEY_REWIND); break;
614 case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
615 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
616 case 0x0b7: map_key_clear(KEY_STOPCD); break;
617 case 0x0b8: map_key_clear(KEY_EJECTCD); break;
618 case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
619
620 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
621 case 0x0e0: map_abs_clear(ABS_VOLUME); break;
622 case 0x0e2: map_key_clear(KEY_MUTE); break;
623 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
624 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
625 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
626
627 case 0x182: map_key_clear(KEY_BOOKMARKS); break;
628 case 0x183: map_key_clear(KEY_CONFIG); break;
629 case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
630 case 0x185: map_key_clear(KEY_EDITOR); break;
631 case 0x186: map_key_clear(KEY_SPREADSHEET); break;
632 case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break;
633 case 0x188: map_key_clear(KEY_PRESENTATION); break;
634 case 0x189: map_key_clear(KEY_DATABASE); break;
635 case 0x18a: map_key_clear(KEY_MAIL); break;
636 case 0x18b: map_key_clear(KEY_NEWS); break;
637 case 0x18c: map_key_clear(KEY_VOICEMAIL); break;
638 case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break;
639 case 0x18e: map_key_clear(KEY_CALENDAR); break;
640 case 0x191: map_key_clear(KEY_FINANCE); break;
641 case 0x192: map_key_clear(KEY_CALC); break;
642 case 0x194: map_key_clear(KEY_FILE); break;
643 case 0x196: map_key_clear(KEY_WWW); break;
644 case 0x19c: map_key_clear(KEY_LOGOFF); break;
645 case 0x19e: map_key_clear(KEY_COFFEE); break;
646 case 0x1a6: map_key_clear(KEY_HELP); break;
647 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
648 case 0x1ab: map_key_clear(KEY_SPELLCHECK); break;
649 case 0x1b6: map_key_clear(KEY_MEDIA); break;
650 case 0x1b7: map_key_clear(KEY_SOUND); break;
651 case 0x1bc: map_key_clear(KEY_MESSENGER); break;
652 case 0x1bd: map_key_clear(KEY_INFO); break;
653 case 0x201: map_key_clear(KEY_NEW); break;
654 case 0x202: map_key_clear(KEY_OPEN); break;
655 case 0x203: map_key_clear(KEY_CLOSE); break;
656 case 0x204: map_key_clear(KEY_EXIT); break;
657 case 0x207: map_key_clear(KEY_SAVE); break;
658 case 0x208: map_key_clear(KEY_PRINT); break;
659 case 0x209: map_key_clear(KEY_PROPS); break;
660 case 0x21a: map_key_clear(KEY_UNDO); break;
661 case 0x21b: map_key_clear(KEY_COPY); break;
662 case 0x21c: map_key_clear(KEY_CUT); break;
663 case 0x21d: map_key_clear(KEY_PASTE); break;
664 case 0x21f: map_key_clear(KEY_FIND); break;
665 case 0x221: map_key_clear(KEY_SEARCH); break;
666 case 0x222: map_key_clear(KEY_GOTO); break;
667 case 0x223: map_key_clear(KEY_HOMEPAGE); break;
668 case 0x224: map_key_clear(KEY_BACK); break;
669 case 0x225: map_key_clear(KEY_FORWARD); break;
670 case 0x226: map_key_clear(KEY_STOP); break;
671 case 0x227: map_key_clear(KEY_REFRESH); break;
672 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
673 case 0x22d: map_key_clear(KEY_ZOOMIN); break;
674 case 0x22e: map_key_clear(KEY_ZOOMOUT); break;
675 case 0x22f: map_key_clear(KEY_ZOOMRESET); break;
676 case 0x233: map_key_clear(KEY_SCROLLUP); break;
677 case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
678 case 0x238: map_rel(REL_HWHEEL); break;
679 case 0x25f: map_key_clear(KEY_CANCEL); break;
680 case 0x279: map_key_clear(KEY_REDO); break;
681
682 case 0x289: map_key_clear(KEY_REPLY); break;
683 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
684 case 0x28c: map_key_clear(KEY_SEND); break;
685
686 default: goto ignore;
687 } 318 }
688 break; 319 break;
689 320
690 case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */ 321 case 0x3c: /* Invert */
691 322 map_key_clear(BTN_TOOL_RUBBER);
692 set_bit(EV_REP, input->evbit);
693 switch (usage->hid & HID_USAGE) {
694 case 0x021: map_key_clear(KEY_PRINT); break;
695 case 0x070: map_key_clear(KEY_HP); break;
696 case 0x071: map_key_clear(KEY_CAMERA); break;
697 case 0x072: map_key_clear(KEY_SOUND); break;
698 case 0x073: map_key_clear(KEY_QUESTION); break;
699 case 0x080: map_key_clear(KEY_EMAIL); break;
700 case 0x081: map_key_clear(KEY_CHAT); break;
701 case 0x082: map_key_clear(KEY_SEARCH); break;
702 case 0x083: map_key_clear(KEY_CONNECT); break;
703 case 0x084: map_key_clear(KEY_FINANCE); break;
704 case 0x085: map_key_clear(KEY_SPORT); break;
705 case 0x086: map_key_clear(KEY_SHOP); break;
706 default: goto ignore;
707 }
708 break; 323 break;
709 324
710 case HID_UP_MSVENDOR: 325 case 0x33: /* Touch */
711 326 case 0x42: /* TipSwitch */
712 goto ignore; 327 case 0x43: /* TipSwitch2 */
713 328 device->quirks &= ~HID_QUIRK_NOTOUCH;
714 case HID_UP_CUSTOM: /* Reported on Logitech and Apple USB keyboards */ 329 map_key_clear(BTN_TOUCH);
715 330 break;
716 set_bit(EV_REP, input->evbit);
717 switch(usage->hid & HID_USAGE) {
718 case 0x003:
719 /* The fn key on Apple USB keyboards */
720 map_key_clear(KEY_FN);
721 hidinput_apple_setup(input);
722 break;
723 331
724 default: goto ignore; 332 case 0x44: /* BarrelSwitch */
725 } 333 map_key_clear(BTN_STYLUS);
726 break; 334 break;
727 335
728 case HID_UP_LOGIVENDOR: 336 default: goto unknown;
337 }
338 break;
339
340 case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */
341 switch (usage->hid & HID_USAGE) {
342 case 0x000: goto ignore;
343 case 0x034: map_key_clear(KEY_SLEEP); break;
344 case 0x036: map_key_clear(BTN_MISC); break;
345
346 case 0x040: map_key_clear(KEY_MENU); break;
347 case 0x045: map_key_clear(KEY_RADIO); break;
348
349 case 0x083: map_key_clear(KEY_LAST); break;
350 case 0x088: map_key_clear(KEY_PC); break;
351 case 0x089: map_key_clear(KEY_TV); break;
352 case 0x08a: map_key_clear(KEY_WWW); break;
353 case 0x08b: map_key_clear(KEY_DVD); break;
354 case 0x08c: map_key_clear(KEY_PHONE); break;
355 case 0x08d: map_key_clear(KEY_PROGRAM); break;
356 case 0x08e: map_key_clear(KEY_VIDEOPHONE); break;
357 case 0x08f: map_key_clear(KEY_GAMES); break;
358 case 0x090: map_key_clear(KEY_MEMO); break;
359 case 0x091: map_key_clear(KEY_CD); break;
360 case 0x092: map_key_clear(KEY_VCR); break;
361 case 0x093: map_key_clear(KEY_TUNER); break;
362 case 0x094: map_key_clear(KEY_EXIT); break;
363 case 0x095: map_key_clear(KEY_HELP); break;
364 case 0x096: map_key_clear(KEY_TAPE); break;
365 case 0x097: map_key_clear(KEY_TV2); break;
366 case 0x098: map_key_clear(KEY_SAT); break;
367 case 0x09a: map_key_clear(KEY_PVR); break;
368
369 case 0x09c: map_key_clear(KEY_CHANNELUP); break;
370 case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
371 case 0x0a0: map_key_clear(KEY_VCR2); break;
372
373 case 0x0b0: map_key_clear(KEY_PLAY); break;
374 case 0x0b1: map_key_clear(KEY_PAUSE); break;
375 case 0x0b2: map_key_clear(KEY_RECORD); break;
376 case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
377 case 0x0b4: map_key_clear(KEY_REWIND); break;
378 case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
379 case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
380 case 0x0b7: map_key_clear(KEY_STOPCD); break;
381 case 0x0b8: map_key_clear(KEY_EJECTCD); break;
382 case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
383
384 case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
385 case 0x0e0: map_abs_clear(ABS_VOLUME); break;
386 case 0x0e2: map_key_clear(KEY_MUTE); break;
387 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
388 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
389 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
390
391 case 0x182: map_key_clear(KEY_BOOKMARKS); break;
392 case 0x183: map_key_clear(KEY_CONFIG); break;
393 case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
394 case 0x185: map_key_clear(KEY_EDITOR); break;
395 case 0x186: map_key_clear(KEY_SPREADSHEET); break;
396 case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break;
397 case 0x188: map_key_clear(KEY_PRESENTATION); break;
398 case 0x189: map_key_clear(KEY_DATABASE); break;
399 case 0x18a: map_key_clear(KEY_MAIL); break;
400 case 0x18b: map_key_clear(KEY_NEWS); break;
401 case 0x18c: map_key_clear(KEY_VOICEMAIL); break;
402 case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break;
403 case 0x18e: map_key_clear(KEY_CALENDAR); break;
404 case 0x191: map_key_clear(KEY_FINANCE); break;
405 case 0x192: map_key_clear(KEY_CALC); break;
406 case 0x194: map_key_clear(KEY_FILE); break;
407 case 0x196: map_key_clear(KEY_WWW); break;
408 case 0x199: map_key_clear(KEY_CHAT); break;
409 case 0x19c: map_key_clear(KEY_LOGOFF); break;
410 case 0x19e: map_key_clear(KEY_COFFEE); break;
411 case 0x1a6: map_key_clear(KEY_HELP); break;
412 case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
413 case 0x1ab: map_key_clear(KEY_SPELLCHECK); break;
414 case 0x1b6: map_key_clear(KEY_MEDIA); break;
415 case 0x1b7: map_key_clear(KEY_SOUND); break;
416 case 0x1bc: map_key_clear(KEY_MESSENGER); break;
417 case 0x1bd: map_key_clear(KEY_INFO); break;
418 case 0x201: map_key_clear(KEY_NEW); break;
419 case 0x202: map_key_clear(KEY_OPEN); break;
420 case 0x203: map_key_clear(KEY_CLOSE); break;
421 case 0x204: map_key_clear(KEY_EXIT); break;
422 case 0x207: map_key_clear(KEY_SAVE); break;
423 case 0x208: map_key_clear(KEY_PRINT); break;
424 case 0x209: map_key_clear(KEY_PROPS); break;
425 case 0x21a: map_key_clear(KEY_UNDO); break;
426 case 0x21b: map_key_clear(KEY_COPY); break;
427 case 0x21c: map_key_clear(KEY_CUT); break;
428 case 0x21d: map_key_clear(KEY_PASTE); break;
429 case 0x21f: map_key_clear(KEY_FIND); break;
430 case 0x221: map_key_clear(KEY_SEARCH); break;
431 case 0x222: map_key_clear(KEY_GOTO); break;
432 case 0x223: map_key_clear(KEY_HOMEPAGE); break;
433 case 0x224: map_key_clear(KEY_BACK); break;
434 case 0x225: map_key_clear(KEY_FORWARD); break;
435 case 0x226: map_key_clear(KEY_STOP); break;
436 case 0x227: map_key_clear(KEY_REFRESH); break;
437 case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
438 case 0x22d: map_key_clear(KEY_ZOOMIN); break;
439 case 0x22e: map_key_clear(KEY_ZOOMOUT); break;
440 case 0x22f: map_key_clear(KEY_ZOOMRESET); break;
441 case 0x233: map_key_clear(KEY_SCROLLUP); break;
442 case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
443 case 0x238: map_rel(REL_HWHEEL); break;
444 case 0x25f: map_key_clear(KEY_CANCEL); break;
445 case 0x279: map_key_clear(KEY_REDO); break;
446
447 case 0x289: map_key_clear(KEY_REPLY); break;
448 case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
449 case 0x28c: map_key_clear(KEY_SEND); break;
450
451 default: goto ignore;
452 }
453 break;
454
455 case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */
456 set_bit(EV_REP, input->evbit);
457 switch (usage->hid & HID_USAGE) {
458 case 0x021: map_key_clear(KEY_PRINT); break;
459 case 0x070: map_key_clear(KEY_HP); break;
460 case 0x071: map_key_clear(KEY_CAMERA); break;
461 case 0x072: map_key_clear(KEY_SOUND); break;
462 case 0x073: map_key_clear(KEY_QUESTION); break;
463 case 0x080: map_key_clear(KEY_EMAIL); break;
464 case 0x081: map_key_clear(KEY_CHAT); break;
465 case 0x082: map_key_clear(KEY_SEARCH); break;
466 case 0x083: map_key_clear(KEY_CONNECT); break;
467 case 0x084: map_key_clear(KEY_FINANCE); break;
468 case 0x085: map_key_clear(KEY_SPORT); break;
469 case 0x086: map_key_clear(KEY_SHOP); break;
470 default: goto ignore;
471 }
472 break;
729 473
730 goto ignore; 474 case HID_UP_MSVENDOR:
731 475 goto ignore;
732 case HID_UP_PID:
733 476
734 switch(usage->hid & HID_USAGE) { 477 case HID_UP_CUSTOM: /* Reported on Logitech and Apple USB keyboards */
735 case 0xa4: map_key_clear(BTN_DEAD); break; 478 set_bit(EV_REP, input->evbit);
736 default: goto ignore; 479 goto ignore;
737 }
738 break;
739 480
740 default: 481 case HID_UP_LOGIVENDOR:
741 unknown: 482 goto ignore;
742 if (field->report_size == 1) { 483
743 if (field->report->type == HID_OUTPUT_REPORT) { 484 case HID_UP_PID:
744 map_led(LED_MISC); 485 switch (usage->hid & HID_USAGE) {
745 break; 486 case 0xa4: map_key_clear(BTN_DEAD); break;
746 } 487 default: goto ignore;
747 map_key(BTN_MISC); 488 }
748 break; 489 break;
749 } 490
750 if (field->flags & HID_MAIN_ITEM_RELATIVE) { 491 default:
751 map_rel(REL_MISC); 492 unknown:
493 if (field->report_size == 1) {
494 if (field->report->type == HID_OUTPUT_REPORT) {
495 map_led(LED_MISC);
752 break; 496 break;
753 } 497 }
754 map_abs(ABS_MISC); 498 map_key(BTN_MISC);
499 break;
500 }
501 if (field->flags & HID_MAIN_ITEM_RELATIVE) {
502 map_rel(REL_MISC);
755 break; 503 break;
504 }
505 map_abs(ABS_MISC);
506 break;
756 } 507 }
757 508
758mapped: 509mapped:
759 if (device->quirks & HID_QUIRK_MIGHTYMOUSE) { 510 if (device->driver->input_mapped && device->driver->input_mapped(device,
760 if (usage->hid == HID_GD_Z) 511 hidinput, field, usage, &bit, &max) < 0)
761 map_rel(REL_HWHEEL);
762 else if (usage->code == BTN_1)
763 map_key(BTN_2);
764 else if (usage->code == BTN_2)
765 map_key(BTN_1);
766 }
767
768 if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5 |
769 HID_QUIRK_2WHEEL_MOUSE_HACK_B8)) && (usage->type == EV_REL) &&
770 (usage->code == REL_WHEEL))
771 set_bit(REL_HWHEEL, bit);
772
773 if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005))
774 || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007)))
775 goto ignore; 512 goto ignore;
776 513
777 if ((device->quirks & HID_QUIRK_BAD_RELATIVE_KEYS) &&
778 usage->type == EV_KEY && (field->flags & HID_MAIN_ITEM_RELATIVE))
779 field->flags &= ~HID_MAIN_ITEM_RELATIVE;
780
781 set_bit(usage->type, input->evbit); 514 set_bit(usage->type, input->evbit);
782 515
783 if (device->quirks & HID_QUIRK_DUPLICATE_USAGES &&
784 (usage->type == EV_KEY ||
785 usage->type == EV_REL ||
786 usage->type == EV_ABS))
787 clear_bit(usage->code, bit);
788
789 while (usage->code <= max && test_and_set_bit(usage->code, bit)) 516 while (usage->code <= max && test_and_set_bit(usage->code, bit))
790 usage->code = find_next_zero_bit(bit, max + 1, usage->code); 517 usage->code = find_next_zero_bit(bit, max + 1, usage->code);
791 518
@@ -807,6 +534,9 @@ mapped:
807 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4); 534 input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
808 else input_set_abs_params(input, usage->code, a, b, 0, 0); 535 else input_set_abs_params(input, usage->code, a, b, 0, 0);
809 536
537 /* use a larger default input buffer for MT devices */
538 if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0)
539 input_set_events_per_packet(input, 60);
810 } 540 }
811 541
812 if (usage->type == EV_ABS && 542 if (usage->type == EV_ABS &&
@@ -835,15 +565,9 @@ mapped:
835 set_bit(MSC_SCAN, input->mscbit); 565 set_bit(MSC_SCAN, input->mscbit);
836 } 566 }
837 567
838 hid_resolv_event(usage->type, usage->code);
839
840 dbg_hid_line("\n");
841
842 return;
843
844ignore: 568ignore:
845 dbg_hid_line("IGNORED\n");
846 return; 569 return;
570
847} 571}
848 572
849void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) 573void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
@@ -859,10 +583,6 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
859 if (!usage->type) 583 if (!usage->type)
860 return; 584 return;
861 585
862 /* handle input events for quirky devices */
863 if (hidinput_event_quirks(hid, field, usage, value))
864 return;
865
866 if (usage->hat_min < usage->hat_max || usage->hat_dir) { 586 if (usage->hat_min < usage->hat_max || usage->hat_dir) {
867 int hat_dir = usage->hat_dir; 587 int hat_dir = usage->hat_dir;
868 if (!hat_dir) 588 if (!hat_dir)
@@ -936,6 +656,9 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report)
936{ 656{
937 struct hid_input *hidinput; 657 struct hid_input *hidinput;
938 658
659 if (hid->quirks & HID_QUIRK_NO_INPUT_SYNC)
660 return;
661
939 list_for_each_entry(hidinput, &hid->inputs, list) 662 list_for_each_entry(hidinput, &hid->inputs, list)
940 input_sync(hidinput->input); 663 input_sync(hidinput->input);
941} 664}
@@ -962,14 +685,14 @@ static int hidinput_open(struct input_dev *dev)
962{ 685{
963 struct hid_device *hid = input_get_drvdata(dev); 686 struct hid_device *hid = input_get_drvdata(dev);
964 687
965 return hid->hid_open(hid); 688 return hid->ll_driver->open(hid);
966} 689}
967 690
968static void hidinput_close(struct input_dev *dev) 691static void hidinput_close(struct input_dev *dev)
969{ 692{
970 struct hid_device *hid = input_get_drvdata(dev); 693 struct hid_device *hid = input_get_drvdata(dev);
971 694
972 hid->hid_close(hid); 695 hid->ll_driver->close(hid);
973} 696}
974 697
975/* 698/*
@@ -978,7 +701,7 @@ static void hidinput_close(struct input_dev *dev)
978 * Read all reports and initialize the absolute field values. 701 * Read all reports and initialize the absolute field values.
979 */ 702 */
980 703
981int hidinput_connect(struct hid_device *hid) 704int hidinput_connect(struct hid_device *hid, unsigned int force)
982{ 705{
983 struct hid_report *report; 706 struct hid_report *report;
984 struct hid_input *hidinput = NULL; 707 struct hid_input *hidinput = NULL;
@@ -986,19 +709,20 @@ int hidinput_connect(struct hid_device *hid)
986 int i, j, k; 709 int i, j, k;
987 int max_report_type = HID_OUTPUT_REPORT; 710 int max_report_type = HID_OUTPUT_REPORT;
988 711
989 if (hid->quirks & HID_QUIRK_IGNORE_HIDINPUT)
990 return -1;
991
992 INIT_LIST_HEAD(&hid->inputs); 712 INIT_LIST_HEAD(&hid->inputs);
993 713
994 for (i = 0; i < hid->maxcollection; i++) 714 if (!force) {
995 if (hid->collection[i].type == HID_COLLECTION_APPLICATION || 715 for (i = 0; i < hid->maxcollection; i++) {
996 hid->collection[i].type == HID_COLLECTION_PHYSICAL) 716 struct hid_collection *col = &hid->collection[i];
997 if (IS_INPUT_APPLICATION(hid->collection[i].usage)) 717 if (col->type == HID_COLLECTION_APPLICATION ||
998 break; 718 col->type == HID_COLLECTION_PHYSICAL)
719 if (IS_INPUT_APPLICATION(col->usage))
720 break;
721 }
999 722
1000 if (i == hid->maxcollection && (hid->quirks & HID_QUIRK_HIDINPUT) == 0) 723 if (i == hid->maxcollection)
1001 return -1; 724 return -1;
725 }
1002 726
1003 if (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) 727 if (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS)
1004 max_report_type = HID_INPUT_REPORT; 728 max_report_type = HID_INPUT_REPORT;
@@ -1020,7 +744,8 @@ int hidinput_connect(struct hid_device *hid)
1020 } 744 }
1021 745
1022 input_set_drvdata(input_dev, hid); 746 input_set_drvdata(input_dev, hid);
1023 input_dev->event = hid->hidinput_input_event; 747 input_dev->event =
748 hid->ll_driver->hidinput_input_event;
1024 input_dev->open = hidinput_open; 749 input_dev->open = hidinput_open;
1025 input_dev->close = hidinput_close; 750 input_dev->close = hidinput_close;
1026 input_dev->setkeycode = hidinput_setkeycode; 751 input_dev->setkeycode = hidinput_setkeycode;
@@ -1033,7 +758,7 @@ int hidinput_connect(struct hid_device *hid)
1033 input_dev->id.vendor = hid->vendor; 758 input_dev->id.vendor = hid->vendor;
1034 input_dev->id.product = hid->product; 759 input_dev->id.product = hid->product;
1035 input_dev->id.version = hid->version; 760 input_dev->id.version = hid->version;
1036 input_dev->dev.parent = hid->dev; 761 input_dev->dev.parent = hid->dev.parent;
1037 hidinput->input = input_dev; 762 hidinput->input = input_dev;
1038 list_add_tail(&hidinput->list, &hid->inputs); 763 list_add_tail(&hidinput->list, &hid->inputs);
1039 } 764 }
diff --git a/usr/src/dkms_source_tree/hid.mod.c b/usr/src/dkms_source_tree/hid.mod.c
deleted file mode 100644
index 03190d8..0000000
--- a/usr/src/dkms_source_tree/hid.mod.c
+++ /dev/null
@@ -1,76 +0,0 @@
1#include <linux/module.h>
2#include <linux/vermagic.h>
3#include <linux/compiler.h>
4
5MODULE_INFO(vermagic, VERMAGIC_STRING);
6
7struct module __this_module
8__attribute__((section(".gnu.linkonce.this_module"))) = {
9 .name = KBUILD_MODNAME,
10 .init = init_module,
11#ifdef CONFIG_MODULE_UNLOAD
12 .exit = cleanup_module,
13#endif
14 .arch = MODULE_ARCH_INIT,
15};
16
17static const struct modversion_info ____versions[]
18__used
19__attribute__((section("__versions"))) = {
20 { 0xa257c5a3, "struct_module" },
21 { 0x6b9a06f4, "cdev_del" },
22 { 0x24b84de1, "per_cpu__current_task" },
23 { 0xafcac6fe, "kmalloc_caches" },
24 { 0x12da5bb2, "__kmalloc" },
25 { 0x73ffd178, "cdev_init" },
26 { 0x608c2831, "warn_on_slowpath" },
27 { 0xd6ee688f, "vmalloc" },
28 { 0x60400b7f, "pv_lock_ops" },
29 { 0xa5423cc4, "param_get_int" },
30 { 0x71356fba, "remove_wait_queue" },
31 { 0x973873ab, "_spin_lock" },
32 { 0x25e6a7c5, "device_destroy" },
33 { 0x6729d3df, "__get_user_4" },
34 { 0xe2fae716, "kmemdup" },
35 { 0x577cc638, "mutex_unlock" },
36 { 0x7485e15e, "unregister_chrdev_region" },
37 { 0x999e8297, "vfree" },
38 { 0xcb32da10, "param_set_int" },
39 { 0x805a8fd8, "input_event" },
40 { 0xffd5a395, "default_wake_function" },
41 { 0x67e71b77, "__mutex_init" },
42 { 0xb72397d5, "printk" },
43 { 0x3656bf5a, "lock_kernel" },
44 { 0x479c3c86, "find_next_zero_bit" },
45 { 0x2f287f0d, "copy_to_user" },
46 { 0xb4390f9a, "mcount" },
47 { 0x8aaf8654, "mutex_lock" },
48 { 0x9eae490d, "device_create" },
49 { 0x9b355194, "cdev_add" },
50 { 0xb1f975aa, "unlock_kernel" },
51 { 0xa36a1add, "kmem_cache_alloc" },
52 { 0xb2fd5ceb, "__put_user_4" },
53 { 0xbc9fe26a, "input_register_device" },
54 { 0x4292364c, "schedule" },
55 { 0x98578ea8, "input_free_device" },
56 { 0x64cd5d16, "init_waitqueue_head" },
57 { 0x642e54ac, "__wake_up" },
58 { 0x650fb346, "add_wait_queue" },
59 { 0x37a0cba, "kfree" },
60 { 0xab1d8e96, "input_unregister_device" },
61 { 0x9ef749e2, "unregister_chrdev" },
62 { 0xba9b3a6f, "class_destroy" },
63 { 0xb0412d, "kill_fasync" },
64 { 0x3ea9f1de, "__class_create" },
65 { 0xd6c963c, "copy_from_user" },
66 { 0x29537c9e, "alloc_chrdev_region" },
67 { 0xa51d5c08, "input_allocate_device" },
68};
69
70static const char __module_depends[]
71__used
72__attribute__((section(".modinfo"))) =
73"depends=";
74
75
76MODULE_INFO(srcversion, "B7CBC60F230650415B31999");
diff --git a/usr/src/dkms_source_tree/hidraw.c b/usr/src/dkms_source_tree/hidraw.c
index 8c030d9..3ccd478 100644
--- a/usr/src/dkms_source_tree/hidraw.c
+++ b/usr/src/dkms_source_tree/hidraw.c
@@ -28,8 +28,10 @@
28#include <linux/poll.h> 28#include <linux/poll.h>
29#include <linux/device.h> 29#include <linux/device.h>
30#include <linux/major.h> 30#include <linux/major.h>
31#include <linux/slab.h>
31#include <linux/hid.h> 32#include <linux/hid.h>
32#include <linux/mutex.h> 33#include <linux/mutex.h>
34#include <linux/sched.h>
33#include <linux/smp_lock.h> 35#include <linux/smp_lock.h>
34 36
35#include <linux/hidraw.h> 37#include <linux/hidraw.h>
@@ -38,7 +40,7 @@ static int hidraw_major;
38static struct cdev hidraw_cdev; 40static struct cdev hidraw_cdev;
39static struct class *hidraw_class; 41static struct class *hidraw_class;
40static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES]; 42static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES];
41static DEFINE_SPINLOCK(minors_lock); 43static DEFINE_MUTEX(minors_lock);
42 44
43static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) 45static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
44{ 46{
@@ -47,10 +49,9 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count,
47 char *report; 49 char *report;
48 DECLARE_WAITQUEUE(wait, current); 50 DECLARE_WAITQUEUE(wait, current);
49 51
50 while (ret == 0) { 52 mutex_lock(&list->read_mutex);
51
52 mutex_lock(&list->read_mutex);
53 53
54 while (ret == 0) {
54 if (list->head == list->tail) { 55 if (list->head == list->tail) {
55 add_wait_queue(&list->hidraw->wait, &wait); 56 add_wait_queue(&list->hidraw->wait, &wait);
56 set_current_state(TASK_INTERRUPTIBLE); 57 set_current_state(TASK_INTERRUPTIBLE);
@@ -105,38 +106,48 @@ out:
105static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) 106static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
106{ 107{
107 unsigned int minor = iminor(file->f_path.dentry->d_inode); 108 unsigned int minor = iminor(file->f_path.dentry->d_inode);
108 /* FIXME: What stops hidraw_table going NULL */ 109 struct hid_device *dev;
109 struct hid_device *dev = hidraw_table[minor]->hid;
110 __u8 *buf; 110 __u8 *buf;
111 int ret = 0; 111 int ret = 0;
112 112
113 if (!dev->hid_output_raw_report) 113 mutex_lock(&minors_lock);
114 return -ENODEV; 114 dev = hidraw_table[minor]->hid;
115
116 if (!dev->hid_output_raw_report) {
117 ret = -ENODEV;
118 goto out;
119 }
115 120
116 if (count > HID_MAX_BUFFER_SIZE) { 121 if (count > HID_MAX_BUFFER_SIZE) {
117 printk(KERN_WARNING "hidraw: pid %d passed too large report\n", 122 printk(KERN_WARNING "hidraw: pid %d passed too large report\n",
118 task_pid_nr(current)); 123 task_pid_nr(current));
119 return -EINVAL; 124 ret = -EINVAL;
125 goto out;
120 } 126 }
121 127
122 if (count < 2) { 128 if (count < 2) {
123 printk(KERN_WARNING "hidraw: pid %d passed too short report\n", 129 printk(KERN_WARNING "hidraw: pid %d passed too short report\n",
124 task_pid_nr(current)); 130 task_pid_nr(current));
125 return -EINVAL; 131 ret = -EINVAL;
132 goto out;
126 } 133 }
127 134
128 buf = kmalloc(count * sizeof(__u8), GFP_KERNEL); 135 buf = kmalloc(count * sizeof(__u8), GFP_KERNEL);
129 if (!buf) 136 if (!buf) {
130 return -ENOMEM; 137 ret = -ENOMEM;
138 goto out;
139 }
131 140
132 if (copy_from_user(buf, buffer, count)) { 141 if (copy_from_user(buf, buffer, count)) {
133 ret = -EFAULT; 142 ret = -EFAULT;
134 goto out; 143 goto out_free;
135 } 144 }
136 145
137 ret = dev->hid_output_raw_report(dev, buf, count); 146 ret = dev->hid_output_raw_report(dev, buf, count, HID_OUTPUT_REPORT);
138out: 147out_free:
139 kfree(buf); 148 kfree(buf);
149out:
150 mutex_unlock(&minors_lock);
140 return ret; 151 return ret;
141} 152}
142 153
@@ -159,16 +170,13 @@ static int hidraw_open(struct inode *inode, struct file *file)
159 struct hidraw_list *list; 170 struct hidraw_list *list;
160 int err = 0; 171 int err = 0;
161 172
162 lock_kernel();
163 if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) { 173 if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) {
164 err = -ENOMEM; 174 err = -ENOMEM;
165 goto out; 175 goto out;
166 } 176 }
167 177
168 spin_lock(&minors_lock); 178 mutex_lock(&minors_lock);
169 if (!hidraw_table[minor]) { 179 if (!hidraw_table[minor]) {
170 printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n",
171 minor);
172 kfree(list); 180 kfree(list);
173 err = -ENODEV; 181 err = -ENODEV;
174 goto out_unlock; 182 goto out_unlock;
@@ -180,13 +188,23 @@ static int hidraw_open(struct inode *inode, struct file *file)
180 file->private_data = list; 188 file->private_data = list;
181 189
182 dev = hidraw_table[minor]; 190 dev = hidraw_table[minor];
183 if (!dev->open++) 191 if (!dev->open++) {
184 dev->hid->hid_open(dev->hid); 192 if (dev->hid->ll_driver->power) {
193 err = dev->hid->ll_driver->power(dev->hid, PM_HINT_FULLON);
194 if (err < 0)
195 goto out_unlock;
196 }
197 err = dev->hid->ll_driver->open(dev->hid);
198 if (err < 0) {
199 if (dev->hid->ll_driver->power)
200 dev->hid->ll_driver->power(dev->hid, PM_HINT_NORMAL);
201 dev->open--;
202 }
203 }
185 204
186out_unlock: 205out_unlock:
187 spin_unlock(&minors_lock); 206 mutex_unlock(&minors_lock);
188out: 207out:
189 unlock_kernel();
190 return err; 208 return err;
191 209
192} 210}
@@ -197,19 +215,19 @@ static int hidraw_release(struct inode * inode, struct file * file)
197 struct hidraw *dev; 215 struct hidraw *dev;
198 struct hidraw_list *list = file->private_data; 216 struct hidraw_list *list = file->private_data;
199 217
200 if (!hidraw_table[minor]) { 218 if (!hidraw_table[minor])
201 printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n",
202 minor);
203 return -ENODEV; 219 return -ENODEV;
204 }
205 220
206 list_del(&list->node); 221 list_del(&list->node);
207 dev = hidraw_table[minor]; 222 dev = hidraw_table[minor];
208 if (!dev->open--) { 223 if (!--dev->open) {
209 if (list->hidraw->exist) 224 if (list->hidraw->exist) {
210 dev->hid->hid_close(dev->hid); 225 if (dev->hid->ll_driver->power)
211 else 226 dev->hid->ll_driver->power(dev->hid, PM_HINT_NORMAL);
227 dev->hid->ll_driver->close(dev->hid);
228 } else {
212 kfree(list->hidraw); 229 kfree(list->hidraw);
230 }
213 } 231 }
214 232
215 kfree(list); 233 kfree(list);
@@ -223,11 +241,12 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
223 struct inode *inode = file->f_path.dentry->d_inode; 241 struct inode *inode = file->f_path.dentry->d_inode;
224 unsigned int minor = iminor(inode); 242 unsigned int minor = iminor(inode);
225 long ret = 0; 243 long ret = 0;
226 /* FIXME: What stops hidraw_table going NULL */ 244 struct hidraw *dev;
227 struct hidraw *dev = hidraw_table[minor];
228 void __user *user_arg = (void __user*) arg; 245 void __user *user_arg = (void __user*) arg;
229 246
230 lock_kernel(); 247 mutex_lock(&minors_lock);
248 dev = hidraw_table[minor];
249
231 switch (cmd) { 250 switch (cmd) {
232 case HIDIOCGRDESCSIZE: 251 case HIDIOCGRDESCSIZE:
233 if (put_user(dev->hid->rsize, (int __user *)arg)) 252 if (put_user(dev->hid->rsize, (int __user *)arg))
@@ -262,8 +281,45 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd,
262 break; 281 break;
263 } 282 }
264 default: 283 default:
265 ret = -ENOTTY; 284 {
285 struct hid_device *hid = dev->hid;
286 if (_IOC_TYPE(cmd) != 'H' || _IOC_DIR(cmd) != _IOC_READ) {
287 ret = -EINVAL;
288 break;
289 }
290
291 if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWNAME(0))) {
292 int len;
293 if (!hid->name) {
294 ret = 0;
295 break;
296 }
297 len = strlen(hid->name) + 1;
298 if (len > _IOC_SIZE(cmd))
299 len = _IOC_SIZE(cmd);
300 ret = copy_to_user(user_arg, hid->name, len) ?
301 -EFAULT : len;
302 break;
303 }
304
305 if (_IOC_NR(cmd) == _IOC_NR(HIDIOCGRAWPHYS(0))) {
306 int len;
307 if (!hid->phys) {
308 ret = 0;
309 break;
310 }
311 len = strlen(hid->phys) + 1;
312 if (len > _IOC_SIZE(cmd))
313 len = _IOC_SIZE(cmd);
314 ret = copy_to_user(user_arg, hid->phys, len) ?
315 -EFAULT : len;
316 break;
317 }
318 }
319
320 ret = -ENOTTY;
266 } 321 }
322 mutex_unlock(&minors_lock);
267 return ret; 323 return ret;
268} 324}
269 325
@@ -298,10 +354,7 @@ int hidraw_connect(struct hid_device *hid)
298 int minor, result; 354 int minor, result;
299 struct hidraw *dev; 355 struct hidraw *dev;
300 356
301 /* TODO currently we accept any HID device. This should later 357 /* we accept any HID device, no matter the applications */
302 * probably be fixed to accept only those devices which provide
303 * non-input applications
304 */
305 358
306 dev = kzalloc(sizeof(struct hidraw), GFP_KERNEL); 359 dev = kzalloc(sizeof(struct hidraw), GFP_KERNEL);
307 if (!dev) 360 if (!dev)
@@ -309,7 +362,7 @@ int hidraw_connect(struct hid_device *hid)
309 362
310 result = -EINVAL; 363 result = -EINVAL;
311 364
312 spin_lock(&minors_lock); 365 mutex_lock(&minors_lock);
313 366
314 for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) { 367 for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) {
315 if (hidraw_table[minor]) 368 if (hidraw_table[minor])
@@ -319,26 +372,24 @@ int hidraw_connect(struct hid_device *hid)
319 break; 372 break;
320 } 373 }
321 374
322 spin_unlock(&minors_lock);
323
324 if (result) { 375 if (result) {
376 mutex_unlock(&minors_lock);
325 kfree(dev); 377 kfree(dev);
326 goto out; 378 goto out;
327 } 379 }
328 380
329 dev->dev = device_create_drvdata(hidraw_class, NULL, 381 dev->dev = device_create(hidraw_class, &hid->dev, MKDEV(hidraw_major, minor),
330 MKDEV(hidraw_major, minor), NULL, 382 NULL, "%s%d", "hidraw", minor);
331 "%s%d", "hidraw", minor);
332 383
333 if (IS_ERR(dev->dev)) { 384 if (IS_ERR(dev->dev)) {
334 spin_lock(&minors_lock);
335 hidraw_table[minor] = NULL; 385 hidraw_table[minor] = NULL;
336 spin_unlock(&minors_lock); 386 mutex_unlock(&minors_lock);
337 result = PTR_ERR(dev->dev); 387 result = PTR_ERR(dev->dev);
338 kfree(dev); 388 kfree(dev);
339 goto out; 389 goto out;
340 } 390 }
341 391
392 mutex_unlock(&minors_lock);
342 init_waitqueue_head(&dev->wait); 393 init_waitqueue_head(&dev->wait);
343 INIT_LIST_HEAD(&dev->list); 394 INIT_LIST_HEAD(&dev->list);
344 395
@@ -360,14 +411,14 @@ void hidraw_disconnect(struct hid_device *hid)
360 411
361 hidraw->exist = 0; 412 hidraw->exist = 0;
362 413
363 spin_lock(&minors_lock); 414 mutex_lock(&minors_lock);
364 hidraw_table[hidraw->minor] = NULL; 415 hidraw_table[hidraw->minor] = NULL;
365 spin_unlock(&minors_lock); 416 mutex_unlock(&minors_lock);
366 417
367 device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor)); 418 device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
368 419
369 if (hidraw->open) { 420 if (hidraw->open) {
370 hid->hid_close(hid); 421 hid->ll_driver->close(hid);
371 wake_up_interruptible(&hidraw->wait); 422 wake_up_interruptible(&hidraw->wait);
372 } else { 423 } else {
373 kfree(hidraw); 424 kfree(hidraw);
@@ -404,7 +455,7 @@ out:
404 return result; 455 return result;
405} 456}
406 457
407void __exit hidraw_exit(void) 458void hidraw_exit(void)
408{ 459{
409 dev_t dev_id = MKDEV(hidraw_major, 0); 460 dev_t dev_id = MKDEV(hidraw_major, 0);
410 461
diff --git a/usr/src/dkms_source_tree/patches/10-expose-and-dashboard.patch b/usr/src/dkms_source_tree/patches/10-expose-and-dashboard.patch
deleted file mode 100644
index de64ac1..0000000
--- a/usr/src/dkms_source_tree/patches/10-expose-and-dashboard.patch
+++ /dev/null
@@ -1,17 +0,0 @@
1diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
2--- a/drivers/hid/hid-input.c
3+++ b/drivers/hid/hid-input.c
4@@ -98,10 +98,11 @@ static struct hidinput_key_translation apple_fn_keys[] = {
5
6 static struct hidinput_key_translation apple_fn_keys[] = {
7 { KEY_BACKSPACE, KEY_DELETE },
8+ { KEY_ENTER, KEY_INSERT },
9 { KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
10 { KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
11- { KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */
12- { KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */
13+ { KEY_F3, KEY_CYCLEWINDOWS, APPLE_FLAG_FKEY }, /* Exposé */
14+ { KEY_F4, KEY_CALC, APPLE_FLAG_FKEY }, /* Dashboard */
15 { KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
16 { KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
17 { KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },