diff options
author | Abe Levkoy <alevkoy@chromium.org> | 2022-11-21 13:47:05 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-11-22 21:56:01 +0000 |
commit | 34be701febda42a32d9c98a21f008fbb292fd885 (patch) | |
tree | 5183bc02dbde6ab526a2046e7b21e832c0f64f42 | |
parent | 6a96283c3b07e0718588fe8742805f647f81b772 (diff) | |
download | chrome-ec-34be701febda42a32d9c98a21f008fbb292fd885.tar.gz |
zephyr emul: TCPC partner: Expose CC to extensions
Implement a callback in the TCPC partner common code for changes to
control registers in the TCPCI TCPC emulator. Specifically, when the
TCPC changes ROLE_CONTROL, record the new CC "voltages" exposed by the
TCPC emulator in the partner emulator. Then call any partner extension
callbacks for control changes.
This change does not cause the partner to react to other changes to
TCPCI control registers.
BUG=b:257341564
TEST=twister -s zephyr/test/drivers/drivers.usbc_ctvpd
BRANCH=none
LOW_COVERAGE_REASON=This is an emulator. Later tests will use it.
Signed-off-by: Abe Levkoy <alevkoy@chromium.org>
Change-Id: Id27a156ed5db6d805c439a33a157ae13706d541a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4043735
Reviewed-by: Tomasz Michalec <tmichalec@google.com>
Code-Coverage: Zoss <zoss-cl-coverage@prod.google.com>
-rw-r--r-- | zephyr/emul/tcpc/emul_tcpci_partner_common.c | 29 | ||||
-rw-r--r-- | zephyr/include/emul/tcpc/emul_tcpci_partner_common.h | 6 |
2 files changed, 34 insertions, 1 deletions
diff --git a/zephyr/emul/tcpc/emul_tcpci_partner_common.c b/zephyr/emul/tcpc/emul_tcpci_partner_common.c index abc46ef0a2..cb12d37b63 100644 --- a/zephyr/emul/tcpc/emul_tcpci_partner_common.c +++ b/zephyr/emul/tcpc/emul_tcpci_partner_common.c @@ -4,6 +4,7 @@ */ #include "common.h" +#include "driver/tcpm/tcpci.h" #include "emul/tcpc/emul_tcpci.h" #include "emul/tcpc/emul_tcpci_partner_common.h" #include "usb_pd.h" @@ -1193,6 +1194,16 @@ void tcpci_partner_set_discovery_info(struct tcpci_partner_data *data, memcpy(data->modes_vdm, modes_vdm, modes_vdos * sizeof(*modes_vdm)); } +static void tcpci_partner_common_control_change(struct tcpci_partner_data *data) +{ + const struct emul *tcpci_emul = data->tcpci_emul; + uint16_t role_control; + + tcpci_emul_get_reg(tcpci_emul, TCPC_REG_ROLE_CTRL, &role_control); + data->tcpm_cc1 = TCPC_REG_ROLE_CTRL_CC1(role_control); + data->tcpm_cc1 = TCPC_REG_ROLE_CTRL_CC2(role_control); +} + void tcpci_partner_common_disconnect(struct tcpci_partner_data *data) { tcpci_partner_clear_msg_queue(data); @@ -1491,6 +1502,22 @@ tcpci_partner_rx_consumed_op(const struct emul *emul, tcpci_partner_free_msg(msg); } +static void +tcpci_partner_control_change_op(const struct emul *emul, + const struct tcpci_emul_partner_ops *ops) +{ + struct tcpci_partner_data *data = + CONTAINER_OF(ops, struct tcpci_partner_data, ops); + struct tcpci_partner_extension *ext; + + tcpci_partner_common_control_change(data); + for (ext = data->extensions; ext != NULL; ext = ext->next) { + if (ext->ops->control_change) { + ext->ops->control_change(ext, data); + } + } +} + /** * @brief Function called when emulator is disconnected from TCPCI * @@ -1582,7 +1609,7 @@ void tcpci_partner_init(struct tcpci_partner_data *data, enum pd_rev_type rev) data->ops.transmit = tcpci_partner_transmit_op; data->ops.rx_consumed = tcpci_partner_rx_consumed_op; - data->ops.control_change = NULL; + data->ops.control_change = tcpci_partner_control_change_op; data->ops.disconnect = tcpci_partner_disconnect_op; data->displayport_configured = false; data->entered_svid = 0; diff --git a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h index 36071bc7d3..d0d0a2d183 100644 --- a/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h +++ b/zephyr/include/emul/tcpc/emul_tcpci_partner_common.h @@ -148,6 +148,9 @@ struct tcpci_partner_data { /* SVID of entered mode (0 if no mode is entered) */ uint16_t entered_svid; + enum tcpc_cc_voltage_status tcpm_cc1; + enum tcpc_cc_voltage_status tcpm_cc2; + /* VDMs with which the partner responds to discovery REQs. The VDM * buffers include the VDM header, and the VDO counts include 1 for the * VDM header. This structure has space for the mode response for a @@ -312,6 +315,9 @@ struct tcpci_partner_extension_ops { void (*soft_reset)(struct tcpci_partner_extension *ext, struct tcpci_partner_data *common_data); + void (*control_change)(struct tcpci_partner_extension *ext, + struct tcpci_partner_data *common_data); + /** * @brief Function called when partner emulator is disconnected from * TCPM |