hid-generic.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * HID support for Linux
  3. *
  4. * Copyright (c) 1999 Andreas Gal
  5. * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
  6. * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
  7. * Copyright (c) 2007-2008 Oliver Neukum
  8. * Copyright (c) 2006-2012 Jiri Kosina
  9. * Copyright (c) 2012 Henrik Rydberg
  10. */
  11. /*
  12. * This program is free software; you can redistribute it and/or modify it
  13. * under the terms of the GNU General Public License as published by the Free
  14. * Software Foundation; either version 2 of the License, or (at your option)
  15. * any later version.
  16. */
  17. #include <linux/module.h>
  18. #include <linux/slab.h>
  19. #include <linux/kernel.h>
  20. #include <asm/unaligned.h>
  21. #include <asm/byteorder.h>
  22. #include <linux/hid.h>
  23. static struct hid_driver hid_generic;
  24. static int __check_hid_generic(struct device_driver *drv, void *data)
  25. {
  26. struct hid_driver *hdrv = to_hid_driver(drv);
  27. struct hid_device *hdev = data;
  28. if (hdrv == &hid_generic)
  29. return 0;
  30. return hid_match_device(hdev, hdrv) != NULL;
  31. }
  32. static bool hid_generic_match(struct hid_device *hdev,
  33. bool ignore_special_driver)
  34. {
  35. if (ignore_special_driver)
  36. return true;
  37. if (hdev->quirks & HID_QUIRK_HAVE_SPECIAL_DRIVER)
  38. return false;
  39. /*
  40. * If any other driver wants the device, leave the device to this other
  41. * driver.
  42. */
  43. if (bus_for_each_drv(&hid_bus_type, NULL, hdev, __check_hid_generic))
  44. return false;
  45. return true;
  46. }
  47. static int hid_generic_probe(struct hid_device *hdev,
  48. const struct hid_device_id *id)
  49. {
  50. int ret;
  51. hdev->quirks |= HID_QUIRK_INPUT_PER_APP;
  52. ret = hid_parse(hdev);
  53. if (ret)
  54. return ret;
  55. return hid_hw_start(hdev, HID_CONNECT_DEFAULT);
  56. }
  57. static const struct hid_device_id hid_table[] = {
  58. { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, HID_ANY_ID, HID_ANY_ID) },
  59. { }
  60. };
  61. MODULE_DEVICE_TABLE(hid, hid_table);
  62. static struct hid_driver hid_generic = {
  63. .name = "hid-generic",
  64. .id_table = hid_table,
  65. .match = hid_generic_match,
  66. .probe = hid_generic_probe,
  67. };
  68. module_hid_driver(hid_generic);
  69. MODULE_AUTHOR("Henrik Rydberg");
  70. MODULE_DESCRIPTION("HID generic driver");
  71. MODULE_LICENSE("GPL");