Merge branch 'release-2.6.27' of git://git.kernel.org/pub/scm/linux/kernel/git/ak...
[pandora-kernel.git] / drivers / hid / hid-input-quirks.c
index a870ba5..16feea0 100644 (file)
@@ -89,6 +89,29 @@ static int quirk_logitech_ultrax_remote(struct hid_usage *usage, struct input_de
        return 1;
 }
 
+static int quirk_gyration_remote(struct hid_usage *usage, struct input_dev *input,
+                             unsigned long **bit, int *max)
+{
+       if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
+               return 0;
+
+       set_bit(EV_REP, input->evbit);
+       switch(usage->hid & HID_USAGE) {
+               /* Reported on Gyration MCE Remote */
+               case 0x00d: map_key_clear(KEY_HOME);            break;
+               case 0x024: map_key_clear(KEY_DVD);             break;
+               case 0x025: map_key_clear(KEY_PVR);             break;
+               case 0x046: map_key_clear(KEY_MEDIA);           break;
+               case 0x047: map_key_clear(KEY_MP3);             break;
+               case 0x049: map_key_clear(KEY_CAMERA);          break;
+               case 0x04a: map_key_clear(KEY_VIDEO);           break;
+
+               default:
+                       return 0;
+       }
+       return 1;
+}
+
 static int quirk_chicony_tactical_pad(struct hid_usage *usage, struct input_dev *input,
                              unsigned long **bit, int *max)
 {
@@ -276,6 +299,21 @@ static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
        return 1;
 }
 
+static int quirk_sunplus_wdesktop(struct hid_usage *usage, struct input_dev *input,
+                             unsigned long **bit, int *max)
+{
+       if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
+               return 0;
+
+       switch (usage->hid & HID_USAGE) {
+               case 0x2003: map_key_clear(KEY_ZOOMIN);         break;
+               case 0x2103: map_key_clear(KEY_ZOOMOUT);        break;
+               default:
+                       return 0;
+       }
+       return 1;
+}
+
 #define VENDOR_ID_BELKIN                       0x1020
 #define DEVICE_ID_BELKIN_WIRELESS_KEYBOARD     0x0006
 
@@ -288,6 +326,9 @@ static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
 #define VENDOR_ID_EZKEY                                0x0518
 #define DEVICE_ID_BTC_8193                     0x0002
 
+#define VENDOR_ID_GYRATION                     0x0c16
+#define DEVICE_ID_GYRATION_REMOTE              0x0002
+
 #define VENDOR_ID_LOGITECH                     0x046d
 #define DEVICE_ID_LOGITECH_RECEIVER            0xc101
 #define DEVICE_ID_S510_RECEIVER                        0xc50c
@@ -306,6 +347,9 @@ static int quirk_btc_8193(struct hid_usage *usage, struct input_dev *input,
 #define VENDOR_ID_PETALYNX                     0x18b1
 #define DEVICE_ID_PETALYNX_MAXTER_REMOTE       0x0037
 
+#define VENDOR_ID_SUNPLUS                      0x04fc
+#define DEVICE_ID_SUNPLUS_WDESKTOP             0x05d8
+
 static const struct hid_input_blacklist {
        __u16 idVendor;
        __u16 idProduct;
@@ -319,6 +363,8 @@ static const struct hid_input_blacklist {
 
        { VENDOR_ID_EZKEY, DEVICE_ID_BTC_8193, quirk_btc_8193 },
 
+       { VENDOR_ID_GYRATION, DEVICE_ID_GYRATION_REMOTE, quirk_gyration_remote },
+
        { VENDOR_ID_LOGITECH, DEVICE_ID_LOGITECH_RECEIVER, quirk_logitech_ultrax_remote },
        { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER, quirk_logitech_wireless },
        { VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER_2, quirk_logitech_wireless },
@@ -332,8 +378,10 @@ static const struct hid_input_blacklist {
        { VENDOR_ID_MONTEREY, DEVICE_ID_GENIUS_KB29E, quirk_cherry_genius_29e },
 
        { VENDOR_ID_PETALYNX, DEVICE_ID_PETALYNX_MAXTER_REMOTE, quirk_petalynx_remote },
-       
-       { 0, 0, 0 }
+
+       { VENDOR_ID_SUNPLUS, DEVICE_ID_SUNPLUS_WDESKTOP, quirk_sunplus_wdesktop },
+
+       { 0, 0, NULL }
 };
 
 int hidinput_mapping_quirks(struct hid_usage *usage, 
@@ -352,7 +400,7 @@ int hidinput_mapping_quirks(struct hid_usage *usage,
        return 0;
 }
 
-void hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
+int hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
 {
        struct input_dev *input;
 
@@ -362,34 +410,34 @@ void hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, stru
                || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) {
                if (value) hid->quirks |=  HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
                else       hid->quirks &= ~HID_QUIRK_2WHEEL_MOUSE_HACK_ON;
-               return;
+               return 1;
        }
 
        if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_B8) &&
                        (usage->type == EV_REL) &&
                        (usage->code == REL_WHEEL)) {
                hid->delayed_value = value;
-               return;
+               return 1;
        }
 
        if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_B8) &&
                        (usage->hid == 0x000100b8)) {
                input_event(input, EV_REL, value ? REL_HWHEEL : REL_WHEEL, hid->delayed_value);
-               return;
+               return 1;
        }
 
        if ((hid->quirks & HID_QUIRK_INVERT_HWHEEL) && (usage->code == REL_HWHEEL)) {
                input_event(input, usage->type, usage->code, -value);
-               return;
+               return 1;
        }
 
        if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) {
                input_event(input, usage->type, REL_HWHEEL, value);
-               return;
+               return 1;
        }
 
        if ((hid->quirks & HID_QUIRK_APPLE_HAS_FN) && hidinput_apple_event(hid, input, usage, value))
-               return;
+               return 1;
 
        /* Handling MS keyboards special buttons */
        if (hid->quirks & HID_QUIRK_MICROSOFT_KEYS && 
@@ -416,8 +464,21 @@ void hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, stru
        if (hid->quirks & HID_QUIRK_HWHEEL_WHEEL_INVERT &&
                        usage->type == EV_REL && usage->code == REL_HWHEEL) {
                input_event(input, usage->type, REL_WHEEL, -value);
-               return;
+               return 1;
+       }
+
+       /* Gyration MCE remote "Sleep" key */
+       if (hid->vendor == VENDOR_ID_GYRATION &&
+           hid->product == DEVICE_ID_GYRATION_REMOTE &&
+           (usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK &&
+           (usage->hid & 0xff) == 0x82) {
+               input_event(input, usage->type, usage->code, 1);
+               input_sync(input);
+               input_event(input, usage->type, usage->code, 0);
+               input_sync(input);
+               return 1;
        }
+       return 0;
 }