diff options
author | Eric Yilun Lin <yllin@chromium.org> | 2023-04-13 17:59:46 +0800 |
---|---|---|
committer | Eric Yilun Lin <yllin@google.com> | 2023-04-13 10:01:21 +0000 |
commit | 017e8c8b9803e5f421522183ce3c4bad5c5236e5 (patch) | |
tree | 2b26885b6e0caf5bf54fc5c882044c3f6a5b9630 /zephyr/test/drivers/anx7452/src/anx7452.c | |
parent | 846964eb47c50aea47ab05af1b2ad7aeed8369ba (diff) | |
parent | fd4151fe81b041c480db9c265fb24e84aa6ef4dc (diff) | |
download | chrome-ec-017e8c8b9803e5f421522183ce3c4bad5c5236e5.tar.gz |
Merge remote-tracking branch cros/main into firmware-corsola-15194.B-mainfirmware-corsola-15194.B-main
Generated by: util/update_release_branch.py -r -z --board corsla --relevant_paths_file
util/corsola-relevant-paths.txt firmware-corsola-15194.B-main
Relevant changes:
git log --oneline 846964eb47..fd4151fe81 -- zephyr/program/corsla
common/charge_state_v2.c common/dps.c common/mkbp_* common/usb_charger.c
common/usb_common.c common/usbc/*_pd_* common/usbc/dp_alt_mode.c
common/usbc/usb_pe_drp_sm.c common/usbc/usb_prl_sm.c
common/usbc/usb_sm.c common/usbc/usb_tc_drp_acc_trysrc_sm.c
driver/battery/smart.c driver/bc12/pi3usb9201.* driver/charger/isl923x.*
driver/charger/rt949* driver/ppc/nx20p348x.* driver/ppc/rt1718s.*
driver/ppc/syv682x.* driver/tcpm/anx7447.* driver/tcpm/rt1718s.*
driver/tcpm/tcpci.* driver/usb_mux/it5205.* driver/usb_mux/ps8743.*
power/mt8186.c zephyr/boards/arm/npcx9/* zephyr/boards/riscv/it8xxx2/*
zephyr/drivers/* zephyr/program/corsola/* zephyr/shim/*
util/getversion.sh
fd4151fe81 zephyr: Kconfig: add FLASH_PSTATE_BANK / FLASH_PSTATE_LOCKED
d18304f138 voltorb: remove debug options and features for FW QUAL
57ed659cb9 USB-PD: Update EC_CMD_TYPEC_STATUS for EPR
d14883b6fd RAA489110: Add RAA489110 driver
e06fe77101 binman: Add binman nodelabel and use it
48cde011ac retimer: Add driver for ANX7452 retimer
BRANCH=None
BUG=none
TEST=`make -j buildall`
Cq-Depend: chromium:4421692
Force-Relevant-Builds: all
Change-Id: I2d7a5d8c6dbfc9d8c13cde3b9e1fcc06ae782067
Signed-off-by: Eric Yilun Lin <yllin@chromium.org>
Diffstat (limited to 'zephyr/test/drivers/anx7452/src/anx7452.c')
-rw-r--r-- | zephyr/test/drivers/anx7452/src/anx7452.c | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/zephyr/test/drivers/anx7452/src/anx7452.c b/zephyr/test/drivers/anx7452/src/anx7452.c new file mode 100644 index 0000000000..f456dea845 --- /dev/null +++ b/zephyr/test/drivers/anx7452/src/anx7452.c @@ -0,0 +1,288 @@ +/* Copyright 2023 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "chipset.h" +#include "common.h" +#include "console.h" +#include "driver/retimer/anx7452.h" +#include "driver/retimer/anx7452_public.h" +#include "emul/emul_anx7452.h" +#include "emul/emul_common_i2c.h" +#include "i2c.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_mocks.h" +#include "test/drivers/test_state.h" +#include "timer.h" +#include "usb_mux.h" + +#include <zephyr/device.h> +#include <zephyr/devicetree.h> +#include <zephyr/drivers/emul.h> +#include <zephyr/drivers/gpio.h> +#include <zephyr/drivers/gpio/gpio_emul.h> +#include <zephyr/fff.h> +#include <zephyr/kernel.h> +#include <zephyr/ztest.h> + +#define GPIO_USB_C1_USB_EN_PATH NAMED_GPIOS_GPIO_NODE(usb_c1_ls_en) +#define GPIO_USB_C1_USB_EN_PORT DT_GPIO_PIN(GPIO_USB_C1_USB_EN_PATH, gpios) +#define GPIO_USB_C1_DP_EN_PATH NAMED_GPIOS_GPIO_NODE(usb_c1_rt_rst_odl) +#define GPIO_USB_C1_DP_EN_PORT DT_GPIO_PIN(GPIO_USB_C1_DP_EN_PATH, gpios) + +#define ANX7452_NODE DT_NODELABEL(usb_c1_anx7452_emul) +#define EMUL EMUL_DT_GET(ANX7452_NODE) +#define COMMON_DATA(port) emul_anx7452_get_i2c_common_data(EMUL, port) + +ZTEST(anx7452, test_anx7452_init) +{ + const struct device *gpio_dev = + DEVICE_DT_GET(DT_GPIO_CTLR(GPIO_USB_C1_USB_EN_PATH, gpios)); + + zassert_not_null(gpio_dev, "Cannot get GPIO device"); + + /* Test successful init */ + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_TOP_STATUS_REG), 0xFF, + NULL); + zassert_equal( + EC_SUCCESS, + anx7452_usb_retimer_driver.init(usb_muxes[USBC_PORT_C1].mux), + NULL); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_TOP_STATUS_REG), + ANX7452_TOP_REG_EN, NULL); + zassert_equal(1, + gpio_emul_output_get(gpio_dev, GPIO_USB_C1_USB_EN_PORT), + NULL); + + /* Setup emulator fail on write */ + i2c_common_emul_set_write_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + ANX7452_TOP_STATUS_REG); + /* With reg read fail, init should fail and pins should be unset */ + zassert_equal( + EC_ERROR_INVAL, + anx7452_usb_retimer_driver.init(usb_muxes[USBC_PORT_C1].mux), + NULL); + zassert_equal(1, + gpio_emul_output_get(gpio_dev, GPIO_USB_C1_USB_EN_PORT), + NULL); + + /* Do not fail on write */ + i2c_common_emul_set_write_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + /* Setup emulator fail on read */ + i2c_common_emul_set_read_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + ANX7452_TOP_STATUS_REG); + /* With reg read fail, init should fail and pins should be unset */ + zassert_equal( + EC_ERROR_TIMEOUT, + anx7452_usb_retimer_driver.init(usb_muxes[USBC_PORT_C1].mux), + NULL); + zassert_equal(1, + gpio_emul_output_get(gpio_dev, GPIO_USB_C1_USB_EN_PORT), + NULL); + + /* Do not fail on read */ + i2c_common_emul_set_read_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + /* Setup emulator fail on read */ + i2c_common_emul_set_read_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + ANX7452_TOP_STATUS_REG); + const uint32_t start_ms = k_uptime_get(); + /* With reg read fail, init should fail and pins should be unset */ + zassert_equal( + EC_ERROR_TIMEOUT, + anx7452_usb_retimer_driver.init(usb_muxes[USBC_PORT_C1].mux), + NULL); + const uint32_t end_ms = k_uptime_get(); + /* With timeout caused by read fail, the time took should be greater + * than or equal to configured timeout value + */ + zassert_true((end_ms - start_ms) >= ANX7452_I2C_WAKE_TIMEOUT_MS, NULL); + zassert_equal(1, + gpio_emul_output_get(gpio_dev, GPIO_USB_C1_USB_EN_PORT), + NULL); +} + +ZTEST(anx7452, test_anx7452_get) +{ + mux_state_t mux_state = 0; + + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + + anx7452_emul_set_reg(EMUL, ANX7452_TOP_STATUS_REG, + ANX7452_TOP_REG_EN | ANX7452_TOP_FLIP_INFO); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + zassert_equal(mux_state, USB_PD_MUX_POLARITY_INVERTED); + + anx7452_emul_set_reg(EMUL, ANX7452_TOP_STATUS_REG, + ANX7452_TOP_REG_EN | ANX7452_TOP_DP_INFO); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + zassert_equal(mux_state, USB_PD_MUX_DP_ENABLED); + + anx7452_emul_set_reg(EMUL, ANX7452_TOP_STATUS_REG, + ANX7452_TOP_REG_EN | ANX7452_TOP_TBT_INFO); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + zassert_equal(mux_state, USB_PD_MUX_TBT_COMPAT_ENABLED); + + anx7452_emul_set_reg(EMUL, ANX7452_TOP_STATUS_REG, + ANX7452_TOP_REG_EN | ANX7452_TOP_USB3_INFO); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + zassert_equal(mux_state, USB_PD_MUX_USB_ENABLED); + + anx7452_emul_set_reg(EMUL, ANX7452_TOP_STATUS_REG, + ANX7452_TOP_REG_EN | ANX7452_TOP_USB4_INFO); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); + zassert_equal(mux_state, USB_PD_MUX_USB4_ENABLED); + + i2c_common_emul_set_read_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + ANX7452_TOP_STATUS_REG); + zassert_equal(EC_ERROR_INVAL, + anx7452_usb_retimer_driver.get( + usb_muxes[USBC_PORT_C1].mux, &mux_state)); +} + +ZTEST(anx7452, test_anx7452_set) +{ + mux_state_t mux_state = 0; + bool ack_required; + + zassert_equal(EC_SUCCESS, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + zassert_equal(ack_required, false); + + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG0_REG), 0); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + USB_PD_MUX_POLARITY_INVERTED, &ack_required)); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG0_REG), + ANX7452_CTLTOP_CFG0_FLIP_EN); + + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + USB_PD_MUX_USB_ENABLED, &ack_required)); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG0_REG), + ANX7452_CTLTOP_CFG0_USB3_EN); + + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG1_REG), 0); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + USB_PD_MUX_DP_ENABLED, &ack_required)); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG1_REG), + ANX7452_CTLTOP_CFG1_DP_EN); + + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG2_REG), 0); + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + USB_PD_MUX_USB4_ENABLED, &ack_required)); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG2_REG), + ANX7452_CTLTOP_CFG2_USB4_EN); + + zassert_equal(EC_SUCCESS, + anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + USB_PD_MUX_TBT_COMPAT_ENABLED, &ack_required)); + zassert_equal(anx7452_emul_get_reg(EMUL, ANX7452_CTLTOP_CFG2_REG), + ANX7452_CTLTOP_CFG2_TBT_EN); + + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG0_REG); + zassert_equal(EC_ERROR_INVAL, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG1_REG); + zassert_equal(EC_ERROR_INVAL, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG2_REG); + zassert_equal(EC_ERROR_INVAL, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG0_REG); + zassert_equal(EC_ERROR_TIMEOUT, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG1_REG); + zassert_equal(EC_ERROR_TIMEOUT, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); + + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + ANX7452_CTLTOP_CFG2_REG); + zassert_equal(EC_ERROR_TIMEOUT, anx7452_usb_retimer_driver.set( + usb_muxes[USBC_PORT_C1].mux, + mux_state, &ack_required)); +} + +static inline void reset_anx7452_state(void) +{ + i2c_common_emul_set_write_func(COMMON_DATA(TOP_EMUL_PORT), NULL, NULL); + i2c_common_emul_set_read_func(COMMON_DATA(TOP_EMUL_PORT), NULL, NULL); + i2c_common_emul_set_write_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_read_fail_reg(COMMON_DATA(TOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + + i2c_common_emul_set_write_func(COMMON_DATA(CTLTOP_EMUL_PORT), NULL, + NULL); + i2c_common_emul_set_read_func(COMMON_DATA(CTLTOP_EMUL_PORT), NULL, + NULL); + i2c_common_emul_set_write_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + i2c_common_emul_set_read_fail_reg(COMMON_DATA(CTLTOP_EMUL_PORT), + I2C_COMMON_EMUL_NO_FAIL_REG); + + anx7452_emul_reset(EMUL); +} + +static void anx7452_before(void *state) +{ + ARG_UNUSED(state); + reset_anx7452_state(); +} + +static void anx7452_after(void *state) +{ + ARG_UNUSED(state); + reset_anx7452_state(); +} + +ZTEST_SUITE(anx7452, drivers_predicate_post_main, NULL, anx7452_before, + anx7452_after, NULL); |