]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/hid/hid-rmi.c
HID: rmi: Check for additional ACM registers appended to F11 data report
[mirror_ubuntu-artful-kernel.git] / drivers / hid / hid-rmi.c
index 3cccff73b9b9283e01aacf81a60dc264815e9d2b..a994477bd25aec700a9a9a633bb506acc9ca979b 100644 (file)
@@ -584,11 +584,15 @@ static int rmi_populate_f11(struct hid_device *hdev)
        bool has_query10 = false;
        bool has_query11;
        bool has_query12;
+       bool has_query27;
+       bool has_query28;
+       bool has_query36 = false;
        bool has_physical_props;
        bool has_gestures;
        bool has_rel;
+       bool has_data40 = false;
        unsigned x_size, y_size;
-       u16 query12_offset;
+       u16 query_offset;
 
        if (!data->f11.query_base_addr) {
                hid_err(hdev, "No 2D sensor found, giving up.\n");
@@ -604,6 +608,8 @@ static int rmi_populate_f11(struct hid_device *hdev)
        has_query9 = !!(buf[0] & BIT(3));
        has_query11 = !!(buf[0] & BIT(4));
        has_query12 = !!(buf[0] & BIT(5));
+       has_query27 = !!(buf[0] & BIT(6));
+       has_query28 = !!(buf[0] & BIT(7));
 
        /* query 1 to get the max number of fingers */
        ret = rmi_read(hdev, data->f11.query_base_addr + 1, buf);
@@ -642,27 +648,27 @@ static int rmi_populate_f11(struct hid_device *hdev)
         * +1 for query 5 which is present since absolute events are
         * reported and +1 for query 12.
         */
-       query12_offset = 6;
+       query_offset = 6;
 
        if (has_rel)
-               ++query12_offset; /* query 6 is present */
+               ++query_offset; /* query 6 is present */
 
        if (has_gestures)
-               query12_offset += 2; /* query 7 and 8 are present */
+               query_offset += 2; /* query 7 and 8 are present */
 
        if (has_query9)
-               ++query12_offset;
+               ++query_offset;
 
        if (has_query10)
-               ++query12_offset;
+               ++query_offset;
 
        if (has_query11)
-               ++query12_offset;
+               ++query_offset;
 
        /* query 12 to know if the physical properties are reported */
        if (has_query12) {
                ret = rmi_read(hdev, data->f11.query_base_addr
-                               + query12_offset, buf);
+                               + query_offset, buf);
                if (ret) {
                        hid_err(hdev, "can not get query 12: %d.\n", ret);
                        return ret;
@@ -670,9 +676,10 @@ static int rmi_populate_f11(struct hid_device *hdev)
                has_physical_props = !!(buf[0] & BIT(5));
 
                if (has_physical_props) {
+                       query_offset += 1;
                        ret = rmi_read_block(hdev,
                                        data->f11.query_base_addr
-                                               + query12_offset + 1, buf, 4);
+                                               + query_offset, buf, 4);
                        if (ret) {
                                hid_err(hdev, "can not read query 15-18: %d.\n",
                                        ret);
@@ -687,9 +694,45 @@ static int rmi_populate_f11(struct hid_device *hdev)
 
                        hid_info(hdev, "%s: size in mm: %d x %d\n",
                                 __func__, data->x_size_mm, data->y_size_mm);
+
+                       /*
+                        * query 15 - 18 contain the size of the sensor
+                        * and query 19 - 26 contain bezel dimensions
+                        */
+                       query_offset += 12;
+               }
+       }
+
+       if (has_query27)
+               ++query_offset;
+
+       if (has_query28) {
+               ret = rmi_read(hdev, data->f11.query_base_addr
+                               + query_offset, buf);
+               if (ret) {
+                       hid_err(hdev, "can not get query 28: %d.\n", ret);
+                       return ret;
+               }
+
+               has_query36 = !!(buf[0] & BIT(6));
+       }
+
+       if (has_query36) {
+               query_offset += 2;
+               ret = rmi_read(hdev, data->f11.query_base_addr
+                               + query_offset, buf);
+               if (ret) {
+                       hid_err(hdev, "can not get query 36: %d.\n", ret);
+                       return ret;
                }
+
+               has_data40 = !!(buf[0] & BIT(5));
        }
 
+
+       if (has_data40)
+               data->f11.report_size += data->max_fingers * 2;
+
        /*
         * retrieve the ctrl registers
         * the ctrl register has a size of 20 but a fw bug split it into 16 + 4,