Lines Matching refs:ec_dev

59 static int prepare_tx(struct cros_ec_device *ec_dev,  in prepare_tx()  argument
67 if (msg->outsize + sizeof(*request) > ec_dev->dout_size) in prepare_tx()
70 out = ec_dev->dout; in prepare_tx()
92 static int prepare_tx_legacy(struct cros_ec_device *ec_dev, in prepare_tx_legacy() argument
102 out = ec_dev->dout; in prepare_tx_legacy()
114 static int cros_ec_xfer_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) in cros_ec_xfer_command() argument
119 if (ec_dev->proto_version > 2) in cros_ec_xfer_command()
120 xfer_fxn = ec_dev->pkt_xfer; in cros_ec_xfer_command()
122 xfer_fxn = ec_dev->cmd_xfer; in cros_ec_xfer_command()
130 dev_err_once(ec_dev->dev, "missing EC transfer API, cannot send command\n"); in cros_ec_xfer_command()
135 ret = (*xfer_fxn)(ec_dev, msg); in cros_ec_xfer_command()
141 static int cros_ec_wait_until_complete(struct cros_ec_device *ec_dev, uint32_t *result) in cros_ec_wait_until_complete() argument
158 ret = cros_ec_xfer_command(ec_dev, msg); in cros_ec_wait_until_complete()
183 static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) in cros_ec_send_command() argument
185 int ret = cros_ec_xfer_command(ec_dev, msg); in cros_ec_send_command()
188 ret = cros_ec_wait_until_complete(ec_dev, &msg->result); in cros_ec_send_command()
203 int cros_ec_prepare_tx(struct cros_ec_device *ec_dev, in cros_ec_prepare_tx() argument
206 if (ec_dev->proto_version > 2) in cros_ec_prepare_tx()
207 return prepare_tx(ec_dev, msg); in cros_ec_prepare_tx()
209 return prepare_tx_legacy(ec_dev, msg); in cros_ec_prepare_tx()
226 int cros_ec_check_result(struct cros_ec_device *ec_dev, in cros_ec_check_result() argument
233 dev_dbg(ec_dev->dev, "command 0x%02x in progress\n", in cros_ec_check_result()
237 dev_dbg(ec_dev->dev, "command 0x%02x returned %d\n", in cros_ec_check_result()
256 static int cros_ec_get_host_event_wake_mask(struct cros_ec_device *ec_dev, uint32_t *mask) in cros_ec_get_host_event_wake_mask() argument
269 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_get_host_event_wake_mask()
292 int cros_ec_rwsig_continue(struct cros_ec_device *ec_dev) in cros_ec_rwsig_continue() argument
299 ec_dev->proto_version = 3; in cros_ec_rwsig_continue()
314 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_rwsig_continue()
350 static int cros_ec_get_proto_info(struct cros_ec_device *ec_dev, int devidx) in cros_ec_get_proto_info() argument
356 ec_dev->proto_version = 3; in cros_ec_get_proto_info()
358 ec_dev->max_passthru = 0; in cros_ec_get_proto_info()
367 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_get_proto_info()
370 dev_dbg(ec_dev->dev, in cros_ec_get_proto_info()
391 ec_dev->max_request = info->max_request_packet_size - in cros_ec_get_proto_info()
393 ec_dev->max_response = info->max_response_packet_size - in cros_ec_get_proto_info()
395 ec_dev->proto_version = min(EC_HOST_REQUEST_VERSION, in cros_ec_get_proto_info()
397 ec_dev->din_size = info->max_response_packet_size + EC_MAX_RESPONSE_OVERHEAD; in cros_ec_get_proto_info()
398 ec_dev->dout_size = info->max_request_packet_size + EC_MAX_REQUEST_OVERHEAD; in cros_ec_get_proto_info()
400 dev_dbg(ec_dev->dev, "using proto v%u\n", ec_dev->proto_version); in cros_ec_get_proto_info()
403 ec_dev->max_passthru = info->max_request_packet_size - in cros_ec_get_proto_info()
406 dev_dbg(ec_dev->dev, "found PD chip\n"); in cros_ec_get_proto_info()
409 dev_dbg(ec_dev->dev, "unknown passthru index: %d\n", devidx); in cros_ec_get_proto_info()
419 static int cros_ec_get_proto_info_legacy(struct cros_ec_device *ec_dev) in cros_ec_get_proto_info_legacy() argument
426 ec_dev->proto_version = 2; in cros_ec_get_proto_info_legacy()
439 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_get_proto_info_legacy()
441 dev_dbg(ec_dev->dev, "EC failed to respond to v2 hello: %d\n", ret); in cros_ec_get_proto_info_legacy()
448 dev_err(ec_dev->dev, "EC responded to v2 hello with error: %d\n", msg->result); in cros_ec_get_proto_info_legacy()
459 dev_err(ec_dev->dev, in cros_ec_get_proto_info_legacy()
466 ec_dev->max_request = EC_PROTO2_MAX_PARAM_SIZE; in cros_ec_get_proto_info_legacy()
467 ec_dev->max_response = EC_PROTO2_MAX_PARAM_SIZE; in cros_ec_get_proto_info_legacy()
468 ec_dev->max_passthru = 0; in cros_ec_get_proto_info_legacy()
469 ec_dev->pkt_xfer = NULL; in cros_ec_get_proto_info_legacy()
470 ec_dev->din_size = EC_PROTO2_MSG_BYTES; in cros_ec_get_proto_info_legacy()
471 ec_dev->dout_size = EC_PROTO2_MSG_BYTES; in cros_ec_get_proto_info_legacy()
473 dev_dbg(ec_dev->dev, "falling back to proto v2\n"); in cros_ec_get_proto_info_legacy()
495 static int cros_ec_get_host_command_version_mask(struct cros_ec_device *ec_dev, u16 cmd, u32 *mask) in cros_ec_get_host_command_version_mask() argument
515 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_get_host_command_version_mask()
545 int cros_ec_query_all(struct cros_ec_device *ec_dev) in cros_ec_query_all() argument
547 struct device *dev = ec_dev->dev; in cros_ec_query_all()
552 if (!cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_EC_INDEX)) { in cros_ec_query_all()
554 cros_ec_get_proto_info(ec_dev, CROS_EC_DEV_PD_INDEX); in cros_ec_query_all()
557 ret = cros_ec_get_proto_info_legacy(ec_dev); in cros_ec_query_all()
564 ec_dev->proto_version = EC_PROTO_VERSION_UNKNOWN; in cros_ec_query_all()
565 dev_dbg(ec_dev->dev, "EC query failed: %d\n", ret); in cros_ec_query_all()
570 devm_kfree(dev, ec_dev->din); in cros_ec_query_all()
571 devm_kfree(dev, ec_dev->dout); in cros_ec_query_all()
573 ec_dev->din = devm_kzalloc(dev, ec_dev->din_size, GFP_KERNEL); in cros_ec_query_all()
574 if (!ec_dev->din) { in cros_ec_query_all()
579 ec_dev->dout = devm_kzalloc(dev, ec_dev->dout_size, GFP_KERNEL); in cros_ec_query_all()
580 if (!ec_dev->dout) { in cros_ec_query_all()
581 devm_kfree(dev, ec_dev->din); in cros_ec_query_all()
587 ret = cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_GET_NEXT_EVENT, &ver_mask); in cros_ec_query_all()
589 ec_dev->mkbp_event_supported = 0; in cros_ec_query_all()
591 ec_dev->mkbp_event_supported = fls(ver_mask); in cros_ec_query_all()
593 dev_dbg(ec_dev->dev, "MKBP support version %u\n", ec_dev->mkbp_event_supported - 1); in cros_ec_query_all()
597 ret = cros_ec_get_host_command_version_mask(ec_dev, EC_CMD_HOST_SLEEP_EVENT, &ver_mask); in cros_ec_query_all()
598 ec_dev->host_sleep_v1 = (ret == 0 && (ver_mask & EC_VER_MASK(1))); in cros_ec_query_all()
601 ret = cros_ec_get_host_event_wake_mask(ec_dev, &ec_dev->host_event_wake_mask); in cros_ec_query_all()
612 ec_dev->host_event_wake_mask = U32_MAX & in cros_ec_query_all()
625 dev_err(ec_dev->dev, in cros_ec_query_all()
656 int cros_ec_cmd_xfer(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) in cros_ec_cmd_xfer() argument
660 mutex_lock(&ec_dev->lock); in cros_ec_cmd_xfer()
661 if (ec_dev->proto_version == EC_PROTO_VERSION_UNKNOWN) { in cros_ec_cmd_xfer()
662 ret = cros_ec_query_all(ec_dev); in cros_ec_cmd_xfer()
664 dev_err(ec_dev->dev, in cros_ec_cmd_xfer()
666 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer()
671 if (msg->insize > ec_dev->max_response) { in cros_ec_cmd_xfer()
672 dev_dbg(ec_dev->dev, "clamping message receive buffer\n"); in cros_ec_cmd_xfer()
673 msg->insize = ec_dev->max_response; in cros_ec_cmd_xfer()
677 if (msg->outsize > ec_dev->max_request) { in cros_ec_cmd_xfer()
678 dev_err(ec_dev->dev, in cros_ec_cmd_xfer()
681 ec_dev->max_request); in cros_ec_cmd_xfer()
682 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer()
686 if (msg->outsize > ec_dev->max_passthru) { in cros_ec_cmd_xfer()
687 dev_err(ec_dev->dev, in cros_ec_cmd_xfer()
690 ec_dev->max_passthru); in cros_ec_cmd_xfer()
691 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer()
696 ret = cros_ec_send_command(ec_dev, msg); in cros_ec_cmd_xfer()
697 mutex_unlock(&ec_dev->lock); in cros_ec_cmd_xfer()
716 int cros_ec_cmd_xfer_status(struct cros_ec_device *ec_dev, in cros_ec_cmd_xfer_status() argument
721 ret = cros_ec_cmd_xfer(ec_dev, msg); in cros_ec_cmd_xfer_status()
727 dev_dbg(ec_dev->dev, "Command result (err: %d [%d])\n", in cros_ec_cmd_xfer_status()
736 static int get_next_event_xfer(struct cros_ec_device *ec_dev, in get_next_event_xfer() argument
748 ret = cros_ec_cmd_xfer_status(ec_dev, msg); in get_next_event_xfer()
750 ec_dev->event_size = ret - 1; in get_next_event_xfer()
751 ec_dev->event_data = *event; in get_next_event_xfer()
757 static int get_next_event(struct cros_ec_device *ec_dev) in get_next_event() argument
763 int cmd_version = ec_dev->mkbp_event_supported - 1; in get_next_event()
766 if (ec_dev->suspended) { in get_next_event()
767 dev_dbg(ec_dev->dev, "Device suspended.\n"); in get_next_event()
784 return get_next_event_xfer(ec_dev, msg, event, cmd_version, size); in get_next_event()
787 static int get_keyboard_state_event(struct cros_ec_device *ec_dev) in get_keyboard_state_event() argument
790 sizeof(ec_dev->event_data.data)]; in get_keyboard_state_event()
795 msg->insize = sizeof(ec_dev->event_data.data); in get_keyboard_state_event()
798 ec_dev->event_size = cros_ec_cmd_xfer_status(ec_dev, msg); in get_keyboard_state_event()
799 ec_dev->event_data.event_type = EC_MKBP_EVENT_KEY_MATRIX; in get_keyboard_state_event()
800 memcpy(&ec_dev->event_data.data, msg->data, in get_keyboard_state_event()
801 sizeof(ec_dev->event_data.data)); in get_keyboard_state_event()
803 return ec_dev->event_size; in get_keyboard_state_event()
824 int cros_ec_get_next_event(struct cros_ec_device *ec_dev, in cros_ec_get_next_event() argument
849 if (!ec_dev->mkbp_event_supported) in cros_ec_get_next_event()
850 return get_keyboard_state_event(ec_dev); in cros_ec_get_next_event()
852 ret = get_next_event(ec_dev); in cros_ec_get_next_event()
861 dev_dbg(ec_dev->dev, in cros_ec_get_next_event()
863 mutex_lock(&ec_dev->lock); in cros_ec_get_next_event()
864 ret = cros_ec_get_host_command_version_mask(ec_dev, in cros_ec_get_next_event()
867 mutex_unlock(&ec_dev->lock); in cros_ec_get_next_event()
878 ec_dev->mkbp_event_supported = fls(ver_mask); in cros_ec_get_next_event()
879 dev_dbg(ec_dev->dev, "MKBP support version changed to %u\n", in cros_ec_get_next_event()
880 ec_dev->mkbp_event_supported - 1); in cros_ec_get_next_event()
883 ret = get_next_event(ec_dev); in cros_ec_get_next_event()
890 *has_more_events = ec_dev->event_data.event_type & in cros_ec_get_next_event()
892 ec_dev->event_data.event_type &= EC_MKBP_EVENT_TYPE_MASK; in cros_ec_get_next_event()
895 event_type = ec_dev->event_data.event_type; in cros_ec_get_next_event()
896 host_event = cros_ec_get_host_event(ec_dev); in cros_ec_get_next_event()
909 if (!(host_event & ec_dev->host_event_wake_mask)) in cros_ec_get_next_event()
928 u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev) in cros_ec_get_host_event() argument
932 if (!ec_dev->mkbp_event_supported) in cros_ec_get_host_event()
935 if (ec_dev->event_data.event_type != EC_MKBP_EVENT_HOST_EVENT) in cros_ec_get_host_event()
938 if (ec_dev->event_size != sizeof(host_event)) { in cros_ec_get_host_event()
939 dev_warn(ec_dev->dev, "Invalid host event size\n"); in cros_ec_get_host_event()
943 host_event = get_unaligned_le32(&ec_dev->event_data.data.host_event); in cros_ec_get_host_event()
958 int ret = cros_ec_cmd(ec->ec_dev, 0, EC_CMD_GET_FEATURES + ec->cmd_offset, in cros_ec_read_features()
1013 struct cros_ec_device *ec_dev = ec->ec_dev; in cros_ec_get_sensor_count() local
1029 ret = cros_ec_cmd_xfer_status(ec->ec_dev, msg); in cros_ec_get_sensor_count()
1042 if (sensor_count < 0 && ec->cmd_offset == 0 && ec_dev->cmd_readmem) { in cros_ec_get_sensor_count()
1043 ret = ec_dev->cmd_readmem(ec_dev, EC_MEMMAP_ACC_STATUS, in cros_ec_get_sensor_count()
1075 int cros_ec_cmd(struct cros_ec_device *ec_dev, in cros_ec_cmd() argument
1098 ret = cros_ec_cmd_xfer_status(ec_dev, msg); in cros_ec_cmd()
1120 int cros_ec_cmd_readmem(struct cros_ec_device *ec_dev, u8 offset, u8 size, void *dest) in cros_ec_cmd_readmem() argument
1127 if (ec_dev->cmd_readmem) in cros_ec_cmd_readmem()
1128 return ec_dev->cmd_readmem(ec_dev, offset, size, dest); in cros_ec_cmd_readmem()
1132 return cros_ec_cmd(ec_dev, 0, EC_CMD_READ_MEMMAP, in cros_ec_cmd_readmem()
1145 int cros_ec_get_cmd_versions(struct cros_ec_device *ec_dev, u16 cmd) in cros_ec_get_cmd_versions() argument
1154 ret = cros_ec_cmd(ec_dev, 0, EC_CMD_GET_CMD_VERSIONS, in cros_ec_get_cmd_versions()
1158 ret = cros_ec_cmd(ec_dev, 1, EC_CMD_GET_CMD_VERSIONS, in cros_ec_get_cmd_versions()
1178 bool cros_ec_device_registered(struct cros_ec_device *ec_dev) in cros_ec_device_registered() argument
1180 guard(mutex)(&ec_dev->lock); in cros_ec_device_registered()
1181 return ec_dev->registered; in cros_ec_device_registered()