diff options
Diffstat (limited to 'drivers/hid/hid-input-quirks.c')
| -rw-r--r-- | drivers/hid/hid-input-quirks.c | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/hid/hid-input-quirks.c b/drivers/hid/hid-input-quirks.c index 4c2052c658f..16feea01449 100644 --- a/drivers/hid/hid-input-quirks.c +++ b/drivers/hid/hid-input-quirks.c @@ -89,6 +89,29 @@ static int quirk_logitech_ultrax_remote(struct hid_usage *usage, struct input_de  	return 1;  } +static int quirk_gyration_remote(struct hid_usage *usage, struct input_dev *input, +			      unsigned long **bit, int *max) +{ +	if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR) +		return 0; + +	set_bit(EV_REP, input->evbit); +	switch(usage->hid & HID_USAGE) { +		/* Reported on Gyration MCE Remote */ +		case 0x00d: map_key_clear(KEY_HOME);		break; +		case 0x024: map_key_clear(KEY_DVD);		break; +		case 0x025: map_key_clear(KEY_PVR);		break; +		case 0x046: map_key_clear(KEY_MEDIA);		break; +		case 0x047: map_key_clear(KEY_MP3);		break; +		case 0x049: map_key_clear(KEY_CAMERA);		break; +		case 0x04a: map_key_clear(KEY_VIDEO);		break; + +		default: +			return 0; +	} +	return 1; +} +  static int quirk_chicony_tactical_pad(struct hid_usage *usage, struct input_dev *input,  			      unsigned long **bit, int *max)  { @@ -303,6 +326,9 @@ static int quirk_sunplus_wdesktop(struct hid_usage *usage, struct input_dev *inp  #define VENDOR_ID_EZKEY				0x0518  #define DEVICE_ID_BTC_8193			0x0002 +#define VENDOR_ID_GYRATION			0x0c16 +#define DEVICE_ID_GYRATION_REMOTE		0x0002 +  #define VENDOR_ID_LOGITECH			0x046d  #define DEVICE_ID_LOGITECH_RECEIVER		0xc101  #define DEVICE_ID_S510_RECEIVER			0xc50c @@ -337,6 +363,8 @@ static const struct hid_input_blacklist {  	{ VENDOR_ID_EZKEY, DEVICE_ID_BTC_8193, quirk_btc_8193 }, +	{ VENDOR_ID_GYRATION, DEVICE_ID_GYRATION_REMOTE, quirk_gyration_remote }, +  	{ VENDOR_ID_LOGITECH, DEVICE_ID_LOGITECH_RECEIVER, quirk_logitech_ultrax_remote },  	{ VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER, quirk_logitech_wireless },  	{ VENDOR_ID_LOGITECH, DEVICE_ID_S510_RECEIVER_2, quirk_logitech_wireless }, @@ -438,6 +466,18 @@ int hidinput_event_quirks(struct hid_device *hid, struct hid_field *field, struc  		input_event(input, usage->type, REL_WHEEL, -value);  		return 1;  	} + +	/* Gyration MCE remote "Sleep" key */ +	if (hid->vendor == VENDOR_ID_GYRATION && +	    hid->product == DEVICE_ID_GYRATION_REMOTE && +	    (usage->hid & HID_USAGE_PAGE) == HID_UP_GENDESK && +	    (usage->hid & 0xff) == 0x82) { +		input_event(input, usage->type, usage->code, 1); +		input_sync(input); +		input_event(input, usage->type, usage->code, 0); +		input_sync(input); +		return 1; +	}  	return 0;  }  |