Merge branches 'for-3.19/hid-report-len', 'for-3.19/i2c-hid', 'for-3.19/lenovo',...
[cascardo/linux.git] / drivers / hid / i2c-hid / i2c-hid.c
index 747d544..fbd0781 100644 (file)
@@ -137,6 +137,7 @@ struct i2c_hid {
                                                   * descriptor. */
        unsigned int            bufsize;        /* i2c buffer size */
        char                    *inbuf;         /* Input buffer */
+       char                    *rawbuf;        /* Raw Input buffer */
        char                    *cmdbuf;        /* Command buffer */
        char                    *argsbuf;       /* Command arguments buffer */
 
@@ -369,7 +370,7 @@ static int i2c_hid_hwreset(struct i2c_client *client)
 static void i2c_hid_get_input(struct i2c_hid *ihid)
 {
        int ret, ret_size;
-       int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
+       int size = ihid->bufsize;
 
        ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
        if (ret != size) {
@@ -437,7 +438,7 @@ static void i2c_hid_init_report(struct hid_report *report, u8 *buffer,
                        report->id, buffer, size))
                return;
 
-       i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, ihid->inbuf);
+       i2c_hid_dbg(ihid, "report (len=%d): %*ph\n", size, size, buffer);
 
        ret_size = buffer[0] | (buffer[1] << 8);
 
@@ -504,9 +505,11 @@ static void i2c_hid_find_max_report(struct hid_device *hid, unsigned int type,
 static void i2c_hid_free_buffers(struct i2c_hid *ihid)
 {
        kfree(ihid->inbuf);
+       kfree(ihid->rawbuf);
        kfree(ihid->argsbuf);
        kfree(ihid->cmdbuf);
        ihid->inbuf = NULL;
+       ihid->rawbuf = NULL;
        ihid->cmdbuf = NULL;
        ihid->argsbuf = NULL;
        ihid->bufsize = 0;
@@ -522,10 +525,11 @@ static int i2c_hid_alloc_buffers(struct i2c_hid *ihid, size_t report_size)
                       report_size; /* report */
 
        ihid->inbuf = kzalloc(report_size, GFP_KERNEL);
+       ihid->rawbuf = kzalloc(report_size, GFP_KERNEL);
        ihid->argsbuf = kzalloc(args_len, GFP_KERNEL);
        ihid->cmdbuf = kzalloc(sizeof(union command) + args_len, GFP_KERNEL);
 
-       if (!ihid->inbuf || !ihid->argsbuf || !ihid->cmdbuf) {
+       if (!ihid->inbuf || !ihid->rawbuf || !ihid->argsbuf || !ihid->cmdbuf) {
                i2c_hid_free_buffers(ihid);
                return -ENOMEM;
        }
@@ -552,12 +556,12 @@ static int i2c_hid_get_raw_report(struct hid_device *hid,
 
        ret = i2c_hid_get_report(client,
                        report_type == HID_FEATURE_REPORT ? 0x03 : 0x01,
-                       report_number, ihid->inbuf, ask_count);
+                       report_number, ihid->rawbuf, ask_count);
 
        if (ret < 0)
                return ret;
 
-       ret_count = ihid->inbuf[0] | (ihid->inbuf[1] << 8);
+       ret_count = ihid->rawbuf[0] | (ihid->rawbuf[1] << 8);
 
        if (ret_count <= 2)
                return 0;
@@ -566,7 +570,7 @@ static int i2c_hid_get_raw_report(struct hid_device *hid,
 
        /* The query buffer contains the size, dropping it in the reply */
        count = min(count, ret_count - 2);
-       memcpy(buf, ihid->inbuf + 2, count);
+       memcpy(buf, ihid->rawbuf + 2, count);
 
        return count;
 }