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
45
drivers/hid/hid-wiimote-modules.c
Normal file
45
drivers/hid/hid-wiimote-modules.c
Normal file
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Device Modules for Nintendo Wii / Wii U HID Driver
|
||||
* Copyright (c) 2011-2013 David Herrmann <dh.herrmann@gmail.com>
|
||||
*/
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wiimote Modules
|
||||
* Nintendo devices provide different peripherals and many new devices lack
|
||||
* initial features like the IR camera. Therefore, each peripheral device is
|
||||
* implemented as an independent module and we probe on each device only the
|
||||
* modules for the hardware that really is available.
|
||||
*
|
||||
* Module registration is sequential. Unregistration is done in reverse order.
|
||||
* After device detection, the needed modules are loaded. Users can trigger
|
||||
* re-detection which causes all modules to be unloaded and then reload the
|
||||
* modules for the new detected device.
|
||||
*
|
||||
* wdata->input is a shared input device. It is always initialized prior to
|
||||
* module registration. If at least one registered module is marked as
|
||||
* WIIMOD_FLAG_INPUT, then the input device will get registered after all
|
||||
* modules were registered.
|
||||
* Please note that it is unregistered _before_ the "remove" callbacks are
|
||||
* called. This guarantees that no input interaction is done, anymore. However,
|
||||
* the wiimote core keeps a reference to the input device so it is freed only
|
||||
* after all modules were removed. It is safe to send events to unregistered
|
||||
* input devices.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/hid.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include "hid-wiimote.h"
|
||||
|
||||
/* module table */
|
||||
|
||||
const struct wiimod_ops *wiimod_table[WIIMOD_NUM] = {
|
||||
};
|
Reference in New Issue
Block a user