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