HID: wiimote: add sub-device module infrastructure
To avoid loading all sub-device drivers for every Wii Remote, even though the required hardware might not be available, we introduce a module layer. The module layer specifies which sub-devices are available on each device-type. After device detection, we only load the modules for the detected device. If module loading fails, we unload everything and mark the device as WIIMOTE_DEV_UNKNOWN. As long as a device is marked as "unknown", no sub-devices will be used and the device is considered unsupported. All the different sub-devices, including KEYS, RUMBLE, BATTERY, LEDS, ACCELEROMETER, IR and more will be ported in follow-up patches to the new module layer. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:

committed by
Jiri Kosina

parent
d758b1f0c5
commit
27f0694214
@@ -108,6 +108,33 @@ struct wiimote_data {
|
||||
struct work_struct init_worker;
|
||||
};
|
||||
|
||||
/* wiimote modules */
|
||||
|
||||
enum wiimod_module {
|
||||
WIIMOD_NUM,
|
||||
WIIMOD_NULL = WIIMOD_NUM,
|
||||
};
|
||||
|
||||
#define WIIMOD_FLAG_INPUT 0x0001
|
||||
|
||||
struct wiimod_ops {
|
||||
__u16 flags;
|
||||
unsigned long arg;
|
||||
int (*probe) (const struct wiimod_ops *ops,
|
||||
struct wiimote_data *wdata);
|
||||
void (*remove) (const struct wiimod_ops *ops,
|
||||
struct wiimote_data *wdata);
|
||||
|
||||
void (*in_keys) (struct wiimote_data *wdata, const __u8 *keys);
|
||||
void (*in_accel) (struct wiimote_data *wdata, const __u8 *accel);
|
||||
void (*in_ir) (struct wiimote_data *wdata, const __u8 *ir, bool packed,
|
||||
unsigned int id);
|
||||
};
|
||||
|
||||
extern const struct wiimod_ops *wiimod_table[WIIMOD_NUM];
|
||||
|
||||
/* wiimote requests */
|
||||
|
||||
enum wiiproto_reqs {
|
||||
WIIPROTO_REQ_NULL = 0x0,
|
||||
WIIPROTO_REQ_RUMBLE = 0x10,
|
||||
|
Reference in New Issue
Block a user