diff options
Diffstat (limited to 'zephyr/emul/tcpc/emul_tcpci_partner_vpd.c')
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_vpd.c | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_vpd.c b/zephyr/emul/tcpc/emul_tcpci_partner_vpd.c deleted file mode 100644 index f01227e913..0000000000 --- a/zephyr/emul/tcpc/emul_tcpci_partner_vpd.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright 2022 The ChromiumOS Authors - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "driver/tcpm/tcpci.h" -#include "emul/tcpc/emul_tcpci_partner_common.h" -#include "emul/tcpc/emul_tcpci_partner_faulty_ext.h" -#include "emul/tcpc/emul_tcpci_partner_snk.h" -#include "emul/tcpc/emul_tcpci_partner_src.h" -#include "emul/tcpc/emul_tcpci_partner_vpd.h" - -#include <zephyr/logging/log.h> -#include <zephyr/sys/byteorder.h> - -LOG_MODULE_REGISTER(tcpci_vpd_emul, CONFIG_TCPCI_EMUL_LOG_LEVEL); - -static enum tcpci_partner_handler_res -tcpci_vpd_emul_handle_sop_msg(struct tcpci_partner_extension *ext, - struct tcpci_partner_data *common_data, - const struct tcpci_emul_msg *msg) -{ - struct tcpci_vpd_emul_data *data = - CONTAINER_OF(ext, struct tcpci_vpd_emul_data, ext); - - /* Do not respond to SOP messages until charge-through is connected. */ - if (!data->charge_through_connected) - return TCPCI_PARTNER_COMMON_MSG_NO_GOODCRC; - - /* Once charge-through is connected, let the charger (later extension) - * handle SOP messages. - */ - return TCPCI_PARTNER_COMMON_MSG_NOT_HANDLED; -} - -static int tcpci_vpd_emul_connect(struct tcpci_partner_extension *ext, - struct tcpci_partner_data *common_data) -{ - struct tcpci_vpd_emul_data *data = - CONTAINER_OF(ext, struct tcpci_vpd_emul_data, ext); - - /* Strictly speaking, the VPD shouldn't GoodCRC anything on SOP, Source - * Capabilities is the first message it will receive, so that's good - * enough. - */ - if (common_data->power_role == PD_ROLE_SOURCE) { - tcpci_faulty_ext_clear_actions_list(&data->fault_ext); - } else { - data->fault_actions[0].action_mask = - TCPCI_FAULTY_EXT_FAIL_SRC_CAP; - data->fault_actions[0].count = TCPCI_FAULTY_EXT_INFINITE_ACTION; - tcpci_faulty_ext_append_action(&data->fault_ext, - &data->fault_actions[0]); - } - - return 0; -} - -static void -tcpci_vpd_emul_control_change(struct tcpci_partner_extension *ext, - struct tcpci_partner_data *common_data) -{ - struct tcpci_vpd_emul_data *data = - CONTAINER_OF(ext, struct tcpci_vpd_emul_data, ext); - enum pd_cc_states tcpm_cc_state = - pd_get_cc_state(common_data->tcpm_cc1, common_data->tcpm_cc2); - - LOG_DBG("TCPM changed control register; TCPM CC1 %u, CC2 %u", - common_data->tcpm_cc1, common_data->tcpm_cc2); - if (!data->charge_through_connected && - tcpm_cc_state == PD_CC_UFP_ATTACHED) { - LOG_INF("Connecting charge-through port as Source"); - data->charge_through_connected = true; - tcpci_partner_common_hard_reset_as_role(common_data, - PD_ROLE_SOURCE); - tcpci_partner_connect_to_tcpci(common_data, - common_data->tcpci_emul); - } -} - -void tcpci_vpd_emul_disconnect(struct tcpci_partner_extension *ext, - struct tcpci_partner_data *common_data) -{ - struct tcpci_vpd_emul_data *data = - CONTAINER_OF(ext, struct tcpci_vpd_emul_data, ext); - - data->charge_through_connected = false; - tcpci_partner_common_hard_reset_as_role(common_data, PD_ROLE_SINK); -} - -static struct tcpci_partner_extension_ops vpd_emul_ops = { - .sop_msg_handler = tcpci_vpd_emul_handle_sop_msg, - .connect = tcpci_vpd_emul_connect, - .control_change = tcpci_vpd_emul_control_change, - .disconnect = tcpci_vpd_emul_disconnect, -}; - -struct tcpci_partner_extension * -tcpci_vpd_emul_init(struct tcpci_vpd_emul_data *data, - struct tcpci_partner_data *common_data, - struct tcpci_partner_extension *ext) -{ - struct tcpci_partner_extension *vpd_ext = &data->ext; - struct tcpci_partner_extension *snk_ext; - struct tcpci_partner_extension *src_ext; - - /* A VPD host port initially attaches as a Sink and responds to SOP' - * Discover Identity while ignoring SOP traffic. Then, when a Source is - * connected to the charge-through port, the CT-VPD acts as a Source. - * This extension therefore contains a faulty extension, a sink - * extension, and a source extension, in that order. Due to the - * linked-list extension structure, the initialization order is the - * reverse of that. - */ - src_ext = tcpci_src_emul_init(&data->src_ext, common_data, ext); - snk_ext = tcpci_snk_emul_init(&data->snk_ext, common_data, src_ext); - vpd_ext->next = - tcpci_faulty_ext_init(&data->fault_ext, common_data, snk_ext); - - vpd_ext->ops = &vpd_emul_ops; - - data->charge_through_connected = false; - - return vpd_ext; -} |