[PATCH 4/5] Input: serio_raw - add debugfs interface

From: Che-Liang Chiou
Date: Tue Feb 07 2012 - 22:26:14 EST


Add debugfs interface for each serio_raw module instance. Take
serio_raw0 for example, the interface should look like:

/sys/kernel/debug/serio_raw0/replay
.../user
.../device

Signed-off-by: Che-Liang Chiou <clchiou@xxxxxxxxxxxx>
---
drivers/input/serio/serio_raw.c | 51 +++++++++++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)

diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c
index 5d13c64..7b02691 100644
--- a/drivers/input/serio/serio_raw.c
+++ b/drivers/input/serio/serio_raw.c
@@ -21,6 +21,7 @@
#include <linux/miscdevice.h>
#include <linux/wait.h>
#include <linux/mutex.h>
+#include <linux/debugfs.h>

#define DRIVER_DESC "Raw serio driver"

@@ -45,6 +46,9 @@ struct serio_raw {
struct list_head client_list;
struct list_head node;
bool dead;
+ u32 replay; /* not bool because debugfs_create_bool() takes u32 */
+
+ struct dentry *dentry;
};

struct serio_raw_client {
@@ -342,6 +346,17 @@ static const struct file_operations serio_raw_fops = {


/*********************************************************************
+ * Interface with debugfs (file operations) *
+ *********************************************************************/
+
+static const struct file_operations debug_user_fops = {
+};
+
+static const struct file_operations debug_device_fops = {
+};
+
+
+/*********************************************************************
* Interface with serio port *
*********************************************************************/

@@ -361,6 +376,36 @@ static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data,
return IRQ_HANDLED;
}

+static int serio_raw_debug_init(struct serio_raw *serio_raw)
+{
+ const mode_t mode = S_IRUSR | S_IWUSR;
+
+ serio_raw->dentry = debugfs_create_dir(serio_raw->name, NULL);
+ if (!serio_raw->dentry)
+ return -ENOENT;
+
+ if (!debugfs_create_bool("replay", mode, serio_raw->dentry,
+ &serio_raw->replay))
+ goto err;
+ if (!debugfs_create_file("user", mode, serio_raw->dentry, serio_raw,
+ &debug_user_fops))
+ goto err;
+ if (!debugfs_create_file("device", mode, serio_raw->dentry, serio_raw,
+ &debug_device_fops))
+ goto err;
+
+ return 0;
+
+err:
+ debugfs_remove_recursive(serio_raw->dentry);
+ return -ENOENT;
+}
+
+static void serio_raw_debug_cleanup(struct serio_raw *serio_raw)
+{
+ debugfs_remove_recursive(serio_raw->dentry);
+}
+
static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
{
static atomic_t serio_raw_no = ATOMIC_INIT(0);
@@ -413,6 +458,10 @@ static int serio_raw_connect(struct serio *serio, struct serio_driver *drv)
goto err_unlink;
}

+ if (serio_raw_debug_init(serio_raw))
+ dev_warn(&serio->dev, "failed to register debugfs for %s\n",
+ serio->phys);
+
dev_info(&serio->dev, "raw access enabled on %s (%s, minor %d)\n",
serio->phys, serio_raw->name, serio_raw->dev.minor);
return 0;
@@ -475,6 +524,8 @@ static void serio_raw_disconnect(struct serio *serio)

serio_raw_hangup(serio_raw);

+ serio_raw_debug_cleanup(serio_raw);
+
serio_close(serio);
kref_put(&serio_raw->kref, serio_raw_free);

--
1.7.7.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/