These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / i2c / busses / i2c-cros-ec-tunnel.c
index fa8dedd..a0d95ff 100644 (file)
@@ -182,8 +182,9 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
        const u16 bus_num = bus->remote_bus;
        int request_len;
        int response_len;
+       int alloc_size;
        int result;
-       struct cros_ec_command msg = { };
+       struct cros_ec_command *msg;
 
        request_len = ec_i2c_count_message(i2c_msgs, num);
        if (request_len < 0) {
@@ -198,25 +199,39 @@ static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
                return response_len;
        }
 
-       result = ec_i2c_construct_message(msg.outdata, i2c_msgs, num, bus_num);
-       if (result)
-               return result;
+       alloc_size = max(request_len, response_len);
+       msg = kmalloc(sizeof(*msg) + alloc_size, GFP_KERNEL);
+       if (!msg)
+               return -ENOMEM;
 
-       msg.version = 0;
-       msg.command = EC_CMD_I2C_PASSTHRU;
-       msg.outsize = request_len;
-       msg.insize = response_len;
+       result = ec_i2c_construct_message(msg->data, i2c_msgs, num, bus_num);
+       if (result) {
+               dev_err(dev, "Error constructing EC i2c message %d\n", result);
+               goto exit;
+       }
 
-       result = cros_ec_cmd_xfer(bus->ec, &msg);
-       if (result < 0)
-               return result;
+       msg->version = 0;
+       msg->command = EC_CMD_I2C_PASSTHRU;
+       msg->outsize = request_len;
+       msg->insize = response_len;
 
-       result = ec_i2c_parse_response(msg.indata, i2c_msgs, &num);
-       if (result < 0)
-               return result;
+       result = cros_ec_cmd_xfer(bus->ec, msg);
+       if (result < 0) {
+               dev_err(dev, "Error transferring EC i2c message %d\n", result);
+               goto exit;
+       }
+
+       result = ec_i2c_parse_response(msg->data, i2c_msgs, &num);
+       if (result < 0) {
+               dev_err(dev, "Error parsing EC i2c message %d\n", result);
+               goto exit;
+       }
 
        /* Indicate success by saying how many messages were sent */
-       return num;
+       result = num;
+exit:
+       kfree(msg);
+       return result;
 }
 
 static u32 ec_i2c_functionality(struct i2c_adapter *adap)