0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0011
0012 #include <linux/slab.h>
0013 #include <linux/module.h>
0014 #include <linux/input.h>
0015 #include <linux/init.h>
0016 #include <linux/device.h>
0017
0018 MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
0019 MODULE_DESCRIPTION("Input driver event debug module");
0020 MODULE_LICENSE("GPL");
0021
0022 static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
0023 {
0024 printk(KERN_DEBUG pr_fmt("Event. Dev: %s, Type: %d, Code: %d, Value: %d\n"),
0025 dev_name(&handle->dev->dev), type, code, value);
0026 }
0027
0028 static int evbug_connect(struct input_handler *handler, struct input_dev *dev,
0029 const struct input_device_id *id)
0030 {
0031 struct input_handle *handle;
0032 int error;
0033
0034 handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
0035 if (!handle)
0036 return -ENOMEM;
0037
0038 handle->dev = dev;
0039 handle->handler = handler;
0040 handle->name = "evbug";
0041
0042 error = input_register_handle(handle);
0043 if (error)
0044 goto err_free_handle;
0045
0046 error = input_open_device(handle);
0047 if (error)
0048 goto err_unregister_handle;
0049
0050 printk(KERN_DEBUG pr_fmt("Connected device: %s (%s at %s)\n"),
0051 dev_name(&dev->dev),
0052 dev->name ?: "unknown",
0053 dev->phys ?: "unknown");
0054
0055 return 0;
0056
0057 err_unregister_handle:
0058 input_unregister_handle(handle);
0059 err_free_handle:
0060 kfree(handle);
0061 return error;
0062 }
0063
0064 static void evbug_disconnect(struct input_handle *handle)
0065 {
0066 printk(KERN_DEBUG pr_fmt("Disconnected device: %s\n"),
0067 dev_name(&handle->dev->dev));
0068
0069 input_close_device(handle);
0070 input_unregister_handle(handle);
0071 kfree(handle);
0072 }
0073
0074 static const struct input_device_id evbug_ids[] = {
0075 { .driver_info = 1 },
0076 { },
0077 };
0078
0079 MODULE_DEVICE_TABLE(input, evbug_ids);
0080
0081 static struct input_handler evbug_handler = {
0082 .event = evbug_event,
0083 .connect = evbug_connect,
0084 .disconnect = evbug_disconnect,
0085 .name = "evbug",
0086 .id_table = evbug_ids,
0087 };
0088
0089 static int __init evbug_init(void)
0090 {
0091 return input_register_handler(&evbug_handler);
0092 }
0093
0094 static void __exit evbug_exit(void)
0095 {
0096 input_unregister_handler(&evbug_handler);
0097 }
0098
0099 module_init(evbug_init);
0100 module_exit(evbug_exit);