Lines Matching refs:ec_dev

80 typedef int (*cros_ec_xfer_fn_t) (struct cros_ec_device *ec_dev,
96 struct cros_ec_device *ec_dev; member
115 static int terminate_request(struct cros_ec_device *ec_dev) in terminate_request() argument
117 struct cros_ec_spi *ec_spi = ec_dev->priv; in terminate_request()
136 dev_err(ec_dev->dev, in terminate_request()
149 static int receive_n_bytes(struct cros_ec_device *ec_dev, u8 *buf, int n) in receive_n_bytes() argument
151 struct cros_ec_spi *ec_spi = ec_dev->priv; in receive_n_bytes()
156 BUG_ON(buf - ec_dev->din + n > ec_dev->din_size); in receive_n_bytes()
167 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in receive_n_bytes()
184 static int cros_ec_spi_receive_packet(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_packet() argument
193 BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT); in cros_ec_spi_receive_packet()
200 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_packet()
201 ec_dev->din, in cros_ec_spi_receive_packet()
206 ptr = ec_dev->din; in cros_ec_spi_receive_packet()
209 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_packet()
210 ptr - ec_dev->din); in cros_ec_spi_receive_packet()
223 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_packet()
233 BUG_ON(todo < 0 || todo > ec_dev->din_size); in cros_ec_spi_receive_packet()
235 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_packet()
236 ptr = ec_dev->din + todo; in cros_ec_spi_receive_packet()
237 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_packet()
243 ret = receive_n_bytes(ec_dev, ptr, sizeof(*response) - todo); in cros_ec_spi_receive_packet()
250 response = (struct ec_host_response *)ec_dev->din; in cros_ec_spi_receive_packet()
253 if (response->data_len > ec_dev->din_size) in cros_ec_spi_receive_packet()
265 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_packet()
266 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_packet()
268 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_packet()
276 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_packet()
293 static int cros_ec_spi_receive_response(struct cros_ec_device *ec_dev, in cros_ec_spi_receive_response() argument
301 BUG_ON(ec_dev->din_size < EC_MSG_PREAMBLE_COUNT); in cros_ec_spi_receive_response()
308 ret = receive_n_bytes(ec_dev, in cros_ec_spi_receive_response()
309 ec_dev->din, in cros_ec_spi_receive_response()
314 ptr = ec_dev->din; in cros_ec_spi_receive_response()
317 dev_dbg(ec_dev->dev, "msg found at %zd\n", in cros_ec_spi_receive_response()
318 ptr - ec_dev->din); in cros_ec_spi_receive_response()
331 dev_warn(ec_dev->dev, "EC failed to respond in time\n"); in cros_ec_spi_receive_response()
341 BUG_ON(todo < 0 || todo > ec_dev->din_size); in cros_ec_spi_receive_response()
343 memmove(ec_dev->din, ptr, todo); in cros_ec_spi_receive_response()
344 ptr = ec_dev->din + todo; in cros_ec_spi_receive_response()
345 dev_dbg(ec_dev->dev, "need %d, got %d bytes from preamble\n", in cros_ec_spi_receive_response()
358 dev_dbg(ec_dev->dev, "loop, todo=%d, need_len=%d, ptr=%zd\n", in cros_ec_spi_receive_response()
359 todo, need_len, ptr - ec_dev->din); in cros_ec_spi_receive_response()
361 ret = receive_n_bytes(ec_dev, ptr, todo); in cros_ec_spi_receive_response()
365 debug_packet(ec_dev->dev, "interim", ptr, todo); in cros_ec_spi_receive_response()
370 dev_dbg(ec_dev->dev, "loop done, ptr=%zd\n", ptr - ec_dev->din); in cros_ec_spi_receive_response()
381 static int do_cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_pkt_xfer_spi() argument
385 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_pkt_xfer_spi()
396 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
397 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_pkt_xfer_spi()
423 trans.tx_buf = ec_dev->dout; in do_cros_ec_pkt_xfer_spi()
460 ret = cros_ec_spi_receive_packet(ec_dev, in do_cros_ec_pkt_xfer_spi()
463 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_pkt_xfer_spi()
465 final_ret = terminate_request(ec_dev); in do_cros_ec_pkt_xfer_spi()
474 ptr = ec_dev->din; in do_cros_ec_pkt_xfer_spi()
480 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_pkt_xfer_spi()
487 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_pkt_xfer_spi()
502 dev_err(ec_dev->dev, in do_cros_ec_pkt_xfer_spi()
524 static int do_cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in do_cros_ec_cmd_xfer_spi() argument
527 struct cros_ec_spi *ec_spi = ec_dev->priv; in do_cros_ec_cmd_xfer_spi()
538 len = cros_ec_prepare_tx(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
539 dev_dbg(ec_dev->dev, "prepared, len=%d\n", len); in do_cros_ec_cmd_xfer_spi()
553 debug_packet(ec_dev->dev, "out", ec_dev->dout, len); in do_cros_ec_cmd_xfer_spi()
555 trans.tx_buf = ec_dev->dout; in do_cros_ec_cmd_xfer_spi()
579 ret = cros_ec_spi_receive_response(ec_dev, in do_cros_ec_cmd_xfer_spi()
582 dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret); in do_cros_ec_cmd_xfer_spi()
584 final_ret = terminate_request(ec_dev); in do_cros_ec_cmd_xfer_spi()
593 ptr = ec_dev->din; in do_cros_ec_cmd_xfer_spi()
597 ret = cros_ec_check_result(ec_dev, ec_msg); in do_cros_ec_cmd_xfer_spi()
604 dev_err(ec_dev->dev, "packet too long (%d bytes, expected %d)", in do_cros_ec_cmd_xfer_spi()
618 debug_packet(ec_dev->dev, "in", ptr, len + 3); in do_cros_ec_cmd_xfer_spi()
621 dev_err(ec_dev->dev, in do_cros_ec_cmd_xfer_spi()
642 params->ret = params->fn(params->ec_dev, params->ec_msg); in cros_ec_xfer_high_pri_work()
645 static int cros_ec_xfer_high_pri(struct cros_ec_device *ec_dev, in cros_ec_xfer_high_pri() argument
649 struct cros_ec_spi *ec_spi = ec_dev->priv; in cros_ec_xfer_high_pri()
653 .ec_dev = ec_dev, in cros_ec_xfer_high_pri()
673 static int cros_ec_pkt_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_pkt_xfer_spi() argument
676 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_pkt_xfer_spi); in cros_ec_pkt_xfer_spi()
679 static int cros_ec_cmd_xfer_spi(struct cros_ec_device *ec_dev, in cros_ec_cmd_xfer_spi() argument
682 return cros_ec_xfer_high_pri(ec_dev, ec_msg, do_cros_ec_cmd_xfer_spi); in cros_ec_cmd_xfer_spi()
737 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 return 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()