Skip to content

Commit

Permalink
HID: rmi: make compututation of the address of Query 12 more careful
Browse files Browse the repository at this point in the history
There are additional queries which are optional and may not be present
depending on the configuration of the firmware. Knowing which queries are
present is needed to properly compute the address of Query 12 and all
subsequent queries. Additional bits in Query 1 are used to indicate the
presence of these optional queries.

Signed-off-by: Andrew Duggan <[email protected]>
Reviewed-by: Benjamin Tissoires <[email protected]>
Signed-off-by: Jiri Kosina <[email protected]>
  • Loading branch information
aduggan-syna authored and Jiri Kosina committed Jul 29, 2014
1 parent 4c2f503 commit 9e2c327
Showing 1 changed file with 25 additions and 10 deletions.
35 changes: 25 additions & 10 deletions drivers/hid/hid-rmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,10 +549,12 @@ static int rmi_populate_f11(struct hid_device *hdev)
u8 buf[20];
int ret;
bool has_query9;
bool has_query10;
bool has_query10 = false;
bool has_query11;
bool has_query12;
bool has_physical_props;
bool has_gestures;
bool has_rel;
unsigned x_size, y_size;
u16 query12_offset;

Expand Down Expand Up @@ -589,19 +591,32 @@ static int rmi_populate_f11(struct hid_device *hdev)
return -ENODEV;
}

/* query 8 to find out if query 10 exists */
ret = rmi_read(hdev, data->f11.query_base_addr + 8, buf);
if (ret) {
hid_err(hdev, "can not read gesture information: %d.\n", ret);
return ret;
has_rel = !!(buf[0] & BIT(3));
has_gestures = !!(buf[0] & BIT(5));

if (has_gestures) {
/* query 8 to find out if query 10 exists */
ret = rmi_read(hdev, data->f11.query_base_addr + 8, buf);
if (ret) {
hid_err(hdev, "can not read gesture information: %d.\n",
ret);
return ret;
}
has_query10 = !!(buf[0] & BIT(2));
}
has_query10 = !!(buf[0] & BIT(2));

/*
* At least 8 queries are guaranteed to be present in F11
* +1 for query12.
* At least 4 queries are guaranteed to be present in F11
* +1 for query 5 which is present since absolute events are
* reported and +1 for query 12.
*/
query12_offset = 9;
query12_offset = 6;

if (has_rel)
++query12_offset; /* query 6 is present */

if (has_gestures)
query12_offset += 2; /* query 7 and 8 are present */

if (has_query9)
++query12_offset;
Expand Down

0 comments on commit 9e2c327

Please sign in to comment.