evbug.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (c) 1999-2001 Vojtech Pavlik
  4. */
  5. /*
  6. * Input driver event debug module - dumps all events into syslog
  7. */
  8. /*
  9. */
  10. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  11. #include <linux/slab.h>
  12. #include <linux/module.h>
  13. #include <linux/input.h>
  14. #include <linux/init.h>
  15. #include <linux/device.h>
  16. MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
  17. MODULE_DESCRIPTION("Input driver event debug module");
  18. MODULE_LICENSE("GPL");
  19. static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
  20. {
  21. printk(KERN_DEBUG pr_fmt("Event. Dev: %s, Type: %d, Code: %d, Value: %d\n"),
  22. dev_name(&handle->dev->dev), type, code, value);
  23. }
  24. static int evbug_connect(struct input_handler *handler, struct input_dev *dev,
  25. const struct input_device_id *id)
  26. {
  27. struct input_handle *handle;
  28. int error;
  29. handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
  30. if (!handle)
  31. return -ENOMEM;
  32. handle->dev = dev;
  33. handle->handler = handler;
  34. handle->name = "evbug";
  35. error = input_register_handle(handle);
  36. if (error)
  37. goto err_free_handle;
  38. error = input_open_device(handle);
  39. if (error)
  40. goto err_unregister_handle;
  41. printk(KERN_DEBUG pr_fmt("Connected device: %s (%s at %s)\n"),
  42. dev_name(&dev->dev),
  43. dev->name ?: "unknown",
  44. dev->phys ?: "unknown");
  45. return 0;
  46. err_unregister_handle:
  47. input_unregister_handle(handle);
  48. err_free_handle:
  49. kfree(handle);
  50. return error;
  51. }
  52. static void evbug_disconnect(struct input_handle *handle)
  53. {
  54. printk(KERN_DEBUG pr_fmt("Disconnected device: %s\n"),
  55. dev_name(&handle->dev->dev));
  56. input_close_device(handle);
  57. input_unregister_handle(handle);
  58. kfree(handle);
  59. }
  60. static const struct input_device_id evbug_ids[] = {
  61. { .driver_info = 1 }, /* Matches all devices */
  62. { }, /* Terminating zero entry */
  63. };
  64. MODULE_DEVICE_TABLE(input, evbug_ids);
  65. static struct input_handler evbug_handler = {
  66. .event = evbug_event,
  67. .connect = evbug_connect,
  68. .disconnect = evbug_disconnect,
  69. .name = "evbug",
  70. .id_table = evbug_ids,
  71. };
  72. static int __init evbug_init(void)
  73. {
  74. return input_register_handler(&evbug_handler);
  75. }
  76. static void __exit evbug_exit(void)
  77. {
  78. input_unregister_handler(&evbug_handler);
  79. }
  80. module_init(evbug_init);
  81. module_exit(evbug_exit);