Skip to content

Commit

Permalink
HID: rmi: check for the existence of some optional queries before rea…
Browse files Browse the repository at this point in the history
…ding query 12

The rmi4 spec defines some optional query registers in F11 which appear before
query 12. This patch checks for the existence of some of the lesser used queries to
 compute the location of query12 and all subsequent query registers.

Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Andrew Duggan authored and Jiri Kosina committed May 13, 2014
1 parent b89f991 commit f15475c
Showing 1 changed file with 32 additions and 4 deletions.
36 changes: 32 additions & 4 deletions drivers/hid/hid-rmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -546,9 +546,13 @@ static int rmi_populate_f11(struct hid_device *hdev)
struct rmi_data *data = hid_get_drvdata(hdev);
u8 buf[20];
int ret;
bool has_query9;
bool has_query10;
bool has_query11;
bool has_query12;
bool has_physical_props;
unsigned x_size, y_size;
u16 query12_offset;

if (!data->f11.query_base_addr) {
hid_err(hdev, "No 2D sensor found, giving up.\n");
Expand All @@ -561,6 +565,8 @@ static int rmi_populate_f11(struct hid_device *hdev)
hid_err(hdev, "can not get query 0: %d.\n", ret);
return ret;
}
has_query9 = !!(buf[0] & BIT(3));
has_query11 = !!(buf[0] & BIT(4));
has_query12 = !!(buf[0] & BIT(5));

/* query 1 to get the max number of fingers */
Expand All @@ -581,12 +587,33 @@ 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_query10 = !!(buf[0] & BIT(2));

/*
* query 12 to know if the physical properties are reported
* (query 12 is at offset 10 for HID devices)
* At least 8 queries are guaranteed to be present in F11
* +1 for query12.
*/
query12_offset = 9;

if (has_query9)
++query12_offset;

if (has_query10)
++query12_offset;

if (has_query11)
++query12_offset;

/* query 12 to know if the physical properties are reported */
if (has_query12) {
ret = rmi_read(hdev, data->f11.query_base_addr + 10, buf);
ret = rmi_read(hdev, data->f11.query_base_addr
+ query12_offset, buf);
if (ret) {
hid_err(hdev, "can not get query 12: %d.\n", ret);
return ret;
Expand All @@ -595,7 +622,8 @@ static int rmi_populate_f11(struct hid_device *hdev)

if (has_physical_props) {
ret = rmi_read_block(hdev,
data->f11.query_base_addr + 11, buf, 4);
data->f11.query_base_addr
+ query12_offset + 1, buf, 4);
if (ret) {
hid_err(hdev, "can not read query 15-18: %d.\n",
ret);
Expand Down

0 comments on commit f15475c

Please sign in to comment.