Input: add force feedback driver for PID devices
This replaces the older PID driver which was never completed. Signed-off-by: Anssi Hannula <anssi.hannula@gmail.com> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:

committed by
Dmitry Torokhov

parent
f6a01c8596
commit
224ee88fe3
@@ -44,45 +44,34 @@ struct hid_ff_initializer {
|
||||
int (*init)(struct hid_device*);
|
||||
};
|
||||
|
||||
/*
|
||||
* We try pidff when no other driver is found because PID is the
|
||||
* standards compliant way of implementing force feedback in HID.
|
||||
* pidff_init() will quickly abort if the device doesn't appear to
|
||||
* be a PID device
|
||||
*/
|
||||
static struct hid_ff_initializer inits[] = {
|
||||
#ifdef CONFIG_LOGITECH_FF
|
||||
{0x46d, 0xc211, hid_lgff_init}, // Logitech Cordless rumble pad
|
||||
{0x46d, 0xc283, hid_lgff_init}, // Logitech Wingman Force 3d
|
||||
{0x46d, 0xc295, hid_lgff_init}, // Logitech MOMO force wheel
|
||||
{0x46d, 0xc219, hid_lgff_init}, // Logitech Cordless rumble pad 2
|
||||
#endif
|
||||
#ifdef CONFIG_HID_PID
|
||||
{0x45e, 0x001b, hid_pid_init},
|
||||
{ 0x46d, 0xc211, hid_lgff_init }, /* Logitech Cordless rumble pad */
|
||||
{ 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */
|
||||
{ 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */
|
||||
{ 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */
|
||||
#endif
|
||||
#ifdef CONFIG_THRUSTMASTER_FF
|
||||
{0x44f, 0xb304, hid_tmff_init},
|
||||
{ 0x44f, 0xb304, hid_tmff_init },
|
||||
#endif
|
||||
{0, 0, NULL} /* Terminating entry */
|
||||
{ 0, 0, hid_pidff_init} /* Matches anything */
|
||||
};
|
||||
|
||||
static struct hid_ff_initializer *hid_get_ff_init(__u16 idVendor,
|
||||
__u16 idProduct)
|
||||
{
|
||||
struct hid_ff_initializer *init;
|
||||
for (init = inits;
|
||||
init->idVendor
|
||||
&& !(init->idVendor == idVendor
|
||||
&& init->idProduct == idProduct);
|
||||
init++);
|
||||
|
||||
return init->idVendor? init : NULL;
|
||||
}
|
||||
|
||||
int hid_ff_init(struct hid_device* hid)
|
||||
{
|
||||
struct hid_ff_initializer *init;
|
||||
int vendor = le16_to_cpu(hid->dev->descriptor.idVendor);
|
||||
int product = le16_to_cpu(hid->dev->descriptor.idProduct);
|
||||
|
||||
init = hid_get_ff_init(le16_to_cpu(hid->dev->descriptor.idVendor),
|
||||
le16_to_cpu(hid->dev->descriptor.idProduct));
|
||||
for (init = inits; init->idVendor; init++)
|
||||
if (init->idVendor == vendor && init->idProduct == product)
|
||||
break;
|
||||
|
||||
if (!init) {
|
||||
dbg("hid_ff_init could not find initializer");
|
||||
return -ENOSYS;
|
||||
}
|
||||
return init->init(hid);
|
||||
}
|
||||
|
Reference in New Issue
Block a user