Lines Matching +full:cros +full:- +full:ec +full:- +full:i2c

1 // SPDX-License-Identifier: GPL-2.0+
3 * Chromium OS cros_ec driver - I2C interface
17 #include <i2c.h>
29 * byte 1-8 struct ec_host_request
30 * byte 10- response data
42 * byte 2-9 struct ec_host_response
43 * byte 10- response data
56 (struct ec_host_request_i2c *)dev->dout; in cros_ec_i2c_packet()
58 (struct ec_host_response_i2c *)dev->din; in cros_ec_i2c_packet()
62 i2c_msg[0].addr = chip->chip_addr; in cros_ec_i2c_packet()
64 i2c_msg[1].addr = chip->chip_addr; in cros_ec_i2c_packet()
69 i2c_msg[0].buf = dev->dout; in cros_ec_i2c_packet()
72 memmove(&ec_request_i2c->ec_request, dev->dout, out_bytes); in cros_ec_i2c_packet()
73 ec_request_i2c->command_protocol = EC_COMMAND_PROTOCOL_3; in cros_ec_i2c_packet()
77 i2c_msg[1].buf = dev->din; in cros_ec_i2c_packet()
85 /* When we send a v3 request to v2 ec, ec won't recognize the 0xda in cros_ec_i2c_packet()
92 if (ec_response_i2c->result == EC_RES_INVALID_COMMAND && in cros_ec_i2c_packet()
93 ec_response_i2c->packet_length == 0) in cros_ec_i2c_packet()
94 return -EPROTONOSUPPORT; in cros_ec_i2c_packet()
96 if (ec_response_i2c->packet_length < sizeof(struct ec_host_response)) { in cros_ec_i2c_packet()
98 __func__, ec_response_i2c->packet_length); in cros_ec_i2c_packet()
99 return -EBADMSG; in cros_ec_i2c_packet()
104 memmove(dev->din, &ec_response_i2c->ec_response, in_bytes); in cros_ec_i2c_packet()
126 * Sanity-check I/O sizes given transaction overhead in internal in cros_ec_i2c_command()
129 if (out_bytes > sizeof(dev->dout)) { in cros_ec_i2c_command()
131 return -1; in cros_ec_i2c_command()
133 if (in_bytes > sizeof(dev->din)) { in cros_ec_i2c_command()
135 return -1; in cros_ec_i2c_command()
140 i2c_msg[0].addr = chip->chip_addr; in cros_ec_i2c_command()
142 i2c_msg[0].buf = dev->dout; in cros_ec_i2c_command()
146 * Copy command and data into output buffer so we can do a single I2C in cros_ec_i2c_command()
149 ptr = dev->dout; in cros_ec_i2c_command()
152 * in_ptr starts of pointing to a dword-aligned input data buffer. in cros_ec_i2c_command()
157 in_ptr = dev->din + sizeof(int64_t); in cros_ec_i2c_command()
159 if (dev->protocol_version != 2) { in cros_ec_i2c_command()
162 __func__, dev->protocol_version); in cros_ec_i2c_command()
163 return -1; in cros_ec_i2c_command()
169 in_ptr -= 2; /* Expect status, length bytes */ in cros_ec_i2c_command()
175 cros_ec_calc_checksum(dev->dout, dout_len + 3); in cros_ec_i2c_command()
177 i2c_msg[1].addr = chip->chip_addr; in cros_ec_i2c_command()
183 cros_ec_dump_data("out", -1, dev->dout, out_bytes); in cros_ec_i2c_command()
188 udev->name); in cros_ec_i2c_command()
189 ret = -1; in cros_ec_i2c_command()
194 return -(int)*in_ptr; in cros_ec_i2c_command()
198 if (len + 3 > sizeof(dev->din)) { in cros_ec_i2c_command()
201 return -1; in cros_ec_i2c_command()
207 return -1; in cros_ec_i2c_command()
210 cros_ec_dump_data("in", -1, in_ptr, din_len + 3); in cros_ec_i2c_command()
212 /* Return pointer to dword-aligned input data, if any */ in cros_ec_i2c_command()
213 *dinp = dev->din + sizeof(int64_t); in cros_ec_i2c_command()
229 { .compatible = "google,cros-ec-i2c" },