]> Pileus Git - ~andy/linux/blobdiff - drivers/hid/hid-input.c
Driver core: add device symlink back to sysfs
[~andy/linux] / drivers / hid / hid-input.c
index eeba66513997575957bf641f84fd514d532e2ca6..c8434023ba652ac325fb924b577fc051d331f86d 100644 (file)
@@ -71,7 +71,6 @@ static const struct {
 #define map_led(c)     do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0)
 
 #define map_abs_clear(c)       do { map_abs(c); clear_bit(c, bit); } while (0)
-#define map_rel_clear(c)       do { map_rel(c); clear_bit(c, bit); } while (0)
 #define map_key_clear(c)       do { map_key(c); clear_bit(c, bit); } while (0)
 
 #ifdef CONFIG_USB_HIDINPUT_POWERBOOK
@@ -296,7 +295,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                                        }
                        }
 
-                       map_key_clear(code);
+                       map_key(code);
                        break;
 
 
@@ -347,9 +346,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                                case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ:
                                case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL:
                                        if (field->flags & HID_MAIN_ITEM_RELATIVE)
-                                               map_rel_clear(usage->hid & 0xf);
+                                               map_rel(usage->hid & 0xf);
                                        else
-                                               map_abs_clear(usage->hid & 0xf);
+                                               map_abs(usage->hid & 0xf);
                                        break;
 
                                case HID_GD_HATSWITCH:
@@ -519,7 +518,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
                                case 0x22f: map_key_clear(KEY_ZOOMRESET);       break;
                                case 0x233: map_key_clear(KEY_SCROLLUP);        break;
                                case 0x234: map_key_clear(KEY_SCROLLDOWN);      break;
-                               case 0x238: map_rel_clear(REL_HWHEEL);          break;
+                               case 0x238: map_rel(REL_HWHEEL);                break;
                                case 0x25f: map_key_clear(KEY_CANCEL);          break;
                                case 0x279: map_key_clear(KEY_REDO);            break;
 
@@ -667,6 +666,12 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 
        set_bit(usage->type, input->evbit);
 
+       if (device->quirks & HID_QUIRK_DUPLICATE_USAGES &&
+                       (usage->type == EV_KEY ||
+                        usage->type == EV_REL ||
+                        usage->type == EV_ABS))
+               clear_bit(usage->code, bit);
+
        while (usage->code <= max && test_and_set_bit(usage->code, bit))
                usage->code = find_next_zero_bit(bit, max + 1, usage->code);