mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-25 00:52:45 -04:00
HID: fix Logitech DiNovo Edge touchwheel and Logic3 /SpectraVideo middle button
Dongle shipped with Logitech DiNovo Edge (0x046d/0xc714) behaves in a weird
non-standard way - it contains multiple reports with the same usage, which
results in remapping of GenericDesktop.X and GenericDesktop.Y usages to
GenericDesktop.Z and GenericDesktop.RX respectively, thus rendering the
touchwheel unusable.
The commit 3506897691 solved this
in a way that it didn't remap certain usages. This however breaks
(at least) middle button of Logic3 / SpectraVideo (0x1267/0x0210),
which in contrary requires the remapping.
To make both of the harware work, allow remapping of these usages again,
and introduce a quirk for Logitech DiNovo Edge "touchwheel" instead - we
disable remapping for key, abs and rel events only for this hardware.
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user