|
38 | 38 | (usage->hid & HID_USAGE_PAGE) == HID_UP_CONSUMER)
|
39 | 39 |
|
40 | 40 | #define PLT_QUIRK_DOUBLE_VOLUME_KEYS BIT(0)
|
| 41 | +#define PLT_QUIRK_FOLLOWED_OPPOSITE_VOLUME_KEYS BIT(1) |
41 | 42 |
|
42 | 43 | #define PLT_DOUBLE_KEY_TIMEOUT 5 /* ms */
|
| 44 | +#define PLT_FOLLOWED_OPPOSITE_KEY_TIMEOUT 220 /* ms */ |
43 | 45 |
|
44 | 46 | struct plt_drv_data {
|
45 | 47 | unsigned long device_type;
|
@@ -137,6 +139,21 @@ static int plantronics_event(struct hid_device *hdev, struct hid_field *field,
|
137 | 139 |
|
138 | 140 | drv_data->last_volume_key_ts = cur_ts;
|
139 | 141 | }
|
| 142 | + if (drv_data->quirks & PLT_QUIRK_FOLLOWED_OPPOSITE_VOLUME_KEYS) { |
| 143 | + unsigned long prev_ts, cur_ts; |
| 144 | + |
| 145 | + /* Usages are filtered in plantronics_usages. */ |
| 146 | + |
| 147 | + if (!value) /* Handle key presses only. */ |
| 148 | + return 0; |
| 149 | + |
| 150 | + prev_ts = drv_data->last_volume_key_ts; |
| 151 | + cur_ts = jiffies; |
| 152 | + if (jiffies_to_msecs(cur_ts - prev_ts) <= PLT_FOLLOWED_OPPOSITE_KEY_TIMEOUT) |
| 153 | + return 1; /* Ignore the followed opposite volume key. */ |
| 154 | + |
| 155 | + drv_data->last_volume_key_ts = cur_ts; |
| 156 | + } |
140 | 157 |
|
141 | 158 | return 0;
|
142 | 159 | }
|
@@ -210,6 +227,12 @@ static const struct hid_device_id plantronics_devices[] = {
|
210 | 227 | { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS,
|
211 | 228 | USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3225_SERIES),
|
212 | 229 | .driver_data = PLT_QUIRK_DOUBLE_VOLUME_KEYS },
|
| 230 | + { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, |
| 231 | + USB_DEVICE_ID_PLANTRONICS_BLACKWIRE_3325_SERIES), |
| 232 | + .driver_data = PLT_QUIRK_FOLLOWED_OPPOSITE_VOLUME_KEYS }, |
| 233 | + { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, |
| 234 | + USB_DEVICE_ID_PLANTRONICS_ENCOREPRO_500_SERIES), |
| 235 | + .driver_data = PLT_QUIRK_FOLLOWED_OPPOSITE_VOLUME_KEYS }, |
213 | 236 | { HID_USB_DEVICE(USB_VENDOR_ID_PLANTRONICS, HID_ANY_ID) },
|
214 | 237 | { }
|
215 | 238 | };
|
|
0 commit comments