Lines Matching refs:ec_dev

55 static int prepare_packet(struct cros_ec_device *ec_dev,  in prepare_packet()  argument
63 BUG_ON(ec_dev->proto_version != EC_HOST_REQUEST_VERSION); in prepare_packet()
64 BUG_ON(msg->outsize + sizeof(*request) > ec_dev->dout_size); in prepare_packet()
66 out = ec_dev->dout; in prepare_packet()
88 static int send_command(struct cros_ec_device *ec_dev, in send_command() argument
94 if (ec_dev->proto_version > 2) in send_command()
95 xfer_fxn = ec_dev->pkt_xfer; in send_command()
97 xfer_fxn = ec_dev->cmd_xfer; in send_command()
105 dev_err_once(ec_dev->dev, in send_command()
111 ret = (*xfer_fxn)(ec_dev, msg); in send_command()
136 ret = (*xfer_fxn)(ec_dev, status_msg); in send_command()
170 int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, in cros_ec_prepare_tx() argument
177 if (ec_dev->proto_version > 2) in cros_ec_prepare_tx()
178 return prepare_packet(ec_dev, msg); in cros_ec_prepare_tx()
181 out = ec_dev->dout; in cros_ec_prepare_tx()
204 int cros_ec_check_result(struct cros_ec_device *ec_dev, in cros_ec_check_result() argument
211 dev_dbg(ec_dev->dev, "command 0x%02x in progress\n", in cros_ec_check_result()
215 dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n", in cros_ec_check_result()
235 static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, in cros_ec_get_host_event_wake_mask() argument
247 ret = send_command(ec_dev, msg); in cros_ec_get_host_event_wake_mask()
262 static int cros_ec_host_command_proto_query(struct cros_ec_device *ec_dev, in cros_ec_host_command_proto_query() argument
274 if (!ec_dev->pkt_xfer) in cros_ec_host_command_proto_query()
281 ret = send_command(ec_dev, msg); in cros_ec_host_command_proto_query()
290 ret = send_command(ec_dev, msg); in cros_ec_host_command_proto_query()
293 dev_dbg(ec_dev->dev, in cros_ec_host_command_proto_query()
307 static int cros_ec_host_command_proto_query_v2(struct cros_ec_device *ec_dev) in cros_ec_host_command_proto_query_v2() argument
328 ret = send_command(ec_dev, msg); in cros_ec_host_command_proto_query_v2()
331 dev_dbg(ec_dev->dev, in cros_ec_host_command_proto_query_v2()
336 dev_err(ec_dev->dev, in cros_ec_host_command_proto_query_v2()
342 dev_err(ec_dev->dev, in cros_ec_host_command_proto_query_v2()
372 static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, in cros_ec_get_host_command_version_mask() argument
393 ret = send_command(ec_dev, msg); in cros_ec_get_host_command_version_mask()
411 int cros_ec_query_all(struct cros_ec_device *ec_dev) in cros_ec_query_all() argument
413 struct device *dev = ec_dev->dev; in cros_ec_query_all()
425 ec_dev->proto_version = 3; in cros_ec_query_all()
426 ret = cros_ec_host_command_proto_query(ec_dev, 0, proto_msg); in cros_ec_query_all()
431 ec_dev->max_request = proto_info->max_request_packet_size - in cros_ec_query_all()
433 ec_dev->max_response = proto_info->max_response_packet_size - in cros_ec_query_all()
435 ec_dev->proto_version = in cros_ec_query_all()
438 dev_dbg(ec_dev->dev, in cros_ec_query_all()
440 ec_dev->proto_version); in cros_ec_query_all()
442 ec_dev->din_size = ec_dev->max_response + in cros_ec_query_all()
445 ec_dev->dout_size = ec_dev->max_request + in cros_ec_query_all()
452 ret = cros_ec_host_command_proto_query(ec_dev, 1, proto_msg); in cros_ec_query_all()
455 dev_dbg(ec_dev->dev, "no PD chip found: %d\n", ret); in cros_ec_query_all()
456 ec_dev->max_passthru = 0; in cros_ec_query_all()
458 dev_dbg(ec_dev->dev, "found PD chip\n"); in cros_ec_query_all()
459 ec_dev->max_passthru = in cros_ec_query_all()
465 ec_dev->proto_version = 2; in cros_ec_query_all()
466 ret = cros_ec_host_command_proto_query_v2(ec_dev); in cros_ec_query_all()
470 dev_dbg(ec_dev->dev, "falling back to proto v2\n"); in cros_ec_query_all()
472 ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; in cros_ec_query_all()
473 ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; in cros_ec_query_all()
474 ec_dev->max_passthru = 0; in cros_ec_query_all()
475 ec_dev->pkt_xfer = NULL; in cros_ec_query_all()
476 ec_dev->din_size = EC_PROTO2_MSG_BYTES; in cros_ec_query_all()
477 ec_dev->dout_size = EC_PROTO2_MSG_BYTES; in cros_ec_query_all()
484 ec_dev->proto_version = EC_PROTO_VERSION_UNKNOWN; in cros_ec_query_all()
485 dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); in cros_ec_query_all()
490 devm_kfree(dev, ec_dev->din); in cros_ec_query_all()
491 devm_kfree(dev, ec_dev->dout); in cros_ec_query_all()
493 ec_dev->din = devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL); in cros_ec_query_all()
494 if (!ec_dev->din) { in cros_ec_query_all()
499 ec_dev->dout = devm_kzalloc(dev, ec_dev->dout_size, GFP_KERNEL); in cros_ec_query_all()
500 if (!ec_dev->dout) { in cros_ec_query_all()
501 devm_kfree(dev, ec_dev->din); in cros_ec_query_all()
507 ret = cros_ec_get_host_command_version_mask(ec_dev, in cros_ec_query_all()
511 ec_dev->mkbp_event_supported = 0; in cros_ec_query_all()
513 ec_dev->mkbp_event_supported = fls(ver_mask); in cros_ec_query_all()
515 dev_dbg(ec_dev->dev, "MKBP support version %u\n", in cros_ec_query_all()
516 ec_dev->mkbp_event_supported - 1); in cros_ec_query_all()
519 ret = cros_ec_get_host_command_version_mask(ec_dev, in cros_ec_query_all()
522 ec_dev->host_sleep_v1 = (ret >= 0 && (ver_mask & EC_VER_MASK(1))); in cros_ec_query_all()
525 ret = cros_ec_get_host_event_wake_mask(ec_dev, proto_msg, in cros_ec_query_all()
526 &ec_dev->host_event_wake_mask); in cros_ec_query_all()
537 ec_dev->host_event_wake_mask = U32_MAX & in cros_ec_query_all()
550 dev_err(ec_dev->dev, in cros_ec_query_all()
575 int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, in cros_ec_cmd_xfer_status() argument
580 mutex_lock(&ec_dev->lock); in cros_ec_cmd_xfer_status()
581 if (ec_dev->proto_version == EC_PROTO_VERSION_UNKNOWN) { in cros_ec_cmd_xfer_status()
582 ret = cros_ec_query_all(ec_dev); in cros_ec_cmd_xfer_status()
584 dev_err(ec_dev->dev, in cros_ec_cmd_xfer_status()
586 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer_status()
591 if (msg->insize > ec_dev->max_response) { in cros_ec_cmd_xfer_status()
592 dev_dbg(ec_dev->dev, "clamping message receive buffer\n"); in cros_ec_cmd_xfer_status()
593 msg->insize = ec_dev->max_response; in cros_ec_cmd_xfer_status()
597 if (msg->outsize > ec_dev->max_request) { in cros_ec_cmd_xfer_status()
598 dev_err(ec_dev->dev, in cros_ec_cmd_xfer_status()
601 ec_dev->max_request); in cros_ec_cmd_xfer_status()
602 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer_status()
606 if (msg->outsize > ec_dev->max_passthru) { in cros_ec_cmd_xfer_status()
607 dev_err(ec_dev->dev, in cros_ec_cmd_xfer_status()
610 ec_dev->max_passthru); in cros_ec_cmd_xfer_status()
611 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer_status()
616 ret = send_command(ec_dev, msg); in cros_ec_cmd_xfer_status()
617 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer_status()
621 dev_dbg(ec_dev->dev, "Command result (err: %d [%d])\n", in cros_ec_cmd_xfer_status()
630 static int get_next_event_xfer(struct cros_ec_device *ec_dev, in get_next_event_xfer() argument
642 ret = cros_ec_cmd_xfer_status(ec_dev, msg); in get_next_event_xfer()
644 ec_dev->event_size = ret - 1; in get_next_event_xfer()
645 ec_dev->event_data = *event; in get_next_event_xfer()
651 static int get_next_event(struct cros_ec_device *ec_dev) in get_next_event() argument
659 const int cmd_version = ec_dev->mkbp_event_supported - 1; in get_next_event()
662 if (ec_dev->suspended) { in get_next_event()
663 dev_dbg(ec_dev->dev, "Device suspended.\n"); in get_next_event()
668 return get_next_event_xfer(ec_dev, msg, event, 0, in get_next_event()
671 return get_next_event_xfer(ec_dev, msg, event, cmd_version, in get_next_event()
675 static int get_keyboard_state_event(struct cros_ec_device *ec_dev) in get_keyboard_state_event() argument
678 sizeof(ec_dev->event_data.data)]; in get_keyboard_state_event()
683 msg->insize = sizeof(ec_dev->event_data.data); in get_keyboard_state_event()
686 ec_dev->event_size = cros_ec_cmd_xfer_status(ec_dev, msg); in get_keyboard_state_event()
687 ec_dev->event_data.event_type = EC_MKBP_EVENT_KEY_MATRIX; in get_keyboard_state_event()
688 memcpy(&ec_dev->event_data.data, msg->data, in get_keyboard_state_event()
689 sizeof(ec_dev->event_data.data)); in get_keyboard_state_event()
691 return ec_dev->event_size; in get_keyboard_state_event()
712 int cros_ec_get_next_event(struct cros_ec_device *ec_dev, in cros_ec_get_next_event() argument
736 if (!ec_dev->mkbp_event_supported) in cros_ec_get_next_event()
737 return get_keyboard_state_event(ec_dev); in cros_ec_get_next_event()
739 ret = get_next_event(ec_dev); in cros_ec_get_next_event()
744 *has_more_events = ec_dev->event_data.event_type & in cros_ec_get_next_event()
746 ec_dev->event_data.event_type &= EC_MKBP_EVENT_TYPE_MASK; in cros_ec_get_next_event()
749 event_type = ec_dev->event_data.event_type; in cros_ec_get_next_event()
750 host_event = cros_ec_get_host_event(ec_dev); in cros_ec_get_next_event()
763 if (!(host_event & ec_dev->host_event_wake_mask)) in cros_ec_get_next_event()
782 u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) in cros_ec_get_host_event() argument
786 BUG_ON(!ec_dev->mkbp_event_supported); in cros_ec_get_host_event()
788 if (ec_dev->event_data.event_type != EC_MKBP_EVENT_HOST_EVENT) in cros_ec_get_host_event()
791 if (ec_dev->event_size != sizeof(host_event)) { in cros_ec_get_host_event()
792 dev_warn(ec_dev->dev, "Invalid host event size\n"); in cros_ec_get_host_event()
796 host_event = get_unaligned_le32(&ec_dev->event_data.data.host_event); in cros_ec_get_host_event()
820 ret = cros_ec_command(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset, in cros_ec_check_features()
852 struct cros_ec_device *ec_dev = ec->ec_dev; in cros_ec_get_sensor_count() local
868 ret = cros_ec_cmd_xfer_status(ec->ec_dev, msg); in cros_ec_get_sensor_count()
881 if (sensor_count < 0 && ec->cmd_offset == 0 && ec_dev->cmd_readmem) { in cros_ec_get_sensor_count()
882 ret = ec_dev->cmd_readmem(ec_dev, EC_MEMMAP_ACC_STATUS, in cros_ec_get_sensor_count()
914 int cros_ec_command(struct cros_ec_device *ec_dev, in cros_ec_command() argument
937 ret = cros_ec_cmd_xfer_status(ec_dev, msg); in cros_ec_command()