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