1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * HID driver for some ITE "special" devices 4 * Copyright (c) 2017 Hans de Goede <hdegoede@redhat.com> 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) }, 42 { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) }, 43 /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */ 44 { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, 45 USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) }, 46 { } 47 }; 48 MODULE_DEVICE_TABLE(hid, ite_devices); 49 50 static struct hid_driver ite_driver = { 51 .name = "itetech", 52 .id_table = ite_devices, 53 .event = ite_event, 54 }; 55 module_hid_driver(ite_driver); 56 57 MODULE_LICENSE("GPL"); 58