Merge remote-tracking branch 'stable/linux-5.15.y' into rpi-5.15.y
[platform/kernel/linux-rpi.git] / drivers / input / evbug.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  Copyright (c) 1999-2001 Vojtech Pavlik
4  */
5
6 /*
7  *  Input driver event debug module - dumps all events into syslog
8  */
9
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
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
18 MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
19 MODULE_DESCRIPTION("Input driver event debug module");
20 MODULE_LICENSE("GPL");
21
22 static 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
28 static 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
64 static 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
74 static const struct input_device_id evbug_ids[] = {
75         { .driver_info = 1 },   /* Matches all devices */
76         { },                    /* Terminating zero entry */
77 };
78
79 MODULE_DEVICE_TABLE(input, evbug_ids);
80
81 static 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
89 static int __init evbug_init(void)
90 {
91         return input_register_handler(&evbug_handler);
92 }
93
94 static void __exit evbug_exit(void)
95 {
96         input_unregister_handler(&evbug_handler);
97 }
98
99 module_init(evbug_init);
100 module_exit(evbug_exit);