diff options
author | David Herrmann <dh.herrmann@googlemail.com> | 2011-11-17 14:12:10 +0100 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2011-11-22 23:10:26 +0100 |
commit | 43e5e7c60ee7039f538ccfaaa4e99829719d9bea (patch) | |
tree | c97a33352738f583e8f0c563af733914e02b147a /drivers/hid | |
parent | 5906215bab9fccf7aa2c4305accf0716c4634d69 (diff) | |
download | linux-stable-43e5e7c60ee7039f538ccfaaa4e99829719d9bea.tar.gz linux-stable-43e5e7c60ee7039f538ccfaaa4e99829719d9bea.tar.bz2 linux-stable-43e5e7c60ee7039f538ccfaaa4e99829719d9bea.zip |
HID: wiimote: Add debugfs support stubs
Add initializer and deinitializer for debugfs support. This will later allow raw
eeprom access and direct DRM modifications to debug wiimote behaviour and
further protocol reverse-engineerings.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/Makefile | 3 | ||||
-rw-r--r-- | drivers/hid/hid-wiimote-core.c | 5 | ||||
-rw-r--r-- | drivers/hid/hid-wiimote-debug.c | 52 | ||||
-rw-r--r-- | drivers/hid/hid-wiimote.h | 13 |
4 files changed, 73 insertions, 0 deletions
diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 5fab4e632eab..15c1a84537eb 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -29,6 +29,9 @@ hid-wiimote-y := hid-wiimote-core.o ifdef CONFIG_HID_WIIMOTE_EXT hid-wiimote-y += hid-wiimote-ext.o endif +ifdef CONFIG_DEBUG_FS + hid-wiimote-y += hid-wiimote-debug.o +endif obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o obj-$(CONFIG_HID_ACRUX) += hid-axff.o diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c index d8ed1ec58e9f..919abbaba840 100644 --- a/drivers/hid/hid-wiimote-core.c +++ b/drivers/hid/hid-wiimote-core.c @@ -1161,6 +1161,7 @@ err: static void wiimote_destroy(struct wiimote_data *wdata) { + wiidebug_deinit(wdata); wiiext_deinit(wdata); wiimote_leds_destroy(wdata); @@ -1237,6 +1238,10 @@ static int wiimote_hid_probe(struct hid_device *hdev, if (ret) goto err_free; + ret = wiidebug_init(wdata); + if (ret) + goto err_free; + hid_info(hdev, "New device registered\n"); /* by default set led1 after device initialization */ diff --git a/drivers/hid/hid-wiimote-debug.c b/drivers/hid/hid-wiimote-debug.c new file mode 100644 index 000000000000..6282e3c1a362 --- /dev/null +++ b/drivers/hid/hid-wiimote-debug.c @@ -0,0 +1,52 @@ +/* + * Debug support for HID Nintendo Wiimote devices + * Copyright (c) 2011 David Herrmann + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + */ + +#include <linux/module.h> +#include <linux/spinlock.h> +#include "hid-wiimote.h" + +struct wiimote_debug { + struct wiimote_data *wdata; +}; + +int wiidebug_init(struct wiimote_data *wdata) +{ + struct wiimote_debug *dbg; + unsigned long flags; + + dbg = kzalloc(sizeof(*dbg), GFP_KERNEL); + if (!dbg) + return -ENOMEM; + + dbg->wdata = wdata; + + spin_lock_irqsave(&wdata->state.lock, flags); + wdata->debug = dbg; + spin_unlock_irqrestore(&wdata->state.lock, flags); + + return 0; +} + +void wiidebug_deinit(struct wiimote_data *wdata) +{ + struct wiimote_debug *dbg = wdata->debug; + unsigned long flags; + + if (!dbg) + return; + + spin_lock_irqsave(&wdata->state.lock, flags); + wdata->debug = NULL; + spin_unlock_irqrestore(&wdata->state.lock, flags); + + kfree(dbg); +} diff --git a/drivers/hid/hid-wiimote.h b/drivers/hid/hid-wiimote.h index 1f3e53a3a148..89b8851dbf1f 100644 --- a/drivers/hid/hid-wiimote.h +++ b/drivers/hid/hid-wiimote.h @@ -74,6 +74,7 @@ struct wiimote_data { struct input_dev *ir; struct power_supply battery; struct wiimote_ext *ext; + struct wiimote_debug *debug; spinlock_t qlock; __u8 head; @@ -137,6 +138,18 @@ static inline void wiiext_handle(void *u, const __u8 *p) { } #endif +#ifdef CONFIG_DEBUG_FS + +extern int wiidebug_init(struct wiimote_data *wdata); +extern void wiidebug_deinit(struct wiimote_data *wdata); + +#else + +static inline int wiidebug_init(void *u) { return 0; } +static inline void wiidebug_deinit(void *u) { } + +#endif + /* requires the state.lock spinlock to be held */ static inline bool wiimote_cmd_pending(struct wiimote_data *wdata, int cmd, __u32 opt) |