]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/hid/hid-wiimote.h
HID: wiimote: add device detection
[mirror_ubuntu-jammy-kernel.git] / drivers / hid / hid-wiimote.h
index c81dbeb086c556b097dbfb3030bdf2dc62b382f3..301607da771520493f2c9f99dc027ede9082fb8f 100644 (file)
@@ -2,8 +2,8 @@
 #define __HID_WIIMOTE_H
 
 /*
- * HID driver for Nintendo Wiimote devices
- * Copyright (c) 2011 David Herrmann
+ * HID driver for Nintendo Wii / Wii U peripherals
+ * Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
  */
 
 /*
@@ -35,6 +35,8 @@
 #define WIIPROTO_FLAG_IR_BASIC         0x40
 #define WIIPROTO_FLAG_IR_EXT           0x80
 #define WIIPROTO_FLAG_IR_FULL          0xc0 /* IR_BASIC | IR_EXT */
+#define WIIPROTO_FLAG_EXT_PLUGGED      0x0100
+
 #define WIIPROTO_FLAGS_LEDS (WIIPROTO_FLAG_LED1 | WIIPROTO_FLAG_LED2 | \
                                        WIIPROTO_FLAG_LED3 | WIIPROTO_FLAG_LED4)
 #define WIIPROTO_FLAGS_IR (WIIPROTO_FLAG_IR_BASIC | WIIPROTO_FLAG_IR_EXT | \
 /* return flag for led \num */
 #define WIIPROTO_FLAG_LED(num) (WIIPROTO_FLAG_LED1 << (num - 1))
 
+enum wiimote_devtype {
+       WIIMOTE_DEV_PENDING,
+       WIIMOTE_DEV_UNKNOWN,
+       WIIMOTE_DEV_GENERIC,
+       WIIMOTE_DEV_GEN10,
+       WIIMOTE_DEV_GEN20,
+       WIIMOTE_DEV_NUM,
+};
+
+enum wiimote_exttype {
+       WIIMOTE_EXT_NONE,
+       WIIMOTE_EXT_UNKNOWN,
+       WIIMOTE_EXT_NUM,
+};
+
 struct wiimote_buf {
        __u8 data[HID_MAX_BUFFER_SIZE];
        size_t size;
 };
 
+struct wiimote_queue {
+       spinlock_t lock;
+       struct work_struct worker;
+       __u8 head;
+       __u8 tail;
+       struct wiimote_buf outq[WIIMOTE_BUFSIZE];
+};
+
 struct wiimote_state {
        spinlock_t lock;
-       __u8 flags;
+       __u32 flags;
        __u8 accel_split[2];
        __u8 drm;
+       __u8 devtype;
 
        /* synchronous cmd requests */
        struct mutex sync;
@@ -77,13 +103,9 @@ struct wiimote_data {
        struct wiimote_ext *ext;
        struct wiimote_debug *debug;
 
-       spinlock_t qlock;
-       __u8 head;
-       __u8 tail;
-       struct wiimote_buf outq[WIIMOTE_BUFSIZE];
-       struct work_struct worker;
-
+       struct wiimote_queue queue;
        struct wiimote_state state;
+       struct work_struct init_worker;
 };
 
 enum wiiproto_reqs {
@@ -178,6 +200,11 @@ static inline int wiimote_cmd_acquire(struct wiimote_data *wdata)
        return mutex_lock_interruptible(&wdata->state.sync) ? -ERESTARTSYS : 0;
 }
 
+static inline void wiimote_cmd_acquire_noint(struct wiimote_data *wdata)
+{
+       mutex_lock(&wdata->state.sync);
+}
+
 /* requires the state.lock spinlock to be held */
 static inline void wiimote_cmd_set(struct wiimote_data *wdata, int cmd,
                                                                __u32 opt)
@@ -205,4 +232,15 @@ static inline int wiimote_cmd_wait(struct wiimote_data *wdata)
                return 0;
 }
 
+static inline int wiimote_cmd_wait_noint(struct wiimote_data *wdata)
+{
+       unsigned long ret;
+
+       ret = wait_for_completion_timeout(&wdata->state.ready, HZ);
+       if (!ret)
+               return -EIO;
+       else
+               return 0;
+}
+
 #endif