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
117 static int terminate_request(struct cros_ec_device *ec_dev) in terminate_request() argument
119 struct cros_ec_spi *ec_spi = ec_dev->priv; in terminate_request()
139 dev_err(ec_dev->dev, in terminate_request()
156 static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) in receive_n_bytes() argument
158 struct cros_ec_spi *ec_spi = ec_dev->priv; in receive_n_bytes()
163 BUG_ON(buf - ec_dev->din + n > ec_dev->din_size); in receive_n_bytes()
174 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in receive_n_bytes()
191 static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_packet() argument
200 BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT); in cros_ec_spi_receive_packet()
207 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_packet()
208 ec_dev->din, in cros_ec_spi_receive_packet()
213 ptr = ec_dev->din; in cros_ec_spi_receive_packet()
216 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_packet()
217 ptr - ec_dev->din); in cros_ec_spi_receive_packet()
230 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_packet()
240 BUG_ON(todo < 0 || todo > ec_dev->din_size); in cros_ec_spi_receive_packet()
242 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_packet()
243 ptr = ec_dev->din + todo; in cros_ec_spi_receive_packet()
244 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_packet()
250 ret = receive_n_bytes(ec_dev, ptr, sizeof(*response) - todo); in cros_ec_spi_receive_packet()
257 response = (struct ec_host_response *)ec_dev->din; in cros_ec_spi_receive_packet()
260 if (response->data_len > ec_dev->din_size) in cros_ec_spi_receive_packet()
272 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_packet()
273 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_packet()
275 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_packet()
283 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_packet()
300 static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_response() argument
308 BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT); in cros_ec_spi_receive_response()
315 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_response()
316 ec_dev->din, in cros_ec_spi_receive_response()
321 ptr = ec_dev->din; in cros_ec_spi_receive_response()
324 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_response()
325 ptr - ec_dev->din); in cros_ec_spi_receive_response()
338 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_response()
348 BUG_ON(todo < 0 || todo > ec_dev->din_size); in cros_ec_spi_receive_response()
350 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_response()
351 ptr = ec_dev->din + todo; in cros_ec_spi_receive_response()
352 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_response()
365 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_response()
366 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_response()
368 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_response()
372 debug_packet(ec_dev->dev, "interim", ptr, todo); in cros_ec_spi_receive_response()
377 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_response()
388 static int do_cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_pkt_xfer_spi() argument
392 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_pkt_xfer_spi()
403 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
404 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_pkt_xfer_spi()
431 trans.tx_buf = ec_dev->dout; in do_cros_ec_pkt_xfer_spi()
468 ret = cros_ec_spi_receive_packet(ec_dev, in do_cros_ec_pkt_xfer_spi()
471 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_pkt_xfer_spi()
473 final_ret = terminate_request(ec_dev); in do_cros_ec_pkt_xfer_spi()
482 ptr = ec_dev->din; in do_cros_ec_pkt_xfer_spi()
488 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
495 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_pkt_xfer_spi()
510 dev_err(ec_dev->dev, in do_cros_ec_pkt_xfer_spi()
532 static int do_cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_cmd_xfer_spi() argument
535 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_cmd_xfer_spi()
546 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
547 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_cmd_xfer_spi()
561 debug_packet(ec_dev->dev, "out", ec_dev->dout, len); in do_cros_ec_cmd_xfer_spi()
563 trans.tx_buf = ec_dev->dout; in do_cros_ec_cmd_xfer_spi()
587 ret = cros_ec_spi_receive_response(ec_dev, in do_cros_ec_cmd_xfer_spi()
590 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_cmd_xfer_spi()
592 final_ret = terminate_request(ec_dev); in do_cros_ec_cmd_xfer_spi()
601 ptr = ec_dev->din; in do_cros_ec_cmd_xfer_spi()
605 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
612 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_cmd_xfer_spi()
626 debug_packet(ec_dev->dev, "in", ptr, len + 3); in do_cros_ec_cmd_xfer_spi()
629 dev_err(ec_dev->dev, in do_cros_ec_cmd_xfer_spi()
650 params->ret = params->fn(params->ec_dev, params->ec_msg); in cros_ec_xfer_high_pri_work()
653 static int cros_ec_xfer_high_pri(struct cros_ec_device *ec_dev, in cros_ec_xfer_high_pri() argument
657 struct cros_ec_spi *ec_spi = ec_dev->priv; in cros_ec_xfer_high_pri()
661 .ec_dev = ec_dev, in cros_ec_xfer_high_pri()
681 static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_pkt_xfer_spi() argument
684 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_pkt_xfer_spi); in cros_ec_pkt_xfer_spi()
687 static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_cmd_xfer_spi() argument
690 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_cmd_xfer_spi); in cros_ec_cmd_xfer_spi()
740 struct cros_ec_device *ec_dev; in cros_ec_spi_probe() local
753 ec_dev = devm_kzalloc(dev, sizeof(*ec_dev), GFP_KERNEL); in cros_ec_spi_probe()
754 if (!ec_dev) in cros_ec_spi_probe()
760 spi_set_drvdata(spi, ec_dev); in cros_ec_spi_probe()
761 ec_dev->dev = dev; in cros_ec_spi_probe()
762 ec_dev->priv = ec_spi; in cros_ec_spi_probe()
763 ec_dev->irq = spi->irq; in cros_ec_spi_probe()
764 ec_dev->cmd_xfer = cros_ec_cmd_xfer_spi; in cros_ec_spi_probe()
765 ec_dev->pkt_xfer = cros_ec_pkt_xfer_spi; in cros_ec_spi_probe()
766 ec_dev->phys_name = dev_name(&ec_spi->spi->dev); in cros_ec_spi_probe()
767 ec_dev->din_size = EC_MSG_PREAMBLE_COUNT + in cros_ec_spi_probe()
770 ec_dev->dout_size = sizeof(struct ec_host_request); in cros_ec_spi_probe()
778 err = cros_ec_register(ec_dev); in cros_ec_spi_probe()
791 struct cros_ec_device *ec_dev = spi_get_drvdata(spi); in cros_ec_spi_remove() local
793 return cros_ec_unregister(ec_dev); in cros_ec_spi_remove()
799 struct cros_ec_device *ec_dev = dev_get_drvdata(dev); in cros_ec_spi_suspend() local
801 return cros_ec_suspend(ec_dev); in cros_ec_spi_suspend()
806 struct cros_ec_device *ec_dev = dev_get_drvdata(dev); in cros_ec_spi_resume() local
808 return cros_ec_resume(ec_dev); in cros_ec_spi_resume()