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 0 : static int __check_hid_generic(struct device_driver *drv, void *data) 27 : { 28 0 : struct hid_driver *hdrv = to_hid_driver(drv); 29 0 : struct hid_device *hdev = data; 30 : 31 0 : if (hdrv == &hid_generic) 32 : return 0; 33 : 34 0 : return hid_match_device(hdev, hdrv) != NULL; 35 : } 36 : 37 0 : static bool hid_generic_match(struct hid_device *hdev, 38 : bool ignore_special_driver) 39 : { 40 0 : if (ignore_special_driver) 41 : return true; 42 : 43 0 : 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 0 : if (bus_for_each_drv(&hid_bus_type, NULL, hdev, __check_hid_generic)) 51 : return false; 52 : 53 0 : return true; 54 : } 55 : 56 0 : static int hid_generic_probe(struct hid_device *hdev, 57 : const struct hid_device_id *id) 58 : { 59 : int ret; 60 : 61 0 : hdev->quirks |= HID_QUIRK_INPUT_PER_APP; 62 : 63 0 : ret = hid_parse(hdev); 64 0 : if (ret) 65 : return ret; 66 : 67 0 : 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 1 : module_hid_driver(hid_generic); 83 : 84 : MODULE_AUTHOR("Henrik Rydberg"); 85 : MODULE_DESCRIPTION("HID generic driver"); 86 : MODULE_LICENSE("GPL");