Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-or-later 2 : : /* 3 : : * HID support for Linux 4 : : * 5 : : * Copyright (c) 1999 Andreas Gal 6 : : * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> 7 : : * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc 8 : : * Copyright (c) 2007-2008 Oliver Neukum 9 : : * Copyright (c) 2006-2012 Jiri Kosina 10 : : * Copyright (c) 2012 Henrik Rydberg 11 : : */ 12 : : 13 : : /* 14 : : */ 15 : : 16 : : #include <linux/module.h> 17 : : #include <linux/slab.h> 18 : : #include <linux/kernel.h> 19 : : #include <asm/unaligned.h> 20 : : #include <asm/byteorder.h> 21 : : 22 : : #include <linux/hid.h> 23 : : 24 : : static struct hid_driver hid_generic; 25 : : 26 : 3 : static int __check_hid_generic(struct device_driver *drv, void *data) 27 : : { 28 : 3 : struct hid_driver *hdrv = to_hid_driver(drv); 29 : : struct hid_device *hdev = data; 30 : : 31 : 3 : if (hdrv == &hid_generic) 32 : : return 0; 33 : : 34 : 0 : return hid_match_device(hdev, hdrv) != NULL; 35 : : } 36 : : 37 : 3 : static bool hid_generic_match(struct hid_device *hdev, 38 : : bool ignore_special_driver) 39 : : { 40 : 3 : if (ignore_special_driver) 41 : : return true; 42 : : 43 : 3 : if (hdev->quirks & HID_QUIRK_HAVE_SPECIAL_DRIVER) 44 : : return false; 45 : : 46 : : /* 47 : : * If any other driver wants the device, leave the device to this other 48 : : * driver. 49 : : */ 50 : 3 : if (bus_for_each_drv(&hid_bus_type, NULL, hdev, __check_hid_generic)) 51 : : return false; 52 : : 53 : 3 : return true; 54 : : } 55 : : 56 : 3 : static int hid_generic_probe(struct hid_device *hdev, 57 : : const struct hid_device_id *id) 58 : : { 59 : : int ret; 60 : : 61 : 3 : hdev->quirks |= HID_QUIRK_INPUT_PER_APP; 62 : : 63 : : ret = hid_parse(hdev); 64 : 3 : if (ret) 65 : : return ret; 66 : : 67 : 3 : return hid_hw_start(hdev, HID_CONNECT_DEFAULT); 68 : : } 69 : : 70 : : static const struct hid_device_id hid_table[] = { 71 : : { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, HID_ANY_ID, HID_ANY_ID) }, 72 : : { } 73 : : }; 74 : : MODULE_DEVICE_TABLE(hid, hid_table); 75 : : 76 : : static struct hid_driver hid_generic = { 77 : : .name = "hid-generic", 78 : : .id_table = hid_table, 79 : : .match = hid_generic_match, 80 : : .probe = hid_generic_probe, 81 : : }; 82 : 3 : module_hid_driver(hid_generic); 83 : : 84 : : MODULE_AUTHOR("Henrik Rydberg"); 85 : : MODULE_DESCRIPTION("HID generic driver"); 86 : : MODULE_LICENSE("GPL");