mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-17 23:25:46 +08:00
HID: waltop: Extend barrel button fix
Extend Waltop barrel button fix to all models: ignore reported pressure when a barrel button is pressed, because it is rarely correct. Report zero pressure in such cases instead. Signed-off-by: Nikolai Kondrashov <spbnick@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
d2ee4dd9a4
commit
ed13794925
@ -638,28 +638,10 @@ static __u8 sirius_battery_free_tablet_rdesc_fixed[] = {
|
||||
0xC0 /* End Collection */
|
||||
};
|
||||
|
||||
struct waltop_state {
|
||||
u8 pressure0;
|
||||
u8 pressure1;
|
||||
};
|
||||
|
||||
static int waltop_probe(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
int ret;
|
||||
struct waltop_state *s;
|
||||
|
||||
s = kzalloc(sizeof(*s), GFP_KERNEL);
|
||||
if (s == NULL) {
|
||||
hid_err(hdev, "can't allocate device state\n");
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->pressure0 = 0;
|
||||
s->pressure1 = 0;
|
||||
|
||||
hid_set_drvdata(hdev, s);
|
||||
|
||||
ret = hid_parse(hdev);
|
||||
if (ret) {
|
||||
@ -675,7 +657,6 @@ static int waltop_probe(struct hid_device *hdev,
|
||||
|
||||
return 0;
|
||||
err:
|
||||
kfree(s);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -732,27 +713,18 @@ static __u8 *waltop_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
static int waltop_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
u8 *data, int size)
|
||||
{
|
||||
/* If this is a pen input report of a tablet with PID 0038 */
|
||||
if (hdev->product == USB_DEVICE_ID_WALTOP_PID_0038 &&
|
||||
report->type == HID_INPUT_REPORT &&
|
||||
report->id == 16 &&
|
||||
size == 8) {
|
||||
struct waltop_state *s = hid_get_drvdata(hdev);
|
||||
|
||||
/* If this is a pen input report */
|
||||
if (report->type == HID_INPUT_REPORT && report->id == 16 && size >= 8) {
|
||||
/*
|
||||
* Ignore maximum pressure reported when a barrel button is
|
||||
* pressed.
|
||||
* Ignore reported pressure when a barrel button is pressed,
|
||||
* because it is rarely correct.
|
||||
*/
|
||||
|
||||
/* If a barrel button is pressed */
|
||||
if ((data[1] & 0xF) > 1) {
|
||||
/* Use the last known pressure */
|
||||
data[6] = s->pressure0;
|
||||
data[7] = s->pressure1;
|
||||
} else {
|
||||
/* Remember reported pressure */
|
||||
s->pressure0 = data[6];
|
||||
s->pressure1 = data[7];
|
||||
/* Report zero pressure */
|
||||
data[6] = 0;
|
||||
data[7] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -806,10 +778,7 @@ static int waltop_raw_event(struct hid_device *hdev, struct hid_report *report,
|
||||
|
||||
static void waltop_remove(struct hid_device *hdev)
|
||||
{
|
||||
struct waltop_state *s = hid_get_drvdata(hdev);
|
||||
|
||||
hid_hw_stop(hdev);
|
||||
kfree(s);
|
||||
}
|
||||
|
||||
static const struct hid_device_id waltop_devices[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user