diff options
| author | Harry Cutts <hcutts@chromium.org> | 2018-12-05 10:42:26 +1000 | 
|---|---|---|
| committer | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2018-12-07 16:27:15 +0100 | 
| commit | 95c3d00282ce6a4911e3050a3b48a194ba16e9e5 (patch) | |
| tree | cd01873cf40a915e6f1a4bb8480fba02156cb791 /drivers/hid | |
| parent | fef33601a321d8b7edfdd4c318b9c6c7aec6ef06 (diff) | |
| download | linux-95c3d00282ce6a4911e3050a3b48a194ba16e9e5.tar.bz2 | |
HID: logitech: Add function to enable HID++ 1.0 "scrolling acceleration"
"Scrolling acceleration" is a bit of a misnomer: it doesn't deal with
acceleration at all. However, that's the name used in Logitech's spec,
so I used it here.
Signed-off-by: Harry Cutts <hcutts@chromium.org>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Verified-by: Harry Cutts <hcutts@chromium.org>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Diffstat (limited to 'drivers/hid')
| -rw-r--r-- | drivers/hid/hid-logitech-hidpp.c | 47 | 
1 files changed, 34 insertions, 13 deletions
| diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index 22b37a3844d1..95ba9db6e613 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c @@ -400,32 +400,53 @@ static void hidpp_prefix_name(char **name, int name_length)  #define HIDPP_SET_LONG_REGISTER				0x82  #define HIDPP_GET_LONG_REGISTER				0x83 -#define HIDPP_REG_GENERAL				0x00 - -static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev) +/** + * hidpp10_set_register_bit() - Sets a single bit in a HID++ 1.0 register. + * @hidpp_dev: the device to set the register on. + * @register_address: the address of the register to modify. + * @byte: the byte of the register to modify. Should be less than 3. + * Return: 0 if successful, otherwise a negative error code. + */ +static int hidpp10_set_register_bit(struct hidpp_device *hidpp_dev, +	u8 register_address, u8 byte, u8 bit)  {  	struct hidpp_report response;  	int ret;  	u8 params[3] = { 0 };  	ret = hidpp_send_rap_command_sync(hidpp_dev, -					REPORT_ID_HIDPP_SHORT, -					HIDPP_GET_REGISTER, -					HIDPP_REG_GENERAL, -					NULL, 0, &response); +					  REPORT_ID_HIDPP_SHORT, +					  HIDPP_GET_REGISTER, +					  register_address, +					  NULL, 0, &response);  	if (ret)  		return ret;  	memcpy(params, response.rap.params, 3); -	/* Set the battery bit */ -	params[0] |= BIT(4); +	params[byte] |= BIT(bit);  	return hidpp_send_rap_command_sync(hidpp_dev, -					REPORT_ID_HIDPP_SHORT, -					HIDPP_SET_REGISTER, -					HIDPP_REG_GENERAL, -					params, 3, &response); +					   REPORT_ID_HIDPP_SHORT, +					   HIDPP_SET_REGISTER, +					   register_address, +					   params, 3, &response); +} + + +#define HIDPP_REG_GENERAL				0x00 + +static int hidpp10_enable_battery_reporting(struct hidpp_device *hidpp_dev) +{ +	return hidpp10_set_register_bit(hidpp_dev, HIDPP_REG_GENERAL, 0, 4); +} + +#define HIDPP_REG_FEATURES				0x01 + +/* On HID++ 1.0 devices, high-res scroll was called "scrolling acceleration". */ +static int hidpp10_enable_scrolling_acceleration(struct hidpp_device *hidpp_dev) +{ +	return hidpp10_set_register_bit(hidpp_dev, HIDPP_REG_FEATURES, 0, 6);  }  #define HIDPP_REG_BATTERY_STATUS			0x07 |