Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Copyright (c) 1999-2001 Vojtech Pavlik
0004  */
0005 
0006 /*
0007  *  Input driver event debug module - dumps all events into syslog
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 },   /* Matches all devices */
0076     { },            /* Terminating zero entry */
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);