Ejemplo n.º 1
0
static int i2c_transfer(I2cOps *me, I2cSeg *segments, int seg_count)
{
	CrosECTunnelI2c *bus = container_of(me, CrosECTunnelI2c, ops);

	int request_len;
	int response_len;
	int result;

	request_len = ec_i2c_count_message(segments, seg_count);
	response_len = ec_i2c_count_response(segments, seg_count);

	if (request_len > ARRAY_SIZE(bus->request_buf) ||
	    response_len > ARRAY_SIZE(bus->response_buf)) {
		printf("%s: Request or response too large (%d/%d).\n",
		       __func__, request_len, response_len);
		return -1;
	}

	ec_i2c_construct_message(bus->request_buf, segments,
				 seg_count, bus->remote_bus);

	result = ec_command(bus->ec, EC_CMD_I2C_PASSTHRU, 0,
			    bus->request_buf, request_len,
			    bus->response_buf, response_len);
	if (result < response_len) {
		printf("%s: ec_command error %d<%d.\n", __func__,
		       result, response_len);
		return result;
	}

	result = ec_i2c_parse_response(bus->response_buf, segments, seg_count);
	if (result != 0)
		return result;

	return 0;
}
Ejemplo n.º 2
0
static int ec_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg i2c_msgs[],
		       int num)
{
	struct ec_i2c_device *bus = adap->algo_data;
	struct device *dev = bus->dev;
	const u16 bus_num = bus->remote_bus;
	int request_len;
	int response_len;
	u8 *request = NULL;
	u8 *response = NULL;
	int result;

	request_len = ec_i2c_count_message(i2c_msgs, num);
	if (request_len < 0) {
		dev_warn(dev, "Error constructing message %d\n", request_len);
		result = request_len;
		goto exit;
	}
	response_len = ec_i2c_count_response(i2c_msgs, num);
	if (response_len < 0) {
		/* Unexpected; no errors should come when NULL response */
		dev_warn(dev, "Error preparing response %d\n", response_len);
		result = response_len;
		goto exit;
	}

	if (request_len <= ARRAY_SIZE(bus->request_buf)) {
		request = bus->request_buf;
	} else {
		request = kzalloc(request_len, GFP_KERNEL);
		if (request == NULL) {
			result = -ENOMEM;
			goto exit;
		}
	}
	if (response_len <= ARRAY_SIZE(bus->response_buf)) {
		response = bus->response_buf;
	} else {
		response = kzalloc(response_len, GFP_KERNEL);
		if (response == NULL) {
			result = -ENOMEM;
			goto exit;
		}
	}

	ec_i2c_construct_message(request, i2c_msgs, num, bus_num);
	result = bus->ec->command_sendrecv(bus->ec, EC_CMD_I2C_PASSTHRU,
					   request, request_len,
					   response, response_len);
	if (result)
		goto exit;

	result = ec_i2c_parse_response(response, i2c_msgs, &num);
	if (result < 0)
		goto exit;

	/* Indicate success by saying how many messages were sent */
	result = num;
exit:
	if (request != bus->request_buf)
		kfree(request);
	if (response != bus->response_buf)
		kfree(response);

	return result;
}