Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
f1918be1 HG |
2 | /* |
3 | * HID driver for some ITE "special" devices | |
4 | * Copyright (c) 2017 Hans de Goede <hdegoede@redhat.com> | |
f1918be1 HG |
5 | */ |
6 | ||
7 | #include <linux/device.h> | |
8 | #include <linux/input.h> | |
9 | #include <linux/hid.h> | |
10 | #include <linux/module.h> | |
11 | ||
12 | #include "hid-ids.h" | |
13 | ||
14 | static int ite_event(struct hid_device *hdev, struct hid_field *field, | |
15 | struct hid_usage *usage, __s32 value) | |
16 | { | |
17 | struct input_dev *input; | |
18 | ||
19 | if (!(hdev->claimed & HID_CLAIMED_INPUT) || !field->hidinput) | |
20 | return 0; | |
21 | ||
22 | input = field->hidinput->input; | |
23 | ||
24 | /* | |
25 | * The ITE8595 always reports 0 as value for the rfkill button. Luckily | |
26 | * it is the only button in its report, and it sends a report on | |
27 | * release only, so receiving a report means the button was pressed. | |
28 | */ | |
29 | if (usage->hid == HID_GD_RFKILL_BTN) { | |
30 | input_event(input, EV_KEY, KEY_RFKILL, 1); | |
31 | input_sync(input); | |
32 | input_event(input, EV_KEY, KEY_RFKILL, 0); | |
33 | input_sync(input); | |
34 | return 1; | |
35 | } | |
36 | ||
37 | return 0; | |
38 | } | |
39 | ||
40 | static const struct hid_device_id ite_devices[] = { | |
41 | { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) }, | |
40502074 | 42 | { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, |
f1918be1 HG |
43 | { } |
44 | }; | |
45 | MODULE_DEVICE_TABLE(hid, ite_devices); | |
46 | ||
47 | static struct hid_driver ite_driver = { | |
48 | .name = "itetech", | |
49 | .id_table = ite_devices, | |
50 | .event = ite_event, | |
51 | }; | |
52 | module_hid_driver(ite_driver); | |
53 | ||
54 | MODULE_LICENSE("GPL"); |