Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: cros_ec: add bus-specific proto v3 code

Add proto v3 support to the SPI, I2C, and LPC.

Signed-off-by: Stephen Barber <smbarber@chromium.org>
Signed-off-by: Javier Martinez Canillas <javier.martinez@collabora.co.uk>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
Tested-by: Gwendal Grignou <gwendal@chromium.org>
Acked-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Stephen Barber and committed by
Lee Jones
d3654070 2c7589af

+569 -58
+162 -4
drivers/mfd/cros_ec_i2c.c
··· 13 13 * GNU General Public License for more details. 14 14 */ 15 15 16 + #include <linux/delay.h> 16 17 #include <linux/kernel.h> 17 18 #include <linux/module.h> 18 19 #include <linux/i2c.h> ··· 23 22 #include <linux/platform_device.h> 24 23 #include <linux/slab.h> 25 24 25 + /** 26 + * Request format for protocol v3 27 + * byte 0 0xda (EC_COMMAND_PROTOCOL_3) 28 + * byte 1-8 struct ec_host_request 29 + * byte 10- response data 30 + */ 31 + struct ec_host_request_i2c { 32 + /* Always 0xda to backward compatible with v2 struct */ 33 + uint8_t command_protocol; 34 + struct ec_host_request ec_request; 35 + } __packed; 36 + 37 + 38 + /* 39 + * Response format for protocol v3 40 + * byte 0 result code 41 + * byte 1 packet_length 42 + * byte 2-9 struct ec_host_response 43 + * byte 10- response data 44 + */ 45 + struct ec_host_response_i2c { 46 + uint8_t result; 47 + uint8_t packet_length; 48 + struct ec_host_response ec_response; 49 + } __packed; 50 + 26 51 static inline struct cros_ec_device *to_ec_dev(struct device *dev) 27 52 { 28 53 struct i2c_client *client = to_i2c_client(dev); 29 54 30 55 return i2c_get_clientdata(client); 56 + } 57 + 58 + static int cros_ec_pkt_xfer_i2c(struct cros_ec_device *ec_dev, 59 + struct cros_ec_command *msg) 60 + { 61 + struct i2c_client *client = ec_dev->priv; 62 + int ret = -ENOMEM; 63 + int i; 64 + int packet_len; 65 + u8 *out_buf = NULL; 66 + u8 *in_buf = NULL; 67 + u8 sum; 68 + struct i2c_msg i2c_msg[2]; 69 + struct ec_host_response *ec_response; 70 + struct ec_host_request_i2c *ec_request_i2c; 71 + struct ec_host_response_i2c *ec_response_i2c; 72 + int request_header_size = sizeof(struct ec_host_request_i2c); 73 + int response_header_size = sizeof(struct ec_host_response_i2c); 74 + 75 + i2c_msg[0].addr = client->addr; 76 + i2c_msg[0].flags = 0; 77 + i2c_msg[1].addr = client->addr; 78 + i2c_msg[1].flags = I2C_M_RD; 79 + 80 + packet_len = msg->insize + response_header_size; 81 + BUG_ON(packet_len > ec_dev->din_size); 82 + in_buf = ec_dev->din; 83 + i2c_msg[1].len = packet_len; 84 + i2c_msg[1].buf = (char *) in_buf; 85 + 86 + packet_len = msg->outsize + request_header_size; 87 + BUG_ON(packet_len > ec_dev->dout_size); 88 + out_buf = ec_dev->dout; 89 + i2c_msg[0].len = packet_len; 90 + i2c_msg[0].buf = (char *) out_buf; 91 + 92 + /* create request data */ 93 + ec_request_i2c = (struct ec_host_request_i2c *) out_buf; 94 + ec_request_i2c->command_protocol = EC_COMMAND_PROTOCOL_3; 95 + 96 + ec_dev->dout++; 97 + ret = cros_ec_prepare_tx(ec_dev, msg); 98 + ec_dev->dout--; 99 + 100 + /* send command to EC and read answer */ 101 + ret = i2c_transfer(client->adapter, i2c_msg, 2); 102 + if (ret < 0) { 103 + dev_dbg(ec_dev->dev, "i2c transfer failed: %d\n", ret); 104 + goto done; 105 + } else if (ret != 2) { 106 + dev_err(ec_dev->dev, "failed to get response: %d\n", ret); 107 + ret = -EIO; 108 + goto done; 109 + } 110 + 111 + ec_response_i2c = (struct ec_host_response_i2c *) in_buf; 112 + msg->result = ec_response_i2c->result; 113 + ec_response = &ec_response_i2c->ec_response; 114 + 115 + switch (msg->result) { 116 + case EC_RES_SUCCESS: 117 + break; 118 + case EC_RES_IN_PROGRESS: 119 + ret = -EAGAIN; 120 + dev_dbg(ec_dev->dev, "command 0x%02x in progress\n", 121 + msg->command); 122 + goto done; 123 + 124 + default: 125 + dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n", 126 + msg->command, msg->result); 127 + /* 128 + * When we send v3 request to v2 ec, ec won't recognize the 129 + * 0xda (EC_COMMAND_PROTOCOL_3) and will return with status 130 + * EC_RES_INVALID_COMMAND with zero data length. 131 + * 132 + * In case of invalid command for v3 protocol the data length 133 + * will be at least sizeof(struct ec_host_response) 134 + */ 135 + if (ec_response_i2c->result == EC_RES_INVALID_COMMAND && 136 + ec_response_i2c->packet_length == 0) { 137 + ret = -EPROTONOSUPPORT; 138 + goto done; 139 + } 140 + } 141 + 142 + if (ec_response_i2c->packet_length < sizeof(struct ec_host_response)) { 143 + dev_err(ec_dev->dev, 144 + "response of %u bytes too short; not a full header\n", 145 + ec_response_i2c->packet_length); 146 + ret = -EBADMSG; 147 + goto done; 148 + } 149 + 150 + if (msg->insize < ec_response->data_len) { 151 + dev_err(ec_dev->dev, 152 + "response data size is too large: expected %u, got %u\n", 153 + msg->insize, 154 + ec_response->data_len); 155 + ret = -EMSGSIZE; 156 + goto done; 157 + } 158 + 159 + /* copy response packet payload and compute checksum */ 160 + sum = 0; 161 + for (i = 0; i < sizeof(struct ec_host_response); i++) 162 + sum += ((u8 *)ec_response)[i]; 163 + 164 + memcpy(msg->data, 165 + in_buf + response_header_size, 166 + ec_response->data_len); 167 + for (i = 0; i < ec_response->data_len; i++) 168 + sum += msg->data[i]; 169 + 170 + /* All bytes should sum to zero */ 171 + if (sum) { 172 + dev_err(ec_dev->dev, "bad packet checksum\n"); 173 + ret = -EBADMSG; 174 + goto done; 175 + } 176 + 177 + ret = ec_response->data_len; 178 + 179 + done: 180 + if (msg->command == EC_CMD_REBOOT_EC) 181 + msleep(EC_REBOOT_DELAY_MS); 182 + 183 + return ret; 31 184 } 32 185 33 186 static int cros_ec_cmd_xfer_i2c(struct cros_ec_device *ec_dev, ··· 276 121 } 277 122 278 123 ret = len; 279 - done: 124 + done: 280 125 kfree(in_buf); 281 126 kfree(out_buf); 127 + if (msg->command == EC_CMD_REBOOT_EC) 128 + msleep(EC_REBOOT_DELAY_MS); 129 + 282 130 return ret; 283 131 } 284 132 ··· 301 143 ec_dev->priv = client; 302 144 ec_dev->irq = client->irq; 303 145 ec_dev->cmd_xfer = cros_ec_cmd_xfer_i2c; 304 - ec_dev->pkt_xfer = NULL; 146 + ec_dev->pkt_xfer = cros_ec_pkt_xfer_i2c; 305 147 ec_dev->ec_name = client->name; 306 148 ec_dev->phys_name = client->adapter->name; 307 - ec_dev->din_size = sizeof(struct ec_host_response) + 149 + ec_dev->din_size = sizeof(struct ec_host_response_i2c) + 308 150 sizeof(struct ec_response_get_protocol_info); 309 - ec_dev->dout_size = sizeof(struct ec_host_request); 151 + ec_dev->dout_size = sizeof(struct ec_host_request_i2c); 310 152 311 153 err = cros_ec_register(ec_dev); 312 154 if (err) {
+329 -53
drivers/mfd/cros_ec_spi.c
··· 65 65 */ 66 66 #define EC_SPI_RECOVERY_TIME_NS (200 * 1000) 67 67 68 - /* 69 - * The EC is unresponsive for a time after a reboot command. Add a 70 - * simple delay to make sure that the bus stays locked. 71 - */ 72 - #define EC_REBOOT_DELAY_MS 50 73 - 74 68 /** 75 69 * struct cros_ec_spi - information about a SPI-connected EC 76 70 * ··· 81 87 }; 82 88 83 89 static void debug_packet(struct device *dev, const char *name, u8 *ptr, 84 - int len) 90 + int len) 85 91 { 86 92 #ifdef DEBUG 87 93 int i; ··· 92 98 93 99 pr_cont("\n"); 94 100 #endif 101 + } 102 + 103 + static int terminate_request(struct cros_ec_device *ec_dev) 104 + { 105 + struct cros_ec_spi *ec_spi = ec_dev->priv; 106 + struct spi_message msg; 107 + struct spi_transfer trans; 108 + int ret; 109 + 110 + /* 111 + * Turn off CS, possibly adding a delay to ensure the rising edge 112 + * doesn't come too soon after the end of the data. 113 + */ 114 + spi_message_init(&msg); 115 + memset(&trans, 0, sizeof(trans)); 116 + trans.delay_usecs = ec_spi->end_of_msg_delay; 117 + spi_message_add_tail(&trans, &msg); 118 + 119 + ret = spi_sync(ec_spi->spi, &msg); 120 + 121 + /* Reset end-of-response timer */ 122 + ec_spi->last_transfer_ns = ktime_get_ns(); 123 + if (ret < 0) { 124 + dev_err(ec_dev->dev, 125 + "cs-deassert spi transfer failed: %d\n", 126 + ret); 127 + } 128 + 129 + return ret; 130 + } 131 + 132 + /** 133 + * receive_n_bytes - receive n bytes from the EC. 134 + * 135 + * Assumes buf is a pointer into the ec_dev->din buffer 136 + */ 137 + static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) 138 + { 139 + struct cros_ec_spi *ec_spi = ec_dev->priv; 140 + struct spi_transfer trans; 141 + struct spi_message msg; 142 + int ret; 143 + 144 + BUG_ON(buf - ec_dev->din + n > ec_dev->din_size); 145 + 146 + memset(&trans, 0, sizeof(trans)); 147 + trans.cs_change = 1; 148 + trans.rx_buf = buf; 149 + trans.len = n; 150 + 151 + spi_message_init(&msg); 152 + spi_message_add_tail(&trans, &msg); 153 + ret = spi_sync(ec_spi->spi, &msg); 154 + if (ret < 0) 155 + dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 156 + 157 + return ret; 158 + } 159 + 160 + /** 161 + * cros_ec_spi_receive_packet - Receive a packet from the EC. 162 + * 163 + * This function has two phases: reading the preamble bytes (since if we read 164 + * data from the EC before it is ready to send, we just get preamble) and 165 + * reading the actual message. 166 + * 167 + * The received data is placed into ec_dev->din. 168 + * 169 + * @ec_dev: ChromeOS EC device 170 + * @need_len: Number of message bytes we need to read 171 + */ 172 + static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, 173 + int need_len) 174 + { 175 + struct ec_host_response *response; 176 + u8 *ptr, *end; 177 + int ret; 178 + unsigned long deadline; 179 + int todo; 180 + 181 + BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); 182 + 183 + /* Receive data until we see the header byte */ 184 + deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); 185 + while (true) { 186 + unsigned long start_jiffies = jiffies; 187 + 188 + ret = receive_n_bytes(ec_dev, 189 + ec_dev->din, 190 + EC_MSG_PREAMBLE_COUNT); 191 + if (ret < 0) 192 + return ret; 193 + 194 + ptr = ec_dev->din; 195 + for (end = ptr + EC_MSG_PREAMBLE_COUNT; ptr != end; ptr++) { 196 + if (*ptr == EC_SPI_FRAME_START) { 197 + dev_dbg(ec_dev->dev, "msg found at %zd\n", 198 + ptr - ec_dev->din); 199 + break; 200 + } 201 + } 202 + if (ptr != end) 203 + break; 204 + 205 + /* 206 + * Use the time at the start of the loop as a timeout. This 207 + * gives us one last shot at getting the transfer and is useful 208 + * in case we got context switched out for a while. 209 + */ 210 + if (time_after(start_jiffies, deadline)) { 211 + dev_warn(ec_dev->dev, "EC failed to respond in time\n"); 212 + return -ETIMEDOUT; 213 + } 214 + } 215 + 216 + /* 217 + * ptr now points to the header byte. Copy any valid data to the 218 + * start of our buffer 219 + */ 220 + todo = end - ++ptr; 221 + BUG_ON(todo < 0 || todo > ec_dev->din_size); 222 + todo = min(todo, need_len); 223 + memmove(ec_dev->din, ptr, todo); 224 + ptr = ec_dev->din + todo; 225 + dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", 226 + need_len, todo); 227 + need_len -= todo; 228 + 229 + /* If the entire response struct wasn't read, get the rest of it. */ 230 + if (todo < sizeof(*response)) { 231 + ret = receive_n_bytes(ec_dev, ptr, sizeof(*response) - todo); 232 + if (ret < 0) 233 + return -EBADMSG; 234 + ptr += (sizeof(*response) - todo); 235 + todo = sizeof(*response); 236 + } 237 + 238 + response = (struct ec_host_response *)ec_dev->din; 239 + 240 + /* Abort if data_len is too large. */ 241 + if (response->data_len > ec_dev->din_size) 242 + return -EMSGSIZE; 243 + 244 + /* Receive data until we have it all */ 245 + while (need_len > 0) { 246 + /* 247 + * We can't support transfers larger than the SPI FIFO size 248 + * unless we have DMA. We don't have DMA on the ISP SPI ports 249 + * for Exynos. We need a way of asking SPI driver for 250 + * maximum-supported transfer size. 251 + */ 252 + todo = min(need_len, 256); 253 + dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", 254 + todo, need_len, ptr - ec_dev->din); 255 + 256 + ret = receive_n_bytes(ec_dev, ptr, todo); 257 + if (ret < 0) 258 + return ret; 259 + 260 + ptr += todo; 261 + need_len -= todo; 262 + } 263 + 264 + dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); 265 + 266 + return 0; 95 267 } 96 268 97 269 /** ··· 275 115 static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, 276 116 int need_len) 277 117 { 278 - struct cros_ec_spi *ec_spi = ec_dev->priv; 279 - struct spi_transfer trans; 280 - struct spi_message msg; 281 118 u8 *ptr, *end; 282 119 int ret; 283 120 unsigned long deadline; 284 121 int todo; 122 + 123 + BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); 285 124 286 125 /* Receive data until we see the header byte */ 287 126 deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); 288 127 while (true) { 289 128 unsigned long start_jiffies = jiffies; 290 129 291 - memset(&trans, 0, sizeof(trans)); 292 - trans.cs_change = 1; 293 - trans.rx_buf = ptr = ec_dev->din; 294 - trans.len = EC_MSG_PREAMBLE_COUNT; 295 - 296 - spi_message_init(&msg); 297 - spi_message_add_tail(&trans, &msg); 298 - ret = spi_sync(ec_spi->spi, &msg); 299 - if (ret < 0) { 300 - dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 130 + ret = receive_n_bytes(ec_dev, 131 + ec_dev->din, 132 + EC_MSG_PREAMBLE_COUNT); 133 + if (ret < 0) 301 134 return ret; 302 - } 303 135 136 + ptr = ec_dev->din; 304 137 for (end = ptr + EC_MSG_PREAMBLE_COUNT; ptr != end; ptr++) { 305 - if (*ptr == EC_MSG_HEADER) { 138 + if (*ptr == EC_SPI_FRAME_START) { 306 139 dev_dbg(ec_dev->dev, "msg found at %zd\n", 307 140 ptr - ec_dev->din); 308 141 break; ··· 340 187 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", 341 188 todo, need_len, ptr - ec_dev->din); 342 189 343 - memset(&trans, 0, sizeof(trans)); 344 - trans.cs_change = 1; 345 - trans.rx_buf = ptr; 346 - trans.len = todo; 347 - spi_message_init(&msg); 348 - spi_message_add_tail(&trans, &msg); 349 - 350 - /* send command to EC and read answer */ 351 - BUG_ON((u8 *)trans.rx_buf - ec_dev->din + todo > 352 - ec_dev->din_size); 353 - ret = spi_sync(ec_spi->spi, &msg); 354 - if (ret < 0) { 355 - dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 190 + ret = receive_n_bytes(ec_dev, ptr, todo); 191 + if (ret < 0) 356 192 return ret; 357 - } 358 193 359 194 debug_packet(ec_dev->dev, "interim", ptr, todo); 360 195 ptr += todo; ··· 352 211 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); 353 212 354 213 return 0; 214 + } 215 + 216 + /** 217 + * cros_ec_pkt_xfer_spi - Transfer a packet over SPI and receive the reply 218 + * 219 + * @ec_dev: ChromeOS EC device 220 + * @ec_msg: Message to transfer 221 + */ 222 + static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, 223 + struct cros_ec_command *ec_msg) 224 + { 225 + struct ec_host_request *request; 226 + struct ec_host_response *response; 227 + struct cros_ec_spi *ec_spi = ec_dev->priv; 228 + struct spi_transfer trans; 229 + struct spi_message msg; 230 + int i, len; 231 + u8 *ptr; 232 + u8 *rx_buf; 233 + u8 sum; 234 + int ret = 0, final_ret; 235 + 236 + len = cros_ec_prepare_tx(ec_dev, ec_msg); 237 + request = (struct ec_host_request *)ec_dev->dout; 238 + dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); 239 + 240 + /* If it's too soon to do another transaction, wait */ 241 + if (ec_spi->last_transfer_ns) { 242 + unsigned long delay; /* The delay completed so far */ 243 + 244 + delay = ktime_get_ns() - ec_spi->last_transfer_ns; 245 + if (delay < EC_SPI_RECOVERY_TIME_NS) 246 + ndelay(EC_SPI_RECOVERY_TIME_NS - delay); 247 + } 248 + 249 + rx_buf = kzalloc(len, GFP_KERNEL); 250 + if (!rx_buf) { 251 + ret = -ENOMEM; 252 + goto exit; 253 + } 254 + 255 + /* Transmit phase - send our message */ 256 + memset(&trans, 0, sizeof(trans)); 257 + trans.tx_buf = ec_dev->dout; 258 + trans.rx_buf = rx_buf; 259 + trans.len = len; 260 + trans.cs_change = 1; 261 + spi_message_init(&msg); 262 + spi_message_add_tail(&trans, &msg); 263 + ret = spi_sync(ec_spi->spi, &msg); 264 + 265 + /* Get the response */ 266 + if (!ret) { 267 + /* Verify that EC can process command */ 268 + for (i = 0; i < len; i++) { 269 + switch (rx_buf[i]) { 270 + case EC_SPI_PAST_END: 271 + case EC_SPI_RX_BAD_DATA: 272 + case EC_SPI_NOT_READY: 273 + ret = -EAGAIN; 274 + ec_msg->result = EC_RES_IN_PROGRESS; 275 + default: 276 + break; 277 + } 278 + if (ret) 279 + break; 280 + } 281 + if (!ret) 282 + ret = cros_ec_spi_receive_packet(ec_dev, 283 + ec_msg->insize + sizeof(*response)); 284 + } else { 285 + dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 286 + } 287 + 288 + final_ret = terminate_request(ec_dev); 289 + if (!ret) 290 + ret = final_ret; 291 + if (ret < 0) 292 + goto exit; 293 + 294 + ptr = ec_dev->din; 295 + 296 + /* check response error code */ 297 + response = (struct ec_host_response *)ptr; 298 + ec_msg->result = response->result; 299 + 300 + ret = cros_ec_check_result(ec_dev, ec_msg); 301 + if (ret) 302 + goto exit; 303 + 304 + len = response->data_len; 305 + sum = 0; 306 + if (len > ec_msg->insize) { 307 + dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", 308 + len, ec_msg->insize); 309 + ret = -EMSGSIZE; 310 + goto exit; 311 + } 312 + 313 + for (i = 0; i < sizeof(*response); i++) 314 + sum += ptr[i]; 315 + 316 + /* copy response packet payload and compute checksum */ 317 + memcpy(ec_msg->data, ptr + sizeof(*response), len); 318 + for (i = 0; i < len; i++) 319 + sum += ec_msg->data[i]; 320 + 321 + if (sum) { 322 + dev_err(ec_dev->dev, 323 + "bad packet checksum, calculated %x\n", 324 + sum); 325 + ret = -EBADMSG; 326 + goto exit; 327 + } 328 + 329 + ret = len; 330 + exit: 331 + kfree(rx_buf); 332 + if (ec_msg->command == EC_CMD_REBOOT_EC) 333 + msleep(EC_REBOOT_DELAY_MS); 334 + 335 + return ret; 355 336 } 356 337 357 338 /** ··· 490 227 struct spi_message msg; 491 228 int i, len; 492 229 u8 *ptr; 230 + u8 *rx_buf; 493 231 int sum; 494 232 int ret = 0, final_ret; 495 233 ··· 506 242 ndelay(EC_SPI_RECOVERY_TIME_NS - delay); 507 243 } 508 244 245 + rx_buf = kzalloc(len, GFP_KERNEL); 246 + if (!rx_buf) { 247 + ret = -ENOMEM; 248 + goto exit; 249 + } 250 + 509 251 /* Transmit phase - send our message */ 510 252 debug_packet(ec_dev->dev, "out", ec_dev->dout, len); 511 253 memset(&trans, 0, sizeof(trans)); 512 254 trans.tx_buf = ec_dev->dout; 255 + trans.rx_buf = rx_buf; 513 256 trans.len = len; 514 257 trans.cs_change = 1; 515 258 spi_message_init(&msg); ··· 525 254 526 255 /* Get the response */ 527 256 if (!ret) { 528 - ret = cros_ec_spi_receive_response(ec_dev, 529 - ec_msg->insize + EC_MSG_TX_PROTO_BYTES); 257 + /* Verify that EC can process command */ 258 + for (i = 0; i < len; i++) { 259 + switch (rx_buf[i]) { 260 + case EC_SPI_PAST_END: 261 + case EC_SPI_RX_BAD_DATA: 262 + case EC_SPI_NOT_READY: 263 + ret = -EAGAIN; 264 + ec_msg->result = EC_RES_IN_PROGRESS; 265 + default: 266 + break; 267 + } 268 + if (ret) 269 + break; 270 + } 271 + if (!ret) 272 + ret = cros_ec_spi_receive_response(ec_dev, 273 + ec_msg->insize + EC_MSG_TX_PROTO_BYTES); 530 274 } else { 531 275 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 532 276 } 533 277 534 - /* 535 - * Turn off CS, possibly adding a delay to ensure the rising edge 536 - * doesn't come too soon after the end of the data. 537 - */ 538 - spi_message_init(&msg); 539 - memset(&trans, 0, sizeof(trans)); 540 - trans.delay_usecs = ec_spi->end_of_msg_delay; 541 - spi_message_add_tail(&trans, &msg); 542 - 543 - final_ret = spi_sync(ec_spi->spi, &msg); 544 - ec_spi->last_transfer_ns = ktime_get_ns(); 278 + final_ret = terminate_request(ec_dev); 545 279 if (!ret) 546 280 ret = final_ret; 547 - if (ret < 0) { 548 - dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); 281 + if (ret < 0) 549 282 goto exit; 550 - } 551 283 552 284 ptr = ec_dev->din; 553 285 ··· 589 315 590 316 ret = len; 591 317 exit: 318 + kfree(rx_buf); 592 319 if (ec_msg->command == EC_CMD_REBOOT_EC) 593 320 msleep(EC_REBOOT_DELAY_MS); 594 321 ··· 636 361 ec_dev->priv = ec_spi; 637 362 ec_dev->irq = spi->irq; 638 363 ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; 639 - ec_dev->pkt_xfer = NULL; 364 + ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi; 640 365 ec_dev->ec_name = ec_spi->spi->modalias; 641 366 ec_dev->phys_name = dev_name(&ec_spi->spi->dev); 642 367 ec_dev->din_size = EC_MSG_PREAMBLE_COUNT + 643 368 sizeof(struct ec_host_response) + 644 369 sizeof(struct ec_response_get_protocol_info); 645 370 ec_dev->dout_size = sizeof(struct ec_host_request); 371 + 646 372 647 373 err = cros_ec_register(ec_dev); 648 374 if (err) {
+72 -1
drivers/platform/chrome/cros_ec_lpc.c
··· 46 46 return 1; 47 47 } 48 48 49 + static int cros_ec_pkt_xfer_lpc(struct cros_ec_device *ec, 50 + struct cros_ec_command *msg) 51 + { 52 + struct ec_host_request *request; 53 + struct ec_host_response response; 54 + u8 sum = 0; 55 + int i; 56 + int ret = 0; 57 + u8 *dout; 58 + 59 + ret = cros_ec_prepare_tx(ec, msg); 60 + 61 + /* Write buffer */ 62 + for (i = 0; i < ret; i++) 63 + outb(ec->dout[i], EC_LPC_ADDR_HOST_PACKET + i); 64 + 65 + request = (struct ec_host_request *)ec->dout; 66 + 67 + /* Here we go */ 68 + outb(EC_COMMAND_PROTOCOL_3, EC_LPC_ADDR_HOST_CMD); 69 + 70 + if (ec_response_timed_out()) { 71 + dev_warn(ec->dev, "EC responsed timed out\n"); 72 + ret = -EIO; 73 + goto done; 74 + } 75 + 76 + /* Check result */ 77 + msg->result = inb(EC_LPC_ADDR_HOST_DATA); 78 + ret = cros_ec_check_result(ec, msg); 79 + if (ret) 80 + goto done; 81 + 82 + /* Read back response */ 83 + dout = (u8 *)&response; 84 + for (i = 0; i < sizeof(response); i++) { 85 + dout[i] = inb(EC_LPC_ADDR_HOST_PACKET + i); 86 + sum += dout[i]; 87 + } 88 + 89 + msg->result = response.result; 90 + 91 + if (response.data_len > msg->insize) { 92 + dev_err(ec->dev, 93 + "packet too long (%d bytes, expected %d)", 94 + response.data_len, msg->insize); 95 + ret = -EMSGSIZE; 96 + goto done; 97 + } 98 + 99 + /* Read response and process checksum */ 100 + for (i = 0; i < response.data_len; i++) { 101 + msg->data[i] = 102 + inb(EC_LPC_ADDR_HOST_PACKET + sizeof(response) + i); 103 + sum += msg->data[i]; 104 + } 105 + 106 + if (sum) { 107 + dev_err(ec->dev, 108 + "bad packet checksum %02x\n", 109 + response.checksum); 110 + ret = -EBADMSG; 111 + goto done; 112 + } 113 + 114 + /* Return actual amount of data received */ 115 + ret = response.data_len; 116 + done: 117 + return ret; 118 + } 119 + 49 120 static int cros_ec_cmd_xfer_lpc(struct cros_ec_device *ec, 50 121 struct cros_ec_command *msg) 51 122 { ··· 286 215 ec_dev->ec_name = pdev->name; 287 216 ec_dev->phys_name = dev_name(dev); 288 217 ec_dev->cmd_xfer = cros_ec_cmd_xfer_lpc; 289 - ec_dev->pkt_xfer = NULL; 218 + ec_dev->pkt_xfer = cros_ec_pkt_xfer_lpc; 290 219 ec_dev->cmd_readmem = cros_ec_lpc_readmem; 291 220 ec_dev->din_size = sizeof(struct ec_host_response) + 292 221 sizeof(struct ec_response_get_protocol_info);
+6
include/linux/mfd/cros_ec.h
··· 22 22 #include <linux/mutex.h> 23 23 24 24 /* 25 + * The EC is unresponsive for a time after a reboot command. Add a 26 + * simple delay to make sure that the bus stays locked. 27 + */ 28 + #define EC_REBOOT_DELAY_MS 50 29 + 30 + /* 25 31 * Max bus-specific overhead incurred by request/responses. 26 32 * I2C requires 1 additional byte for requests. 27 33 * I2C requires 2 additional bytes for responses.