Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/hch/vfs...
[pandora-kernel.git] / drivers / hid / hid-input.c
index 33dde87..f333139 100644 (file)
@@ -44,11 +44,11 @@ static const unsigned char hid_keyboard[256] = {
         72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
        191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
        115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
-       122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
+       122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,
        unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
        unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
        unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
-       unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
+       unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,
         29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
        150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
 };
@@ -357,6 +357,18 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                        case 0x1: map_key_clear(KEY_POWER);  break;
                        case 0x2: map_key_clear(KEY_SLEEP);  break;
                        case 0x3: map_key_clear(KEY_WAKEUP); break;
+                       case 0x4: map_key_clear(KEY_CONTEXT_MENU); break;
+                       case 0x5: map_key_clear(KEY_MENU); break;
+                       case 0x6: map_key_clear(KEY_PROG1); break;
+                       case 0x7: map_key_clear(KEY_HELP); break;
+                       case 0x8: map_key_clear(KEY_EXIT); break;
+                       case 0x9: map_key_clear(KEY_SELECT); break;
+                       case 0xa: map_key_clear(KEY_RIGHT); break;
+                       case 0xb: map_key_clear(KEY_LEFT); break;
+                       case 0xc: map_key_clear(KEY_UP); break;
+                       case 0xd: map_key_clear(KEY_DOWN); break;
+                       case 0xe: map_key_clear(KEY_POWER2); break;
+                       case 0xf: map_key_clear(KEY_RESTART); break;
                        default: goto unknown;
                        }
                        break;
@@ -462,20 +474,47 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                        map_key_clear(BTN_STYLUS2);
                        break;
 
+               case 0x51: /* ContactID */
+                       device->quirks |= HID_QUIRK_MULTITOUCH;
+                       goto unknown;
+
                default:  goto unknown;
                }
                break;
 
-       case HID_UP_CONSUMER:   /* USB HUT v1.1, pages 56-62 */
+       case HID_UP_CONSUMER:   /* USB HUT v1.12, pages 75-84 */
                switch (usage->hid & HID_USAGE) {
                case 0x000: goto ignore;
+               case 0x030: map_key_clear(KEY_POWER);           break;
+               case 0x031: map_key_clear(KEY_RESTART);         break;
+               case 0x032: map_key_clear(KEY_SLEEP);           break;
                case 0x034: map_key_clear(KEY_SLEEP);           break;
+               case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE);  break;
                case 0x036: map_key_clear(BTN_MISC);            break;
 
-               case 0x040: map_key_clear(KEY_MENU);            break;
-               case 0x045: map_key_clear(KEY_RADIO);           break;
-
+               case 0x040: map_key_clear(KEY_MENU);            break; /* Menu */
+               case 0x041: map_key_clear(KEY_SELECT);          break; /* Menu Pick */
+               case 0x042: map_key_clear(KEY_UP);              break; /* Menu Up */
+               case 0x043: map_key_clear(KEY_DOWN);            break; /* Menu Down */
+               case 0x044: map_key_clear(KEY_LEFT);            break; /* Menu Left */
+               case 0x045: map_key_clear(KEY_RIGHT);           break; /* Menu Right */
+               case 0x046: map_key_clear(KEY_ESC);             break; /* Menu Escape */
+               case 0x047: map_key_clear(KEY_KPPLUS);          break; /* Menu Value Increase */
+               case 0x048: map_key_clear(KEY_KPMINUS);         break; /* Menu Value Decrease */
+
+               case 0x060: map_key_clear(KEY_INFO);            break; /* Data On Screen */
+               case 0x061: map_key_clear(KEY_SUBTITLE);        break; /* Closed Caption */
+               case 0x063: map_key_clear(KEY_VCR);             break; /* VCR/TV */
+               case 0x065: map_key_clear(KEY_CAMERA);          break; /* Snapshot */
+               case 0x069: map_key_clear(KEY_RED);             break;
+               case 0x06a: map_key_clear(KEY_GREEN);           break;
+               case 0x06b: map_key_clear(KEY_BLUE);            break;
+               case 0x06c: map_key_clear(KEY_YELLOW);          break;
+               case 0x06d: map_key_clear(KEY_ZOOM);            break;
+
+               case 0x082: map_key_clear(KEY_VIDEO_NEXT);      break;
                case 0x083: map_key_clear(KEY_LAST);            break;
