diff options
-rw-r--r-- | drivers/hid/hid-rmi.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c index 578bbe65902b..3221a95ed97c 100644 --- a/drivers/hid/hid-rmi.c +++ b/drivers/hid/hid-rmi.c | |||
@@ -549,10 +549,12 @@ static int rmi_populate_f11(struct hid_device *hdev) | |||
549 | u8 buf[20]; | 549 | u8 buf[20]; |
550 | int ret; | 550 | int ret; |
551 | bool has_query9; | 551 | bool has_query9; |
552 | bool has_query10; | 552 | bool has_query10 = false; |
553 | bool has_query11; | 553 | bool has_query11; |
554 | bool has_query12; | 554 | bool has_query12; |
555 | bool has_physical_props; | 555 | bool has_physical_props; |
556 | bool has_gestures; | ||
557 | bool has_rel; | ||
556 | unsigned x_size, y_size; | 558 | unsigned x_size, y_size; |
557 | u16 query12_offset; | 559 | u16 query12_offset; |
558 | 560 | ||
@@ -589,19 +591,32 @@ static int rmi_populate_f11(struct hid_device *hdev) | |||
589 | return -ENODEV; | 591 | return -ENODEV; |
590 | } | 592 | } |
591 | 593 | ||
592 | /* query 8 to find out if query 10 exists */ | 594 | has_rel = !!(buf[0] & BIT(3)); |
593 | ret = rmi_read(hdev, data->f11.query_base_addr + 8, buf); | 595 | has_gestures = !!(buf[0] & BIT(5)); |
594 | if (ret) { | 596 | |
595 | hid_err(hdev, "can not read gesture information: %d.\n", ret); | 597 | if (has_gestures) { |
596 | return ret; | 598 | /* query 8 to find out if query 10 exists */ |
599 | ret = rmi_read(hdev, data->f11.query_base_addr + 8, buf); | ||
600 | if (ret) { | ||
601 | hid_err(hdev, "can not read gesture information: %d.\n", | ||
602 | ret); | ||
603 | return ret; | ||
604 | } | ||
605 | has_query10 = !!(buf[0] & BIT(2)); | ||
597 | } | 606 | } |
598 | has_query10 = !!(buf[0] & BIT(2)); | ||
599 | 607 | ||
600 | /* | 608 | /* |
601 | * At least 8 queries are guaranteed to be present in F11 | 609 | * At least 4 queries are guaranteed to be present in F11 |
602 | * +1 for query12. | 610 | * +1 for query 5 which is present since absolute events are |
611 | * reported and +1 for query 12. | ||
603 | */ | 612 | */ |
604 | query12_offset = 9; | 613 | query12_offset = 6; |
614 | |||
615 | if (has_rel) | ||
616 | ++query12_offset; /* query 6 is present */ | ||
617 | |||
618 | if (has_gestures) | ||
619 | query12_offset += 2; /* query 7 and 8 are present */ | ||
605 | 620 | ||
606 | if (has_query9) | 621 | if (has_query9) |
607 | ++query12_offset; | 622 | ++query12_offset; |