diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
| -rw-r--r-- | drivers/hid/hid-input.c | 36 | 
1 files changed, 27 insertions, 9 deletions
| diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 2c72ce4147b1..1ce75e8b49d5 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -52,6 +52,7 @@ static const struct {  #define map_rel(c)	hid_map_usage(hidinput, usage, &bit, &max, EV_REL, (c))  #define map_key(c)	hid_map_usage(hidinput, usage, &bit, &max, EV_KEY, (c))  #define map_led(c)	hid_map_usage(hidinput, usage, &bit, &max, EV_LED, (c)) +#define map_msc(c)	hid_map_usage(hidinput, usage, &bit, &max, EV_MSC, (c))  #define map_abs_clear(c)	hid_map_usage_clear(hidinput, usage, &bit, \  		&max, EV_ABS, (c)) @@ -160,6 +161,7 @@ static int hidinput_setkeycode(struct input_dev *dev,  	if (usage) {  		*old_keycode = usage->type == EV_KEY ?  				usage->code : KEY_RESERVED; +		usage->type = EV_KEY;  		usage->code = ke->keycode;  		clear_bit(*old_keycode, dev->keybit); @@ -324,6 +326,10 @@ static const struct hid_device_id hid_battery_quirks[] = {  	  HID_BATTERY_QUIRK_IGNORE },  	{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),  	  HID_BATTERY_QUIRK_IGNORE }, +	{ HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN), +	  HID_BATTERY_QUIRK_IGNORE }, +	{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_ENVY_X360_15), +	  HID_BATTERY_QUIRK_IGNORE },  	{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_HP_SPECTRE_X360_15),  	  HID_BATTERY_QUIRK_IGNORE },  	{ HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, I2C_DEVICE_ID_SURFACE_GO_TOUCHSCREEN), @@ -650,10 +656,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  						code += KEY_MACRO1;  					else  						code += BTN_TRIGGER_HAPPY - 0x1e; -				} else { -					goto ignore; +					break;  				} -				break; +				fallthrough;  		default:  			switch (field->physical) {  			case HID_GD_MOUSE: @@ -872,10 +877,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x5b: /* TransducerSerialNumber */  		case 0x6e: /* TransducerSerialNumber2 */ -			usage->type = EV_MSC; -			usage->code = MSC_SERIAL; -			bit = input->mscbit; -			max = MSC_MAX; +			map_msc(MSC_SERIAL);  			break;  		default:  goto unknown; @@ -1329,6 +1331,12 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct  	input = field->hidinput->input; +	if (usage->type == EV_ABS && +	    (((*quirks & HID_QUIRK_X_INVERT) && usage->code == ABS_X) || +	     ((*quirks & HID_QUIRK_Y_INVERT) && usage->code == ABS_Y))) { +		value = field->logical_maximum - value; +	} +  	if (usage->hat_min < usage->hat_max || usage->hat_dir) {  		int hat_dir = usage->hat_dir;  		if (!hat_dir) @@ -1461,7 +1469,8 @@ void hidinput_report_event(struct hid_device *hid, struct hid_report *report)  }  EXPORT_SYMBOL_GPL(hidinput_report_event); -int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field) +static int hidinput_find_field(struct hid_device *hid, unsigned int type, +			       unsigned int code, struct hid_field **field)  {  	struct hid_report *report;  	int i, j; @@ -1476,7 +1485,6 @@ int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int  	}  	return -1;  } -EXPORT_SYMBOL_GPL(hidinput_find_field);  struct hid_field *hidinput_get_led_field(struct hid_device *hid)  { @@ -1739,6 +1747,16 @@ static struct hid_input *hidinput_allocate(struct hid_device *hid,  		case HID_GD_MOUSE:  			suffix = "Mouse";  			break; +		case HID_DG_PEN: +			/* +			 * yes, there is an issue here: +			 *  DG_PEN -> "Stylus" +			 *  DG_STYLUS -> "Pen" +			 * But changing this now means users with config snippets +			 * will have to change it and the test suite will not be happy. +			 */ +			suffix = "Stylus"; +			break;  		case HID_DG_STYLUS:  			suffix = "Pen";  			break; |