diff options
Diffstat (limited to 'drivers/hid/hid-input.c')
| -rw-r--r-- | drivers/hid/hid-input.c | 57 | 
1 files changed, 37 insertions, 20 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c index 8741d953dcc..2619f7f4517 100644 --- a/drivers/hid/hid-input.c +++ b/drivers/hid/hid-input.c @@ -192,6 +192,7 @@ static int hidinput_setkeycode(struct input_dev *dev,  	return -EINVAL;  } +  /**   * hidinput_calc_abs_res - calculate an absolute axis resolution   * @field: the HID report field to calculate resolution for @@ -234,23 +235,17 @@ __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)  	case ABS_MT_TOOL_Y:  	case ABS_MT_TOUCH_MAJOR:  	case ABS_MT_TOUCH_MINOR: -		if (field->unit & 0xffffff00)		/* Not a length */ -			return 0; -		unit_exponent += hid_snto32(field->unit >> 4, 4) - 1; -		switch (field->unit & 0xf) { -		case 0x1:				/* If centimeters */ +		if (field->unit == 0x11) {		/* If centimeters */  			/* Convert to millimeters */  			unit_exponent += 1; -			break; -		case 0x3:				/* If inches */ +		} else if (field->unit == 0x13) {	/* If inches */  			/* Convert to millimeters */  			prev = physical_extents;  			physical_extents *= 254;  			if (physical_extents < prev)  				return 0;  			unit_exponent -= 1; -			break; -		default: +		} else {  			return 0;  		}  		break; @@ -355,9 +350,9 @@ static int hidinput_get_battery_property(struct power_supply *psy,  			ret = -ENOMEM;  			break;  		} -		ret = dev->hid_get_raw_report(dev, dev->battery_report_id, -					      buf, 2, -					      dev->battery_report_type); +		ret = hid_hw_raw_request(dev, dev->battery_report_id, buf, 2, +					 dev->battery_report_type, +					 HID_REQ_GET_REPORT);  		if (ret != 2) {  			ret = -ENODATA; @@ -689,9 +684,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  			break;  		case 0x46: /* TabletPick */ +		case 0x5a: /* SecondaryBarrelSwitch */  			map_key_clear(BTN_STYLUS2);  			break; +		case 0x5b: /* TransducerSerialNumber */ +			set_bit(MSC_SERIAL, input->mscbit); +			break; +  		default:  goto unknown;  		}  		break; @@ -726,6 +726,13 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x06c: map_key_clear(KEY_YELLOW);		break;  		case 0x06d: map_key_clear(KEY_ZOOM);		break; +		case 0x06f: map_key_clear(KEY_BRIGHTNESSUP);		break; +		case 0x070: map_key_clear(KEY_BRIGHTNESSDOWN);		break; +		case 0x072: map_key_clear(KEY_BRIGHTNESS_TOGGLE);	break; +		case 0x073: map_key_clear(KEY_BRIGHTNESS_MIN);		break; +		case 0x074: map_key_clear(KEY_BRIGHTNESS_MAX);		break; +		case 0x075: map_key_clear(KEY_BRIGHTNESS_AUTO);		break; +  		case 0x082: map_key_clear(KEY_VIDEO_NEXT);	break;  		case 0x083: map_key_clear(KEY_LAST);		break;  		case 0x084: map_key_clear(KEY_ENTER);		break; @@ -766,6 +773,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x0bf: map_key_clear(KEY_SLOW);		break;  		case 0x0cd: map_key_clear(KEY_PLAYPAUSE);	break; +		case 0x0cf: map_key_clear(KEY_VOICECOMMAND);	break;  		case 0x0e0: map_abs_clear(ABS_VOLUME);		break;  		case 0x0e2: map_key_clear(KEY_MUTE);		break;  		case 0x0e5: map_key_clear(KEY_BASSBOOST);	break; @@ -773,6 +781,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x0ea: map_key_clear(KEY_VOLUMEDOWN);	break;  		case 0x0f5: map_key_clear(KEY_SLOW);		break; +		case 0x181: map_key_clear(KEY_BUTTONCONFIG);	break;  		case 0x182: map_key_clear(KEY_BOOKMARKS);	break;  		case 0x183: map_key_clear(KEY_CONFIG);		break;  		case 0x184: map_key_clear(KEY_WORDPROCESSOR);	break; @@ -786,6 +795,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x18c: map_key_clear(KEY_VOICEMAIL);	break;  		case 0x18d: map_key_clear(KEY_ADDRESSBOOK);	break;  		case 0x18e: map_key_clear(KEY_CALENDAR);	break; +		case 0x18f: map_key_clear(KEY_TASKMANAGER);	break; +		case 0x190: map_key_clear(KEY_JOURNAL);		break;  		case 0x191: map_key_clear(KEY_FINANCE);		break;  		case 0x192: map_key_clear(KEY_CALC);		break;  		case 0x193: map_key_clear(KEY_PLAYER);		break; @@ -794,10 +805,16 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel  		case 0x199: map_key_clear(KEY_CHAT);		break;  		case 0x19c: map_key_clear(KEY_LOGOFF);		break;  		case 0x19e: map_key_clear(KEY_COFFEE);		break; +		case 0x19f: map_key_clear(KEY_CONTROLPANEL);		break; +		case 0x1a2: map_key_clear(KEY_APPSELECT);		break; +		case 0x1a3: map_key_clear(KEY_NEXT);		break; +		case 0x1a4: map_key_clear(KEY_PREVIOUS);	break;  		case 0x1a6: map_key_clear(KEY_HELP);		break;  		case 0x1a7: map_key_clear(KEY_DOCUMENTS);	break;  		case 0x1ab: map_key_clear(KEY_SPELLCHECK);	break;  		case 0x1ae: map_key_clear(KEY_KEYBOARD);	break; +		case 0x1b1: map_key_clear(KEY_SCREENSAVER);		break; +		case 0x1b4: map_key_clear(KEY_FILE);		break;  		case 0x1b6: map_key_clear(KEY_IMAGES);		break;  		case 0x1b7: map_key_clear(KEY_AUDIO);		break;  		case 0x1b8: map_key_clear(KEY_VIDEO);		break; @@ -1155,7 +1172,7 @@ static void hidinput_led_worker(struct work_struct *work)  					      led_work);  	struct hid_field *field;  	struct hid_report *report; -	int len; +	int len, ret;  	__u8 *buf;  	field = hidinput_get_led_field(hid); @@ -1183,13 +1200,16 @@ static void hidinput_led_worker(struct work_struct *work)  	/* fall back to generic raw-output-report */  	len = ((report->size - 1) >> 3) + 1 + (report->id > 0); -	buf = kmalloc(len, GFP_KERNEL); +	buf = hid_alloc_report_buf(report, GFP_KERNEL);  	if (!buf)  		return;  	hid_output_report(report, buf);  	/* synchronous output report */ -	hid->hid_output_raw_report(hid, buf, len, HID_OUTPUT_REPORT); +	ret = hid_hw_output_report(hid, buf, len); +	if (ret == -ENOSYS) +		hid_hw_raw_request(hid, report->id, buf, len, HID_OUTPUT_REPORT, +				HID_REQ_SET_REPORT);  	kfree(buf);  } @@ -1268,10 +1288,7 @@ static struct hid_input *hidinput_allocate(struct hid_device *hid)  	}  	input_set_drvdata(input_dev, hid); -	if (hid->ll_driver->hidinput_input_event) -		input_dev->event = hid->ll_driver->hidinput_input_event; -	else if (hid->ll_driver->request || hid->hid_output_raw_report) -		input_dev->event = hidinput_input_event; +	input_dev->event = hidinput_input_event;  	input_dev->open = hidinput_open;  	input_dev->close = hidinput_close;  	input_dev->setkeycode = hidinput_setkeycode; @@ -1284,7 +1301,7 @@ static struct hid_input *hidinput_allocate(struct hid_device *hid)  	input_dev->id.vendor  = hid->vendor;  	input_dev->id.product = hid->product;  	input_dev->id.version = hid->version; -	input_dev->dev.parent = hid->dev.parent; +	input_dev->dev.parent = &hid->dev;  	hidinput->input = input_dev;  	list_add_tail(&hidinput->list, &hid->inputs);  | 
