hid-generic.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. #include <linux/module.h>
  15. #include <linux/slab.h>
  16. #include <linux/kernel.h>
  17. #include <asm/unaligned.h>
  18. #include <asm/byteorder.h>
  19. #include <linux/hid.h>
  20. static struct hid_driver hid_generic;
  21. static int __check_hid_generic(struct device_driver *drv, void *data)
  22. {
  23. struct hid_driver *hdrv = to_hid_driver(drv);
  24. struct hid_device *hdev = data;
  25. if (hdrv == &hid_generic)
  26. return 0;
  27. return hid_match_device(hdev, hdrv) != NULL;
  28. }
  29. static bool hid_generic_match(struct hid_device *hdev,
  30. bool ignore_special_driver)
  31. {
  32. if (ignore_special_driver)
  33. return true;
  34. if (hdev->quirks & HID_QUIRK_HAVE_SPECIAL_DRIVER)
  35. return false;
  36. /*
  37. * If any other driver wants the device, leave the device to this other
  38. * driver.
  39. */
  40. if (bus_for_each_drv(&hid_bus_type, NULL, hdev, __check_hid_generic))
  41. return false;
  42. return true;
  43. }
  44. static int hid_generic_probe(struct hid_device *hdev,
  45. const struct hid_device_id *id)
  46. {
  47. int ret;
  48. hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
  49. ret = hid_parse(hdev);
  50. if (ret)
  51. return ret;
  52. return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
  53. }
  54. static const struct hid_device_id hid_table[] = {
  55. { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, HID_ANY_ID, HID_ANY_ID) },
  56. { }
  57. };
  58. MODULE_DEVICE_TABLE(hid, hid_table);
  59. static struct hid_driver hid_generic = {
  60. .name = "hid-generic",
  61. .id_table = hid_table,
  62. .match = hid_generic_match,
  63. .probe = hid_generic_probe,
  64. };
  65. module_hid_driver(hid_generic);
  66. MODULE_AUTHOR("Henrik Rydberg");
  67. MODULE_DESCRIPTION("HID generic driver");
  68. MODULE_LICENSE("GPL");