diff options
Diffstat (limited to 'drivers/mfd/cros_ec_spi.c')
-rw-r--r-- | drivers/mfd/cros_ec_spi.c | 382 |
1 files changed, 329 insertions, 53 deletions
diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c index 04da2f288ef8..4e6f2f6b1095 100644 --- a/drivers/mfd/cros_ec_spi.c +++ b/drivers/mfd/cros_ec_spi.c | |||
@@ -65,12 +65,6 @@ | |||
65 | */ | 65 | */ |
66 | #define EC_SPI_RECOVERY_TIME_NS (200 * 1000) | 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 | * struct cros_ec_spi - information about a SPI-connected EC | 69 | * struct cros_ec_spi - information about a SPI-connected EC |
76 | * | 70 | * |
@@ -87,7 +81,7 @@ struct cros_ec_spi { | |||
87 | }; | 81 | }; |
88 | 82 | ||
89 | static void debug_packet(struct device *dev, const char *name, u8 *ptr, | 83 | static void debug_packet(struct device *dev, const char *name, u8 *ptr, |
90 | int len) | 84 | int len) |
91 | { | 85 | { |
92 | #ifdef DEBUG | 86 | #ifdef DEBUG |
93 | int i; | 87 | int i; |
@@ -100,6 +94,172 @@ static void debug_packet(struct device *dev, const char *name, u8 *ptr, | |||
100 | #endif | 94 | #endif |
101 | } | 95 | } |
102 | 96 | ||
97 | static int terminate_request(struct cros_ec_device *ec_dev) | ||
98 | { | ||
99 | struct cros_ec_spi *ec_spi = ec_dev->priv; | ||
100 | struct spi_message msg; | ||
101 | struct spi_transfer trans; | ||
102 | int ret; | ||
103 | |||
104 | /* | ||
105 | * Turn off CS, possibly adding a delay to ensure the rising edge | ||
106 | * doesn't come too soon after the end of the data. | ||
107 | */ | ||
108 | spi_message_init(&msg); | ||
109 | memset(&trans, 0, sizeof(trans)); | ||
110 | trans.delay_usecs = ec_spi->end_of_msg_delay; | ||
111 | spi_message_add_tail(&trans, &msg); | ||
112 | |||
113 | ret = spi_sync(ec_spi->spi, &msg); | ||
114 | |||
115 | /* Reset end-of-response timer */ | ||
116 | ec_spi->last_transfer_ns = ktime_get_ns(); | ||
117 | if (ret < 0) { | ||
118 | dev_err(ec_dev->dev, | ||
119 | "cs-deassert spi transfer failed: %d\n", | ||
120 | ret); | ||
121 | } | ||
122 | |||
123 | return ret; | ||
124 | } | ||
125 | |||
126 | /** | ||
127 | * receive_n_bytes - receive n bytes from the EC. | ||
128 | * | ||
129 | * Assumes buf is a pointer into the ec_dev->din buffer | ||
130 | */ | ||
131 | static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) | ||
132 | { | ||
133 | struct cros_ec_spi *ec_spi = ec_dev->priv; | ||
134 | struct spi_transfer trans; | ||
135 | struct spi_message msg; | ||
136 | int ret; | ||
137 | |||
138 | BUG_ON(buf - ec_dev->din + n > ec_dev->din_size); | ||
139 | |||
140 | memset(&trans, 0, sizeof(trans)); | ||
141 | trans.cs_change = 1; | ||
142 | trans.rx_buf = buf; | ||
143 | trans.len = n; | ||
144 | |||
145 | spi_message_init(&msg); | ||
146 | spi_message_add_tail(&trans, &msg); | ||
147 | ret = spi_sync(ec_spi->spi, &msg); | ||
148 | if (ret < 0) | ||
149 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | ||
150 | |||
151 | return ret; | ||
152 | } | ||
153 | |||
154 | /** | ||
155 | * cros_ec_spi_receive_packet - Receive a packet from the EC. | ||
156 | * | ||
157 | * This function has two phases: reading the preamble bytes (since if we read | ||
158 | * data from the EC before it is ready to send, we just get preamble) and | ||
159 | * reading the actual message. | ||
160 | * | ||
161 | * The received data is placed into ec_dev->din. | ||
162 | * | ||
163 | * @ec_dev: ChromeOS EC device | ||
164 | * @need_len: Number of message bytes we need to read | ||
165 | */ | ||
166 | static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, | ||
167 | int need_len) | ||
168 | { | ||
169 | struct ec_host_response *response; | ||
170 | u8 *ptr, *end; | ||
171 | int ret; | ||
172 | unsigned long deadline; | ||
173 | int todo; | ||
174 | |||
175 | BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); | ||
176 | |||
177 | /* Receive data until we see the header byte */ | ||
178 | deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); | ||
179 | while (true) { | ||
180 | unsigned long start_jiffies = jiffies; | ||
181 | |||
182 | ret = receive_n_bytes(ec_dev, | ||
183 | ec_dev->din, | ||
184 | EC_MSG_PREAMBLE_COUNT); | ||
185 | if (ret < 0) | ||
186 | return ret; | ||
187 | |||
188 | ptr = ec_dev->din; | ||
189 | for (end = ptr + EC_MSG_PREAMBLE_COUNT; ptr != end; ptr++) { | ||
190 | if (*ptr == EC_SPI_FRAME_START) { | ||
191 | dev_dbg(ec_dev->dev, "msg found at %zd\n", | ||
192 | ptr - ec_dev->din); | ||
193 | break; | ||
194 | } | ||
195 | } | ||
196 | if (ptr != end) | ||
197 | break; | ||
198 | |||
199 | /* | ||
200 | * Use the time at the start of the loop as a timeout. This | ||
201 | * gives us one last shot at getting the transfer and is useful | ||
202 | * in case we got context switched out for a while. | ||
203 | */ | ||
204 | if (time_after(start_jiffies, deadline)) { | ||
205 | dev_warn(ec_dev->dev, "EC failed to respond in time\n"); | ||
206 | return -ETIMEDOUT; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | /* | ||
211 | * ptr now points to the header byte. Copy any valid data to the | ||
212 | * start of our buffer | ||
213 | */ | ||
214 | todo = end - ++ptr; | ||
215 | BUG_ON(todo < 0 || todo > ec_dev->din_size); | ||
216 | todo = min(todo, need_len); | ||
217 | memmove(ec_dev->din, ptr, todo); | ||
218 | ptr = ec_dev->din + todo; | ||
219 | dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", | ||
220 | need_len, todo); | ||
221 | need_len -= todo; | ||
222 | |||
223 | /* If the entire response struct wasn't read, get the rest of it. */ | ||
224 | if (todo < sizeof(*response)) { | ||
225 | ret = receive_n_bytes(ec_dev, ptr, sizeof(*response) - todo); | ||
226 | if (ret < 0) | ||
227 | return -EBADMSG; | ||
228 | ptr += (sizeof(*response) - todo); | ||
229 | todo = sizeof(*response); | ||
230 | } | ||
231 | |||
232 | response = (struct ec_host_response *)ec_dev->din; | ||
233 | |||
234 | /* Abort if data_len is too large. */ | ||
235 | if (response->data_len > ec_dev->din_size) | ||
236 | return -EMSGSIZE; | ||
237 | |||
238 | /* Receive data until we have it all */ | ||
239 | while (need_len > 0) { | ||
240 | /* | ||
241 | * We can't support transfers larger than the SPI FIFO size | ||
242 | * unless we have DMA. We don't have DMA on the ISP SPI ports | ||
243 | * for Exynos. We need a way of asking SPI driver for | ||
244 | * maximum-supported transfer size. | ||
245 | */ | ||
246 | todo = min(need_len, 256); | ||
247 | dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", | ||
248 | todo, need_len, ptr - ec_dev->din); | ||
249 | |||
250 | ret = receive_n_bytes(ec_dev, ptr, todo); | ||
251 | if (ret < 0) | ||
252 | return ret; | ||
253 | |||
254 | ptr += todo; | ||
255 | need_len -= todo; | ||
256 | } | ||
257 | |||
258 | dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); | ||
259 | |||
260 | return 0; | ||
261 | } | ||
262 | |||
103 | /** | 263 | /** |
104 | * cros_ec_spi_receive_response - Receive a response from the EC. | 264 | * cros_ec_spi_receive_response - Receive a response from the EC. |
105 | * | 265 | * |
@@ -115,34 +275,27 @@ static void debug_packet(struct device *dev, const char *name, u8 *ptr, | |||
115 | static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, | 275 | static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, |
116 | int need_len) | 276 | int need_len) |
117 | { | 277 | { |
118 | struct cros_ec_spi *ec_spi = ec_dev->priv; | ||
119 | struct spi_transfer trans; | ||
120 | struct spi_message msg; | ||
121 | u8 *ptr, *end; | 278 | u8 *ptr, *end; |
122 | int ret; | 279 | int ret; |
123 | unsigned long deadline; | 280 | unsigned long deadline; |
124 | int todo; | 281 | int todo; |
125 | 282 | ||
283 | BUG_ON(EC_MSG_PREAMBLE_COUNT > ec_dev->din_size); | ||
284 | |||
126 | /* Receive data until we see the header byte */ | 285 | /* Receive data until we see the header byte */ |
127 | deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); | 286 | deadline = jiffies + msecs_to_jiffies(EC_MSG_DEADLINE_MS); |
128 | while (true) { | 287 | while (true) { |
129 | unsigned long start_jiffies = jiffies; | 288 | unsigned long start_jiffies = jiffies; |
130 | 289 | ||
131 | memset(&trans, 0, sizeof(trans)); | 290 | ret = receive_n_bytes(ec_dev, |
132 | trans.cs_change = 1; | 291 | ec_dev->din, |
133 | trans.rx_buf = ptr = ec_dev->din; | 292 | EC_MSG_PREAMBLE_COUNT); |
134 | trans.len = EC_MSG_PREAMBLE_COUNT; | 293 | if (ret < 0) |
135 | |||
136 | spi_message_init(&msg); | ||
137 | spi_message_add_tail(&trans, &msg); | ||
138 | ret = spi_sync(ec_spi->spi, &msg); | ||
139 | if (ret < 0) { | ||
140 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | ||
141 | return ret; | 294 | return ret; |
142 | } | ||
143 | 295 | ||
296 | ptr = ec_dev->din; | ||
144 | for (end = ptr + EC_MSG_PREAMBLE_COUNT; ptr != end; ptr++) { | 297 | for (end = ptr + EC_MSG_PREAMBLE_COUNT; ptr != end; ptr++) { |
145 | if (*ptr == EC_MSG_HEADER) { | 298 | if (*ptr == EC_SPI_FRAME_START) { |
146 | dev_dbg(ec_dev->dev, "msg found at %zd\n", | 299 | dev_dbg(ec_dev->dev, "msg found at %zd\n", |
147 | ptr - ec_dev->din); | 300 | ptr - ec_dev->din); |
148 | break; | 301 | break; |
@@ -187,21 +340,9 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, | |||
187 | dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", | 340 | dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", |
188 | todo, need_len, ptr - ec_dev->din); | 341 | todo, need_len, ptr - ec_dev->din); |
189 | 342 | ||
190 | memset(&trans, 0, sizeof(trans)); | 343 | ret = receive_n_bytes(ec_dev, ptr, todo); |
191 | trans.cs_change = 1; | 344 | if (ret < 0) |
192 | trans.rx_buf = ptr; | ||
193 | trans.len = todo; | ||
194 | spi_message_init(&msg); | ||
195 | spi_message_add_tail(&trans, &msg); | ||
196 | |||
197 | /* send command to EC and read answer */ | ||
198 | BUG_ON((u8 *)trans.rx_buf - ec_dev->din + todo > | ||
199 | ec_dev->din_size); | ||
200 | ret = spi_sync(ec_spi->spi, &msg); | ||
201 | if (ret < 0) { | ||
202 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | ||
203 | return ret; | 345 | return ret; |
204 | } | ||
205 | 346 | ||
206 | debug_packet(ec_dev->dev, "interim", ptr, todo); | 347 | debug_packet(ec_dev->dev, "interim", ptr, todo); |
207 | ptr += todo; | 348 | ptr += todo; |
@@ -214,6 +355,128 @@ static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, | |||
214 | } | 355 | } |
215 | 356 | ||
216 | /** | 357 | /** |
358 | * cros_ec_pkt_xfer_spi - Transfer a packet over SPI and receive the reply | ||
359 | * | ||
360 | * @ec_dev: ChromeOS EC device | ||
361 | * @ec_msg: Message to transfer | ||
362 | */ | ||
363 | static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, | ||
364 | struct cros_ec_command *ec_msg) | ||
365 | { | ||
366 | struct ec_host_request *request; | ||
367 | struct ec_host_response *response; | ||
368 | struct cros_ec_spi *ec_spi = ec_dev->priv; | ||
369 | struct spi_transfer trans; | ||
370 | struct spi_message msg; | ||
371 | int i, len; | ||
372 | u8 *ptr; | ||
373 | u8 *rx_buf; | ||
374 | u8 sum; | ||
375 | int ret = 0, final_ret; | ||
376 | |||
377 | len = cros_ec_prepare_tx(ec_dev, ec_msg); | ||
378 | request = (struct ec_host_request *)ec_dev->dout; | ||
379 | dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); | ||
380 | |||
381 | /* If it's too soon to do another transaction, wait */ | ||
382 | if (ec_spi->last_transfer_ns) { | ||
383 | unsigned long delay; /* The delay completed so far */ | ||
384 | |||
385 | delay = ktime_get_ns() - ec_spi->last_transfer_ns; | ||
386 | if (delay < EC_SPI_RECOVERY_TIME_NS) | ||
387 | ndelay(EC_SPI_RECOVERY_TIME_NS - delay); | ||
388 | } | ||
389 | |||
390 | rx_buf = kzalloc(len, GFP_KERNEL); | ||
391 | if (!rx_buf) { | ||
392 | ret = -ENOMEM; | ||
393 | goto exit; | ||
394 | } | ||
395 | |||
396 | /* Transmit phase - send our message */ | ||
397 | memset(&trans, 0, sizeof(trans)); | ||
398 | trans.tx_buf = ec_dev->dout; | ||
399 | trans.rx_buf = rx_buf; | ||
400 | trans.len = len; | ||
401 | trans.cs_change = 1; | ||
402 | spi_message_init(&msg); | ||
403 | spi_message_add_tail(&trans, &msg); | ||
404 | ret = spi_sync(ec_spi->spi, &msg); | ||
405 | |||
406 | /* Get the response */ | ||
407 | if (!ret) { | ||
408 | /* Verify that EC can process command */ | ||
409 | for (i = 0; i < len; i++) { | ||
410 | switch (rx_buf[i]) { | ||
411 | case EC_SPI_PAST_END: | ||
412 | case EC_SPI_RX_BAD_DATA: | ||
413 | case EC_SPI_NOT_READY: | ||
414 | ret = -EAGAIN; | ||
415 | ec_msg->result = EC_RES_IN_PROGRESS; | ||
416 | default: | ||
417 | break; | ||
418 | } | ||
419 | if (ret) | ||
420 | break; | ||
421 | } | ||
422 | if (!ret) | ||
423 | ret = cros_ec_spi_receive_packet(ec_dev, | ||
424 | ec_msg->insize + sizeof(*response)); | ||
425 | } else { | ||
426 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | ||
427 | } | ||
428 | |||
429 | final_ret = terminate_request(ec_dev); | ||
430 | if (!ret) | ||
431 | ret = final_ret; | ||
432 | if (ret < 0) | ||
433 | goto exit; | ||
434 | |||
435 | ptr = ec_dev->din; | ||
436 | |||
437 | /* check response error code */ | ||
438 | response = (struct ec_host_response *)ptr; | ||
439 | ec_msg->result = response->result; | ||
440 | |||
441 | ret = cros_ec_check_result(ec_dev, ec_msg); | ||
442 | if (ret) | ||
443 | goto exit; | ||
444 | |||
445 | len = response->data_len; | ||
446 | sum = 0; | ||
447 | if (len > ec_msg->insize) { | ||
448 | dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", | ||
449 | len, ec_msg->insize); | ||
450 | ret = -EMSGSIZE; | ||
451 | goto exit; | ||
452 | } | ||
453 | |||
454 | for (i = 0; i < sizeof(*response); i++) | ||
455 | sum += ptr[i]; | ||
456 | |||
457 | /* copy response packet payload and compute checksum */ | ||
458 | memcpy(ec_msg->data, ptr + sizeof(*response), len); | ||
459 | for (i = 0; i < len; i++) | ||
460 | sum += ec_msg->data[i]; | ||
461 | |||
462 | if (sum) { | ||
463 | dev_err(ec_dev->dev, | ||
464 | "bad packet checksum, calculated %x\n", | ||
465 | sum); | ||
466 | ret = -EBADMSG; | ||
467 | goto exit; | ||
468 | } | ||
469 | |||
470 | ret = len; | ||
471 | exit: | ||
472 | kfree(rx_buf); | ||
473 | if (ec_msg->command == EC_CMD_REBOOT_EC) | ||
474 | msleep(EC_REBOOT_DELAY_MS); | ||
475 | |||
476 | return ret; | ||
477 | } | ||
478 | |||
479 | /** | ||
217 | * cros_ec_cmd_xfer_spi - Transfer a message over SPI and receive the reply | 480 | * cros_ec_cmd_xfer_spi - Transfer a message over SPI and receive the reply |
218 | * | 481 | * |
219 | * @ec_dev: ChromeOS EC device | 482 | * @ec_dev: ChromeOS EC device |
@@ -227,6 +490,7 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, | |||
227 | struct spi_message msg; | 490 | struct spi_message msg; |
228 | int i, len; | 491 | int i, len; |
229 | u8 *ptr; | 492 | u8 *ptr; |
493 | u8 *rx_buf; | ||
230 | int sum; | 494 | int sum; |
231 | int ret = 0, final_ret; | 495 | int ret = 0, final_ret; |
232 | 496 | ||
@@ -242,10 +506,17 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, | |||
242 | ndelay(EC_SPI_RECOVERY_TIME_NS - delay); | 506 | ndelay(EC_SPI_RECOVERY_TIME_NS - delay); |
243 | } | 507 | } |
244 | 508 | ||
509 | rx_buf = kzalloc(len, GFP_KERNEL); | ||
510 | if (!rx_buf) { | ||
511 | ret = -ENOMEM; | ||
512 | goto exit; | ||
513 | } | ||
514 | |||
245 | /* Transmit phase - send our message */ | 515 | /* Transmit phase - send our message */ |
246 | debug_packet(ec_dev->dev, "out", ec_dev->dout, len); | 516 | debug_packet(ec_dev->dev, "out", ec_dev->dout, len); |
247 | memset(&trans, 0, sizeof(trans)); | 517 | memset(&trans, 0, sizeof(trans)); |
248 | trans.tx_buf = ec_dev->dout; | 518 | trans.tx_buf = ec_dev->dout; |
519 | trans.rx_buf = rx_buf; | ||
249 | trans.len = len; | 520 | trans.len = len; |
250 | trans.cs_change = 1; | 521 | trans.cs_change = 1; |
251 | spi_message_init(&msg); | 522 | spi_message_init(&msg); |
@@ -254,29 +525,32 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, | |||
254 | 525 | ||
255 | /* Get the response */ | 526 | /* Get the response */ |
256 | if (!ret) { | 527 | if (!ret) { |
257 | ret = cros_ec_spi_receive_response(ec_dev, | 528 | /* Verify that EC can process command */ |
258 | ec_msg->insize + EC_MSG_TX_PROTO_BYTES); | 529 | for (i = 0; i < len; i++) { |
530 | switch (rx_buf[i]) { | ||
531 | case EC_SPI_PAST_END: | ||
532 | case EC_SPI_RX_BAD_DATA: | ||
533 | case EC_SPI_NOT_READY: | ||
534 | ret = -EAGAIN; | ||
535 | ec_msg->result = EC_RES_IN_PROGRESS; | ||
536 | default: | ||
537 | break; | ||
538 | } | ||
539 | if (ret) | ||
540 | break; | ||
541 | } | ||
542 | if (!ret) | ||
543 | ret = cros_ec_spi_receive_response(ec_dev, | ||
544 | ec_msg->insize + EC_MSG_TX_PROTO_BYTES); | ||
259 | } else { | 545 | } else { |
260 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | 546 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); |
261 | } | 547 | } |
262 | 548 | ||
263 | /* | 549 | final_ret = terminate_request(ec_dev); |
264 | * Turn off CS, possibly adding a delay to ensure the rising edge | ||
265 | * doesn't come too soon after the end of the data. | ||
266 | */ | ||
267 | spi_message_init(&msg); | ||
268 | memset(&trans, 0, sizeof(trans)); | ||
269 | trans.delay_usecs = ec_spi->end_of_msg_delay; | ||
270 | spi_message_add_tail(&trans, &msg); | ||
271 | |||
272 | final_ret = spi_sync(ec_spi->spi, &msg); | ||
273 | ec_spi->last_transfer_ns = ktime_get_ns(); | ||
274 | if (!ret) | 550 | if (!ret) |
275 | ret = final_ret; | 551 | ret = final_ret; |
276 | if (ret < 0) { | 552 | if (ret < 0) |
277 | dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); | ||
278 | goto exit; | 553 | goto exit; |
279 | } | ||
280 | 554 | ||
281 | ptr = ec_dev->din; | 555 | ptr = ec_dev->din; |
282 | 556 | ||
@@ -315,6 +589,7 @@ static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, | |||
315 | 589 | ||
316 | ret = len; | 590 | ret = len; |
317 | exit: | 591 | exit: |
592 | kfree(rx_buf); | ||
318 | if (ec_msg->command == EC_CMD_REBOOT_EC) | 593 | if (ec_msg->command == EC_CMD_REBOOT_EC) |
319 | msleep(EC_REBOOT_DELAY_MS); | 594 | msleep(EC_REBOOT_DELAY_MS); |
320 | 595 | ||
@@ -361,7 +636,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) | |||
361 | ec_dev->priv = ec_spi; | 636 | ec_dev->priv = ec_spi; |
362 | ec_dev->irq = spi->irq; | 637 | ec_dev->irq = spi->irq; |
363 | ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; | 638 | ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; |
364 | ec_dev->pkt_xfer = NULL; | 639 | ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi; |
365 | ec_dev->ec_name = ec_spi->spi->modalias; | 640 | ec_dev->ec_name = ec_spi->spi->modalias; |
366 | ec_dev->phys_name = dev_name(&ec_spi->spi->dev); | 641 | ec_dev->phys_name = dev_name(&ec_spi->spi->dev); |
367 | ec_dev->din_size = EC_MSG_PREAMBLE_COUNT + | 642 | ec_dev->din_size = EC_MSG_PREAMBLE_COUNT + |
@@ -369,6 +644,7 @@ static int cros_ec_spi_probe(struct spi_device *spi) | |||
369 | sizeof(struct ec_response_get_protocol_info); | 644 | sizeof(struct ec_response_get_protocol_info); |
370 | ec_dev->dout_size = sizeof(struct ec_host_request); | 645 | ec_dev->dout_size = sizeof(struct ec_host_request); |
371 | 646 | ||
647 | |||
372 | err = cros_ec_register(ec_dev); | 648 | err = cros_ec_register(ec_dev); |
373 | if (err) { | 649 | if (err) { |
374 | dev_err(dev, "cannot register EC\n"); | 650 | dev_err(dev, "cannot register EC\n"); |