Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 256827
b: refs/heads/master
c: 32a0d9a
h: refs/heads/master
i:
  256825: 32230e1
  256823: 257047e
v: v3
  • Loading branch information
David Herrmann authored and Jiri Kosina committed Jul 11, 2011
1 parent f8ed4f8 commit 5b938d9
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: db3083467f1527816fca95ae2d8bfe5d81503a8e
refs/heads/master: 32a0d9a522b577d0efa6ce793a6ac0516c5e3627
26 changes: 26 additions & 0 deletions trunk/drivers/hid/hid-wiimote.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ struct wiimote_buf {
size_t size;
};

struct wiimote_state {
spinlock_t lock;
__u8 flags;
};

struct wiimote_data {
atomic_t ready;
struct hid_device *hdev;
Expand All @@ -37,12 +42,16 @@ struct wiimote_data {
__u8 tail;
struct wiimote_buf outq[WIIMOTE_BUFSIZE];
struct work_struct worker;

struct wiimote_state state;
};

#define WIIPROTO_FLAG_LED1 0x01
#define WIIPROTO_FLAG_LED2 0x02
#define WIIPROTO_FLAG_LED3 0x04
#define WIIPROTO_FLAG_LED4 0x08
#define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)

enum wiiproto_reqs {
WIIPROTO_REQ_LED = 0x11,
Expand Down Expand Up @@ -160,6 +169,11 @@ static void wiiproto_req_leds(struct wiimote_data *wdata, int leds)
{
__u8 cmd[2];

leds &= WIIPROTO_FLAGS_LEDS;
if ((wdata->state.flags & WIIPROTO_FLAGS_LEDS) == leds)
return;
wdata->state.flags = (wdata->state.flags & ~WIIPROTO_FLAGS_LEDS) | leds;

cmd[0] = WIIPROTO_REQ_LED;
cmd[1] = 0;

Expand Down Expand Up @@ -232,6 +246,7 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
struct wiimote_data *wdata = hid_get_drvdata(hdev);
struct wiiproto_handler *h;
int i;
unsigned long flags;

if (!atomic_read(&wdata->ready))
return -EBUSY;
Expand All @@ -241,12 +256,16 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
if (size < 1)
return -EINVAL;

spin_lock_irqsave(&wdata->state.lock, flags);

for (i = 0; handlers[i].id; ++i) {
h = &handlers[i];
if (h->id == raw_data[0] && h->size < size)
h->func(wdata, &raw_data[1]);
}

spin_unlock_irqrestore(&wdata->state.lock, flags);

return 0;
}

Expand Down Expand Up @@ -284,6 +303,8 @@ static struct wiimote_data *wiimote_create(struct hid_device *hdev)
spin_lock_init(&wdata->qlock);
INIT_WORK(&wdata->worker, wiimote_worker);

spin_lock_init(&wdata->state.lock);

return wdata;
}

Expand Down Expand Up @@ -326,7 +347,12 @@ static int wiimote_hid_probe(struct hid_device *hdev,
smp_wmb();
atomic_set(&wdata->ready, 1);
hid_info(hdev, "New device registered\n");

/* by default set led1 after device initialization */
spin_lock_irq(&wdata->state.lock);
wiiproto_req_leds(wdata, WIIPROTO_FLAG_LED1);
spin_unlock_irq(&wdata->state.lock);

return 0;

err_stop:
Expand Down

0 comments on commit 5b938d9

Please sign in to comment.