Blame view

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