+               case 0x084: map_key_clear(KEY_ENTER);           break;
                case 0x088: map_key_clear(KEY_PC);              break;
                case 0x089: map_key_clear(KEY_TV);              break;
                case 0x08a: map_key_clear(KEY_WWW);             break;
@@ -509,6 +548,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x0b7: map_key_clear(KEY_STOPCD);          break;
                case 0x0b8: map_key_clear(KEY_EJECTCD);         break;
                case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT);    break;
+               case 0x0b9: map_key_clear(KEY_SHUFFLE);         break;
+               case 0x0bf: map_key_clear(KEY_SLOW);            break;
 
                case 0x0cd: map_key_clear(KEY_PLAYPAUSE);       break;
                case 0x0e0: map_abs_clear(ABS_VOLUME);          break;
@@ -516,6 +557,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x0e5: map_key_clear(KEY_BASSBOOST);       break;
                case 0x0e9: map_key_clear(KEY_VOLUMEUP);        break;
                case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);      break;
+               case 0x0f5: map_key_clear(KEY_SLOW);            break;
 
                case 0x182: map_key_clear(KEY_BOOKMARKS);       break;
                case 0x183: map_key_clear(KEY_CONFIG);          break;
@@ -532,6 +574,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x18e: map_key_clear(KEY_CALENDAR);        break;
                case 0x191: map_key_clear(KEY_FINANCE);         break;
                case 0x192: map_key_clear(KEY_CALC);            break;
+               case 0x193: map_key_clear(KEY_PLAYER);          break;
                case 0x194: map_key_clear(KEY_FILE);            break;
                case 0x196: map_key_clear(KEY_WWW);             break;
                case 0x199: map_key_clear(KEY_CHAT);            break;
@@ -540,8 +583,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x1a6: map_key_clear(KEY_HELP);            break;
                case 0x1a7: map_key_clear(KEY_DOCUMENTS);       break;
                case 0x1ab: map_key_clear(KEY_SPELLCHECK);      break;
-               case 0x1b6: map_key_clear(KEY_MEDIA);           break;
-               case 0x1b7: map_key_clear(KEY_SOUND);           break;
+               case 0x1ae: map_key_clear(KEY_KEYBOARD);        break;
+               case 0x1b6: map_key_clear(KEY_IMAGES);          break;
+               case 0x1b7: map_key_clear(KEY_AUDIO);           break;
+               case 0x1b8: map_key_clear(KEY_VIDEO);           break;
                case 0x1bc: map_key_clear(KEY_MESSENGER);       break;
                case 0x1bd: map_key_clear(KEY_INFO);            break;
                case 0x201: map_key_clear(KEY_NEW);             break;
@@ -570,7 +615,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                case 0x233: map_key_clear(KEY_SCROLLUP);        break;
                case 0x234: map_key_clear(KEY_SCROLLDOWN);      break;
                case 0x238: map_rel(REL_HWHEEL);                break;
+               case 0x23d: map_key_clear(KEY_EDIT);            break;
                case 0x25f: map_key_clear(KEY_CANCEL);          break;
+               case 0x269: map_key_clear(KEY_INSERT);          break;
+               case 0x26a: map_key_clear(KEY_DELETE);          break;
                case 0x279: map_key_clear(KEY_REDO);            break;
 
                case 0x289: map_key_clear(KEY_REPLY);           break;
@@ -934,6 +982,13 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
                }
        }
 
+       if (hid->quirks & HID_QUIRK_MULTITOUCH) {
+               /* generic hid does not know how to handle multitouch devices */
+               if (hidinput)
+                       goto out_cleanup;
+               goto out_unwind;
+       }
+
        if (hidinput && input_register_device(hidinput->input))
                goto out_cleanup;