Commit | Line | Data |
---|---|---|
10bd065f JK |
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 | * | |
85c985f4 | 7 | * Copyright (c) 2007-2008 Jiri Kosina |
10bd065f JK |
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 | ||
022e8c4d JS |
19 | #define map_key_clear(c) hid_map_usage_clear(hidinput, usage, bit, \ |
20 | max, EV_KEY, (c)) | |
10bd065f | 21 | |
022e8c4d JS |
22 | static int quirk_gyration_remote(struct hid_usage *usage, |
23 | struct hid_input *hidinput, unsigned long **bit, int *max) | |
a7f32697 DW |
24 | { |
25 | if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) | |
26 | return 0; | |
27 | ||
022e8c4d | 28 | set_bit(EV_REP, hidinput->input->evbit); |
a7f32697 DW |
29 | switch(usage->hid & HID_USAGE) { |
30 | /* Reported on Gyration MCE Remote */ | |
31 | case 0x00d: map_key_clear(KEY_HOME); break; | |
32 | case 0x024: map_key_clear(KEY_DVD); break; | |
33 | case 0x025: map_key_clear(KEY_PVR); break; | |
34 | case 0x046: map_key_clear(KEY_MEDIA); break; | |
35 | case 0x047: map_key_clear(KEY_MP3); break; | |
36 | case 0x049: map_key_clear(KEY_CAMERA); break; | |
37 | case 0x04a: map_key_clear(KEY_VIDEO); break; | |
38 | ||
39 | default: | |
40 | return 0; | |
41 | } | |
42 | return 1; | |
43 | } | |
44 | ||
a7f32697 DW |
45 | #define VENDOR_ID_GYRATION 0x0c16 |
46 | #define DEVICE_ID_GYRATION_REMOTE 0x0002 | |
47 | ||
10bd065f JK |
48 | static const struct hid_input_blacklist { |
49 | __u16 idVendor; | |
50 | __u16 idProduct; | |
022e8c4d JS |
51 | int (*quirk)(struct hid_usage *, struct hid_input *, unsigned long **, |
52 | int *); | |
10bd065f | 53 | } hid_input_blacklist[] = { |
a7f32697 DW |
54 | { VENDOR_ID_GYRATION, DEVICE_ID_GYRATION_REMOTE, quirk_gyration_remote }, |
55 | ||
282bfd4c | 56 | { 0, 0, NULL } |
10bd065f JK |
57 | }; |
58 | ||
59 | int hidinput_mapping_quirks(struct hid_usage *usage, | |
022e8c4d | 60 | struct hid_input *hi, unsigned long **bit, int *max) |
10bd065f | 61 | { |
022e8c4d | 62 | struct hid_device *device = input_get_drvdata(hi->input); |
10bd065f JK |
63 | int i = 0; |
64 | ||
65 | while (hid_input_blacklist[i].quirk) { | |
66 | if (hid_input_blacklist[i].idVendor == device->vendor && | |
67 | hid_input_blacklist[i].idProduct == device->product) | |
022e8c4d JS |
68 | return hid_input_blacklist[i].quirk(usage, hi, bit, |
69 | max); | |
10bd065f JK |
70 | i++; |
71 | } | |
72 | return 0; | |
73 | } | |
87bc2aa9 | 74 | |
68a1f2cc | 75 | int hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) |
87bc2aa9 JK |
76 | { |
77 | struct input_dev *input; | |
87bc2aa9 JK |
78 | |
79 | input = field->hidinput->input; | |
80 | ||
32146dc9 JK |
81 | /* Gyration MCE remote "Sleep" key */ |
82 | if (hid->vendor == VENDOR_ID_GYRATION && | |
83 | hid->product == DEVICE_ID_GYRATION_REMOTE && | |
84 | (usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK && | |
85 | (usage->hid & 0xff) == 0x82) { | |
86 | input_event(input, usage->type, usage->code, 1); | |
87 | input_sync(input); | |
88 | input_event(input, usage->type, usage->code, 0); | |
89 | input_sync(input); | |
90 | return 1; | |
91 | } | |
68a1f2cc | 92 | return 0; |
87bc2aa9 JK |
93 | } |
94 | ||
10bd065f | 95 |