mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 01:49:46 +00:00
HID: logitech-hidpp: Add HIDPP_QUIRK_RESET_HI_RES_SCROLL
[ Upstream commit ed80cc4667 ]
The Logitech G502 Hero Wireless's high resolution scrolling resets after
being unplugged without notifying the driver, causing extremely slow
scrolling.
The only indication of this is a battery update packet, so add a quirk to
detect when the device is unplugged and re-enable the scrolling.
Link: https://bugzilla.kernel.org/show_bug.cgi?id=218037
Signed-off-by: Stuart Hayhurst <stuart.a.hayhurst@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
dcc51dfe6f
commit
c381dd20b0
@@ -75,6 +75,7 @@ MODULE_PARM_DESC(disable_tap_to_click,
|
||||
#define HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS BIT(27)
|
||||
#define HIDPP_QUIRK_HI_RES_SCROLL_1P0 BIT(28)
|
||||
#define HIDPP_QUIRK_WIRELESS_STATUS BIT(29)
|
||||
#define HIDPP_QUIRK_RESET_HI_RES_SCROLL BIT(30)
|
||||
|
||||
/* These are just aliases for now */
|
||||
#define HIDPP_QUIRK_KBD_SCROLL_WHEEL HIDPP_QUIRK_HIDPP_WHEELS
|
||||
@@ -193,6 +194,7 @@ struct hidpp_device {
|
||||
void *private_data;
|
||||
|
||||
struct work_struct work;
|
||||
struct work_struct reset_hi_res_work;
|
||||
struct kfifo delayed_work_fifo;
|
||||
struct input_dev *delayed_input;
|
||||
|
||||
@@ -3864,6 +3866,7 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
|
||||
struct hidpp_report *answer = hidpp->send_receive_buf;
|
||||
struct hidpp_report *report = (struct hidpp_report *)data;
|
||||
int ret;
|
||||
int last_online;
|
||||
|
||||
/*
|
||||
* If the mutex is locked then we have a pending answer from a
|
||||
@@ -3905,6 +3908,7 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
|
||||
"See: https://gitlab.freedesktop.org/jwrdegoede/logitech-27mhz-keyboard-encryption-setup/\n");
|
||||
}
|
||||
|
||||
last_online = hidpp->battery.online;
|
||||
if (hidpp->capabilities & HIDPP_CAPABILITY_HIDPP20_BATTERY) {
|
||||
ret = hidpp20_battery_event_1000(hidpp, data, size);
|
||||
if (ret != 0)
|
||||
@@ -3929,6 +3933,11 @@ static int hidpp_raw_hidpp_event(struct hidpp_device *hidpp, u8 *data,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_RESET_HI_RES_SCROLL) {
|
||||
if (last_online == 0 && hidpp->battery.online == 1)
|
||||
schedule_work(&hidpp->reset_hi_res_work);
|
||||
}
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_HIDPP_WHEELS) {
|
||||
ret = hidpp10_wheel_raw_event(hidpp, data, size);
|
||||
if (ret != 0)
|
||||
@@ -4302,6 +4311,13 @@ static void hidpp_connect_event(struct work_struct *work)
|
||||
hidpp->delayed_input = input;
|
||||
}
|
||||
|
||||
static void hidpp_reset_hi_res_handler(struct work_struct *work)
|
||||
{
|
||||
struct hidpp_device *hidpp = container_of(work, struct hidpp_device, reset_hi_res_work);
|
||||
|
||||
hi_res_scroll_enable(hidpp);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
|
||||
|
||||
static struct attribute *sysfs_attrs[] = {
|
||||
@@ -4432,6 +4448,7 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
}
|
||||
|
||||
INIT_WORK(&hidpp->work, hidpp_connect_event);
|
||||
INIT_WORK(&hidpp->reset_hi_res_work, hidpp_reset_hi_res_handler);
|
||||
mutex_init(&hidpp->send_mutex);
|
||||
init_waitqueue_head(&hidpp->wait);
|
||||
|
||||
@@ -4527,6 +4544,7 @@ static void hidpp_remove(struct hid_device *hdev)
|
||||
|
||||
hid_hw_stop(hdev);
|
||||
cancel_work_sync(&hidpp->work);
|
||||
cancel_work_sync(&hidpp->reset_hi_res_work);
|
||||
mutex_destroy(&hidpp->send_mutex);
|
||||
}
|
||||
|
||||
@@ -4574,6 +4592,9 @@ static const struct hid_device_id hidpp_devices[] = {
|
||||
{ /* Keyboard MX5500 (Bluetooth-receiver in HID proxy mode) */
|
||||
LDJ_DEVICE(0xb30b),
|
||||
.driver_data = HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS },
|
||||
{ /* Logitech G502 Lightspeed Wireless Gaming Mouse */
|
||||
LDJ_DEVICE(0x407f),
|
||||
.driver_data = HIDPP_QUIRK_RESET_HI_RES_SCROLL },
|
||||
|
||||
{ LDJ_DEVICE(HID_ANY_ID) },
|
||||
|
||||
|
||||
Reference in New Issue
Block a user