Lines Matching refs:ec_dev

82 typedef int (*cros_ec_xfer_fn_t) (struct cros_ec_device *ec_dev,
98 struct cros_ec_device *ec_dev; member
111 static int terminate_request(struct cros_ec_device *ec_dev) in terminate_request() argument
113 struct cros_ec_spi *ec_spi = ec_dev->priv; in terminate_request()
133 dev_err(ec_dev->dev, in terminate_request()
150 static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) in receive_n_bytes() argument
152 struct cros_ec_spi *ec_spi = ec_dev->priv; in receive_n_bytes()
157 if (buf - ec_dev->din + n > ec_dev->din_size) in receive_n_bytes()
169 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in receive_n_bytes()
186 static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_packet() argument
195 if (ec_dev->din_size < EC_MSG_PREAMBLE_COUNT) in cros_ec_spi_receive_packet()
203 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_packet()
204 ec_dev->din, in cros_ec_spi_receive_packet()
209 ptr = ec_dev->din; in cros_ec_spi_receive_packet()
212 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_packet()
213 ptr - ec_dev->din); in cros_ec_spi_receive_packet()
226 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_packet()
237 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_packet()
238 ptr = ec_dev->din + todo; in cros_ec_spi_receive_packet()
239 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_packet()
245 ret = receive_n_bytes(ec_dev, ptr, sizeof(*response) - todo); in cros_ec_spi_receive_packet()
252 response = (struct ec_host_response *)ec_dev->din; in cros_ec_spi_receive_packet()
255 if (response->data_len > ec_dev->din_size) in cros_ec_spi_receive_packet()
267 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_packet()
268 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_packet()
270 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_packet()
278 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_packet()
295 static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_response() argument
303 if (ec_dev->din_size < EC_MSG_PREAMBLE_COUNT) in cros_ec_spi_receive_response()
311 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_response()
312 ec_dev->din, in cros_ec_spi_receive_response()
317 ptr = ec_dev->din; in cros_ec_spi_receive_response()
320 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_response()
321 ptr - ec_dev->din); in cros_ec_spi_receive_response()
334 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_response()
345 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_response()
346 ptr = ec_dev->din + todo; in cros_ec_spi_receive_response()
347 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_response()
360 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_response()
361 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_response()
363 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_response()
367 debug_packet(ec_dev->dev, "interim", ptr, todo); in cros_ec_spi_receive_response()
372 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_response()
383 static int do_cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_pkt_xfer_spi() argument
387 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_pkt_xfer_spi()
398 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
401 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_pkt_xfer_spi()
428 trans.tx_buf = ec_dev->dout; in do_cros_ec_pkt_xfer_spi()
465 ret = cros_ec_spi_receive_packet(ec_dev, in do_cros_ec_pkt_xfer_spi()
468 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_pkt_xfer_spi()
470 final_ret = terminate_request(ec_dev); in do_cros_ec_pkt_xfer_spi()
479 ptr = ec_dev->din; in do_cros_ec_pkt_xfer_spi()
485 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
492 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_pkt_xfer_spi()
507 dev_err(ec_dev->dev, in do_cros_ec_pkt_xfer_spi()
529 static int do_cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_cmd_xfer_spi() argument
532 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_cmd_xfer_spi()
543 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
546 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_cmd_xfer_spi()
560 debug_packet(ec_dev->dev, "out", ec_dev->dout, len); in do_cros_ec_cmd_xfer_spi()
562 trans.tx_buf = ec_dev->dout; in do_cros_ec_cmd_xfer_spi()
586 ret = cros_ec_spi_receive_response(ec_dev, in do_cros_ec_cmd_xfer_spi()
589 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_cmd_xfer_spi()
591 final_ret = terminate_request(ec_dev); in do_cros_ec_cmd_xfer_spi()
600 ptr = ec_dev->din; in do_cros_ec_cmd_xfer_spi()
604 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
611 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_cmd_xfer_spi()
625 debug_packet(ec_dev->dev, "in", ptr, len + 3); in do_cros_ec_cmd_xfer_spi()
628 dev_err(ec_dev->dev, in do_cros_ec_cmd_xfer_spi()
649 params->ret = params->fn(params->ec_dev, params->ec_msg); in cros_ec_xfer_high_pri_work()
652 static int cros_ec_xfer_high_pri(struct cros_ec_device *ec_dev, in cros_ec_xfer_high_pri() argument
656 struct cros_ec_spi *ec_spi = ec_dev->priv; in cros_ec_xfer_high_pri()
660 .ec_dev = ec_dev, in cros_ec_xfer_high_pri()
680 static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_pkt_xfer_spi() argument
683 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_pkt_xfer_spi); in cros_ec_pkt_xfer_spi()
686 static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_cmd_xfer_spi() argument
689 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_cmd_xfer_spi); in cros_ec_cmd_xfer_spi()
739 struct cros_ec_device *ec_dev; in cros_ec_spi_probe() local
752 ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL); in cros_ec_spi_probe()
753 if (!ec_dev) in cros_ec_spi_probe()
759 spi_set_drvdata(spi, ec_dev); in cros_ec_spi_probe()
760 ec_dev->dev = dev; in cros_ec_spi_probe()
761 ec_dev->priv = ec_spi; in cros_ec_spi_probe()
762 ec_dev->irq = spi->irq; in cros_ec_spi_probe()
763 ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; in cros_ec_spi_probe()
764 ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi; in cros_ec_spi_probe()
765 ec_dev->phys_name = dev_name(&ec_spi->spi->dev); in cros_ec_spi_probe()
766 ec_dev->din_size = EC_MSG_PREAMBLE_COUNT + in cros_ec_spi_probe()
769 ec_dev->dout_size = sizeof(struct ec_host_request); in cros_ec_spi_probe()
777 err = cros_ec_register(ec_dev); in cros_ec_spi_probe()
790 struct cros_ec_device *ec_dev = spi_get_drvdata(spi); in cros_ec_spi_remove() local
792 cros_ec_unregister(ec_dev); in cros_ec_spi_remove()
798 struct cros_ec_device *ec_dev = dev_get_drvdata(dev); in cros_ec_spi_suspend() local
800 return cros_ec_suspend(ec_dev); in cros_ec_spi_suspend()
805 struct cros_ec_device *ec_dev = dev_get_drvdata(dev); in cros_ec_spi_resume() local
807 return cros_ec_resume(ec_dev); in cros_ec_spi_resume()