diff options
Diffstat (limited to 'zephyr/test/drivers/anx7452')
-rw-r--r-- | zephyr/test/drivers/anx7452/CMakeLists.txt | 6 | ||||
-rw-r--r-- | zephyr/test/drivers/anx7452/prj.conf | 3 | ||||
-rw-r--r-- | zephyr/test/drivers/anx7452/src/anx7452.c | 288 | ||||
-rw-r--r-- | zephyr/test/drivers/anx7452/usbc.dts | 32 |
4 files changed, 329 insertions, 0 deletions
diff --git a/zephyr/test/drivers/anx7452/CMakeLists.txt b/zephyr/test/drivers/anx7452/CMakeLists.txt new file mode 100644 index 0000000000..a61fa0a1c6 --- /dev/null +++ b/zephyr/test/drivers/anx7452/CMakeLists.txt @@ -0,0 +1,6 @@ +# 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. + +# Add source files +target_sources(app PRIVATE src/anx7452.c) diff --git a/zephyr/test/drivers/anx7452/prj.conf b/zephyr/test/drivers/anx7452/prj.conf new file mode 100644 index 0000000000..96bb372274 --- /dev/null +++ b/zephyr/test/drivers/anx7452/prj.conf @@ -0,0 +1,3 @@ +# 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. 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); diff --git a/zephyr/test/drivers/anx7452/usbc.dts b/zephyr/test/drivers/anx7452/usbc.dts new file mode 100644 index 0000000000..3441cf842f --- /dev/null +++ b/zephyr/test/drivers/anx7452/usbc.dts @@ -0,0 +1,32 @@ +/* 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 <dt-bindings/usb_pd_tcpm.h> + +/ { + usbc { + port1@1 { + compatible = "named-usbc-port"; + reg = <1>; + usb-mux-chain-1 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&usb_c1_anx7452_emul>; + }; + }; + }; + +}; +&i2c3 { + status = "okay"; + + /delete-node/ bbretimer@42; + + usb_c1_anx7452_emul: anx7452@10 { + compatible = "analogix,anx7452"; + reg = <0x10>; + usb-en-pin = <&usb_c1_ls_en>; + dp-en-pin = <&usb_c1_rt_rst_odl>; + }; +}; |