Skip to content

Commit

Permalink
HID: wiimote: Synchronize wiimote input and hid event handling
Browse files Browse the repository at this point in the history
The wiimote first starts HID hardware and then registers the input
device. We need to synchronize the startup so no event handler will
start parsing events when the wiimote device is not ready, yet.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
David Herrmann authored and Jiri Kosina committed Jul 11, 2011
1 parent 672bc4e commit 4d36e97
Showing 1 changed file with 19 additions and 0 deletions.
19 changes: 19 additions & 0 deletions drivers/hid/hid-wiimote.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* any later version.
*/

#include <linux/atomic.h>
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/input.h>
Expand All @@ -20,19 +21,34 @@
#define WIIMOTE_NAME "Nintendo Wii Remote"

struct wiimote_data {
atomic_t ready;
struct hid_device *hdev;
struct input_dev *input;
};

static int wiimote_input_event(struct input_dev *dev, unsigned int type,
unsigned int code, int value)
{
struct wiimote_data *wdata = input_get_drvdata(dev);

if (!atomic_read(&wdata->ready))
return -EBUSY;
/* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */
smp_rmb();

return 0;
}

static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
u8 *raw_data, int size)
{
struct wiimote_data *wdata = hid_get_drvdata(hdev);

if (!atomic_read(&wdata->ready))
return -EBUSY;
/* smp_rmb: Make sure wdata->xy is available when wdata->ready is 1 */
smp_rmb();

if (size < 1)
return -EINVAL;

Expand Down Expand Up @@ -103,6 +119,9 @@ static int wiimote_hid_probe(struct hid_device *hdev,
goto err_stop;
}

/* smp_wmb: Write wdata->xy first before wdata->ready is set to 1 */
smp_wmb();
atomic_set(&wdata->ready, 1);
hid_info(hdev, "New device registered\n");
return 0;

Expand Down

0 comments on commit 4d36e97

Please sign in to comment.