Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 282344
b: refs/heads/master
c: 1d3452c
h: refs/heads/master
v: v3
  • Loading branch information
David Herrmann authored and Jiri Kosina committed Nov 22, 2011
1 parent 49d07c8 commit d358084
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 43e5e7c60ee7039f538ccfaaa4e99829719d9bea
refs/heads/master: 1d3452c63d4b62329d34d7634f67a3dbec21ca87
10 changes: 2 additions & 8 deletions trunk/drivers/hid/hid-wiimote-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -320,14 +320,8 @@ static void wiiproto_req_wmem(struct wiimote_data *wdata, bool eeprom,
wiimote_queue(wdata, cmd, sizeof(cmd));
}

#define wiiproto_req_rreg(wdata, os, sz) \
wiiproto_req_rmem((wdata), false, (os), (sz))

#define wiiproto_req_reeprom(wdata, os, sz) \
wiiproto_req_rmem((wdata), true, (os), (sz))

static void wiiproto_req_rmem(struct wiimote_data *wdata, bool eeprom,
__u32 offset, __u16 size)
void wiiproto_req_rmem(struct wiimote_data *wdata, bool eeprom, __u32 offset,
__u16 size)
{
__u8 cmd[7];

Expand Down
76 changes: 76 additions & 0 deletions trunk/drivers/hid/hid-wiimote-debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,80 @@
* any later version.
*/

#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/uaccess.h>
#include "hid-wiimote.h"

struct wiimote_debug {
struct wiimote_data *wdata;
struct dentry *eeprom;
};

static int wiidebug_eeprom_open(struct inode *i, struct file *f)
{
f->private_data = i->i_private;
return 0;
}

static ssize_t wiidebug_eeprom_read(struct file *f, char __user *u, size_t s,
loff_t *off)
{
struct wiimote_debug *dbg = f->private_data;
struct wiimote_data *wdata = dbg->wdata;
unsigned long flags;
ssize_t ret;
char buf[16];
__u16 size;

if (s == 0)
return -EINVAL;
if (*off > 0xffffff)
return 0;
if (s > 16)
s = 16;

ret = wiimote_cmd_acquire(wdata);
if (ret)
return ret;

spin_lock_irqsave(&wdata->state.lock, flags);
wdata->state.cmd_read_size = s;
wdata->state.cmd_read_buf = buf;
wiimote_cmd_set(wdata, WIIPROTO_REQ_RMEM, *off & 0xffff);
wiiproto_req_reeprom(wdata, *off, s);
spin_unlock_irqrestore(&wdata->state.lock, flags);

ret = wiimote_cmd_wait(wdata);
if (!ret)
size = wdata->state.cmd_read_size;

spin_lock_irqsave(&wdata->state.lock, flags);
wdata->state.cmd_read_buf = NULL;
spin_unlock_irqrestore(&wdata->state.lock, flags);

wiimote_cmd_release(wdata);

if (ret)
return ret;
else if (size == 0)
return -EIO;

if (copy_to_user(u, buf, size))
return -EFAULT;

*off += size;
ret = size;

return ret;
}

static const struct file_operations wiidebug_eeprom_fops = {
.owner = THIS_MODULE,
.open = wiidebug_eeprom_open,
.read = wiidebug_eeprom_read,
.llseek = generic_file_llseek,
};

int wiidebug_init(struct wiimote_data *wdata)
Expand All @@ -29,6 +97,13 @@ int wiidebug_init(struct wiimote_data *wdata)

dbg->wdata = wdata;

dbg->eeprom = debugfs_create_file("eeprom", S_IRUSR,
dbg->wdata->hdev->debug_dir, dbg, &wiidebug_eeprom_fops);
if (!dbg->eeprom) {
kfree(dbg);
return -ENOMEM;
}

spin_lock_irqsave(&wdata->state.lock, flags);
wdata->debug = dbg;
spin_unlock_irqrestore(&wdata->state.lock, flags);
Expand All @@ -48,5 +123,6 @@ void wiidebug_deinit(struct wiimote_data *wdata)
wdata->debug = NULL;
spin_unlock_irqrestore(&wdata->state.lock, flags);

debugfs_remove(dbg->eeprom);
kfree(dbg);
}
7 changes: 7 additions & 0 deletions trunk/drivers/hid/hid-wiimote.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,13 @@ extern int wiimote_cmd_write(struct wiimote_data *wdata, __u32 offset,
extern ssize_t wiimote_cmd_read(struct wiimote_data *wdata, __u32 offset,
__u8 *rmem, __u8 size);

#define wiiproto_req_rreg(wdata, os, sz) \
wiiproto_req_rmem((wdata), false, (os), (sz))
#define wiiproto_req_reeprom(wdata, os, sz) \
wiiproto_req_rmem((wdata), true, (os), (sz))
extern void wiiproto_req_rmem(struct wiimote_data *wdata, bool eeprom,
__u32 offset, __u16 size);

#ifdef CONFIG_HID_WIIMOTE_EXT

extern int wiiext_init(struct wiimote_data *wdata);
Expand Down

0 comments on commit d358084

Please sign in to comment.