diff options
Diffstat (limited to 'zephyr')
185 files changed, 8326 insertions, 597 deletions
diff --git a/zephyr/CMakeLists.txt b/zephyr/CMakeLists.txt index a9a8e6c4f0..7b77bcf115 100644 --- a/zephyr/CMakeLists.txt +++ b/zephyr/CMakeLists.txt @@ -2,6 +2,22 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +if(DEFINED CONFIG_PLATFORM_EC AND EXISTS "${EDT_PICKLE}") + message(STATUS "Performing EC specific devicetree checks") + + # Zephyr's gen_defines.py creates an EDT object of the final devicetree, + # saving it as pickle file in the build directory. + set(NAMED_GPIOS_SCRIPT ${PLATFORM_EC}/zephyr/scripts/named_gpios.py) + set(CMD_NAMED_GPIOS ${PYTHON_EXECUTABLE} ${NAMED_GPIOS_SCRIPT} + --zephyr-base ${ZEPHYR_BASE} + --edt-pickle ${EDT_PICKLE} + ) + execute_process(COMMAND ${CMD_NAMED_GPIOS} RESULT_VARIABLE ret) + if(NOT "${ret}" STREQUAL "0") + message(FATAL_ERROR "named_gpios.py failed with return code: ${ret}") + endif() +endif() + if(DEFINED ZMAKE_INCLUDE_DIR) zephyr_include_directories("${ZMAKE_INCLUDE_DIR}") endif() @@ -544,6 +560,8 @@ zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_AOZ1380 "${PLATFORM_EC}/driver/ppc/aoz1380.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_KTU1125 "${PLATFORM_EC}/driver/ppc/ktu1125.c") +zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_NX20P3481 + "${PLATFORM_EC}/driver/ppc/nx20p348x.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_NX20P3483 "${PLATFORM_EC}/driver/ppc/nx20p348x.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_RT1739 diff --git a/zephyr/Kconfig.charger b/zephyr/Kconfig.charger index 131f40e4d3..b340bd7da2 100644 --- a/zephyr/Kconfig.charger +++ b/zephyr/Kconfig.charger @@ -544,6 +544,13 @@ config PLATFORM_EC_CHARGER_MAINTAIN_VBAT all conditions, even when AC is not present. This may be necessary to work around quirks of certain charger chips, such as the BD9995X. +config PLATFORM_EC_CHARGER_BYPASS_MODE + bool + help + Select this option if the charger will be used in a bypass mode in + order to pass the input current from AC directly to the system + power rail for efficiency. + config PLATFORM_EC_CHARGER_NARROW_VDC bool help diff --git a/zephyr/Kconfig.ppc b/zephyr/Kconfig.ppc index a6d376159c..c7108e62a8 100644 --- a/zephyr/Kconfig.ppc +++ b/zephyr/Kconfig.ppc @@ -86,6 +86,14 @@ config PLATFORM_EC_USBC_PPC_KTU1125 solution to USB Type-C applications by eliminating the dependence on external components. +config PLATFORM_EC_USBC_PPC_NX20P3481 + bool "NX20P3481 High Voltage Sink/Source Combo Switch" + depends on DT_HAS_NXP_NX20P348X_ENABLED + select PLATFORM_EC_USBC_OCP + help + The NX20P3481 is a product with combined multiple power switches + and a LDO for USB PD application. + config PLATFORM_EC_USBC_PPC_NX20P3483 bool "NX20P3483 High Voltage Sink/Source Combo Switch" default y diff --git a/zephyr/dts/bindings/battery/cosmx,ap20cbl-3.yaml b/zephyr/dts/bindings/battery/cosmx,ap20cbl-3.yaml index 9df929182f..412f67ecab 100644 --- a/zephyr/dts/bindings/battery/cosmx,ap20cbl-3.yaml +++ b/zephyr/dts/bindings/battery/cosmx,ap20cbl-3.yaml @@ -14,9 +14,9 @@ properties: device_name: default: "AP20CBL" ship_mode_reg_addr: - default: 0x00 + default: 0x3A ship_mode_reg_data: - default: [0x0010, 0x0010] + default: [0xC574, 0xC574] # Documentation: b/263692236#comment2 # Manufacturer Access 0x00 # b1: D-FET diff --git a/zephyr/dts/bindings/emul/cros,rt1718s-tcpc-emul.yaml b/zephyr/dts/bindings/emul/cros,rt1718s-tcpc-emul.yaml new file mode 100644 index 0000000000..a8276cc159 --- /dev/null +++ b/zephyr/dts/bindings/emul/cros,rt1718s-tcpc-emul.yaml @@ -0,0 +1,21 @@ +# 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. + +description: Zephyr RT1718S Emulator + +compatible: "cros,rt1718s-tcpc-emul" + +include: i2c-device.yaml + +properties: + tcpc-flags: + type: int + default: 0 + description: | + TCPC configuration flags + irq-gpios: + type: phandle-array + required: false + description: | + Interrupt from TCPC diff --git a/zephyr/dts/bindings/usbc/ppc-chip.yaml b/zephyr/dts/bindings/usbc/ppc-chip.yaml index 30f71c9d1a..a4e7ad0ec0 100644 --- a/zephyr/dts/bindings/usbc/ppc-chip.yaml +++ b/zephyr/dts/bindings/usbc/ppc-chip.yaml @@ -9,7 +9,7 @@ properties: type: phandles required: false description: | - GPIO interrupt from PPC + GPIO interrupt from PPC using a named-gpios child node is-alt: type: boolean @@ -17,3 +17,9 @@ properties: description: | If present, this node refers to an altnerate PPC device. The PPC device is not used by default, and must be manually enabled at runtime. + + irq-gpios: + type: phandle-array + required: false + description: | + Interrupt line from the PPC (zephyr standard GPIO format) diff --git a/zephyr/dts/board-overlays/native_posix.dts b/zephyr/dts/board-overlays/native_posix.dts index c8bfe02539..6b18a0ec6f 100644 --- a/zephyr/dts/board-overlays/native_posix.dts +++ b/zephyr/dts/board-overlays/native_posix.dts @@ -13,12 +13,26 @@ compatible = "named-gpios"; entering-rw { - gpios = <&gpio0 1 GPIO_OUTPUT_LOW>; + gpios = <&gpio99 0 GPIO_OUTPUT_LOW>; enum-name = "GPIO_ENTERING_RW"; }; }; -}; -&gpio0 { - ngpios = <2>; + /* + * The GPIO_ENTERING_RW signal is used on nearly every board. + * Allocate a dedicated GPIO controller for this signal to avoid + * conflicts with board tests. + */ + gpio99: gpio@9900 { + status = "okay"; + compatible = "zephyr,gpio-emul"; + reg = <0x9900 0x4>; + rising-edge; + falling-edge; + high-level; + low-level; + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + }; }; diff --git a/zephyr/emul/CMakeLists.txt b/zephyr/emul/CMakeLists.txt index 77a8de3213..523e1e98b0 100644 --- a/zephyr/emul/CMakeLists.txt +++ b/zephyr/emul/CMakeLists.txt @@ -18,10 +18,12 @@ zephyr_library_sources_ifdef(CONFIG_EMUL_CLOCK_CONTROL emul_clock_control.c) zephyr_library_sources_ifdef(CONFIG_EMUL_COMMON_I2C emul_common_i2c.c) zephyr_library_sources_ifdef(CONFIG_EMUL_CROS_FLASH emul_flash.c) zephyr_library_sources_ifdef(CONFIG_EMUL_ISL923X emul_isl923x.c) +zephyr_library_sources_ifdef(CONFIG_EMUL_CHARGER_ISL9241 emul_isl9241.c) zephyr_library_sources_ifdef(CONFIG_EMUL_KB_RAW emul_kb_raw.c) zephyr_library_sources_ifdef(CONFIG_EMUL_LIS2DW12 emul_lis2dw12.c) zephyr_library_sources_ifdef(CONFIG_EMUL_LN9310 emul_ln9310.c) zephyr_library_sources_ifdef(CONFIG_EMUL_PCT2075 emul_pct2075.c) +zephyr_library_sources_ifdef(CONFIG_EMUL_PPC_NX20P348X emul_nx20p348x.c) zephyr_library_sources_ifdef(CONFIG_EMUL_PPC_SYV682X emul_syv682x.c) zephyr_library_sources_ifdef(CONFIG_EMUL_PS8743 emul_ps8743.c) zephyr_library_sources_ifdef(CONFIG_EMUL_RT9490 emul_rt9490.c) diff --git a/zephyr/emul/Kconfig b/zephyr/emul/Kconfig index b7bfc88aa2..b160e430b2 100644 --- a/zephyr/emul/Kconfig +++ b/zephyr/emul/Kconfig @@ -49,6 +49,26 @@ config EMUL_BC12_DETECT_PI3USB9201 detector/advertiser. The emulator supports reading and writing the 4 I2C registers of the PI3USB9201 using the emulated I2C bus. +config EMUL_CHARGER_ISL9241 + bool "Renesas buck-boost battery charger emulator" + default y + depends on ZTEST && DT_HAS_INTERSIL_ISL9241_ENABLED + select EMUL_COMMON_I2C + help + Enable the ISL9241 emulator. This chip is a configurable buck-boost + battery charger which can communicate over I2C, and utilizes the + emulated I2C bus. + +config EMUL_PPC_NX20P348X + bool "NXP PPC emulator" + default y + depends on ZTEST && DT_HAS_NXP_NX20P348X_ENABLED + select EMUL_COMMON_I2C + help + Enable the NX20P348X emulator, which covers both the NX20P3481 and + NX20P3483. It is also register compatible with the SM5360A. This + emulator makes use of the emulated I2C bus. + config EMUL_PPC_SYV682X bool "Silergy SYV682x PPC emulator" default y diff --git a/zephyr/emul/emul_isl9241.c b/zephyr/emul/emul_isl9241.c new file mode 100644 index 0000000000..2b41230e5b --- /dev/null +++ b/zephyr/emul/emul_isl9241.c @@ -0,0 +1,182 @@ +/* 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 "charger/chg_isl9241.h" +#include "driver/charger/isl9241.h" +#include "emul/emul_common_i2c.h" +#include "emul/emul_stub_device.h" +#include "util.h" + +#include <zephyr/device.h> +#include <zephyr/logging/log.h> +#include <zephyr/ztest.h> + +#define DT_DRV_COMPAT ISL9241_CHG_COMPAT + +#define LOG_LEVEL CONFIG_I2C_LOG_LEVEL +LOG_MODULE_REGISTER(emul_isl9241); + +/* Device ID sits at the end of the register space (0xFF) */ +#define ISL9241_MAX_REG ISL9241_REG_DEVICE_ID + +struct isl9241_emul_data { + struct i2c_common_emul_data common; + uint16_t regs[ISL9241_MAX_REG + 1]; +}; + +/* Note: registers are all 2 bytes */ +struct isl9241_reg_default { + uint8_t offset; + uint16_t val; +}; + +/* Chip defaults for non-zero registers (spec Rev 5.0, Table 1) */ +struct isl9241_reg_default isl9241_defaults[] = { + /* Note: 3s default here */ + { .offset = ISL9241_REG_MAX_SYSTEM_VOLTAGE, .val = 0x3120 }, + { .offset = ISL9241_REG_ADAPTER_CUR_LIMIT2, .val = 0x05DC }, + { .offset = ISL9241_REG_CONTROL1, .val = 0x0103 }, + { .offset = ISL9241_REG_CONTROL2, .val = 0x6000 }, + { .offset = ISL9241_REG_ADAPTER_CUR_LIMIT1, .val = 0x05DC }, + { .offset = ISL9241_REG_CONTROL6, .val = 0x1FFF }, + { .offset = ISL9241_REG_AC_PROCHOT, .val = 0x0C00 }, + { .offset = ISL9241_REG_DC_PROCHOT, .val = 0x1000 }, + { .offset = ISL9241_REG_OTG_VOLTAGE, .val = 0x0D08 }, + { .offset = ISL9241_REG_OTG_CURRENT, .val = 0x0200 }, + { .offset = ISL9241_REG_VIN_VOLTAGE, .val = 0x0C00 }, + { .offset = ISL9241_REG_CONTROL3, .val = 0x0300 }, + { .offset = ISL9241_REG_MANUFACTURER_ID, .val = 0x0049 }, + { .offset = ISL9241_REG_DEVICE_ID, .val = 0x000E }, +}; + +void isl9241_emul_reset_regs(const struct emul *emul) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + + memset(data->regs, 0, sizeof(data->regs)); + + for (int i = 0; i < ARRAY_SIZE(isl9241_defaults); i++) { + struct isl9241_reg_default def = isl9241_defaults[i]; + + data->regs[def.offset] = def.val; + } +} + +uint16_t isl9241_emul_peek(const struct emul *emul, int reg) +{ + __ASSERT_NO_MSG(IN_RANGE(reg, 0, ISL9241_MAX_REG)); + + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + + return data->regs[reg]; +} + +void isl9241_emul_set_vbus(const struct emul *emul, int vbus_mv) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + uint16_t adc_reg; + + if (vbus_mv > 0) + data->regs[ISL9241_REG_INFORMATION2] |= + ISL9241_INFORMATION2_ACOK_PIN; + else + data->regs[ISL9241_REG_INFORMATION2] &= + ~ISL9241_INFORMATION2_ACOK_PIN; + + adc_reg = vbus_mv / ISL9241_VIN_ADC_STEP_MV; + adc_reg <<= ISL9241_VIN_ADC_BIT_OFFSET; + data->regs[ISL9241_REG_VIN_ADC_RESULTS] = adc_reg; +} + +void isl9241_emul_set_vsys(const struct emul *emul, int vsys_mv) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + uint16_t adc_reg; + + adc_reg = vsys_mv / ISL9241_VIN_ADC_STEP_MV; + adc_reg <<= ISL9241_VIN_ADC_BIT_OFFSET; + data->regs[ISL9241_REG_VSYS_ADC_RESULTS] = adc_reg; +} + +static int isl9241_emul_read(const struct emul *emul, int reg, uint8_t *val, + int bytes, void *unused_data) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + + if (!IN_RANGE(reg, 0, ISL9241_MAX_REG)) + return -EINVAL; + + if (!IN_RANGE(bytes, 0, 1)) + return -EINVAL; + + if (bytes == 0) + *val = (uint8_t)(data->regs[reg] & 0xFF); + else + *val = (uint8_t)((data->regs[reg] >> 8) & 0xFF); + + return 0; +} + +static int isl9241_emul_write(const struct emul *emul, int reg, uint8_t val, + int bytes, void *unused_data) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + + if (!IN_RANGE(reg, 0, ISL9241_MAX_REG)) + return -EINVAL; + + if (!IN_RANGE(bytes, 1, 2)) + return -EINVAL; + + if (bytes == 1) + data->regs[reg] = val & 0xFF; + else + data->regs[reg] |= val << 8; + + return 0; +} + +static int isl9241_emul_init(const struct emul *emul, + const struct device *parent) +{ + struct isl9241_emul_data *data = (struct isl9241_emul_data *)emul->data; + struct i2c_common_emul_data *common_data = &data->common; + + i2c_common_emul_init(common_data); + i2c_common_emul_set_read_func(common_data, isl9241_emul_read, NULL); + i2c_common_emul_set_write_func(common_data, isl9241_emul_write, NULL); + + isl9241_emul_reset_regs(emul); + + return 0; +} + +#define INIT_ISL9241_EMUL(n) \ + static struct i2c_common_emul_cfg common_cfg_##n; \ + static struct isl9241_emul_data isl9241_emul_data_##n; \ + static struct i2c_common_emul_cfg common_cfg_##n = { \ + .dev_label = DT_NODE_FULL_NAME(DT_DRV_INST(n)), \ + .data = &isl9241_emul_data_##n.common, \ + .addr = DT_INST_REG_ADDR(n) \ + }; \ + EMUL_DT_INST_DEFINE(n, isl9241_emul_init, &isl9241_emul_data_##n, \ + &common_cfg_##n, &i2c_common_emul_api, NULL) + +DT_INST_FOREACH_STATUS_OKAY(INIT_ISL9241_EMUL) + +DT_INST_FOREACH_STATUS_OKAY(EMUL_STUB_DEVICE); + +static void isl9241_emul_reset_rule_before(const struct ztest_unit_test *test, + void *data) +{ + ARG_UNUSED(test); + ARG_UNUSED(data); + +#define ISL9241_EMUL_RESET_RULE_BEFORE(n) \ + isl9241_emul_reset_regs(EMUL_DT_GET(DT_DRV_INST(n))) + + DT_INST_FOREACH_STATUS_OKAY(ISL9241_EMUL_RESET_RULE_BEFORE); +} +ZTEST_RULE(isl9241_emul_reset, isl9241_emul_reset_rule_before, NULL); diff --git a/zephyr/emul/emul_nx20p348x.c b/zephyr/emul/emul_nx20p348x.c new file mode 100644 index 0000000000..e7b45531d6 --- /dev/null +++ b/zephyr/emul/emul_nx20p348x.c @@ -0,0 +1,204 @@ +/* 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 "driver/ppc/nx20p348x.h" +#include "emul/emul_common_i2c.h" +#include "emul/emul_stub_device.h" +#include "usbc/ppc_nx20p348x.h" +#include "usbc_ppc.h" +#include "util.h" + +#include <zephyr/device.h> +#include <zephyr/devicetree/gpio.h> +#include <zephyr/drivers/emul.h> +#include <zephyr/drivers/gpio/gpio_emul.h> +#include <zephyr/logging/log.h> +#include <zephyr/ztest.h> + +#define DT_DRV_COMPAT NX20P348X_COMPAT + +#define LOG_LEVEL CONFIG_I2C_LOG_LEVEL +LOG_MODULE_REGISTER(emul_nx20p348x); + +/* + * Device control reg marks the end of defined regs for the NX20P3483 (0x0B) + */ +#define NX20P348X_MAX_REG NX20P348X_DEVICE_CONTROL_REG + +struct nx20p348x_emul_data { + struct i2c_common_emul_data common; + struct gpio_dt_spec irq_gpio; + uint8_t regs[NX20P348X_MAX_REG + 1]; +}; + +struct nx20p348x_reg_default { + uint8_t offset; + uint8_t val; +}; + +/* Chip defaults for non-zero registers (spec Rev 0.4 Table 9) */ +struct nx20p348x_reg_default nx20p348x_defaults[] = { + { .offset = NX20P348X_DEVICE_ID_REG, .val = 0x09 }, + { .offset = NX20P348X_OVLO_THRESHOLD_REG, .val = 0x01 }, + { .offset = NX20P348X_HV_SRC_OCP_THRESHOLD_REG, .val = 0x0B }, + { .offset = NX20P348X_5V_SRC_OCP_THRESHOLD_REG, .val = 0x0B }, +}; + +static void nx20p348x_emul_interrupt_set(const struct emul *emul, int val) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + int res = gpio_emul_input_set(data->irq_gpio.port, data->irq_gpio.pin, + val); + __ASSERT_NO_MSG(res == 0); +} + +void nx20p348x_emul_reset_regs(const struct emul *emul) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + memset(data->regs, 0, sizeof(data->regs)); + + for (int i = 0; i < ARRAY_SIZE(nx20p348x_defaults); i++) { + struct nx20p348x_reg_default def = nx20p348x_defaults[i]; + + data->regs[def.offset] = def.val; + } + nx20p348x_emul_interrupt_set(emul, 1); +} + +uint8_t nx20p348x_emul_peek(const struct emul *emul, int reg) +{ + __ASSERT_NO_MSG(IN_RANGE(reg, 0, NX20P348X_MAX_REG)); + + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + return data->regs[reg]; +} + +void nx20p348x_emul_set_interrupt1(const struct emul *emul, uint8_t val) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + data->regs[NX20P348X_INTERRUPT1_REG] = val; + + nx20p348x_emul_interrupt_set(emul, 0); +} + +static int nx20p348x_emul_read(const struct emul *emul, int reg, uint8_t *val, + int bytes, void *unused_data) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + if (!IN_RANGE(reg, 0, NX20P348X_MAX_REG)) + return -EINVAL; + + if (bytes != 0) + return -EINVAL; + + *val = data->regs[reg]; + + /* Interrupt registers are clear on read and de-assert when serviced */ + if (reg == NX20P348X_INTERRUPT1_REG || + reg == NX20P348X_INTERRUPT2_REG) { + data->regs[reg] = 0; + + if (data->regs[NX20P348X_INTERRUPT1_REG] == 0 && + data->regs[NX20P348X_INTERRUPT2_REG] == 0) + nx20p348x_emul_interrupt_set(emul, 1); + } + + return 0; +} + +static int nx20p348x_emul_write(const struct emul *emul, int reg, uint8_t val, + int bytes, void *unused_data) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + + if (!IN_RANGE(reg, 0, NX20P348X_MAX_REG)) + return -EINVAL; + + if (bytes != 1) + return -EINVAL; + + data->regs[reg] = val; + + if (IS_ENABLED(CONFIG_PLATFORM_EC_USBC_PPC_NX20P3481) && + reg == NX20P348X_SWITCH_CONTROL_REG) { + bool enabled = val & NX20P3481_SWITCH_CONTROL_HVSNK; + + /* Update our status as if we turned on/off Vbus sinking */ + if (enabled) + data->regs[NX20P348X_SWITCH_STATUS_REG] |= + NX20P348X_SWITCH_STATUS_HVSNK; + else + data->regs[NX20P348X_SWITCH_STATUS_REG] &= + ~NX20P348X_SWITCH_STATUS_HVSNK; + + /* Do the same for sourcing */ + enabled = val & NX20P3481_SWITCH_CONTROL_5VSRC; + if (enabled) + data->regs[NX20P348X_SWITCH_STATUS_REG] |= + NX20P348X_SWITCH_STATUS_5VSRC; + else + data->regs[NX20P348X_SWITCH_STATUS_REG] &= + ~NX20P348X_SWITCH_STATUS_5VSRC; + } + + return 0; +} + +static int nx20p348x_emul_init(const struct emul *emul, + const struct device *parent) +{ + struct nx20p348x_emul_data *data = + (struct nx20p348x_emul_data *)emul->data; + struct i2c_common_emul_data *common_data = &data->common; + + i2c_common_emul_init(common_data); + i2c_common_emul_set_read_func(common_data, nx20p348x_emul_read, NULL); + i2c_common_emul_set_write_func(common_data, nx20p348x_emul_write, NULL); + + nx20p348x_emul_reset_regs(emul); + + return 0; +} + +#define INIT_NX20P348X_EMUL(n) \ + static struct nx20p348x_emul_data nx20p348x_emul_data_##n; \ + static struct i2c_common_emul_cfg common_cfg_##n = { \ + .dev_label = DT_NODE_FULL_NAME(DT_DRV_INST(n)), \ + .data = &nx20p348x_emul_data_##n.common, \ + .addr = DT_INST_REG_ADDR(n) \ + }; \ + static struct nx20p348x_emul_data nx20p348x_emul_data_##n = { \ + .irq_gpio = GPIO_DT_SPEC_INST_GET_OR(n, irq_gpios, {}), \ + }; \ + EMUL_DT_INST_DEFINE(n, nx20p348x_emul_init, &nx20p348x_emul_data_##n, \ + &common_cfg_##n, &i2c_common_emul_api, NULL) + +DT_INST_FOREACH_STATUS_OKAY(INIT_NX20P348X_EMUL) + +DT_INST_FOREACH_STATUS_OKAY(EMUL_STUB_DEVICE); + +static void nx20p348x_emul_reset_rule_before(const struct ztest_unit_test *test, + void *data) +{ + ARG_UNUSED(test); + ARG_UNUSED(data); + +#define NX20P348X_EMUL_RESET_RULE_BEFORE(n) \ + nx20p348x_emul_reset_regs(EMUL_DT_GET(DT_DRV_INST(n))) + + DT_INST_FOREACH_STATUS_OKAY(NX20P348X_EMUL_RESET_RULE_BEFORE); +} +ZTEST_RULE(nx20p348x_emul_reset, nx20p348x_emul_reset_rule_before, NULL); diff --git a/zephyr/emul/tcpc/CMakeLists.txt b/zephyr/emul/tcpc/CMakeLists.txt index 25031ad658..0dcc5c7743 100644 --- a/zephyr/emul/tcpc/CMakeLists.txt +++ b/zephyr/emul/tcpc/CMakeLists.txt @@ -12,3 +12,4 @@ zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_SRC emul_tcpci_partner_sr zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_FAULTY_EXT emul_tcpci_partner_faulty_ext.c) zephyr_library_sources_ifdef(CONFIG_EMUL_TCPCI_PARTNER_VPD emul_tcpci_partner_vpd.c) zephyr_library_sources_ifdef(CONFIG_EMUL_ANX7447 emul_anx7447.c) +zephyr_library_sources_ifdef(CONFIG_EMUL_RT1718S emul_rt1718s.c) diff --git a/zephyr/emul/tcpc/Kconfig b/zephyr/emul/tcpc/Kconfig index 147f267113..e1738e6381 100644 --- a/zephyr/emul/tcpc/Kconfig +++ b/zephyr/emul/tcpc/Kconfig @@ -7,6 +7,7 @@ menuconfig EMUL_TCPCI default y depends on DT_HAS_CROS_TCPCI_GENERIC_EMUL_ENABLED depends on I2C_EMUL + select EMUL_COMMON_I2C help Enable the TCPCI emulator. This driver uses the emulated I2C bus. It is used to test tcpci code. It supports reads and writes to all @@ -47,6 +48,15 @@ config EMUL_PS8XXX for TCPCI emulator. PS8XXX specific API is available in zephyr/include/emul/tcpc/emul_ps8xxx.h +config EMUL_RT1718S + bool "Richtek rt1718s emulator" + default y + depends on DT_HAS_CROS_RT1718S_TCPC_EMUL_ENABLED + help + Enable emulator for rt1718s of TCPM. This emulator is extension for + TCPCI emulator. rt1718s specific API is available in + zephyr/include/emul/tcpc/emul_rt1718s.h + config EMUL_TCPCI_PARTNER_SRC bool "USB-C source device emulator" select EMUL_TCPCI_PARTNER_COMMON diff --git a/zephyr/emul/tcpc/emul_rt1718s.c b/zephyr/emul/tcpc/emul_rt1718s.c new file mode 100644 index 0000000000..0d180da44a --- /dev/null +++ b/zephyr/emul/tcpc/emul_rt1718s.c @@ -0,0 +1,445 @@ +/* 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 "driver/tcpm/rt1718s.h" +#include "emul/emul_common_i2c.h" +#include "emul/emul_stub_device.h" +#include "emul/tcpc/emul_rt1718s.h" +#include "emul/tcpc/emul_tcpci.h" +#include "tcpm/tcpci.h" + +#include <zephyr/device.h> +#include <zephyr/drivers/emul.h> +#include <zephyr/drivers/i2c.h> +#include <zephyr/drivers/i2c_emul.h> +#include <zephyr/logging/log.h> +#include <zephyr/sys/slist.h> +#include <zephyr/ztest.h> + +#define DT_DRV_COMPAT cros_rt1718s_tcpc_emul + +LOG_MODULE_REGISTER(rt1718s_emul, CONFIG_TCPCI_EMUL_LOG_LEVEL); + +static bool is_valid_rt1718s_page1_register(int reg) +{ + switch (reg) { + case RT1718S_SYS_CTRL1: + case RT1718S_SYS_CTRL2: + case RT1718S_SYS_CTRL3: + case RT1718S_RT_MASK6: + case RT1718S_VCON_CTRL3: + case 0xCF: /* FOD function */ + case RT1718S_RT_MASK1: + case RT1718S_VCONN_CONTROL_2: + case RT1718S_FRS_CTRL2: + case RT1718S_VBUS_CTRL_EN: + return true; + default: + return false; + } +} + +static bool is_valid_rt1718s_page2_register(int reg) +{ + int combined_reg_address = (RT1718S_RT2 << 8) | reg; + + switch (combined_reg_address) { + case RT1718S_RT2_SBU_CTRL_01: + case RT1718S_RT2_BC12_SNK_FUNC: + case RT1718S_RT2_DPDM_CTR1_DPDM_SET: + case RT1718S_RT2_VBUS_VOL_CTRL: + case RT1718S_VCON_CTRL4: + return true; + default: + return false; + } +} + +static void add_access_history_entry(struct rt1718s_emul_data *rt1718s_data, + int reg, uint8_t val) +{ + struct set_reg_entry_t *entry; + + entry = malloc(sizeof(struct set_reg_entry_t)); + entry->reg = reg; + entry->val = val; + entry->access_time = k_uptime_get(); + sys_slist_append(&rt1718s_data->set_private_reg_history, &entry->node); +} + +/** + * @brief Function called on reset + * + * @param emul Pointer to rt1718s emulator + */ +static void rt1718s_emul_reset(const struct emul *emul) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + tcpci_emul_reset(emul); + memset(rt1718s_data->reg_page1, 0, sizeof(rt1718s_data->reg_page1)); + memset(rt1718s_data->reg_page2, 0, sizeof(rt1718s_data->reg_page2)); +} + +int rt1718s_emul_get_reg(const struct emul *emul, int reg, uint16_t *val) +{ + uint8_t reg_addr; + uint8_t *reference_page; + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if ((reg >> 8) == RT1718S_RT2) { + reg_addr = reg & 0xFF; + reference_page = rt1718s_data->reg_page2; + } else if (is_valid_rt1718s_page1_register(reg)) { + reg_addr = reg; + reference_page = rt1718s_data->reg_page1; + } else { + return tcpci_emul_get_reg(emul, reg, val); + } + + if (val == NULL || reg_addr > RT1718S_EMUL_REG_COUNT_PER_PAGE) { + return -EINVAL; + } + + *val = reference_page[reg_addr]; + return EC_SUCCESS; +} + +void rt1718s_emul_reset_set_history(const struct emul *emul) +{ + struct _snode *iter_node; + struct set_reg_entry_t *iter_entry; + struct rt1718s_emul_data *rt1718s_data = emul->data; + + while (!sys_slist_is_empty(&(rt1718s_data->set_private_reg_history))) { + iter_node = + sys_slist_get(&(rt1718s_data->set_private_reg_history)); + iter_entry = SYS_SLIST_CONTAINER(iter_node, iter_entry, node); + free(iter_entry); + } +} + +void rt1718s_emul_set_device_id(const struct emul *emul, uint16_t device_id) +{ + switch (device_id) { + case RT1718S_DEVICE_ID_ES1: + case RT1718S_DEVICE_ID_ES2: + tcpci_emul_set_reg(emul, TCPC_REG_BCD_DEV, device_id); + break; + default: + break; + } +} + +static int copy_reg_byte(uint8_t *dst, uint8_t src_reg[], int reg, + int read_bytes) +{ + if ((reg + read_bytes) > RT1718S_EMUL_REG_COUNT_PER_PAGE || + dst == NULL) { + return -EIO; + } + *(dst + read_bytes) = src_reg[reg + read_bytes]; + return EC_SUCCESS; +} + +/** + * @brief Function called for each byte of read message from rt1718s emulator + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of last write message + * @param val Pointer where byte to read should be stored + * @param bytes Number of bytes already read + * + * @return 0 on success + * @return -EIO on invalid read request + */ +static int rt1718s_emul_read_byte(const struct emul *emul, int reg, + uint8_t *val, int read_bytes) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + int current_page = rt1718s_data->current_page; + + rt1718s_data->current_page = 1; + + if (current_page == 2) { + if (reg != RT1718S_RT2) { + LOG_ERR("The page2 register is selected in previous " + "transaction, but the following read is to reg " + "%x instead of %x", + reg, RT1718S_RT2); + return -EIO; + } + return copy_reg_byte(val, rt1718s_data->reg_page2, + rt1718s_data->current_page2_register, + read_bytes); + } else if (is_valid_rt1718s_page1_register(reg)) { + return copy_reg_byte(val, rt1718s_data->reg_page1, reg, + read_bytes); + } else { + return tcpci_emul_read_byte(emul, reg, val, read_bytes); + } +} + +/** + * @brief Function called for each byte of read message from rt1718s emulator + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of last write message + * @param val Pointer where byte to read should be stored + * @param bytes Number of bytes already read + * + * @return 0 on success + * @return -EIO on invalid read request + */ + +static int rt1718s_emul_write_byte_page1(const struct emul *emul, int reg, + uint8_t val, int bytes) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if (bytes == 2) { + /* + * All register in page1 only has 1 byte, so the write should + * not more than 2 bytes. + */ + return -EIO; + } + rt1718s_data->reg_page1[reg] = val; + add_access_history_entry(rt1718s_data, reg, val); + + /* Software reset is triggered */ + if (reg == RT1718S_SYS_CTRL3 && (val & RT1718S_SWRESET_MASK)) { + rt1718s_emul_reset(emul); + } + + return EC_SUCCESS; +} + +static int rt1718s_emul_write_byte_page2(const struct emul *emul, int reg, + uint8_t val, int bytes) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if (bytes == 1) { + rt1718s_data->current_page = 2; + + if (!is_valid_rt1718s_page2_register(val)) { + return -EIO; + } + rt1718s_data->current_page2_register = val; + } else if (bytes == 2) { + rt1718s_data->reg_page2[rt1718s_data->current_page2_register] = + val; + add_access_history_entry( + rt1718s_data, + (reg << 8) | rt1718s_data->current_page2_register, val); + } else { + /* + * All register in page2 only has 1 byte, so the write should + * not more than 3 bytes. + */ + return -EIO; + } + + return EC_SUCCESS; +} + +/** + * @brief Function called for each byte of write message to rt1718s emulator + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of write message + * @param val Received byte of write message + * @param bytes Number of bytes already received + * + * @return 0 on success + * @return -EIO on invalid write request + */ +static int rt1718s_emul_write_byte(const struct emul *emul, int reg, + uint8_t val, int bytes) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if (reg == RT1718S_RT2) { + return rt1718s_emul_write_byte_page2(emul, reg, val, bytes); + } + + if (rt1718s_data->current_page == 2) { + return -EIO; + } + + if (is_valid_rt1718s_page1_register(reg)) { + return rt1718s_emul_write_byte_page1(emul, reg, val, bytes); + } else { + return tcpci_emul_write_byte(emul, reg, val, bytes); + } +} + +/** + * @brief Wrapper function of rt1718s_emul_write_byte which reset the current + * register page if encounter error. + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of write message + * @param val Received byte of write message + * @param bytes Number of bytes already received + * + * @return 0 on success + * @return -EIO on invalid write request + */ +static int rt1718s_emul_write_byte_wrapper(const struct emul *emul, int reg, + uint8_t val, int bytes) +{ + int err; + struct rt1718s_emul_data *rt1718s_data = emul->data; + + err = rt1718s_emul_write_byte(emul, reg, val, bytes); + if (err != EC_SUCCESS) { + rt1718s_data->current_page = 1; + } + return err; +} + +/** + * @brief Function called on the end of write message to rt1718s emulator + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg Register which is written + * @param msg_len Length of handled I2C message + * + * @return 0 on success + * @return -EIO on error + */ +static int rt1718s_emul_finish_write(const struct emul *emul, int reg, + int msg_len) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if (rt1718s_data->current_page == 2) { + /* msg_len = 2 is selecting the register in page2. */ + if (msg_len != 2) { + rt1718s_data->current_page = 1; + } + return EC_SUCCESS; + } else if (is_valid_rt1718s_page1_register(reg)) { + return EC_SUCCESS; + } else { + return tcpci_emul_handle_write(emul, reg, msg_len); + } +} + +/** + * @brief Get currently accessed register. + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of last write message + * @param bytes Number of bytes already handled from current message + * @param read If currently handled is read message + * + * @return Currently accessed register + */ +static int rt1718s_emul_access_reg(const struct emul *emul, int reg, int bytes, + bool read) +{ + struct rt1718s_emul_data *rt1718s_data = emul->data; + + if (rt1718s_data->current_page == 2) { + return rt1718s_data->current_page2_register; + } else { + return reg; + } +} + +/** + * @brief Set up a new rt1718s emulator + * + * This should be called for each rt1718s device that needs to be + * emulated. + * + * @param emul Emulation information + * @param parent Device to emulate + * + * @return 0 indicating success (always) + */ +static int rt1718s_emul_init(const struct emul *emul, + const struct device *parent) +{ + struct tcpc_emul_data *tcpc_data = emul->data; + struct rt1718s_emul_data *rt1718s_data = emul->data; + struct tcpci_ctx *tcpci_ctx = tcpc_data->tcpci_ctx; + const struct device *i2c_dev; + + i2c_dev = parent; + + tcpci_ctx->common.write_byte = rt1718s_emul_write_byte_wrapper; + tcpci_ctx->common.finish_write = rt1718s_emul_finish_write; + tcpci_ctx->common.read_byte = rt1718s_emul_read_byte; + tcpci_ctx->common.access_reg = rt1718s_emul_access_reg; + + tcpci_emul_i2c_init(emul, i2c_dev); + + rt1718s_emul_reset(emul); + sys_slist_init(&(rt1718s_data->set_private_reg_history)); + + return 0; +} + +static int i2c_rt1718s_emul_transfer(const struct emul *target, + struct i2c_msg *msgs, int num_msgs, + int addr) +{ + struct tcpc_emul_data *tcpc_data = target->data; + struct tcpci_ctx *tcpci_ctx = tcpc_data->tcpci_ctx; + + return i2c_common_emul_transfer_workhorse(target, &tcpci_ctx->common, + &tcpc_data->i2c_cfg, msgs, + num_msgs, addr); +} + +struct i2c_emul_api i2c_rt1718s_emul_api = { + .transfer = i2c_rt1718s_emul_transfer, +}; + +#define RT1718S_EMUL(n) \ + static uint8_t tcpci_emul_tx_buf_##n[128]; \ + static struct tcpci_emul_msg tcpci_emul_tx_msg_##n = { \ + .buf = tcpci_emul_tx_buf_##n, \ + }; \ + static struct tcpci_ctx tcpci_ctx##n = { \ + .tx_msg = &tcpci_emul_tx_msg_##n, \ + .error_on_ro_write = true, \ + .error_on_rsvd_write = true, \ + .irq_gpio = GPIO_DT_SPEC_INST_GET_OR(n, irq_gpios, {}), \ + }; \ + static struct rt1718s_emul_data rt1718s_emul_data_##n = { \ + .embedded_tcpc_emul_data = { \ + .tcpci_ctx = &tcpci_ctx##n, \ + .i2c_cfg = { \ + .dev_label = DT_NODE_FULL_NAME(DT_DRV_INST(n)),\ + .data = &tcpci_ctx##n.common,\ + .addr = DT_INST_REG_ADDR(n), \ + } \ + }, \ + .current_page = 1, \ + }; \ + EMUL_DT_INST_DEFINE(n, rt1718s_emul_init, &rt1718s_emul_data_##n, \ + NULL, &i2c_rt1718s_emul_api, NULL) + +DT_INST_FOREACH_STATUS_OKAY(RT1718S_EMUL) + +#ifdef CONFIG_ZTEST_NEW_API +#define RT1718S_EMUL_RESET_RULE_BEFORE(n) \ + rt1718s_emul_reset(EMUL_DT_GET(DT_DRV_INST(n))) +static void rt1718s_emul_reset_rule_before(const struct ztest_unit_test *test, + void *data) +{ + ARG_UNUSED(test); + ARG_UNUSED(data); + DT_INST_FOREACH_STATUS_OKAY(RT1718S_EMUL_RESET_RULE_BEFORE); +} +ZTEST_RULE(RT1718S_emul_reset, rt1718s_emul_reset_rule_before, NULL); +#endif /* CONFIG_ZTEST_NEW_API */ + +DT_INST_FOREACH_STATUS_OKAY(EMUL_STUB_DEVICE); diff --git a/zephyr/include/emul/emul_isl9241.h b/zephyr/include/emul/emul_isl9241.h new file mode 100644 index 0000000000..2838687731 --- /dev/null +++ b/zephyr/include/emul/emul_isl9241.h @@ -0,0 +1,36 @@ +/* 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. + */ + +#ifndef EMUL_ISL9241_H +#define EMUL_ISL9241_H + +#include <zephyr/drivers/emul.h> + +/** + * Peek an internal register value + * + * @param emul - ISL9241 emulator data + * @param reg - which register to peek + * @return register contents + */ +uint16_t isl9241_emul_peek(const struct emul *emul, int reg); + +/** + * Fake a Vbus voltage presence + * + * @param emul - ISL9241 emulator data + * @param vbus_mv - desired Vbus mV to set + */ +void isl9241_emul_set_vbus(const struct emul *emul, int vbus_mv); + +/** + * Fake a specific Vsys voltage + * + * @param emul - ISL9241 emulator data + * @param vsys_mv - desired Vsys mV to set + */ +void isl9241_emul_set_vsys(const struct emul *emul, int vsys_mv); + +#endif diff --git a/zephyr/include/emul/emul_nx20p348x.h b/zephyr/include/emul/emul_nx20p348x.h new file mode 100644 index 0000000000..a8435ee530 --- /dev/null +++ b/zephyr/include/emul/emul_nx20p348x.h @@ -0,0 +1,27 @@ +/* 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. + */ + +#ifndef EMUL_NX20P348X_H +#define EMUL_NX20P348X_H + +#include <zephyr/drivers/emul.h> + +/** + * Peek an internal register value + * + * @param emul - NX20P383X emulator data + * @param reg - which register to peek + * @return register contents + */ +uint8_t nx20p348x_emul_peek(const struct emul *emul, int reg); + +/** + * Set an interrupt in the first interrupt register + * + * @param emul - NX20P383X emulator data + * @param val - value for interrupt register + */ +void nx20p348x_emul_set_interrupt1(const struct emul *emul, uint8_t val); +#endif diff --git a/zephyr/include/emul/tcpc/emul_rt1718s.h b/zephyr/include/emul/tcpc/emul_rt1718s.h new file mode 100644 index 0000000000..09614bc02c --- /dev/null +++ b/zephyr/include/emul/tcpc/emul_rt1718s.h @@ -0,0 +1,64 @@ +/* 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. + */ + +#ifndef __EMUL_RT1718S_H +#define __EMUL_RT1718S_H + +#include "emul/tcpc/emul_tcpci.h" + +#include <zephyr/drivers/emul.h> +#include <zephyr/sys/slist.h> + +#define RT1718S_EMUL_REG_COUNT_PER_PAGE 0x100 + +struct set_reg_entry_t { + struct _snode node; + int reg; + uint16_t val; + int64_t access_time; +}; + +/** Run-time data used by the emulator */ +struct rt1718s_emul_data { + /* Composite with the tcpc_emul_data to extend it. */ + struct tcpc_emul_data embedded_tcpc_emul_data; + uint8_t reg_page1[RT1718S_EMUL_REG_COUNT_PER_PAGE]; + uint8_t reg_page2[RT1718S_EMUL_REG_COUNT_PER_PAGE]; + uint8_t current_page; + uint8_t current_page2_register; + struct _slist set_private_reg_history; +}; + +/** + * @brief Getting each byte of register from rt1718s emulator + * + * @param emul Pointer to I2C rt1718s emulator + * @param reg First byte of last write message + * @param val Pointer where byte to read should be stored + * + * @return 0 on success + * @return -EINVAL when register is out of range defined in rt1718s private + * register or val is NULL + */ +int rt1718s_emul_get_reg(const struct emul *emul, int reg, uint16_t *val); + +/** + * @brief Reset the register set history + * + * @param emul Pointer to I2C rt1718s emulator + * + */ +void rt1718s_emul_reset_set_history(const struct emul *emul); + +/** + * @brief Set the device id of + * + * @param emul Pointer to I2C rt1718s emulator + * @param device_id the 16 bits device id + * + */ +void rt1718s_emul_set_device_id(const struct emul *emul, uint16_t device_id); + +#endif /* __EMUL_RT1718S_H */ diff --git a/zephyr/program/brya/BUILD.py b/zephyr/program/brya/BUILD.py index 9991335ca7..6395cbc68b 100644 --- a/zephyr/program/brya/BUILD.py +++ b/zephyr/program/brya/BUILD.py @@ -33,6 +33,7 @@ def register_npcx9_variant( # Project-specific KConfig customization. *extra_kconfig_files, ], + inherited_from=["brya"], ) diff --git a/zephyr/program/brya/i2c.dts b/zephyr/program/brya/i2c.dts index b87a53f600..8dbacc2119 100644 --- a/zephyr/program/brya/i2c.dts +++ b/zephyr/program/brya/i2c.dts @@ -136,7 +136,7 @@ * "named-gpios". This is the Zephyr preferred style, * the "named-gpios" node will be dealt with at a later date. */ - irq-gpios = <&gpioe 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + irq-gpios = <&gpioe 0 GPIO_ACTIVE_LOW>; nct38xx-dev = <&nct3808_0_P1 &nct3808_0_P2>; label = "NCT3808_ALERT_1"; }; diff --git a/zephyr/program/corsola/BUILD.py b/zephyr/program/corsola/BUILD.py index f145953e0d..d0ef4132bc 100644 --- a/zephyr/program/corsola/BUILD.py +++ b/zephyr/program/corsola/BUILD.py @@ -27,6 +27,7 @@ def register_corsola_project( here / f"{chip_kconfig}_program.conf", here / project_name / "project.conf", ], + inherited_from=["corsola"], ) diff --git a/zephyr/program/corsola/ite_interrupts.dtsi b/zephyr/program/corsola/ite_interrupts.dtsi index b99effb9eb..d3f718ec8c 100644 --- a/zephyr/program/corsola/ite_interrupts.dtsi +++ b/zephyr/program/corsola/ite_interrupts.dtsi @@ -44,7 +44,7 @@ int_ap_in_rst: ap_in_rst { irq-pin = <&ap_sysrst_odl_r>; flags = <GPIO_INT_EDGE_BOTH>; - handler = "power_signal_interrupt"; + handler = "chipset_warm_reset_interrupt"; }; int_ap_wdtrst: ap_wdtrst { irq-pin = <&ap_ec_wdtrst_l>; diff --git a/zephyr/program/corsola/npcx_interrupts.dtsi b/zephyr/program/corsola/npcx_interrupts.dtsi index 130f4501dd..c59d4b257e 100644 --- a/zephyr/program/corsola/npcx_interrupts.dtsi +++ b/zephyr/program/corsola/npcx_interrupts.dtsi @@ -48,7 +48,7 @@ int_ap_in_rst: ap_in_rst { irq-pin = <&ap_sysrst_odl_r>; flags = <GPIO_INT_EDGE_BOTH>; - handler = "power_signal_interrupt"; + handler = "chipset_warm_reset_interrupt"; }; int_ap_wdtrst: ap_wdtrst { irq-pin = <&ap_ec_wdtrst_l>; diff --git a/zephyr/program/geralt/BUILD.py b/zephyr/program/geralt/BUILD.py index f41948506a..cc4c2b1946 100644 --- a/zephyr/program/geralt/BUILD.py +++ b/zephyr/program/geralt/BUILD.py @@ -17,6 +17,7 @@ def register_geralt_project( here / "program.conf", here / project_name / "project.conf", ], + inherited_from=["geralt"], ) diff --git a/zephyr/program/herobrine/BUILD.py b/zephyr/program/herobrine/BUILD.py index 0bee6ffe2a..302262fc21 100644 --- a/zephyr/program/herobrine/BUILD.py +++ b/zephyr/program/herobrine/BUILD.py @@ -21,6 +21,7 @@ def register_variant( # Project-specific KConfig customization. here / project_name / "project.conf", ], + inherited_from=["herobrine"], ) diff --git a/zephyr/program/intelrvp/BUILD.py b/zephyr/program/intelrvp/BUILD.py index 7a79480a61..32a2eb5e97 100644 --- a/zephyr/program/intelrvp/BUILD.py +++ b/zephyr/program/intelrvp/BUILD.py @@ -37,6 +37,7 @@ def register_intelrvp_project( zephyr_board=chip, dts_overlays=dts_overlays, kconfig_files=kconfig_files, + inherited_from=["intelrvp"], ) diff --git a/zephyr/program/intelrvp/mtlrvp/mtlrvpp_mchp/gpio.dts b/zephyr/program/intelrvp/mtlrvp/mtlrvpp_mchp/gpio.dts index 2c8c925a26..d351bb87f3 100644 --- a/zephyr/program/intelrvp/mtlrvp/mtlrvpp_mchp/gpio.dts +++ b/zephyr/program/intelrvp/mtlrvp/mtlrvpp_mchp/gpio.dts @@ -62,8 +62,24 @@ gpios = <&gpio_140_176 14 GPIO_INPUT>; enum-name = "GPIO_AC_PRESENT"; }; /* GPIO156 */ + + /* + * Note - the Intel boards implement their own handlers + * for tcpc_get_alert_status(). These handlers use + * gpio_get_level(), which returns the raw state of the pin, + * ignoring the GPIO_ACTIVE_LOW flag. + * + * However, the interrupt pin is shared with the upstream + * driver gpio_nct38xx_alert.c, which does use the logical + * level of the pin and requires that the signal is active low. + * + * Mark the signal active low here as well which ensures there + * is no conflict between the gpio_pin_configure_dt() run by + * the named-gpios driver and the gpio_nct38xx_alert.c driver. + */ usbc_tcpc_alrt_p0: usbc-tcpc-alrt-p0 { - gpios = <&gpio_140_176 3 GPIO_INPUT>; + gpios = <&gpio_140_176 3 (GPIO_INPUT | \ + GPIO_ACTIVE_LOW)>; }; /* GPIO143 */ /* NOTE: Netname is USBC_TCPC_PPC_ALRT_P0 */ usb_c0_c1_tcpc_rst_odl: usb-c0-c1-tcpc-rst-odl { diff --git a/zephyr/program/intelrvp/mtlrvp/mtlrvpp_npcx/gpio.dts b/zephyr/program/intelrvp/mtlrvp/mtlrvpp_npcx/gpio.dts index 77b4cf0573..8dbb684b56 100644 --- a/zephyr/program/intelrvp/mtlrvp/mtlrvpp_npcx/gpio.dts +++ b/zephyr/program/intelrvp/mtlrvp/mtlrvpp_npcx/gpio.dts @@ -61,8 +61,22 @@ gpios = <&gpio0 2 GPIO_INPUT>; enum-name = "GPIO_AC_PRESENT"; }; - usbc_tcpc_alrt_p0: usbc-tcpc-alrt-p0 { - gpios = <&gpio4 0 GPIO_INPUT>; + /* + * Note - the Intel boards implement their own handlers + * for tcpc_get_alert_status(). These handlers use + * gpio_get_level(), which returns the raw state of the pin, + * ignoring the GPIO_ACTIVE_LOW flag. + * + * However, the interrupt pin is shared with the upstream + * driver gpio_nct38xx_alert.c, which does use the logical + * level of the pin and requires that the signal is active low. + * + * Mark the signal active low here as well which ensures there + * is no conflict between the gpio_pin_configure_dt() run by + * the named-gpios driver and the gpio_nct38xx_alert.c driver. + */ + usbc_tcpc_alrt_p0: usbc-tcpc-alrt-p0 { + gpios = <&gpio4 0 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; }; /* NOTE: Netname is USBC_TCPC_PPC_ALRT_P0 */ usb_c0_c1_tcpc_rst_odl: usb-c0-c1-tcpc-rst-odl { diff --git a/zephyr/program/myst/BUILD.py b/zephyr/program/myst/BUILD.py new file mode 100644 index 0000000000..27e4009c1c --- /dev/null +++ b/zephyr/program/myst/BUILD.py @@ -0,0 +1,30 @@ +# 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. + +"""Define zmake projects for myst.""" + + +def register_myst_project( + project_name, +): + """Register a variant of myst.""" + register_npcx_project( + project_name=project_name, + zephyr_board="npcx9m7f", + dts_overlays=[ + here / project_name / "project.overlay", + ], + kconfig_files=[ + # Common to all projects. + here / "program.conf", + # Project-specific KConfig customization. + here / project_name / "project.conf", + ], + inherited_from=["myst"], + ) + + +register_myst_project( + project_name="myst", +) diff --git a/zephyr/program/myst/CMakeLists.txt b/zephyr/program/myst/CMakeLists.txt new file mode 100644 index 0000000000..c339dbeef7 --- /dev/null +++ b/zephyr/program/myst/CMakeLists.txt @@ -0,0 +1,21 @@ +# 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. + +cmake_minimum_required(VERSION 3.20.5) +find_package(Zephyr REQUIRED HINTS "${ZEPHYR_BASE}") + + +zephyr_library_sources("src/common.c") +zephyr_library_sources("src/power_signals.c") + +zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC + "src/usb_pd_policy.c" + "src/usbc_config.c") +zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_LED_COMMON "src/led.c") +zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_AMD_STT "src/stt.c") + +if(DEFINED CONFIG_BOARD_MYST) + project(myst) + add_subdirectory(myst) +endif() diff --git a/zephyr/program/myst/Kconfig b/zephyr/program/myst/Kconfig new file mode 100644 index 0000000000..db33f73668 --- /dev/null +++ b/zephyr/program/myst/Kconfig @@ -0,0 +1,15 @@ +# 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. + +config BOARD_MYST + bool "Google Myst Board" + help + Build Google Myst reference board. This board uses an AMD SoC + and NPCX9 EC + +module = MYST +module-str = Myst board-specific code +source "subsys/logging/Kconfig.template.log_config" + +source "Kconfig.zephyr" diff --git a/zephyr/program/myst/adc.dtsi b/zephyr/program/myst/adc.dtsi new file mode 100644 index 0000000000..613d57e8ab --- /dev/null +++ b/zephyr/program/myst/adc.dtsi @@ -0,0 +1,60 @@ +/* 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 <cros/thermistor/thermistor.dtsi> + +/ { + temp_charger_thermistor: charger-thermistor { + compatible = "cros-ec,temp-sensor-thermistor"; + thermistor = <&thermistor_3V3_30K9_47K_4050B>; + adc = <&adc_temp_chg>; + }; + + temp_memory_thermistor: memory-thermistor { + compatible = "cros-ec,temp-sensor-thermistor"; + thermistor = <&thermistor_3V3_30K9_47K_4050B>; + adc = <&adc_temp_mem>; + }; + + named-temp-sensors { + compatible = "cros-ec,temp-sensors"; + temp_sensor_charger: charger-thermistor { + temp_host_high = <100>; + temp_host_halt = <105>; + temp_host_release_high = <80>; + sensor = <&temp_charger_thermistor>; + }; + + temp_sensor_memory: memory-thermistor { + temp_host_high = <100>; + temp_host_halt = <105>; + temp_host_release_high = <80>; + power-good-pin = <&gpio_pg_pwr_s5>; + sensor = <&temp_memory_thermistor>; + }; + + temp_sensor_cpu: cpu { + temp_host_high = <100>; + temp_host_halt = <105>; + temp_host_release_high = <80>; + temp_fan_off = <60>; + temp_fan_max = <90>; + power-good-pin = <&gpio_pg_pcore_s0_r_od>; + sensor = <&temp_cpu>; + }; + + }; +}; + +&adc0 { + status = "okay"; + pinctrl-0 = <&adc0_chan0_gp45 + &adc0_chan1_gp44>; + pinctrl-names = "default"; +}; + +&thermistor_3V3_30K9_47K_4050B { + status = "okay"; +}; diff --git a/zephyr/program/myst/fan.dtsi b/zephyr/program/myst/fan.dtsi new file mode 100644 index 0000000000..3e725ff4f3 --- /dev/null +++ b/zephyr/program/myst/fan.dtsi @@ -0,0 +1,39 @@ +/* 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. + */ + +/ { + fans { + compatible = "cros-ec,fans"; + + fan0: fan_0 { + pwms = <&pwm0 0 PWM_KHZ(25) PWM_POLARITY_NORMAL>; + rpm_min = <3000>; + rpm_start = <3000>; + rpm_max = <5000>; + tach = <&tach1>; + pgood_gpio = <&gpio_pg_groupc_s0_od>; + }; + }; +}; + +/* Tachometer for fan speed measurement */ +&tach1 { + status = "okay"; + pinctrl-0 = <&ta1_1_in_gp40>; + pinctrl-names = "default"; + port = <NPCX_TACH_PORT_A>; /* port-A is selected */ + sample-clk = <NPCX_TACH_FREQ_LFCLK>; /* Use LFCLK as sampling clock */ + pulses-per-round = <2>; /* number of pulses per round of encoder */ +}; + +&pwm0_gpc3 { + drive-open-drain; +}; + +&pwm0 { + status = "okay"; + pinctrl-0 = <&pwm0_gpc3>; + pinctrl-names = "default"; +}; diff --git a/zephyr/program/myst/generated.dtsi b/zephyr/program/myst/generated.dtsi new file mode 100644 index 0000000000..0e5ed5d944 --- /dev/null +++ b/zephyr/program/myst/generated.dtsi @@ -0,0 +1,235 @@ +/* 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. + * + * This file is auto-generated - do not edit! + */ + +/ { + + named-adc-channels { + compatible = "named-adc-channels"; + + adc_temp_chg: temp_chg { + enum-name = "ADC_TEMP_SENSOR_CHARGER"; + io-channels = <&adc0 0>; + }; + adc_temp_mem: temp_mem { + enum-name = "ADC_TEMP_SENSOR_MEMORY"; + io-channels = <&adc0 1>; + }; + }; + + named-gpios { + compatible = "named-gpios"; + + gpio_3axis_int_l: 3axis_int_l { + gpios = <&gpioa 2 GPIO_INPUT_PULL_UP>; + }; + gpio_6axis_int_l: 6axis_int_l { + gpios = <&gpioa 0 GPIO_INPUT_PULL_UP>; + }; + gpio_acok_od: acok_od { + gpios = <&gpio0 0 GPIO_INPUT>; + enum-name = "GPIO_AC_PRESENT"; + }; + gpio_ccd_mode_odl: ccd_mode_odl { + gpios = <&gpiob 7 GPIO_ODR_LOW>; + enum-name = "GPIO_CCD_MODE_ODL"; + }; + gpio_ec_bat_pres_odl: ec_bat_pres_odl { + gpios = <&gpio9 3 GPIO_INPUT>; + enum-name = "GPIO_BATT_PRES_ODL"; + }; + gpio_ec_c0_retimer_int_odl: ec_c0_retimer_int_odl { + gpios = <&gpio9 6 GPIO_INPUT_PULL_UP>; + }; + gpio_ec_c0_retimer_rst_l: ec_c0_retimer_rst_l { + gpios = <&gpiof 4 GPIO_OUTPUT>; + }; + gpio_ec_c1_retimer_int_odl: ec_c1_retimer_int_odl { + gpios = <&gpioa 6 GPIO_INPUT>; + }; + gpio_ec_c1_retimer_rst_odl: ec_c1_retimer_rst_odl { + gpios = <&gpio0 3 GPIO_ODR_LOW>; + }; + gpio_ec_disable_disp_bl: ec_disable_disp_bl { + gpios = <&gpiob 1 GPIO_OUTPUT>; + enum-name = "GPIO_ENABLE_BACKLIGHT"; + }; + gpio_ec_fan1_speed: ec_fan1_speed { + gpios = <&gpio4 0 GPIO_INPUT>; + }; + gpio_ec_fan2_speed: ec_fan2_speed { + gpios = <&gpio7 3 GPIO_INPUT>; + }; + gpio_ec_gsc_packet_mode_odl: ec_gsc_packet_mode_odl { + gpios = <&gpioc 0 GPIO_ODR_LOW>; + enum-name = "GPIO_PACKET_MODE_EN"; + }; + gpio_ec_kso_02_inv: ec_kso_02_inv { + gpios = <&gpio1 7 (GPIO_OUTPUT | GPIO_ACTIVE_LOW)>; + enum-name = "GPIO_KBD_KSO2"; + }; + gpio_ec_mech_pwr_btn_odl: ec_mech_pwr_btn_odl { + gpios = <&gpiod 2 GPIO_INPUT>; + enum-name = "GPIO_POWER_BUTTON_L"; + }; + gpio_ec_prochot_odl: ec_prochot_odl { + gpios = <&gpiod 4 GPIO_ODR_LOW>; + enum-name = "GPIO_CPU_PROCHOT"; + }; + gpio_ec_soc_int: ec_soc_int { + gpios = <&gpio6 0 GPIO_OUTPUT>; + enum-name = "GPIO_EC_INT_L"; + }; + gpio_ec_soc_pwr_btn_odl: ec_soc_pwr_btn_odl { + gpios = <&gpiob 0 GPIO_ODR_LOW>; + enum-name = "GPIO_PCH_PWRBTN_L"; + }; + gpio_ec_soc_pwr_good: ec_soc_pwr_good { + gpios = <&gpio9 4 GPIO_ODR_HIGH>; + }; + gpio_ec_soc_rsmrst_l: ec_soc_rsmrst_l { + gpios = <&gpioa 5 GPIO_OUTPUT>; + enum-name = "GPIO_PCH_RSMRST_L"; + }; + gpio_ec_soc_wake_odl: ec_soc_wake_odl { + gpios = <&gpiof 0 GPIO_ODR_LOW>; + }; + gpio_ec_sys_rst_l: ec_sys_rst_l { + gpios = <&gpio7 5 GPIO_OUTPUT>; + enum-name = "GPIO_SYS_RESET_L"; + }; + gpio_ec_wp_l: ec_wp_l { + gpios = <&gpioa 7 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + }; + gpio_en_kb_bl: en_kb_bl { + gpios = <&gpio7 4 GPIO_OUTPUT>; + enum-name = "GPIO_EN_KEYBOARD_BACKLIGHT"; + }; + gpio_en_pp5000_usb_a0_vbus: en_pp5000_usb_a0_vbus { + gpios = <&gpio6 6 GPIO_OUTPUT>; + }; + gpio_en_pp5000_usb_a1_vbus: en_pp5000_usb_a1_vbus { + gpios = <&gpio8 3 GPIO_OUTPUT>; + }; + gpio_en_pwr_pcore_s0: en_pwr_pcore_s0 { + gpios = <&gpioe 2 GPIO_OUTPUT>; + }; + gpio_en_pwr_s0: en_pwr_s0 { + gpios = <&gpioe 5 GPIO_OUTPUT>; + }; + gpio_en_pwr_s5: en_pwr_s5 { + gpios = <&gpiod 7 GPIO_OUTPUT>; + enum-name = "GPIO_EN_PWR_A"; + }; + gpio_en_pwr_z1: en_pwr_z1 { + gpios = <&gpio8 5 GPIO_OUTPUT>; + }; + gpio_en_usb_a1_retimer: en_usb_a1_retimer { + gpios = <&gpio3 5 GPIO_OUTPUT>; + }; + gpio_en_usb_c0_tcpc_vbsnk_l: en_usb_c0_tcpc_vbsnk_l { + gpios = <&gpioc 5 GPIO_ODR_LOW>; + }; + gpio_lid_open: lid_open { + gpios = <&gpio0 1 GPIO_INPUT>; + enum-name = "GPIO_LID_OPEN"; + }; + gpio_pg_groupc_s0_od: pg_groupc_s0_od { + gpios = <&gpio9 7 GPIO_INPUT>; + }; + gpio_pg_lpddr5_s3_od: pg_lpddr5_s3_od { + gpios = <&gpioe 1 GPIO_INPUT>; + }; + gpio_pg_pcore_s0_r_od: pg_pcore_s0_r_od { + gpios = <&gpiof 1 GPIO_INPUT>; + enum-name = "GPIO_S0_PGOOD"; + }; + gpio_pg_ppvar_mem_od: pg_ppvar_mem_od { + gpios = <&gpio7 6 GPIO_INPUT>; + }; + gpio_pg_pwr_s5: pg_pwr_s5 { + gpios = <&gpiod 5 GPIO_INPUT>; + }; + gpio_pg_vddq_mem_od: pg_vddq_mem_od { + gpios = <&gpioa 4 GPIO_INPUT_PULL_UP>; + }; + gpio_slp_s3_l: slp_s3_l { + gpios = <&gpio6 1 GPIO_INPUT>; + enum-name = "GPIO_PCH_SLP_S3_L"; + }; + gpio_slp_s5_l: slp_s5_l { + gpios = <&gpio7 2 GPIO_INPUT>; + enum-name = "GPIO_PCH_SLP_S5_L"; + }; + gpio_soc_alert_ec_odl: soc_alert_ec_odl { + gpios = <&gpiod 3 GPIO_INPUT>; + }; + gpio_soc_thermtrip_r_odl: soc_thermtrip_r_odl { + gpios = <&gpio9 5 GPIO_INPUT>; + }; + gpio_soc_usbc_pd_int: soc_usbc_pd_int { + gpios = <&gpioa 3 GPIO_INPUT>; + }; + gpio_tablet_mode: tablet_mode { + gpios = <&gpioc 1 GPIO_INPUT>; + enum-name = "GPIO_TABLET_MODE_L"; + }; + gpio_usb_a1_retimer_rst_l: usb_a1_retimer_rst_l { + gpios = <&gpio3 2 GPIO_OUTPUT>; + }; + gpio_usb_c0_c1_fault_odl: usb_c0_c1_fault_odl { + gpios = <&gpioa 1 GPIO_INPUT_PULL_UP>; + }; + gpio_usb_c0_frs_alert_od: usb_c0_frs_alert_od { + gpios = <&gpioc 6 GPIO_INPUT>; + }; + gpio_usb_c0_hpd: usb_c0_hpd { + gpios = <&gpio6 2 GPIO_OUTPUT>; + enum-name = "GPIO_USB_C0_DP_HPD"; + }; + gpio_usb_c0_ppc_int_odl: usb_c0_ppc_int_odl { + gpios = <&gpio6 7 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + enum-name = "GPIO_USB_C0_PPC_INT_ODL"; + }; + gpio_usb_c0_ppc_rst_l: usb_c0_ppc_rst_l { + gpios = <&gpioe 0 GPIO_OUTPUT>; + }; + gpio_usb_c0_sbu_flip: usb_c0_sbu_flip { + gpios = <&gpio0 2 GPIO_ODR_LOW>; + }; + gpio_usb_c0_tcpc_int_odl: usb_c0_tcpc_int_odl { + gpios = <&gpio3 7 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + enum-name = "GPIO_USB_C0_TCPC_INT_ODL"; + }; + gpio_usb_c1_frs_alert_od: usb_c1_frs_alert_od { + gpios = <&gpioc 7 GPIO_INPUT>; + }; + gpio_usb_c1_hpd: usb_c1_hpd { + gpios = <&gpio6 3 GPIO_OUTPUT>; + enum-name = "GPIO_USB_C1_DP_HPD"; + }; + gpio_usb_c1_ppc_int_odl: usb_c1_ppc_int_odl { + gpios = <&gpio7 0 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + enum-name = "GPIO_USB_C1_PPC_INT_ODL"; + }; + gpio_usb_c1_tcpc_int_odl: usb_c1_tcpc_int_odl { + gpios = <&gpio3 4 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + enum-name = "GPIO_USB_C1_TCPC_INT_ODL"; + }; + gpio_voldn_btn_odl: voldn_btn_odl { + gpios = <&gpio4 2 GPIO_INPUT_PULL_UP>; + enum-name = "GPIO_VOLUME_DOWN_L"; + }; + gpio_volup_btn_odl: volup_btn_odl { + gpios = <&gpio4 3 GPIO_INPUT_PULL_UP>; + enum-name = "GPIO_VOLUME_UP_L"; + }; + }; +}; + +&adc0 { + status = "okay"; +}; diff --git a/zephyr/program/myst/gpio.dtsi b/zephyr/program/myst/gpio.dtsi new file mode 100644 index 0000000000..4980b066f0 --- /dev/null +++ b/zephyr/program/myst/gpio.dtsi @@ -0,0 +1,52 @@ +/* Copyright 2021 The ChromiumOS Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/ { + aliases { + gpio-wp = &gpio_ec_wp_l; + /* There is no CBI WP on myst... remove this ASAP */ + gpio-cbi-wp = &gpio_usb_c0_sbu_flip; + gpio-kbd-kso2 = &gpio_ec_kso_02_inv; + }; +}; + +/* PSL input pads */ +&psl_in1_gpd2 { + /* MECH_PWR_BTN_ODL */ + psl-in-mode = "edge"; + psl-in-pol = "low-falling"; +}; + +&psl_in2_gp00 { + /* ACOK_OD */ + psl-in-mode = "edge"; + psl-in-pol = "high-rising"; +}; + +&psl_in4_gp02 { + /* LID_OPEN */ + psl-in-mode = "edge"; + psl-in-pol = "high-rising"; +}; + +/* Power domain device controlled by PSL (Power Switch Logic) IO pads */ +&power_ctrl_psl { + status = "okay"; + pinctrl-names = "sleep"; + pinctrl-0 = <&psl_in1_gpd2 &psl_in2_gp00 &psl_in4_gp02>; +}; + +/* host interface */ +&espi0 { + status = "okay"; + pinctrl-0 = <&espi_lpc_gp46_47_51_52_53_54_55_57>; + pinctrl-names = "default"; +}; + +/* Required node label that is named differently on Myst */ +gpio_ec_pch_wake_odl: &gpio_ec_soc_wake_odl {}; +gpio_slp_s0_l: &gpio_slp_s3_l { + alias = "GPIO_PCH_SLP_S0_L"; +}; diff --git a/zephyr/program/myst/i2c.dtsi b/zephyr/program/myst/i2c.dtsi new file mode 100644 index 0000000000..58ba31911b --- /dev/null +++ b/zephyr/program/myst/i2c.dtsi @@ -0,0 +1,246 @@ +/* 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> + #include <dt-bindings/usbc_mux.h> + +/ { + aliases { + i2c-0 = &i2c0_0; + i2c-1 = &i2c1_0; + i2c-2 = &i2c2_0; + i2c-3 = &i2c3_0; + i2c-4 = &i2c4_1; + i2c-5 = &i2c5_0; + i2c-6 = &i2c6_0; + i2c-7 = &i2c7_0; + }; + + named-i2c-ports { + compatible = "named-i2c-ports"; + + i2c_tcpc0: tcpc0 { + i2c-port = <&i2c0_0>; + enum-names = "I2C_PORT_TCPC0"; + }; + + i2c_tcpc1: tcpc1 { + i2c-port = <&i2c1_0>; + enum-names = "I2C_PORT_TCPC1"; + }; + + battery { + i2c-port = <&i2c2_0>; + remote-port = <0>; + enum-names = "I2C_PORT_BATTERY"; + }; + + usb-mux { + i2c-port = <&i2c3_0>; + enum-names = "I2C_PORT_USB_MUX"; + }; + + i2c_charger: charger { + i2c-port = <&i2c4_1>; + enum-names = "I2C_PORT_CHARGER"; + }; + + eeprom { + i2c-port = <&i2c5_0>; + enum-names = "I2C_PORT_EEPROM"; + }; + + i2c_sensor: sensor { + i2c-port = <&i2c6_1>; + enum-names = "I2C_PORT_SENSOR"; + }; + + i2c_soc_thermal: soc-thermal { + i2c-port = <&i2c7_0>; + enum-names = "I2C_PORT_THERMAL_AP"; + }; + }; + + +}; + +&i2c0_0 { + status = "okay"; + label = "I2C_TCPC0"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c0_0_sda_scl_gpb4_b5>; + pinctrl-names = "default"; + + tcpc_port0: rt1716@70 { + compatible = "richtek,rt1716"; + reg = <0x70>; + tcpc-flags = <(TCPC_FLAGS_TCPCI_REV2_0)>; + /* TBD */ + irq-gpios = <&gpioe 0 GPIO_ACTIVE_LOW>; + }; + + ppc_port0: ktu1125@78 { + compatible = "kinetic,ktu1125"; + status = "okay"; + reg = <0x78>; + }; +}; + +&i2c_ctrl0 { + status = "okay"; +}; + +&i2c1_0 { + status = "okay"; + label = "I2C_TCPC1"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c1_0_sda_scl_gp87_90>; + pinctrl-names = "default"; + + bc12_port1: rt1718s-bc12@40 { + compatible = "richtek,rt1718s-bc12"; + status = "okay"; + reg = <0x40>; + }; + + tcpc_port1: rt1718s-tcpc@40 { + compatible = "richtek,rt1718s-tcpc"; + reg = <0x40>; + tcpc-flags = <( + TCPC_FLAGS_ALERT_OD | + TCPC_FLAGS_CONTROL_VCONN | + TCPC_FLAGS_CONTROL_FRS)>; + /* a duplicate of the <&gpio_usb_c1_tcpc_int_odl> node in + * "named-gpios". This is the Zephyr preferred style, + * the "named-gpios" node will be dealt with at a later date. + */ + irq-gpios = <&gpio3 4 GPIO_ACTIVE_LOW>; + }; + + ppc_port1: nx20p348x@71 { + compatible = "nxp,nx20p348x"; + status = "okay"; + reg = <0x71>; + }; + + /* TODO: add SKU-B DB b/275610001 */ +}; + +&i2c_ctrl1 { + status = "okay"; +}; + +&i2c2_0 { + status = "okay"; + label = "I2C_BATTERY"; + clock-frequency = <I2C_BITRATE_STANDARD>; + pinctrl-0 = <&i2c2_0_sda_scl_gp91_92>; + pinctrl-names = "default"; +}; + +&i2c_ctrl2 { + status = "okay"; +}; + +&i2c3_0 { + status = "okay"; + label = "I2C_USB_MUX"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c3_0_sda_scl_gpd0_d1>; + pinctrl-names = "default"; + + amd_fp6_port0: amd_fp6@5c { + compatible = "amd,usbc-mux-amd-fp6"; + status = "okay"; + reg = <0x5c>; + }; + amd_fp6_port1: amd_fp6@52 { + compatible = "amd,usbc-mux-amd-fp6"; + status = "okay"; + reg = <0x52>; + }; +}; + +&i2c_ctrl3 { + status = "okay"; +}; + +&i2c4_1 { + status = "okay"; + label = "I2C_CHARGER"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c4_1_sda_scl_gpf2_f3>; + pinctrl-names = "default"; + + charger: isl9241@9 { + compatible = "intersil,isl9241"; + status = "okay"; + reg = <0x9>; + }; +}; + +&i2c_ctrl4 { + status = "okay"; +}; + +&i2c5_0 { + status = "okay"; + label = "I2C_EEPROM"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c5_0_sda_scl_gp33_36>; + pinctrl-names = "default"; + + cbi_eeprom: eeprom@50 { + compatible = "atmel,at24"; + reg = <0x50>; + size = <2048>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + }; +}; + +&i2c_ctrl5 { + status = "okay"; +}; + +&i2c6_1 { + status = "okay"; + label = "I2C_SENSOR"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c6_1_sda_scl_gpe3_e4>; + pinctrl-names = "default"; + + soc_pct2075: soc-pct2075@48 { + compatible = "nxp,pct2075"; + reg = <0x48>; + }; + + amb_pct2075: amb-pct2075@4f { + compatible = "nxp,pct2075"; + reg = <0x4f>; + }; +}; + +&i2c_ctrl6 { + status = "okay"; +}; + +&i2c7_0 { + status = "okay"; + label = "I2C_THERMAL_AP"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c7_0_sda_scl_gpb2_b3>; + pinctrl-names = "default"; + + temp_cpu: cpu@4c { + compatible = "amd,sb-tsi"; + reg = <0x4c>; + }; +}; + +&i2c_ctrl7 { + status = "okay"; +}; diff --git a/zephyr/program/myst/interrupts.dtsi b/zephyr/program/myst/interrupts.dtsi new file mode 100644 index 0000000000..eb2c9aec92 --- /dev/null +++ b/zephyr/program/myst/interrupts.dtsi @@ -0,0 +1,106 @@ +/* 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. + */ + +/ { + gpio-interrupts { + compatible = "cros-ec,gpio-interrupts"; + + int_lid_open: lid_open { + irq-pin = <&gpio_lid_open>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "lid_interrupt"; + }; + int_ac_present: ac_present { + irq-pin = <&gpio_acok_od>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "extpower_interrupt"; + }; + int_power_button: power_button { + irq-pin = <&gpio_ec_mech_pwr_btn_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "power_button_interrupt"; + }; + int_slp_s3: slp_s3 { + irq-pin = <&gpio_slp_s3_l>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_en_pwr_s0"; + }; + int_slp_s5: slp_s5 { + irq-pin = <&gpio_slp_s5_l>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_set_en_pwr_s3"; + }; + int_s5_pgood: s5_pgood { + irq-pin = <&gpio_pg_pwr_s5>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_s5_pgood"; + }; + int_pg_groupc_s0: pg_groupc_s0 { + irq-pin = <&gpio_pg_groupc_s0_od>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_set_en_pwr_pcore"; + }; + int_pg_lpddr_s3: pg_lpddr_s3 { + irq-pin = <&gpio_pg_lpddr5_s3_od>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_set_en_pwr_pcore"; + }; + int_s0_pgood: s0_pgood { + irq-pin = <&gpio_pg_groupc_s0_od>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "baseboard_s0_pgood"; + }; + int_soc_thermtrip: soc_thermtrip { + irq-pin = <&gpio_soc_thermtrip_r_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "baseboard_soc_thermtrip"; + }; + int_volume_up: volume_up { + irq-pin = <&gpio_volup_btn_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "button_interrupt"; + }; + int_volume_down: volume_down { + irq-pin = <&gpio_voldn_btn_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "button_interrupt"; + }; + int_usb_c0_c1_sbu_fault: c0_c1_sbu_fault { + irq-pin = <&gpio_usb_c0_c1_fault_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "sbu_fault_interrupt"; + }; + int_usb_c0_ppc: usb_c0_ppc { + irq-pin = <&gpio_usb_c0_ppc_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "ppc_interrupt"; + }; + int_usb_c1_ppc: usb_c1_ppc { + irq-pin = <&gpio_usb_c1_ppc_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "ppc_interrupt"; + }; + int_usb_pd_soc: usb_pd_soc { + irq-pin = <&gpio_ec_c0_retimer_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "usb_pd_soc_interrupt"; + }; + int_lid_accel: lid_accel { + irq-pin = <&gpio_3axis_int_l>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "bma4xx_interrupt"; + }; + int_accel_gyro: accel_gyro { + irq-pin = <&gpio_6axis_int_l>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "bmi3xx_interrupt"; + }; + int_prochot: prochot { + irq-pin = <&gpio_ec_prochot_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "throttle_ap_prochot_input_interrupt"; + }; + }; +}; diff --git a/zephyr/program/myst/keyboard.dtsi b/zephyr/program/myst/keyboard.dtsi new file mode 100644 index 0000000000..79cf33d4fc --- /dev/null +++ b/zephyr/program/myst/keyboard.dtsi @@ -0,0 +1,48 @@ +/* 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. + */ + +/ { + kblight { + compatible = "cros-ec,kblight-pwm"; + pwms = <&pwm1 0 PWM_HZ(100) PWM_POLARITY_NORMAL>; + }; +}; + +&pwm1 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; + pinctrl-0 = <&pwm1_gpc2>; + pinctrl-names = "default"; +}; + +&cros_kb_raw { + status = "okay"; + /* No KSO2 (it's inverted and implemented by GPIO) */ + pinctrl-0 = < + &ksi0_gp31 + &ksi1_gp30 + &ksi2_gp27 + &ksi3_gp26 + &ksi4_gp25 + &ksi5_gp24 + &ksi6_gp23 + &ksi7_gp22 + &kso00_gp21 + &kso01_gp20 + &kso03_gp16 + &kso04_gp15 + &kso05_gp14 + &kso06_gp13 + &kso07_gp12 + &kso08_gp11 + &kso09_gp10 + &kso10_gp07 + &kso11_gp06 + &kso12_gp05 + &kso13_gp04 + &kso14_gp82 + >; + pinctrl-names = "default"; +}; diff --git a/zephyr/program/myst/myst.csv b/zephyr/program/myst/myst.csv new file mode 100644 index 0000000000..7296853547 --- /dev/null +++ b/zephyr/program/myst/myst.csv @@ -0,0 +1,69 @@ +Signal Name,Pin Number,Type,Enum +USB_C0_PPC_RST_L,F4,OUTPUT, +USB_C0_TCPC_INT_ODL,C1,INPUT_L,GPIO_USB_C0_TCPC_INT_ODL +USB_C0_PPC_INT_ODL,J3,INPUT_L,GPIO_USB_C0_PPC_INT_ODL +USB_C0_C1_FAULT_ODL,L12,INPUT_PU, +USB_C0_HPD,H2,OUTPUT,GPIO_USB_C0_DP_HPD +SOC_USBC_PD_INT,K12,INPUT, +USB_C1_TCPC_INT_ODL,B2,INPUT_L,GPIO_USB_C1_TCPC_INT_ODL +USB_C1_PPC_INT_ODL,J4,INPUT_L,GPIO_USB_C1_PPC_INT_ODL +USB_C1_HPD,J2,OUTPUT,GPIO_USB_C1_DP_HPD +EC_FAN1_PWM,G9,PWM, +EC_FAN1_SPEED,E5,INPUT, +EC_FAN2_PWM,H10,PWM, +EC_FAN2_SPEED,G5,INPUT, +EC_PWM_KB_BL,G8,PWM, +EC_PWM_LED_CHRG_L,K5,PWM_INVERT, +EC_PWM_LED_FULL_L,L9,PWM_INVERT, +EC_BAT_PRES_ODL,E11,INPUT,GPIO_BATT_PRES_ODL +CCD_MODE_ODL,J7,OUTPUT_ODL,GPIO_CCD_MODE_ODL +EC_GSC_PACKET_MODE_ODL,H8,OUTPUT_ODL,GPIO_PACKET_MODE_EN +3AXIS_INT_L,F12,INPUT_PU, +6AXIS_INT_L,G11,INPUT_PU, +TABLET_MODE,H9,INPUT,GPIO_TABLET_MODE_L +VOLUP_BTN_ODL,E2,INPUT_PU,GPIO_VOLUME_UP_L +VOLDN_BTN_ODL,D3,INPUT_PU,GPIO_VOLUME_DOWN_L +EN_KB_BL,H5,OUTPUT,GPIO_EN_KEYBOARD_BACKLIGHT +EC_SOC_PWR_GOOD,M11,OUTPUT_ODR, +PG_GROUPC_S0_OD,L10,INPUT, +PG_LPDDR5_S3_OD,F3,INPUT, +PG_VDDQ_MEM_OD,H11,INPUT_PU, +PG_PWR_S5,A10,INPUT, +PG_PCORE_S0_R_OD,G3,INPUT,GPIO_S0_PGOOD +EN_PWR_PCORE_S0,A11,OUTPUT, +EN_PWR_S0,A12,OUTPUT, +EN_PWR_S5,H6,OUTPUT,GPIO_EN_PWR_A +SLP_S3_L,K4,INPUT,GPIO_PCH_SLP_S3_L +SLP_S5_L,M4,INPUT,GPIO_PCH_SLP_S5_L +EC_PROCHOT_ODL,A9,OUTPUT_ODL,GPIO_CPU_PROCHOT +SOC_ALERT_EC_ODL,E10,INPUT, +SOC_THERMTRIP_R_ODL,M12,INPUT, +EC_SYS_RST_L,J6,OUTPUT,GPIO_SYS_RESET_L +EC_SOC_RSMRST_L,K11,OUTPUT,GPIO_PCH_RSMRST_L +EC_SOC_INT,G6,OUTPUT,GPIO_EC_INT_L +EC_SOC_WAKE_ODL,D2,OUTPUT_ODL, +EC_SOC_PWR_BTN_ODL,L11,OUTPUT_ODL,GPIO_PCH_PWRBTN_L +EC_DISABLE_DISP_BL,D8,OUTPUT,GPIO_ENABLE_BACKLIGHT +EC_WP_L,J11,INPUT_L, +TEMP_CHG,F2,ADC,ADC_TEMP_SENSOR_CHARGER +TEMP_MEM,E3,ADC,ADC_TEMP_SENSOR_MEMORY +UART_EC_TX_DBG_RX_R,H4,OTHER, +UART_EC_RX_DBG_TX_R,G4,OTHER, +EC_C1_RETIMER_INT_ODL,F11,INPUT, +EC_C1_RETIMER_RST_ODL,D9,OUTPUT_ODL, +EC_C0_RETIMER_INT_ODL,G12,INPUT_PU, +EC_C0_RETIMER_RST_L,E9,OUTPUT, +USB_C0_FRS_ALERT_OD,D10,INPUT, +EN_PP5000_USB_A0_VBUS,G2,OUTPUT, +EN_PP5000_USB_A1_VBUS,D7,OUTPUT, +USB_C0_SBU_FLIP,F7,OUTPUT_ODL, +EN_USB_A1_RETIMER,K2,OUTPUT, +USB_A1_RETIMER_RST_L,E4,OUTPUT, +USB_C1_FRS_ALERT_OD,F10,INPUT, +EN_USB_C0_TCPC_VBSNK_L,H7,OUTPUT_ODL, +ACOK_OD,E7,INPUT,GPIO_AC_PRESENT +LID_OPEN,E6,INPUT,GPIO_LID_OPEN +EC_MECH_PWR_BTN_ODL,G7,INPUT,GPIO_POWER_BUTTON_L +PG_PPVAR_MEM_OD,J5,INPUT, +EN_PWR_Z1,J8,OUTPUT, +EC_KSO_02_INV,B7,OUTPUT_L,GPIO_KBD_KSO2 diff --git a/zephyr/program/myst/myst/CMakeLists.txt b/zephyr/program/myst/myst/CMakeLists.txt new file mode 100644 index 0000000000..9dc79f913e --- /dev/null +++ b/zephyr/program/myst/myst/CMakeLists.txt @@ -0,0 +1,9 @@ +# 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. + +cros_ec_library_include_directories_ifdef(CONFIG_BOARD_MYST include) +zephyr_library_sources( + "src/ppc_config.c" + "src/keyboard.c" +) diff --git a/zephyr/program/myst/myst/led_pins.dtsi b/zephyr/program/myst/myst/led_pins.dtsi new file mode 100644 index 0000000000..29c33f7457 --- /dev/null +++ b/zephyr/program/myst/myst/led_pins.dtsi @@ -0,0 +1,59 @@ +/* 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. + */ + +/ { + pwmleds { + compatible = "pwm-leds"; + pwm_y: pwm_y { + pwms = <&pwm2 0 PWM_HZ(100) PWM_POLARITY_INVERTED>; + }; + pwm_w: pwm_w { + pwms = <&pwm3 0 PWM_HZ(100) PWM_POLARITY_INVERTED>; + }; + }; + + pwm-led-pins { + compatible = "cros-ec,pwm-led-pins"; + + color_off: color-off { + led-color = "LED_OFF"; + led-id = "EC_LED_ID_BATTERY_LED"; + led-pwms = <&pwm_y &pwm_w>; + led-values = <0 0>; + }; + + color_amber: color-amber { + led-color = "LED_AMBER"; + led-id = "EC_LED_ID_BATTERY_LED"; + br-color = "EC_LED_COLOR_AMBER"; + led-pwms = <&pwm_y &pwm_w>; + led-values = <100 0>; + }; + + color_white: color-white { + led-color = "LED_WHITE"; + led-id = "EC_LED_ID_BATTERY_LED"; + br-color = "EC_LED_COLOR_WHITE"; + led-pwms = <&pwm_y &pwm_w>; + led-values = <0 100>; + }; + }; +}; + +/* Amber "battery charging" LED */ +&pwm2 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; + pinctrl-0 = <&pwm3_gp80>; + pinctrl-names = "default"; +}; + +/* White "battery full" LED */ +&pwm3 { + status = "okay"; + clock-bus = "NPCX_CLOCK_BUS_LFCLK"; + pinctrl-0 = <&pwm4_gpb6>; + pinctrl-names = "default"; +}; diff --git a/zephyr/program/myst/myst/led_policy.dtsi b/zephyr/program/myst/myst/led_policy.dtsi new file mode 100644 index 0000000000..2215c9fda7 --- /dev/null +++ b/zephyr/program/myst/myst/led_policy.dtsi @@ -0,0 +1,108 @@ +/* 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/battery.h> + +/ { + led-colors { + compatible = "cros-ec,led-policy"; + + power-state-charge { + charge-state = "PWR_STATE_CHARGE"; + + color-0 { + led-color = <&color_amber>; + }; + }; + + power-state-discharge-s0 { + charge-state = "PWR_STATE_DISCHARGE"; + chipset-state = "POWER_S0"; + /* Battery percent range (> Low, <= Full) */ + batt-lvl = <(BATTERY_LEVEL_LOW + 1) BATTERY_LEVEL_FULL>; + + color-0 { + led-color = <&color_white>; + }; + }; + + power-state-discharge-s0-batt-low { + charge-state = "PWR_STATE_DISCHARGE"; + chipset-state = "POWER_S0"; + /* Battery percent range (>= Empty, <= Low) */ + batt-lvl = <BATTERY_LEVEL_EMPTY BATTERY_LEVEL_LOW>; + + /* White 2 sec, off 1 sec */ + color-0 { + led-color = <&color_white>; + period-ms = <2000>; + }; + color-1 { + led-color = <&color_off>; + period-ms = <1000>; + }; + }; + + power-state-discharge-s3 { + charge-state = "PWR_STATE_DISCHARGE"; + chipset-state = "POWER_S3"; + + /* White 1 sec, off 1 sec */ + color-0 { + led-color = <&color_white>; + period-ms = <1000>; + }; + color-1 { + led-color = <&color_off>; + period-ms = <1000>; + }; + }; + + power-state-discharge-s5 { + charge-state = "PWR_STATE_DISCHARGE"; + chipset-state = "POWER_S5"; + + color-0 { + led-color = <&color_off>; + }; + }; + + power-state-error { + charge-state = "PWR_STATE_ERROR"; + + /* Amber 1 sec, off 1 sec */ + color-0 { + led-color = <&color_amber>; + period-ms = <1000>; + }; + color-1 { + led-color = <&color_off>; + period-ms = <1000>; + }; + }; + + power-state-near-full { + charge-state = "PWR_STATE_CHARGE_NEAR_FULL"; + + color-0 { + led-color = <&color_white>; + }; + }; + + power-state-forced-idle { + charge-state = "PWR_STATE_FORCED_IDLE"; + + /* Amber 2 sec, White 2 sec */ + color-0 { + led-color = <&color_amber>; + period-ms = <2000>; + }; + color-1 { + led-color = <&color_white>; + period-ms = <2000>; + }; + }; + }; +}; diff --git a/zephyr/program/myst/myst/motionsense.dtsi b/zephyr/program/myst/myst/motionsense.dtsi new file mode 100644 index 0000000000..d2119f4942 --- /dev/null +++ b/zephyr/program/myst/myst/motionsense.dtsi @@ -0,0 +1,136 @@ +/* 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 <dt-bindings/motionsense/utils.h> + + +/ { + aliases { + /* + * motion sense's <>_INT_EVENT is handled + * by alias. Using the alias, each driver creates + * its own <>_INT_EVENT. + */ + bmi3xx-int = &base_accel; + bma4xx-int = &lid_accel; + }; + + /* + * Declare mutexes used by sensor drivers. + * A mutex node is used to create an instance of mutex_t. + * A mutex node is referenced by a sensor node if the + * corresponding sensor driver needs to use the + * instance of the mutex. + */ + motionsense-mutex { + compatible = "cros-ec,motionsense-mutex"; + lid_mutex: lid-mutex { + }; + + mutex_bmi3xx: bmi3xx-mutex { + }; + }; + + /* + * Driver specific data. A driver-specific data can be shared with + * different motion sensors while they are using the same driver. + * + * If a node's compatible starts with "cros-ec,accelgyro-", it is for + * a common structure defined in accelgyro.h. + * e.g) compatible = "cros-ec,accelgyro-als-drv-data" is for + * "struct als_drv_data_t" in accelgyro.h + */ + motionsense-sensor-data { + bma4xx_data: bma4xx-drv-data { + compatible = "cros-ec,drvdata-bma4xx"; + status = "okay"; + }; + + bmi3xx_data: bmi3xx-drv-data { + compatible = "cros-ec,drvdata-bmi3xx"; + status = "okay"; + }; + }; + + /* + * List of motion sensors that creates motion_sensors array. + * The nodelabel "lid_accel" and "base_accel" are used to indicate + * motion sensor IDs for lid angle calculation. + */ + motionsense-sensor { + lid_accel: lid-accel { + compatible = "cros-ec,bma4xx"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_LID"; + mutex = <&lid_mutex>; + port = <&i2c_sensor>; + drv-data = <&bma4xx_data>; + rot-standard-ref = <&lid_rot_ref>; + default-range = <2>; + configs { + compatible = + "cros-ec,motionsense-sensor-config"; + ec-s0 { + odr = <(12500 | ROUND_UP_FLAG)>; + ec-rate = <100>; + }; + ec-s3 { + odr = <(12500 | ROUND_UP_FLAG)>; + }; + }; + }; + + base_accel: base-accel { + compatible = "cros-ec,bmi3xx-accel"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_BASE"; + mutex = <&mutex_bmi3xx>; + port = <&i2c_sensor>; + rot-standard-ref = <&base_rot_ref>; + drv-data = <&bmi3xx_data>; + + configs { + compatible = + "cros-ec,motionsense-sensor-config"; + ec-s0 { + odr = <(12500 | ROUND_UP_FLAG)>; + ec-rate = <100>; + }; + ec-s3 { + odr = <(12500 | ROUND_UP_FLAG)>; + }; + }; + }; + + base-gyro { + compatible = "cros-ec,bmi3xx-gyro"; + status = "okay"; + + active-mask = "SENSOR_ACTIVE_S0_S3"; + location = "MOTIONSENSE_LOC_BASE"; + mutex = <&mutex_bmi3xx>; + port = <&i2c_sensor>; + rot-standard-ref = <&base_rot_ref>; + drv-data = <&bmi3xx_data>; + }; + }; + + motionsense-sensor-info { + compatible = "cros-ec,motionsense-sensor-info"; + + /* + * list of GPIO interrupts that have to + * be enabled at initial stage + */ + sensor-irqs = <&int_accel_gyro>; + + /* list of sensors in force mode */ + accel-force-mode-sensors = <&lid_accel>; + }; +}; diff --git a/zephyr/program/myst/myst/project.conf b/zephyr/program/myst/myst/project.conf new file mode 100644 index 0000000000..e223c83db6 --- /dev/null +++ b/zephyr/program/myst/myst/project.conf @@ -0,0 +1,27 @@ +# 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. + +# Myst reference-board-specific Kconfig settings. +CONFIG_BOARD_MYST=y + +# CBI WP pin present +CONFIG_PLATFORM_EC_EEPROM_CBI_WP=y + +# Myst is capable of sinking 100W +CONFIG_PLATFORM_EC_PD_MAX_POWER_MW=100000 +CONFIG_PLATFORM_EC_PD_MAX_CURRENT_MA=5000 +CONFIG_PLATFORM_EC_PD_MAX_VOLTAGE_MV=20000 + +# Enable alternative charger chip +CONFIG_PLATFORM_EC_CHARGER_RUNTIME_CONFIG=y +CONFIG_PLATFORM_EC_CHARGER_ISL9241=y + +# Battery +CONFIG_PLATFORM_EC_BATTERY_PRESENT_GPIO=y + +# Disable BC12 +# CONFIG_PLATFORM_EC_USB_CHARGER=n + +# EC Host Commands +CONFIG_PLATFORM_EC_HOSTCMD_AP_RESET=y diff --git a/zephyr/program/myst/myst/project.overlay b/zephyr/program/myst/myst/project.overlay new file mode 100644 index 0000000000..1bdcd595c7 --- /dev/null +++ b/zephyr/program/myst/myst/project.overlay @@ -0,0 +1,209 @@ +/* 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. + */ + +/* Myst program common DTS includes */ +#include "../adc.dtsi" +#include "../fan.dtsi" +#include "../generated.dtsi" +#include "../gpio.dtsi" +#include "../i2c.dtsi" +#include "../interrupts.dtsi" +#include "../keyboard.dtsi" +#include "../usbc.dtsi" + +/* Myst project DTS includes*/ +#include "led_pins.dtsi" +#include "led_policy.dtsi" +#include "motionsense.dtsi" + +/* Myst overrides follow... */ +/ { + /* battery overrides */ + batteries { + default_battery: lgc_ap19b8m { + compatible = "lgc,ap19b8m", "battery-smart"; + }; + }; + + named-gpios { + /* Unimplemented */ + gpio_ec_entering_rw: ec_entering_rw { + enum-name = "GPIO_ENTERING_RW"; + }; + gpio-s5-pgood { + enum-name = "GPIO_S5_PGOOD"; + }; + pch-sys-prwok { + enum-name = "GPIO_PCH_SYS_PWROK"; + }; + }; + + named-temp-sensors { + compatible = "cros-ec,temp-sensors"; + soc-pct2075 { + temp_host_high = <100>; + temp_host_halt = <105>; + temp_host_release_high = <80>; + temp_host_release_halt = <80>; + temp_fan_off = <35>; + temp_fan_max = <70>; + power-good-pin = <&gpio_pg_pwr_s5>; + sensor = <&soc_pct2075>; + }; + amb-pct2075 { + power-good-pin = <&gpio_pg_pwr_s5>; + sensor = <&amb_pct2075>; + }; + }; + + /* + * Note this is expected to vary per-board, so we keep it in the overlay + * files. + */ + myst-fw-config { + compatible = "cros-ec,cbi-fw-config"; + + form-factor { + enum-name = "FW_FORM_FACTOR"; + start = <0>; + size = <1>; + + ff-clamshell { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FF_CLAMSHELL"; + value = <0>; + }; + ff-convertible { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FF_CONVERTIBLE"; + value = <1>; + default; + }; + }; + + fingerprint { + enum-name = "FW_FINGERPRINT"; + start = <1>; + size = <2>; + + fp-disabled { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FP_DISABLED"; + value = <0>; + default; + }; + fp-uart { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FP_UART"; + value = <1>; + }; + fp-spi { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FP_SPI"; + value = <2>; + }; + }; + + wlan { + enum-name = "FW_WLAN"; + start = <3>; + size = <2>; + + wlan-mt7922 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_WLAN_MT7922"; + value = <0>; + default; + }; + wlan-mt7925 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_WLAN_MT7925"; + value = <1>; + }; + }; + + wwan { + enum-name = "FW_WWAN"; + start = <5>; + size = <2>; + + wwan-disabled { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_WWAN_DISABLED"; + value = <0>; + default; + }; + wwan-fm101-gl { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_WWAN_FM101_GL"; + value = <1>; + }; + }; + + io-db { + enum-name = "FW_IO_DB"; + start = <7>; + size = <3>; + + io-db-none { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_IO_DB_NONE"; + value = <0>; + default; + }; + io-db-sku-a { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_IO_DB_SKU_A"; + value = <1>; + }; + io-db-sku-b { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_IO_DB_SKU_B"; + value = <2>; + }; + }; + + kb-bl { + enum-name = "FW_KB_BL"; + start = <10>; + size = <1>; + + kb-bl-disabled { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_BL_DISABLED"; + value = <0>; + default; + }; + kb-bl-enabled { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_BL_ENABLED"; + value = <1>; + }; + }; + }; + + /* Rotation matrices for motion sensors. */ + motionsense-rotation-ref { + compatible = "cros-ec,motionsense-rotation-ref"; + lid_rot_ref: lid-rotation-ref { + mat33 = <0 (-1) 0 + 1 0 0 + 0 0 1>; + }; + + lid_rot_ref1: lid-rotation-ref1 { + mat33 = <0 1 0 + (-1) 0 0 + 0 0 1>; + }; + + base_rot_ref: base-rotation-ref { + mat33 = <0 1 0 + (-1) 0 0 + 0 0 1>; + }; + }; + +}; diff --git a/zephyr/program/myst/myst/src/keyboard.c b/zephyr/program/myst/myst/src/keyboard.c new file mode 100644 index 0000000000..90e60fb0d7 --- /dev/null +++ b/zephyr/program/myst/myst/src/keyboard.c @@ -0,0 +1,29 @@ +/* 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 "ec_commands.h" + +static const struct ec_response_keybd_config myst_kb = { + .num_top_row_keys = 10, + .action_keys = { + TK_BACK, /* T1 */ + TK_REFRESH, /* T2 */ + TK_FULLSCREEN, /* T3 */ + TK_OVERVIEW, /* T4 */ + TK_SNAPSHOT, /* T5 */ + TK_BRIGHTNESS_DOWN, /* T6 */ + TK_BRIGHTNESS_UP, /* T7 */ + TK_VOL_MUTE, /* T8 */ + TK_VOL_DOWN, /* T9 */ + TK_VOL_UP, /* T10 */ + }, + .capabilities = KEYBD_CAP_SCRNLOCK_KEY, +}; + +__override const struct ec_response_keybd_config * +board_vivaldi_keybd_config(void) +{ + return &myst_kb; +} diff --git a/zephyr/program/myst/myst/src/ppc_config.c b/zephyr/program/myst/myst/src/ppc_config.c new file mode 100644 index 0000000000..a16e38a25d --- /dev/null +++ b/zephyr/program/myst/myst/src/ppc_config.c @@ -0,0 +1,29 @@ +/* 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. + */ + +/* Myst board-specific PPC code */ + +#include "driver/ppc/aoz1380_public.h" +#include "driver/ppc/nx20p348x.h" +#include "usbc_ppc.h" + +#include <zephyr/drivers/gpio.h> + +#define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ##args) +#define CPRINTFUSB(format, args...) cprintf(CC_USBCHARGE, format, ##args) + +void ppc_interrupt(enum gpio_signal signal) +{ + switch (signal) { + case GPIO_USB_C0_PPC_INT_ODL: + break; + + case GPIO_USB_C1_PPC_INT_ODL: + break; + + default: + break; + } +} diff --git a/zephyr/program/myst/program.conf b/zephyr/program/myst/program.conf new file mode 100644 index 0000000000..49d4cc00ad --- /dev/null +++ b/zephyr/program/myst/program.conf @@ -0,0 +1,145 @@ +# 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. + +CONFIG_CROS_EC=y +CONFIG_PLATFORM_EC=y +CONFIG_SHIMMED_TASKS=y +CONFIG_ESPI=y + +# Shell features +CONFIG_SHELL_HISTORY=y +CONFIG_SHELL_TAB=y +CONFIG_SHELL_TAB_AUTOCOMPLETION=y +CONFIG_KERNEL_SHELL=y + +# Power sequencing +CONFIG_AP=y +CONFIG_AP_X86_AMD=y +CONFIG_PLATFORM_EC_POWERSEQ=y +CONFIG_PLATFORM_EC_POWER_BUTTON_TO_PCH_CUSTOM=y +CONFIG_PLATFORM_EC_POWER_SLEEP_FAILURE_DETECTION=y +CONFIG_PLATFORM_EC_POWERSEQ_RSMRST_DELAY=y +CONFIG_PLATFORM_EC_POWERSEQ_S0IX=y +CONFIG_PLATFORM_EC_POWERSEQ_CPU_PROCHOT_ACTIVE_LOW=y +CONFIG_PLATFORM_EC_PORT80=y + +# Power button +CONFIG_PLATFORM_EC_POWER_BUTTON=y + +# CBI EEPROM support - to be removed in favor of CBI in EC +CONFIG_EEPROM=y +CONFIG_PLATFORM_EC_BOARD_VERSION_CBI=y +CONFIG_PLATFORM_EC_BYPASS_CBI_EEPROM_WP_CHECK=y + +# Temperature Sensors +CONFIG_PLATFORM_EC_AMD_SB_RMI=y +CONFIG_PLATFORM_EC_AMD_STT=y +CONFIG_PLATFORM_EC_THROTTLE_AP=y +# An external prochot can only be triggered by the charger +# and during on the fan would increase current draw and make it worse. +CONFIG_PLATFORM_EC_THROTTLE_AP_NO_FAN=y +CONFIG_PLATFORM_EC_THROTTLE_AP_SINGLE_PIN=y + +# External power +CONFIG_PLATFORM_EC_HOSTCMD=y +CONFIG_PLATFORM_EC_EXTPOWER_GPIO=y +CONFIG_PLATFORM_EC_BACKLIGHT_LID=y + +# Lid switch +CONFIG_PLATFORM_EC_LID_ANGLE=y +CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y +CONFIG_PLATFORM_EC_LID_SWITCH=y + +# Keyboard +CONFIG_PLATFORM_EC_KBLIGHT_ENABLE_PIN=y +CONFIG_PLATFORM_EC_KEYBOARD_COL2_INVERTED=y +CONFIG_PLATFORM_EC_VOLUME_BUTTONS=y +CONFIG_PLATFORM_EC_KEYBOARD_PWRBTN_ASSERTS_KSI3=y +CONFIG_PLATFORM_EC_KEYBOARD_REFRESH_ROW3=y + +# Syscon +CONFIG_SYSCON=y + +# Battery +CONFIG_PLATFORM_EC_BATTERY_FUEL_GAUGE=y +CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y +CONFIG_PLATFORM_EC_BATTERY_REVIVE_DISCONNECT=y + +# Charger +CONFIG_PLATFORM_EC_CHARGER_DISCHARGE_ON_AC=y +CONFIG_PLATFORM_EC_CHARGER_DEFAULT_CURRENT_LIMIT=512 +CONFIG_PLATFORM_EC_CHARGER_MIN_INPUT_CURRENT_LIMIT=512 +CONFIG_PLATFORM_EC_CHARGER_ISL9241=y +CONFIG_PLATFORM_EC_CHARGER_DUMP_PROCHOT=y +CONFIG_PLATFORM_EC_CHARGER_SENSE_RESISTOR=10 +CONFIG_PLATFORM_EC_CHARGER_SENSE_RESISTOR_AC=20 +CONFIG_PLATFORM_EC_CHARGER_MIN_POWER_MW_FOR_POWER_ON=50000 + +# USB-C +CONFIG_PLATFORM_EC_USB_PD_TCPM_PS8815=y +CONFIG_PLATFORM_EC_USBC_SS_MUX_DFP_ONLY=y +CONFIG_PLATFORM_EC_USB_MUX_RUNTIME_CONFIG=y +CONFIG_PLATFORM_EC_USB_DRP_ACC_TRYSRC=y +CONFIG_PLATFORM_EC_USB_PID=0x505F +CONFIG_PLATFORM_EC_USB_PD_5V_EN_CUSTOM=y +CONFIG_PLATFORM_EC_USB_PD_VBUS_DETECT_TCPC=y +CONFIG_PLATFORM_EC_USB_PD_DISCHARGE_TCPC=y +CONFIG_PLATFORM_EC_USB_PD_DP_HPD_GPIO=y +CONFIG_PLATFORM_EC_USB_PD_LOGGING=y +CONFIG_PLATFORM_EC_USB_PD_REV30=y +CONFIG_PLATFORM_EC_USB_PD_TBT_COMPAT_MODE=n +CONFIG_PLATFORM_EC_USB_PD_TCPC_LOW_POWER=y +CONFIG_PLATFORM_EC_USB_PD_TCPC_RUNTIME_CONFIG=n +CONFIG_PLATFORM_EC_USB_PD_USB4=n +CONFIG_PLATFORM_EC_USB_PD_VBUS_MEASURE_CHARGER=y + +# Disable FRS for bringup +CONFIG_PLATFORM_EC_USB_PD_FRS=n +CONFIG_PLATFORM_EC_USB_PD_FRS_TCPC=n + +# Temporary hack to enable bc12 driver +CONFIG_PLATFORM_EC_BC12_SINGLE_DRIVER=n + +# Give ourselves enough task space to use i2ctrace +CONFIG_TASK_PD_STACK_SIZE=1280 + +# Motion sense +CONFIG_PLATFORM_EC_ACCEL_FIFO=y +CONFIG_PLATFORM_EC_CONSOLE_CMD_ACCELS=y +CONFIG_PLATFORM_EC_CONSOLE_CMD_ACCEL_INFO=y +CONFIG_PLATFORM_EC_LID_ANGLE=y +CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y +CONFIG_PLATFORM_EC_SENSOR_TIGHT_TIMESTAMPS=y + +CONFIG_PLATFORM_EC_MKBP_EVENT=y +CONFIG_PLATFORM_EC_MKBP_INPUT_DEVICES=y +CONFIG_PLATFORM_EC_MKBP_USE_GPIO=y + +CONFIG_PLATFORM_EC_TABLET_MODE=y +CONFIG_PLATFORM_EC_TABLET_MODE_SWITCH=y +CONFIG_PLATFORM_EC_GMR_TABLET_MODE=y + +CONFIG_PLATFORM_EC_ACCEL_BMA4XX=y +CONFIG_PLATFORM_EC_ACCELGYRO_BMI3XX=y +CONFIG_PLATFORM_EC_ACCELGYRO_BMI_COMM_I2C=y + +# Misc. +CONFIG_PLATFORM_EC_AMD_STB_DUMP=y +CONFIG_PLATFORM_EC_I2C_DEBUG=y +CONFIG_PLATFORM_EC_PORT80_4_BYTE=y + +# System safe mode for improved panic debugging +CONFIG_PLATFORM_EC_SYSTEM_SAFE_MODE=y # 576 bytes + 56 bytes RAM + +# These are debug options that happen to be expensive in terms of flash space. +# Turn off as needed based on demand. +CONFIG_FLASH_PAGE_LAYOUT=y # 1876 bytes +CONFIG_FLASH_SHELL=y # 1852 bytes +CONFIG_PLATFORM_EC_CONSOLE_CMD_ACCEL_INFO=y # 656 bytes +CONFIG_PLATFORM_EC_CONSOLE_CMD_MEM=y # 896 bytes +CONFIG_PLATFORM_EC_CONSOLE_CMD_TCPC_DUMP=y # 1180 bytes +CONFIG_PLATFORM_EC_CONSOLE_CMD_PPC_DUMP=y +CONFIG_PLATFORM_EC_CONSOLE_CMD_USB_PD_CABLE=y # 1104 bytes +CONFIG_SHELL_HELP=y # 3432 bytes +CONFIG_THREAD_MONITOR=y # 1548 bytes diff --git a/zephyr/program/myst/src/common.c b/zephyr/program/myst/src/common.c new file mode 100644 index 0000000000..c78d28bdaa --- /dev/null +++ b/zephyr/program/myst/src/common.c @@ -0,0 +1,8 @@ +/* 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 <zephyr/logging/log.h> + +LOG_MODULE_REGISTER(myst, CONFIG_MYST_LOG_LEVEL); diff --git a/zephyr/program/myst/src/power_signals.c b/zephyr/program/myst/src/power_signals.c new file mode 100644 index 0000000000..83b27cf87e --- /dev/null +++ b/zephyr/program/myst/src/power_signals.c @@ -0,0 +1,215 @@ +/* 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 "ap_power/ap_power.h" +#include "charger.h" +#include "chipset.h" +#include "config.h" +#include "driver/amd_stb.h" +#include "gpio/gpio_int.h" +#include "gpio_signal.h" +#include "hooks.h" +#include "i2c.h" +#include "ioexpander.h" +#include "power.h" +#include "power/amd_x86.h" +#include "throttle_ap.h" +#include "timer.h" + +/* Power Signal Input List */ +/* TODO: b/218904113: Convert to using Zephyr GPIOs */ +const struct power_signal_info power_signal_list[] = { + [X86_SLP_S3_N] = { + .gpio = GPIO_PCH_SLP_S3_L, + .flags = POWER_SIGNAL_ACTIVE_HIGH, + .name = "SLP_S3_DEASSERTED", + }, + [X86_SLP_S5_N] = { + .gpio = GPIO_PCH_SLP_S5_L, + .flags = POWER_SIGNAL_ACTIVE_HIGH, + .name = "SLP_S5_DEASSERTED", + }, + [X86_S0_PGOOD] = { + .gpio = GPIO_S0_PGOOD, + .flags = POWER_SIGNAL_ACTIVE_HIGH, + .name = "S0_PGOOD", + }, +/* looks like we don't have this on Myst.. but POWER_SIGNAL_COUNT is needed */ + [X86_S5_PGOOD] = { + .gpio = GPIO_S5_PGOOD, + .flags = POWER_SIGNAL_ACTIVE_HIGH, + .name = "S5_PGOOD", + }, +}; +BUILD_ASSERT(ARRAY_SIZE(power_signal_list) == POWER_SIGNAL_COUNT); + +static void handle_prochot(bool asserted, void *data); + +const struct prochot_cfg prochot_cfg = { + .gpio_prochot_in = GPIO_CPU_PROCHOT, + .callback = handle_prochot, +}; + +/* Chipset hooks */ +static void baseboard_suspend_change(struct ap_power_ev_callback *cb, + struct ap_power_ev_data data) +{ + switch (data.event) { + default: + return; + + case AP_POWER_SUSPEND: + /* Disable display backlight and retimer */ + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_disable_disp_bl), + 1); + break; + + case AP_POWER_RESUME: + /* Enable retimer and display backlight */ + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_disable_disp_bl), + 0); + /* Any retimer tuning can be done after the retimer turns on */ + break; + } +} + +static void check_charger_prochot(void) +{ + print_charger_prochot(CHARGER_SOLO); +} +DECLARE_DEFERRED(check_charger_prochot); + +static void handle_prochot(bool asserted, void *data) +{ + if (asserted) { + ccprints("Prochot asserted externally"); + hook_call_deferred(&check_charger_prochot_data, 0); + } else + ccprints("Prochot deasserted externally"); +} + +static void baseboard_init(void) +{ + static struct ap_power_ev_callback cb; + + /* Setup a suspend/resume callback */ + ap_power_ev_init_callback(&cb, baseboard_suspend_change, + AP_POWER_RESUME | AP_POWER_SUSPEND); + ap_power_ev_add_callback(&cb); + /* Enable Power Group interrupts. */ + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_pg_groupc_s0)); + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_pg_lpddr_s3)); + + /* Enable thermtrip interrupt */ + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_soc_thermtrip)); + + /* Enable prochot interrupt */ + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_prochot)); + throttle_ap_config_prochot(&prochot_cfg); +} +DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_POST_I2C); + +/** + * b/275949288: On G3->S5, wait for RSMRST_L to be deasserted before asserting + * PCH_PWRBTN_L. This can be as long as ~65ms after cold boot. Then wait an + * additional delay of T1a defined in the EDS before changing the power button. + */ +#define RSMRST_WAIT_DELAY 65 +#define EDS_PWR_BTN_RSMRST_T1A_DELAY 16 +void board_pwrbtn_to_pch(int level) +{ + timestamp_t start; + + /* Add delay for G3 exit if asserting PWRBTN_L and RSMRST_L is low. */ + if (!level && + !gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_soc_rsmrst_l))) { + start = get_time(); + do { + usleep(500); + if (gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL( + gpio_ec_soc_rsmrst_l))) + break; + } while (time_since32(start) < (RSMRST_WAIT_DELAY * MSEC)); + + if (!gpio_pin_get_dt( + GPIO_DT_FROM_NODELABEL(gpio_ec_soc_rsmrst_l))) + ccprints("Error pwrbtn: RSMRST_L still low"); + + msleep(EDS_PWR_BTN_RSMRST_T1A_DELAY); + } + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_mech_pwr_btn_odl), + level); +} + +/* Note: signal parameter unused */ +void baseboard_set_soc_pwr_pgood(enum gpio_signal unused) +{ + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ec_soc_pwr_good), + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL( + gpio_pg_pcore_s0_r_od)) && + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL( + gpio_pg_groupc_s0_od))); +} + +void baseboard_s0_pgood(enum gpio_signal signal) +{ + baseboard_set_soc_pwr_pgood(signal); + + /* Chain off power signal interrupt handler for PG_PCORE_S0_R_OD */ + power_signal_interrupt(signal); +} + +/* Note: signal parameter unused */ +void baseboard_set_en_pwr_pcore(enum gpio_signal unused) +{ + /* + * EC must AND signals PG_LPDDR5_S3_OD, PG_GROUPC_S0_OD, and + * EN_PWR_S0_R + */ + gpio_pin_set_dt( + GPIO_DT_FROM_NODELABEL(gpio_pg_pcore_s0_r_od), + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_pg_lpddr5_s3_od)) && + gpio_pin_get_dt( + GPIO_DT_FROM_NODELABEL(gpio_pg_groupc_s0_od)) && + gpio_pin_get_dt( + GPIO_DT_FROM_NODELABEL(gpio_en_pwr_s0))); + + /* Update EC_SOC_PWR_GOOD based on our results */ + baseboard_set_soc_pwr_pgood(unused); +} + +void baseboard_en_pwr_s0(enum gpio_signal signal) +{ + /* EC must AND signals SLP_S3_L and PG_PWR_S5 */ + gpio_pin_set_dt( + GPIO_DT_FROM_NODELABEL(gpio_en_pwr_s0), + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_slp_s3_l)) && + gpio_pin_get_dt( + GPIO_DT_FROM_NODELABEL(gpio_pg_pwr_s5))); + + /* Change EN_PWR_PCORE_S0_R if needed*/ + baseboard_set_en_pwr_pcore(signal); + + /* Now chain off to the normal power signal interrupt handler. */ + power_signal_interrupt(signal); +} + +void baseboard_s5_pgood(enum gpio_signal signal) +{ + /* Continue to our signal AND-ing and power interrupt */ + baseboard_en_pwr_s0(signal); +} + +void baseboard_set_en_pwr_s3(enum gpio_signal signal) +{ + /* Chain off the normal power signal interrupt handler */ + power_signal_interrupt(signal); +} + +void baseboard_soc_thermtrip(enum gpio_signal signal) +{ + ccprints("SoC thermtrip reported, shutting down"); + chipset_force_shutdown(CHIPSET_SHUTDOWN_THERMAL); +} diff --git a/zephyr/program/myst/src/stt.c b/zephyr/program/myst/src/stt.c new file mode 100644 index 0000000000..f739155ee6 --- /dev/null +++ b/zephyr/program/myst/src/stt.c @@ -0,0 +1,39 @@ +/* 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. + */ + +/* Support code for STT temperature reporting */ + +#include "chipset.h" +#include "driver/temp_sensor/f75303.h" +#include "temp_sensor/pct2075.h" +#include "temp_sensor/temp_sensor.h" + +int board_get_soc_temp_mk(int *temp_mk) +{ + if (chipset_in_state(CHIPSET_STATE_HARD_OFF)) + return EC_ERROR_NOT_POWERED; + +#ifdef CONFIG_TEMP_SENSOR_PCT2075 + return pct2075_get_val_mk(PCT2075_SENSOR_ID(DT_NODELABEL(soc_pct2075)), + temp_mk); +#else + return f75303_get_val_mk(F75303_SENSOR_ID(DT_NODELABEL(soc_f75303)), + temp_mk); +#endif +} + +int board_get_ambient_temp_mk(int *temp_mk) +{ + if (chipset_in_state(CHIPSET_STATE_HARD_OFF)) + return EC_ERROR_NOT_POWERED; + +#ifdef CONFIG_TEMP_SENSOR_PCT2075 + return pct2075_get_val_mk(PCT2075_SENSOR_ID(DT_NODELABEL(amb_pct2075)), + temp_mk); +#else + return f75303_get_val_mk(F75303_SENSOR_ID(DT_NODELABEL(amb_f75303)), + temp_mk); +#endif +} diff --git a/zephyr/program/myst/src/usb_pd_policy.c b/zephyr/program/myst/src/usb_pd_policy.c new file mode 100644 index 0000000000..9e656e815f --- /dev/null +++ b/zephyr/program/myst/src/usb_pd_policy.c @@ -0,0 +1,79 @@ +/* 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. + */ + +/* Shared USB-C policy for Myst boards */ + +#include "charge_manager.h" +#include "chipset.h" +#include "common.h" +#include "compile_time_macros.h" +#include "console.h" +#include "ec_commands.h" +#include "ioexpander.h" +#include "system.h" +#include "usb_mux.h" +#include "usb_pd.h" +#include "usbc_ppc.h" +#include "util.h" + +#include <zephyr/drivers/gpio.h> + +int pd_check_vconn_swap(int port) +{ + /* + * Do not allow vconn swap 5V rail is off + * S5_PGOOD depends on PG_PP5000_S5 being asserted, + * so GPIO_S5_PGOOD is a reasonable proxy for PP5000_S5 + */ + return gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_pg_pwr_s5)); +} + +void pd_power_supply_reset(int port) +{ + /* Disable VBUS. */ + ppc_vbus_source_enable(port, 0); + + /* Enable discharge if we were previously sourcing 5V */ + if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE)) + pd_set_vbus_discharge(port, 1); + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); +} + +int pd_set_power_supply_ready(int port) +{ + int rv; + + /* Disable charging. */ + rv = ppc_vbus_sink_enable(port, 0); + if (rv) + return rv; + + if (IS_ENABLED(CONFIG_USB_PD_DISCHARGE)) + pd_set_vbus_discharge(port, 0); + + /* Provide Vbus. */ + rv = ppc_vbus_source_enable(port, 1); + if (rv) + return rv; + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); + + return EC_SUCCESS; +} + +/* Used by Vbus discharge common code with CONFIG_USB_PD_DISCHARGE */ +int board_vbus_source_enabled(int port) +{ + return tcpm_get_src_ctrl(port); +} + +/* Used by USB charger task with CONFIG_USB_PD_5V_EN_CUSTOM */ +int board_is_sourcing_vbus(int port) +{ + return board_vbus_source_enabled(port); +} diff --git a/zephyr/program/myst/src/usbc_config.c b/zephyr/program/myst/src/usbc_config.c new file mode 100644 index 0000000000..c3aafd9da9 --- /dev/null +++ b/zephyr/program/myst/src/usbc_config.c @@ -0,0 +1,162 @@ +/* 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. + */ + +/* Myst family-specific USB-C configuration */ + +#include "battery_fuel_gauge.h" +#include "charge_manager.h" +#include "charge_ramp.h" +#include "charge_state.h" +#include "charge_state_v2.h" +#include "charger.h" +#include "cros_board_info.h" +#include "cros_cbi.h" +#include "driver/charger/isl9241.h" +#include "driver/tcpm/rt1718s.h" +#include "driver/usb_mux/amd_fp6.h" +#include "gpio/gpio_int.h" +#include "hooks.h" +#include "power.h" +#include "usb_mux.h" +#include "usb_pd_tcpm.h" +#include "usbc/usb_muxes.h" +#include "usbc_ppc.h" + +#include <zephyr/drivers/gpio.h> + +#define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ##args) +#define CPRINTFUSB(format, args...) cprintf(CC_USBCHARGE, format, ##args) + +/* USB-A ports */ +enum usba_port { USBA_PORT_A0 = 0, USBA_PORT_A1, USBA_PORT_COUNT }; + +/* USB-C ports */ +enum usbc_port { USBC_PORT_C0 = 0, USBC_PORT_C1, USBC_PORT_COUNT }; +BUILD_ASSERT(USBC_PORT_COUNT == CONFIG_USB_PD_PORT_MAX_COUNT); + +static void usbc_interrupt_init(void) +{ + /* Enable PPC interrupts. */ + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_usb_c0_ppc)); + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_usb_c1_ppc)); + + /* Enable SBU fault interrupts */ + gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_usb_c0_c1_sbu_fault)); +} +DECLARE_HOOK(HOOK_INIT, usbc_interrupt_init, HOOK_PRIO_POST_I2C); + +int board_set_active_charge_port(int port) +{ + int is_valid_port = (port >= 0 && port < CONFIG_USB_PD_PORT_MAX_COUNT); + int i; + + if (port == CHARGE_PORT_NONE) { + CPRINTSUSB("Disabling all charger ports"); + + /* Disable all ports. */ + for (i = 0; i < ppc_cnt; i++) { + /* + * Do not return early if one fails otherwise we can + * get into a boot loop assertion failure. + */ + if (ppc_vbus_sink_enable(i, 0)) + CPRINTSUSB("Disabling C%d as sink failed.", i); + } + + return EC_SUCCESS; + } else if (!is_valid_port) { + return EC_ERROR_INVAL; + } + + /* Check if the port is sourcing VBUS. */ + if (tcpm_get_src_ctrl(port)) { + CPRINTSUSB("Skip enable C%d", port); + return EC_ERROR_INVAL; + } + + CPRINTSUSB("New charge port: C%d", port); + + /* + * Turn off the other ports' sink path FETs, before enabling the + * requested charge port. + */ + for (i = 0; i < ppc_cnt; i++) { + if (i == port) + continue; + + if (ppc_vbus_sink_enable(i, 0)) + CPRINTSUSB("C%d: sink path disable failed.", i); + } + + /* Enable requested charge port. */ + if (ppc_vbus_sink_enable(port, 1)) { + CPRINTSUSB("C%d: sink path enable failed.", port); + return EC_ERROR_UNKNOWN; + } + + return EC_SUCCESS; +} + +void sbu_fault_interrupt(enum gpio_signal signal) +{ + /* + * TODO: b/275609315 + * Determine if the fault happened on C0 or C1 + */ + int port = 0; + + CPRINTSUSB("C%d: SBU fault", port); + pd_handle_overcurrent(port); +} + +void usb_pd_soc_interrupt(enum gpio_signal signal) +{ + /* + * This interrupt is unexpected with our use of the SoC mux, so just log + * it as a point of interest. + */ + CPRINTSUSB("SOC PD Interrupt"); +} + +/* Round up 3250 max current to multiple of 128mA for ISL9241 AC prochot. */ +static void charger_prochot_init_isl9241(void) +{ + isl9241_set_ac_prochot(CHARGER_SOLO, CONFIG_AC_PROCHOT_CURRENT_MA); +} +DECLARE_HOOK(HOOK_INIT, charger_prochot_init_isl9241, HOOK_PRIO_DEFAULT); + +void board_reset_pd_mcu(void) +{ + /* No reset line for TCPC0 */ + /* No reset line for TCPC1 */ +} + +#define SAFE_RESET_VBUS_DELAY_MS 900 +#define SAFE_RESET_VBUS_MV 5000 +void board_hibernate(void) +{ + int port; + enum ec_error_list ret; + + /* + * If we are charging, then drop the Vbus level down to 5V to ensure + * that we don't get locked out of the 6.8V OVLO for our PPCs in + * dead-battery mode. This is needed when the TCPC/PPC rails go away. + * (b/79218851, b/143778351, b/147007265) + */ + port = charge_manager_get_active_charge_port(); + if (port != CHARGE_PORT_NONE) { + pd_request_source_voltage(port, SAFE_RESET_VBUS_MV); + + /* Give PD task and PPC chip time to get to 5V */ + msleep(SAFE_RESET_VBUS_DELAY_MS); + } + + /* Try to put our battery fuel gauge into sleep mode */ + ret = battery_sleep_fuel_gauge(); + if ((ret != EC_SUCCESS) && (ret != EC_ERROR_UNIMPLEMENTED)) + cprints(CC_SYSTEM, "Failed to send battery sleep command"); +} diff --git a/zephyr/program/myst/usbc.dtsi b/zephyr/program/myst/usbc.dtsi new file mode 100644 index 0000000000..8e8579d328 --- /dev/null +++ b/zephyr/program/myst/usbc.dtsi @@ -0,0 +1,35 @@ +/* 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. + */ + +/ { + usbc { + #address-cells = <1>; + #size-cells = <0>; + + usbc_port0: port0@0 { + compatible = "named-usbc-port"; + reg = <0>; + tcpc = <&tcpc_port0>; + chg = <&charger>; + ppc = <&ppc_port0>; + usb-mux-chain-0 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&amd_fp6_port0>; + }; + }; + + usbc_port1: port1@1 { + compatible = "named-usbc-port"; + reg = <1>; + bc12 = <&bc12_port1>; + tcpc = <&tcpc_port1>; + ppc = <&ppc_port1>; + usb-mux-chain-1-anx { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&amd_fp6_port1>; + }; + }; + }; +}; diff --git a/zephyr/program/nissa/BUILD.py b/zephyr/program/nissa/BUILD.py index 00e4322473..0a10912552 100644 --- a/zephyr/program/nissa/BUILD.py +++ b/zephyr/program/nissa/BUILD.py @@ -4,7 +4,8 @@ """Define zmake projects for nissa.""" -# Nivviks and Craask, Pujjo, Xivu, Xivur, Uldren has NPCX993F, Nereid and Joxer, Yaviks has ITE81302 +# Nivviks and Craask, Pujjo, Xivu, Xivur, Uldren has NPCX993F, Nereid +# and Joxer, Yaviks, Yavilla has ITE81302 def register_nissa_project( @@ -27,6 +28,7 @@ def register_nissa_project( here / f"{chip_kconfig}_program.conf", here / project_name / "project.conf", ], + inherited_from=["nissa"], ) @@ -102,6 +104,11 @@ yaviks = register_nissa_project( chip="it81302bx", ) +yavilla = register_nissa_project( + project_name="yavilla", + chip="it81302bx", +) + uldren = register_nissa_project( project_name="uldren", chip="npcx9m3f", diff --git a/zephyr/program/nissa/CMakeLists.txt b/zephyr/program/nissa/CMakeLists.txt index 0044b05e12..eaaa2ebee1 100644 --- a/zephyr/program/nissa/CMakeLists.txt +++ b/zephyr/program/nissa/CMakeLists.txt @@ -88,6 +88,18 @@ if(DEFINED CONFIG_BOARD_YAVIKS) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_CHARGER "yaviks/src/charger.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_FAN "yaviks/src/fan.c") endif() +if(DEFINED CONFIG_BOARD_YAVILLA) + project(yavilla) + zephyr_library_sources( + "yavilla/src/led.c" + "yavilla/src/keyboard.c" + "yavilla/src/board.c" + "yavilla/src/thermal.c" + ) + zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC "yavilla/src/usbc.c") + zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_CHARGER "yavilla/src/charger.c") + zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_FAN "yavilla/src/fan.c") +endif() if(DEFINED CONFIG_BOARD_XIVUR) project(xivur) zephyr_library_sources( diff --git a/zephyr/program/nissa/Kconfig b/zephyr/program/nissa/Kconfig index 6e23d0a569..5168a112ed 100644 --- a/zephyr/program/nissa/Kconfig +++ b/zephyr/program/nissa/Kconfig @@ -65,6 +65,12 @@ config BOARD_YAVIKS Build Google Yaviks board. Yaviks has Intel ADL-N SoC with IT81302 EC. +config BOARD_YAVILLA + bool "Google Yavilla Board" + help + Build Google Yavilla board. Yavilla has Intel ADL-N SoC + with IT81302 EC. + config BOARD_ULDREN bool "Google Uldren Board" help diff --git a/zephyr/program/nissa/src/sub_board.c b/zephyr/program/nissa/src/sub_board.c index 9c86c9422c..db6788de96 100644 --- a/zephyr/program/nissa/src/sub_board.c +++ b/zephyr/program/nissa/src/sub_board.c @@ -19,7 +19,6 @@ #include "usbc/usb_muxes.h" #include <zephyr/drivers/gpio.h> -#include <zephyr/drivers/pinctrl.h> #include <zephyr/init.h> #include <zephyr/kernel.h> #include <zephyr/sys/printk.h> @@ -39,55 +38,56 @@ __override uint8_t board_get_usb_pd_port_count(void) return cached_usb_pd_port_count; } +test_export_static enum nissa_sub_board_type nissa_cached_sub_board = + NISSA_SB_UNKNOWN; /* * Retrieve sub-board type from FW_CONFIG. */ enum nissa_sub_board_type nissa_get_sb_type(void) { - static enum nissa_sub_board_type sb = NISSA_SB_UNKNOWN; int ret; uint32_t val; /* * Return cached value. */ - if (sb != NISSA_SB_UNKNOWN) - return sb; + if (nissa_cached_sub_board != NISSA_SB_UNKNOWN) + return nissa_cached_sub_board; - sb = NISSA_SB_NONE; /* Defaults to none */ + nissa_cached_sub_board = NISSA_SB_NONE; /* Defaults to none */ ret = cros_cbi_get_fw_config(FW_SUB_BOARD, &val); if (ret != 0) { LOG_WRN("Error retrieving CBI FW_CONFIG field %d", FW_SUB_BOARD); - return sb; + return nissa_cached_sub_board; } switch (val) { default: LOG_WRN("No sub-board defined"); break; case FW_SUB_BOARD_1: - sb = NISSA_SB_C_A; + nissa_cached_sub_board = NISSA_SB_C_A; LOG_INF("SB: USB type C, USB type A"); break; case FW_SUB_BOARD_2: - sb = NISSA_SB_C_LTE; + nissa_cached_sub_board = NISSA_SB_C_LTE; LOG_INF("SB: USB type C, WWAN LTE"); break; case FW_SUB_BOARD_3: - sb = NISSA_SB_HDMI_A; + nissa_cached_sub_board = NISSA_SB_HDMI_A; LOG_INF("SB: HDMI, USB type A"); break; } - return sb; + return nissa_cached_sub_board; } /* * Initialise the USB PD port count, which * depends on which sub-board is attached. */ -static void board_usb_pd_count_init(void) +test_export_static void board_usb_pd_count_init(void) { switch (nissa_get_sb_type()) { default: @@ -181,6 +181,7 @@ __overridable void nissa_configure_hdmi_power_gpios(void) */ #define I2C4_NODE DT_NODELABEL(i2c4) #if DT_NODE_EXISTS(I2C4_NODE) +#include <zephyr/drivers/pinctrl.h> PINCTRL_DT_DEFINE(I2C4_NODE); /* disable i2c4 alternate function */ diff --git a/zephyr/program/nissa/uldren/overlay.dtsi b/zephyr/program/nissa/uldren/overlay.dtsi index ed1611eb58..7ea4ac8580 100644 --- a/zephyr/program/nissa/uldren/overlay.dtsi +++ b/zephyr/program/nissa/uldren/overlay.dtsi @@ -444,6 +444,6 @@ * after waking up automatically for better power consumption. */ &power_leakage_io { - leak-gpios = <&gpioa 4 0 - &gpiof 1 0>; + leak-gpios = <&gpioa 4 GPIO_OPEN_DRAIN + &gpiof 1 GPIO_OPEN_DRAIN>; }; diff --git a/zephyr/program/nissa/yavilla/cbi.dtsi b/zephyr/program/nissa/yavilla/cbi.dtsi new file mode 100644 index 0000000000..0d9d7a95c8 --- /dev/null +++ b/zephyr/program/nissa/yavilla/cbi.dtsi @@ -0,0 +1,100 @@ +/* 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. + */ + +/ { + /* Yavilla-specific fw_config fields. */ + nissa-fw-config { + compatible = "cros-ec,cbi-fw-config"; + /* + * FW_CONFIG field for multiple wi-fi SAR. + * + * start = <2>; + * size = <2>; + */ + + /* + * FW_CONFIG field to enable fan or not. + */ + fan { + enum-name = "FW_FAN"; + start = <4>; + size = <1>; + + no-fan { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FAN_NOT_PRESENT"; + value = <0>; + }; + fan-present { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_FAN_PRESENT"; + value = <1>; + /* + * Set as default so that unprovisioned + * configs will run the fan regardless. + */ + default; + }; + }; + + /* + * FW_CONFIG field to indicate which keyboard layout + * should be used. + */ + keyboard { + enum-name = "FW_KB_LAYOUT"; + start = <5>; + size = <1>; + + layout-1 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_LAYOUT_DEFAULT"; + value = <0>; + default; + }; + layout-2 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_LAYOUT_US2"; + value = <1>; + }; + }; + + /* + * FW_CONFIG field to indicate which keyboard layout + * should be used. + */ + keyboard-backlight { + enum-name = "FW_KB_BACKLIGHT"; + start = <6>; + size = <1>; + + without-keyboard-backlight { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_BACKLIGHT_OFF"; + value = <1>; + }; + with-keyboard-backlight { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_KB_BACKLIGHT_ON"; + value = <0>; + default; + }; + }; + + /* + * FW_CONFIG field for multiple touch panel. + * + * start = <7>; + * size = <2>; + */ + + /* + * FW_CONFIG field for multiple storage. + * + * start = <31>; + * size = <1>; + */ + }; +}; diff --git a/zephyr/program/nissa/yavilla/fan.dtsi b/zephyr/program/nissa/yavilla/fan.dtsi new file mode 100644 index 0000000000..6a3fc0288a --- /dev/null +++ b/zephyr/program/nissa/yavilla/fan.dtsi @@ -0,0 +1,71 @@ +/* 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. + */ +/ { + fans { + compatible = "cros-ec,fans"; + fan_0 { + pwms = <&pwm2 PWM_CHANNEL_2 PWM_KHZ(25) PWM_POLARITY_NORMAL>; + tach = <&tach1>; + rpm_min = <2500>; + rpm_start = <2500>; + rpm_max = <4100>; + rpm_deviation = <1>; + enable_gpio = <&gpio_fan_enable>; + }; + }; + fan_steps { + compatible = "cros-ec,fan-steps"; + level_0 { + temp_on = <43 47 0>; + temp_off = <99 99 99>; + rpm_target = <0>; + }; + level_1 { + temp_on = <46 48 0>; + temp_off = <40 45 99>; + rpm_target = <2600>; + }; + level_2 { + temp_on = <49 49 0>; + temp_off = <44 46 99>; + rpm_target = <2800>; + }; + level_3 { + temp_on = <53 50 54>; + temp_off = <47 47 51>; + rpm_target = <3100>; + }; + level_4 { + temp_on = <56 56 60>; + temp_off = <51 48 52>; + rpm_target = <3300>; + }; + level_5 { + temp_on = <60 60 64>; + temp_off = <54 52 56>; + rpm_target = <3600>; + }; + level_6 { + temp_on = <100 100 100>; + temp_off = <58 54 58>; + rpm_target = <4000>; + }; + }; +}; +/* pwm for fan */ +&pwm2 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C6>; + pinctrl-0 = <&pwm2_gpa2_default>; + pinctrl-names = "default"; +}; +/* fan tachometer sensor */ +&tach1 { + status = "okay"; + channel = <IT8XXX2_TACH_CHANNEL_A>; + pulses-per-round = <2>; + pinctrl-0 = <&tach1a_gpd7_default>; + pinctrl-names = "default"; +}; diff --git a/zephyr/program/nissa/yavilla/gpio.dtsi b/zephyr/program/nissa/yavilla/gpio.dtsi new file mode 100644 index 0000000000..d063b897d9 --- /dev/null +++ b/zephyr/program/nissa/yavilla/gpio.dtsi @@ -0,0 +1,242 @@ +/* + * 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. + */ + +/ { + + named-adc-channels { + compatible = "named-adc-channels"; + + adc_ec_vsense_pp1050_proc: ec_vsense_pp1050_proc { + enum-name = "ADC_PP1050_PROC"; + io-channels = <&adc0 14>; + }; + adc_ec_vsense_pp3300_s5: ec_vsense_pp3300_s5 { + enum-name = "ADC_PP3300_S5"; + io-channels = <&adc0 0>; + }; + adc_temp_sensor_1: temp_sensor_1 { + enum-name = "ADC_TEMP_SENSOR_1"; + io-channels = <&adc0 2>; + }; + adc_temp_sensor_2: temp_sensor_2 { + enum-name = "ADC_TEMP_SENSOR_2"; + io-channels = <&adc0 3>; + }; + adc_temp_sensor_3: temp_sensor_3 { + enum-name = "ADC_TEMP_SENSOR_3"; + io-channels = <&adc0 13>; + }; + }; + + named-gpios { + compatible = "named-gpios"; + + gpio_all_sys_pwrgd: all_sys_pwrgd { + gpios = <&gpiob 7 GPIO_INPUT>; + }; + gpio_ccd_mode_odl: ccd_mode_odl { + gpios = <&gpioh 5 GPIO_INPUT>; + enum-name = "GPIO_CCD_MODE_ODL"; + }; + gpio_cpu_c10_gate_l: cpu_c10_gate_l { + gpios = <&gpiog 1 GPIO_INPUT>; + }; + gpio_ec_battery_pres_odl: ec_battery_pres_odl { + gpios = <&gpioi 4 GPIO_INPUT>; + enum-name = "GPIO_BATT_PRES_ODL"; + }; + gpio_ec_cbi_wp: ec_cbi_wp { + gpios = <&gpioj 5 GPIO_OUTPUT>; + }; + gpio_ec_edp_bl_en_od: ec_edp_bl_en_od { + gpios = <&gpiok 4 GPIO_ODR_HIGH>; + enum-name = "GPIO_ENABLE_BACKLIGHT"; + }; + gpio_ec_entering_rw: ec_entering_rw { + gpios = <&gpioc 7 GPIO_OUTPUT>; + enum-name = "GPIO_ENTERING_RW"; + }; + gpio_ec_gsc_packet_mode: ec_gsc_packet_mode { + gpios = <&gpioh 1 GPIO_OUTPUT>; + enum-name = "GPIO_PACKET_MODE_EN"; + }; + gpio_ec_pch_wake_odl: ec_pch_wake_odl { + gpios = <&gpiob 2 GPIO_ODR_LOW>; + }; + gpio_ec_prochot_odl: ec_prochot_odl { + gpios = <&gpioi 1 (GPIO_ODR_HIGH | GPIO_VOLTAGE_1P8)>; + }; + gpio_ec_soc_dsw_pwrok: ec_soc_dsw_pwrok { + gpios = <&gpiol 7 GPIO_OUTPUT>; + no-auto-init; + }; + gpio_ec_soc_int_odl: ec_soc_int_odl { + gpios = <&gpiod 5 GPIO_ODR_HIGH>; + enum-name = "GPIO_EC_INT_L"; + }; + gpio_ec_soc_pch_pwrok_od: ec_soc_pch_pwrok_od { + gpios = <&gpiod 6 GPIO_ODR_HIGH>; + no-auto-init; + }; + gpio_ec_soc_pwr_btn_odl: ec_soc_pwr_btn_odl { + gpios = <&gpiob 6 GPIO_ODR_HIGH>; + enum-name = "GPIO_PCH_PWRBTN_L"; + }; + gpio_ec_soc_rsmrst_l: ec_soc_rsmrst_l { + gpios = <&gpioh 0 GPIO_OUTPUT>; + no-auto-init; + }; + gpio_ec_soc_rtcrst: ec_soc_rtcrst { + gpios = <&gpiok 2 GPIO_OUTPUT>; + }; + gpio_ec_soc_sys_pwrok: ec_soc_sys_pwrok { + gpios = <&gpiof 2 GPIO_OUTPUT>; + no-auto-init; + }; + gpio_ec_soc_vccst_pwrgd_od: ec_soc_vccst_pwrgd_od { + gpios = <&gpioe 5 GPIO_ODR_HIGH>; + no-auto-init; + }; + gpio_ec_wp_odl: ec_wp_odl { + gpios = <&gpioa 6 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + }; + gpio_en_pp3300_s5: en_pp3300_s5 { + gpios = <&gpioc 5 GPIO_OUTPUT>; + enum-name = "GPIO_TEMP_SENSOR_POWER"; + no-auto-init; + }; + gpio_en_pp5000_pen_x: en_pp5000_pen_x { + gpios = <&gpiob 5 GPIO_OUTPUT>; + }; + gpio_en_pp5000_s5: en_pp5000_s5 { + gpios = <&gpiok 5 GPIO_OUTPUT>; + no-auto-init; + }; + gpio_en_slp_z: en_slp_z { + gpios = <&gpiok 3 GPIO_OUTPUT>; + }; + gpio_en_usb_a0_vbus: en_usb_a0_vbus { + gpios = <&gpiol 6 GPIO_OUTPUT>; + }; + gpio_en_usb_a1_vbus: en_usb_a1_vbus { + gpios = <&gpiof 0 GPIO_OUTPUT>; + }; + gpio_en_usb_c0_cc1_vconn: en_usb_c0_cc1_vconn { + gpios = <&gpioh 4 GPIO_OUTPUT>; + }; + gpio_en_usb_c0_cc2_vconn: en_usb_c0_cc2_vconn { + gpios = <&gpioh 6 GPIO_OUTPUT>; + }; + gpio_gsc_ec_pwr_btn_odl: gsc_ec_pwr_btn_odl { + gpios = <&gpioe 2 GPIO_INPUT_PULL_UP>; + enum-name = "GPIO_POWER_BUTTON_L"; + }; + gpio_imvp91_vrrdy_od: imvp91_vrrdy_od { + gpios = <&gpioj 4 GPIO_INPUT>; + no-auto-init; + }; + gpio_lid_open: lid_open { + gpios = <&gpiof 3 GPIO_INPUT>; + enum-name = "GPIO_LID_OPEN"; + }; + gpio_pen_detect_odl: pen_detect_odl { + gpios = <&gpioj 1 GPIO_INPUT_PULL_UP>; + }; + gpio_pg_pp1050_mem_s3_od: pg_pp1050_mem_s3_od { + gpios = <&gpiod 3 GPIO_INPUT>; + }; + gpio_pg_pp5000_s5_od: pg_pp5000_s5_od { + gpios = <&gpioe 3 GPIO_INPUT>; + }; + gpio_rsmrst_pwrgd_l: rsmrst_pwrgd_l { + gpios = <&gpioe 1 GPIO_INPUT_PULL_UP>; + no-auto-init; + }; + gpio_slp_s0_l: slp_s0_l { + gpios = <&gpioe 4 GPIO_INPUT>; + no-auto-init; + }; + gpio_slp_s3_l: slp_s3_l { + gpios = <&gpioh 3 GPIO_INPUT>; + no-auto-init; + }; + gpio_slp_s4_l: slp_s4_l { + gpios = <&gpioi 5 GPIO_INPUT>; + }; + gpio_slp_sus_l: slp_sus_l { + gpios = <&gpiog 2 GPIO_INPUT>; + no-auto-init; + }; + gpio_sub_usb_a1_ilimit_sdp: sub_usb_a1_ilimit_sdp { + gpios = <&gpiof 1 GPIO_OUTPUT>; + enum-name = "GPIO_USB2_ILIM_SEL"; + }; + gpio_sys_rst_odl: sys_rst_odl { + gpios = <&gpiod 1 GPIO_ODR_HIGH>; + no-auto-init; + }; + gpio_usb_a0_ilimit_sdp: usb_a0_ilimit_sdp { + gpios = <&gpiol 5 GPIO_OUTPUT>; + enum-name = "GPIO_USB1_ILIM_SEL"; + }; + gpio_usb_c0_frs: usb_c0_frs { + gpios = <&gpioc 4 GPIO_OUTPUT>; + }; + gpio_usb_c0_int_odl: usb_c0_int_odl { + gpios = <&gpiok 0 GPIO_INPUT_PULL_UP>; + }; + gpio_usb_c1_int_odl: usb_c1_int_odl { + gpios = <&gpioe 6 GPIO_INPUT_PULL_UP>; + }; + gpio_vccin_aux_vid0: vccin_aux_vid0 { + gpios = <&gpiod 0 (GPIO_INPUT | GPIO_VOLTAGE_1P8)>; + }; + gpio_vccin_aux_vid1: vccin_aux_vid1 { + gpios = <&gpiok 1 (GPIO_INPUT | GPIO_VOLTAGE_1P8)>; + }; + gpio_c1_charger_led_white_l: c1_charger_led_white_l { + gpios = <&gpiol 4 GPIO_OUTPUT_HIGH>; + }; + gpio_c1_charger_led_amber_l: c1_charger_led_amber_l { + gpios = <&gpiod 4 GPIO_OUTPUT_HIGH>; + }; + gpio_c0_charger_led_white_l: c0_charger_led_white_l { + gpios = <&gpioc 3 GPIO_OUTPUT_HIGH>; + }; + gpio_c0_charger_led_amber_l: c0_charger_led_amber_l { + gpios = <&gpioj 7 GPIO_OUTPUT_HIGH>; + }; + gpio_ec_kso_02_inv: ec_kso_02_inv { + gpios = <&gpioksol 2 GPIO_OUTPUT_HIGH>; + enum-name = "GPIO_KBD_KSO2"; + }; + }; + + named-i2c-ports { + compatible = "named-i2c-ports"; + + i2c_ec_i2c_eeprom: ec_i2c_eeprom { + i2c-port = <&i2c0>; + enum-names = "I2C_PORT_EEPROM"; + }; + i2c_ec_i2c_batt: ec_i2c_batt { + i2c-port = <&i2c1>; + enum-names = "I2C_PORT_BATTERY"; + }; + i2c_ec_i2c_sensor: ec_i2c_sensor { + i2c-port = <&i2c2>; + enum-names = "I2C_PORT_SENSOR"; + }; + i2c_ec_i2c_sub_usb_c1: ec_i2c_sub_usb_c1 { + i2c-port = <&i2c4>; + enum-names = "I2C_PORT_USB_C1_TCPC"; + }; + i2c_ec_i2c_usb_c0: ec_i2c_usb_c0 { + i2c-port = <&i2c5>; + enum-names = "I2C_PORT_USB_C0_TCPC"; + }; + }; +}; diff --git a/zephyr/program/nissa/yavilla/keyboard.dtsi b/zephyr/program/nissa/yavilla/keyboard.dtsi new file mode 100644 index 0000000000..87d7d718fa --- /dev/null +++ b/zephyr/program/nissa/yavilla/keyboard.dtsi @@ -0,0 +1,72 @@ +/* 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. + */ + +/ { + kblight { + compatible = "cros-ec,kblight-pwm"; + /* + * Use 324 Hz so that 32Khz clock source is used, + * which is not gated in power saving mode. + */ + pwms = <&pwm0 0 PWM_HZ(324) PWM_POLARITY_NORMAL>; + }; +}; + +&pwm0 { + status = "okay"; + prescaler-cx = <PWM_PRESCALER_C4>; + pinctrl-0 = <&pwm0_gpa0_default>; + pinctrl-names = "default"; +}; + +&cros_kb_raw { + status = "okay"; + /* No KSO2 (it's inverted and implemented by GPIO) */ + pinctrl-0 = <&ksi0_default + &ksi1_default + &ksi2_default + &ksi3_default + &ksi4_default + &ksi5_default + &ksi6_default + &ksi7_default + &kso0_default + &kso1_default + &kso3_default + &kso4_default + &kso5_default + &kso6_default + &kso7_default + &kso8_default + &kso9_default + &kso10_default + &kso11_default + &kso12_default + &kso13_default + &kso14_default>; + pinctrl-1 = <&ksi0_sleep + &ksi1_sleep + &ksi2_sleep + &ksi3_sleep + &ksi4_sleep + &ksi5_sleep + &ksi6_sleep + &ksi7_sleep + &kso0_sleep + &kso1_sleep + &kso3_sleep + &kso4_sleep + &kso5_sleep + &kso6_sleep + &kso7_sleep + &kso8_sleep + &kso9_sleep + &kso10_sleep + &kso11_sleep + &kso12_sleep + &kso13_sleep + &kso14_sleep>; + pinctrl-names = "default", "sleep"; +}; diff --git a/zephyr/program/nissa/yavilla/overlay.dtsi b/zephyr/program/nissa/yavilla/overlay.dtsi new file mode 100644 index 0000000000..663b538953 --- /dev/null +++ b/zephyr/program/nissa/yavilla/overlay.dtsi @@ -0,0 +1,376 @@ +/* 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 <cros/thermistor/thermistor.dtsi> +#include <dt-bindings/usb_pd_tcpm.h> + +/ { + aliases { + gpio-cbi-wp = &gpio_ec_cbi_wp; + gpio-wp = &gpio_ec_wp_odl; + int-wp = &int_wp_l; + }; + + ec-console { + compatible = "ec-console"; + disabled = "events", "lpc", "hostcmd"; + }; + + batteries { + default_battery: cosmx { + compatible = "cosmx,gh02047xl", "battery-smart"; + }; + dynapack_atl_gh02047xl { + compatible = "dynapack,atl_gh02047xl", "battery-smart"; + }; + dynapack_cosmx_gh02047xl { + compatible = "dynapack,cosmx_gh02047xl", "battery-smart"; + }; + smp_coslight_gh02047xl { + compatible = "smp,coslight_gh02047xl", "battery-smart"; + }; + smp_highpower_gh02047xl { + compatible = "smp,highpower_gh02047xl", "battery-smart"; + }; + default_battery_3s:cosmx_si03058xl { + compatible = "cosmx,si03058xl", "battery-smart"; + }; + smp_highpower_si03058xl { + compatible = "smp,highpower_si03058xl", "battery-smart"; + }; + smp_si03054xl { + compatible = "smp,si03054xl", "battery-smart"; + }; + }; + + hibernate-wake-pins { + compatible = "cros-ec,hibernate-wake-pins"; + wakeup-irqs = < + &int_power_button + &int_lid_open + >; + }; + + gpio-interrupts { + compatible = "cros-ec,gpio-interrupts"; + + int_power_button: power_button { + irq-pin = <&gpio_gsc_ec_pwr_btn_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "power_button_interrupt"; + }; + int_wp_l: wp_l { + irq-pin = <&gpio_ec_wp_odl>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "switch_interrupt"; + }; + int_lid_open: lid_open { + irq-pin = <&gpio_lid_open>; + flags = <GPIO_INT_EDGE_BOTH>; + handler = "lid_interrupt"; + }; + int_usb_c0: usb_c0 { + irq-pin = <&gpio_usb_c0_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "usb_c0_interrupt"; + }; + int_usb_c1: usb_c1 { + irq-pin = <&gpio_usb_c1_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "usb_c1_interrupt"; + }; + }; + + unused-pins { + compatible = "unused-gpios"; + unused-gpios = <&gpioa 7 0>, + <&gpioc 0 0>, + <&gpioc 6 0>, + <&gpiod 7 0>, + <&gpioh 2 0>, + <&gpioi 6 0>, + <&gpioi 7 0>, + <&gpioj 0 0>, + <&gpioj 3 0>, + <&gpiok 7 GPIO_OUTPUT>; + }; + + named-gpios { + /* + * EC doesn't take any specific action on CC/SBU disconnect due to + * fault, but this definition is useful for hardware testing. + */ + gpio_usb_c0_prot_fault_odl: usb_c0_prot_fault_odl { + gpios = <&gpiok 6 GPIO_INPUT_PULL_UP>; + }; + gpio_fan_enable: fan-enable { + gpios = <&gpioa 1 GPIO_OUTPUT>; + no-auto-init; + }; + }; + + temp_cpu_thermistor: cpu { + compatible = "cros-ec,temp-sensor-thermistor"; + thermistor = <&thermistor_3V3_51K1_47K_4050B>; + adc = <&adc_temp_sensor_1>; + }; + temp_5v_regulator_thermistor: 5v-regulator { + compatible = "cros-ec,temp-sensor-thermistor"; + thermistor = <&thermistor_3V3_51K1_47K_4050B>; + adc = <&adc_temp_sensor_2>; + }; + temp_charger_thermistor: charger { + compatible = "cros-ec,temp-sensor-thermistor"; + thermistor = <&thermistor_3V3_51K1_47K_4050B>; + adc = <&adc_temp_sensor_3>; + }; + + named-temp-sensors { + compatible = "cros-ec,temp-sensors"; + temp_cpu: cpu { + temp_fan_off = <45>; + temp_fan_max = <60>; + temp_host_high = <75>; + temp_host_halt = <85>; + temp_host_release_high = <65>; + power-good-pin = <&gpio_ec_soc_dsw_pwrok>; + sensor = <&temp_cpu_thermistor>; + }; + temp_5v_regulator: 5v-regulator { + temp_fan_off = <50>; + temp_fan_max = <65>; + temp_host_high = <75>; + temp_host_halt = <85>; + temp_host_release_high = <65>; + power-good-pin = <&gpio_ec_soc_dsw_pwrok>; + sensor = <&temp_5v_regulator_thermistor>; + }; + temp_charger: charger { + temp_fan_off = <50>; + temp_fan_max = <65>; + temp_host_high = <80>; + temp_host_halt = <85>; + temp_host_release_high = <75>; + power-good-pin = <&gpio_ec_soc_dsw_pwrok>; + sensor = <&temp_charger_thermistor>; + }; + }; + + usba { + compatible = "cros-ec,usba-port-enable-pins"; + /* + * ILIM_SEL pins are referred to by legacy enum name, + * GPIO_USB*_ILIM_SEL. + */ + enable-pins = <&gpio_en_usb_a0_vbus &gpio_en_usb_a1_vbus>; + status = "okay"; + }; + + usbc { + #address-cells = <1>; + #size-cells = <0>; + + port0@0 { + compatible = "named-usbc-port"; + reg = <0>; + bc12 = <&bc12_port0>; + chg = <&chg_port0>; + tcpc = <&usbpd0>; + usb-mux-chain-0 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&virtual_mux_0>; + }; + }; + port0-muxes { + virtual_mux_0: virtual-mux-0 { + compatible = "cros-ec,usbc-mux-virtual"; + }; + }; + port1@1 { + compatible = "named-usbc-port"; + reg = <1>; + bc12 = <&bc12_port1>; + chg = <&chg_port1>; + tcpc = <&tcpc_port1>; + usb-mux-chain-1 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&virtual_mux_1 &tcpci_mux_1>; + }; + usb_mux_chain_1_no_mux: usb-mux-chain-1-no-mux { + compatible = "cros-ec,usb-mux-chain"; + alternative-chain; + usb-muxes = <&virtual_mux_1>; + }; + }; + port1-muxes { + virtual_mux_1: virtual-mux-1 { + compatible = "cros-ec,usbc-mux-virtual"; + }; + tcpci_mux_1: tcpci-mux-1 { + compatible = "parade,usbc-mux-ps8xxx"; + }; + }; + }; + + binman { + ec-rw { + size = <0x50000>; + rw-fw { + rw-fwid { + /* Fix the lcoation of the FWID to the + * last 32 bytes of the flash. This + * ensures the RW entries in the FMAP + * stored in the RO section of flash + * are always correct. + */ + offset = <(0x50000 - 32)>; + }; + }; + }; + pad-after = <0x50000>; + }; +}; + +&thermistor_3V3_51K1_47K_4050B { + status = "okay"; +}; + +&adc_ec_vsense_pp3300_s5 { + /* + * Voltage divider on input has 47k upper and 220k lower legs with 3 V + * full-scale reading on the ADC. Apply the largest possible multiplier + * (without overflowing int32) to get the best possible approximation + * of the actual ratio, but derate by a factor of two to ensure + * unexpectedly high values won't overflow. + */ + mul = <(715828 / 2)>; + div = <(589820 / 2)>; +}; + +&adc0 { + pinctrl-0 = <&adc0_ch0_gpi0_default + &adc0_ch2_gpi2_default + &adc0_ch3_gpi3_default + &adc0_ch13_gpl0_default + &adc0_ch14_gpl1_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&pinctrl { + i2c4_clk_gpe0_sleep: i2c4_clk_gpe0_sleep { + pinmuxs = <&pinctrle 0 IT8XXX2_ALT_DEFAULT>; + }; + i2c4_data_gpe7_sleep: i2c4_data_gpe7_sleep { + pinmuxs = <&pinctrle 7 IT8XXX2_ALT_DEFAULT>; + }; + i2c2_clk_gpf6_default: i2c2_clk_gpf6_default { + gpio-voltage = "1v8"; + }; + i2c2_data_gpf7_default: i2c2_data_gpf7_default { + gpio-voltage = "1v8"; + }; +}; + +&i2c0 { + label = "I2C_EEPROM"; + clock-frequency = <I2C_BITRATE_FAST>; + + cbi_eeprom: eeprom@50 { + compatible = "atmel,at24"; + reg = <0x50>; + label = "EEPROM_CBI"; + size = <2048>; + pagesize = <16>; + address-width = <8>; + timeout = <5>; + }; + pinctrl-0 = <&i2c0_clk_gpb3_default + &i2c0_data_gpb4_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&i2c1 { + label = "I2C_BATTERY"; + clock-frequency = <50000>; + pinctrl-0 = <&i2c1_clk_gpc1_default + &i2c1_data_gpc2_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&i2c2 { + label = "I2C_SENSOR"; + clock-frequency = <I2C_BITRATE_FAST>; + pinctrl-0 = <&i2c2_clk_gpf6_default + &i2c2_data_gpf7_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&i2c4 { + label = "I2C_SUB_C1_TCPC"; + clock-frequency = <I2C_BITRATE_FAST_PLUS>; + pinctrl-0 = <&i2c4_clk_gpe0_default + &i2c4_data_gpe7_default>; + pinctrl-1 = <&i2c4_clk_gpe0_sleep + &i2c4_data_gpe7_sleep>; + pinctrl-names = "default", "sleep"; + status = "okay"; + + bc12_port1: pi3usb9201@5f { + compatible = "pericom,pi3usb9201"; + status = "okay"; + reg = <0x5f>; + }; + + chg_port1: sm5803@32 { + compatible = "siliconmitus,sm5803"; + status = "okay"; + reg = <0x32>; + }; + + tcpc_port1: ps8745@b { + compatible = "parade,ps8xxx"; + reg = <0xb>; + tcpc-flags = <(TCPC_FLAGS_TCPCI_REV2_0)>; + }; +}; + +&i2c_ec_i2c_sub_usb_c1 { + /* + * Dynamic speed setting is used for AP-controlled firmware update + * of PS8745 TCPC/redriver: the AP lowers speed to 400 kHz in order + * to use more efficient window programming, then sets it back when + * done. + */ + dynamic-speed; +}; + +&i2c5 { + label = "I2C_USB_C0_TCPC"; + clock-frequency = <I2C_BITRATE_FAST_PLUS>; + pinctrl-0 = <&i2c5_clk_gpa4_default + &i2c5_data_gpa5_default>; + pinctrl-names = "default"; + status = "okay"; + + bc12_port0: pi3usb9201@5f { + compatible = "pericom,pi3usb9201"; + status = "okay"; + reg = <0x5f>; + }; + + chg_port0: sm5803@32 { + compatible = "siliconmitus,sm5803"; + status = "okay"; + reg = <0x32>; + }; +}; + +&usbpd0 { + status = "okay"; +}; diff --git a/zephyr/program/nissa/yavilla/power_signals.dtsi b/zephyr/program/nissa/yavilla/power_signals.dtsi new file mode 100644 index 0000000000..d64ac83150 --- /dev/null +++ b/zephyr/program/nissa/yavilla/power_signals.dtsi @@ -0,0 +1,180 @@ +/* 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. + */ + +/ { + chosen { + intel-ap-pwrseq,espi = &espi0; + }; + + common-pwrseq { + compatible = "intel,ap-pwrseq"; + + sys-pwrok-delay = <10>; + all-sys-pwrgd-timeout = <20>; + }; + + pwr-en-pp5000-s5 { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "PP5000_S5 enable output to regulator"; + enum-name = "PWR_EN_PP5000_A"; + gpios = <&gpiok 5 0>; + output; + }; + pwr-en-pp3300-s5 { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "PP3300_S5 enable output to LS"; + enum-name = "PWR_EN_PP3300_A"; + gpios = <&gpioc 5 0>; + output; + }; + pwr-pg-ec-rsmrst-odl { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "RSMRST power good from regulator"; + enum-name = "PWR_RSMRST"; + gpios = <&gpioe 1 0>; + interrupt-flags = <GPIO_INT_EDGE_BOTH>; + }; + pwr-ec-pch-rsmrst-odl { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "RSMRST output to PCH"; + enum-name = "PWR_EC_PCH_RSMRST"; + gpios = <&gpioh 0 0>; + output; + }; + pwr-slp-s0-l { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "SLP_S0_L input from PCH"; + enum-name = "PWR_SLP_S0"; + gpios = <&gpioe 4 GPIO_ACTIVE_LOW>; + interrupt-flags = <GPIO_INT_EDGE_BOTH>; + }; + pwr-slp-s3-l { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "SLP_S3_L input from PCH"; + enum-name = "PWR_SLP_S3"; + gpios = <&gpioh 3 GPIO_ACTIVE_LOW>; + interrupt-flags = <GPIO_INT_EDGE_BOTH>; + }; + pwr-slp-sus-l { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "SLP_SUS_L input from PCH"; + enum-name = "PWR_SLP_SUS"; + gpios = <&gpiog 2 GPIO_ACTIVE_LOW>; + interrupt-flags = <GPIO_INT_EDGE_BOTH>; + }; + pwr-ec-soc-dsw-pwrok { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "DSW_PWROK output to PCH"; + enum-name = "PWR_EC_SOC_DSW_PWROK"; + gpios = <&gpiol 7 0>; + output; + }; + pwr-vccst-pwrgd-od { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "VCCST_PWRGD output to PCH"; + enum-name = "PWR_VCCST_PWRGD"; + gpios = <&gpioe 5 (GPIO_OPEN_DRAIN | GPIO_VOLTAGE_1P8)>; + output; + }; + pwr-imvp9-vrrdy-od { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "VRRDY input from IMVP9"; + enum-name = "PWR_IMVP9_VRRDY"; + gpios = <&gpioj 4 0>; + }; + pwr-pch-pwrok { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "PCH_PWROK output to PCH"; + enum-name = "PWR_PCH_PWROK"; + gpios = <&gpiod 6 GPIO_OPEN_DRAIN>; + output; + }; + pwr-ec-pch-sys-pwrok { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "SYS_PWROK output to PCH"; + enum-name = "PWR_EC_PCH_SYS_PWROK"; + gpios = <&gpiof 2 0>; + output; + }; + pwr-sys-rst-l { + compatible = "intel,ap-pwrseq-gpio"; + dbg-label = "SYS_RESET# output to PCH"; + enum-name = "PWR_SYS_RST"; + gpios = <&gpiod 1 (GPIO_ACTIVE_LOW|GPIO_OPEN_DRAIN)>; + output; + }; + pwr-slp-s4 { + compatible = "intel,ap-pwrseq-vw"; + dbg-label = "SLP_S4 virtual wire input from PCH"; + enum-name = "PWR_SLP_S4"; + virtual-wire = "ESPI_VWIRE_SIGNAL_SLP_S4"; + vw-invert; + }; + pwr-slp-s5 { + compatible = "intel,ap-pwrseq-vw"; + dbg-label = "SLP_S5 virtual wire input from PCH"; + enum-name = "PWR_SLP_S5"; + virtual-wire = "ESPI_VWIRE_SIGNAL_SLP_S5"; + vw-invert; + }; + pwr-all-sys-pwrgd { + /* + * This is a board level signal, since this + * signal needs some special processing. + */ + compatible = "intel,ap-pwrseq-external"; + dbg-label = "Combined all power good"; + enum-name = "PWR_ALL_SYS_PWRGD"; + }; + pwr-adc-pp3300 { + compatible = "intel,ap-pwrseq-adc"; + dbg-label = "PP3300_PROC"; + enum-name = "PWR_DSW_PWROK"; + trigger-high = <&vcmp0>; + trigger-low = <&vcmp1>; + }; + pwr-adc-pp1p05 { + compatible = "intel,ap-pwrseq-adc"; + dbg-label = "PP1P05_PROC"; + enum-name = "PWR_PG_PP1P05"; + trigger-high = <&vcmp2>; + trigger-low = <&vcmp3>; + }; + +}; + +&vcmp0 { + status = "okay"; + scan-period = <IT8XXX2_VCMP_SCAN_PERIOD_600US>; + comparison = <IT8XXX2_VCMP_GREATER>; + /* + * This is 90% of nominal voltage considering voltage + * divider on ADC input. + */ + threshold-mv = <2448>; + io-channels = <&adc0 0>; +}; +&vcmp1 { + status = "okay"; + scan-period = <IT8XXX2_VCMP_SCAN_PERIOD_600US>; + comparison = <IT8XXX2_VCMP_LESS_OR_EQUAL>; + threshold-mv = <2448>; + io-channels = <&adc0 0>; +}; +&vcmp2 { + status = "okay"; + scan-period = <IT8XXX2_VCMP_SCAN_PERIOD_600US>; + comparison = <IT8XXX2_VCMP_GREATER>; + /* Setting at 90% of nominal voltage */ + threshold-mv = <945>; + io-channels = <&adc0 14>; +}; +&vcmp3 { + status = "okay"; + scan-period = <IT8XXX2_VCMP_SCAN_PERIOD_600US>; + comparison = <IT8XXX2_VCMP_LESS_OR_EQUAL>; + threshold-mv = <945>; + io-channels = <&adc0 14>; +}; diff --git a/zephyr/program/nissa/yavilla/project.conf b/zephyr/program/nissa/yavilla/project.conf new file mode 100644 index 0000000000..ac4fd6a3d2 --- /dev/null +++ b/zephyr/program/nissa/yavilla/project.conf @@ -0,0 +1,47 @@ +# 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. + +CONFIG_BOARD_YAVILLA=y + +# FW image +# TODO: Once this configuration is configured with binman's size property +# by default, it can be removed. +CONFIG_CROS_EC_RW_SIZE=0x50000 + +# Ensure recovery key combination (esc+refresh+power) is reliable: b/236580049 +CONFIG_PLATFORM_EC_KEYBOARD_PWRBTN_ASSERTS_KSI3=y +CONFIG_PLATFORM_EC_KEYBOARD_REFRESH_ROW3=y + +# Sensors: disabled; yavilla is clamshell-only +CONFIG_PLATFORM_EC_LID_ANGLE=n +CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=n +CONFIG_PLATFORM_EC_CONSOLE_CMD_ACCELS=n +CONFIG_PLATFORM_EC_CONSOLE_CMD_ACCEL_INFO=n +CONFIG_PLATFORM_EC_ACCEL_FIFO=n +CONFIG_PLATFORM_EC_SENSOR_TIGHT_TIMESTAMPS=n +CONFIG_PLATFORM_EC_GMR_TABLET_MODE=n +CONFIG_PLATFORM_EC_TABLET_MODE=n +CONFIG_PLATFORM_EC_TABLET_MODE_SWITCH=n +CONFIG_PLATFORM_EC_VOLUME_BUTTONS=n +CONFIG_PLATFORM_EC_MAX_SENSOR_FREQ_MILLIHZ=100000 + +# Keyboard +CONFIG_PLATFORM_EC_KEYBOARD_KEYPAD=y +CONFIG_PLATFORM_EC_KBLIGHT_ENABLE_PIN=n +CONFIG_PLATFORM_EC_KEYBOARD_FACTORY_TEST=y + +# Fan +CONFIG_PLATFORM_EC_CUSTOM_FAN_CONTROL=y + +# LED +CONFIG_PLATFORM_EC_LED_PWM=n + +CONFIG_NISSA_SUB_BOARD=n + +# Both ports use a SLGC55545 smart switch with CTL1..3 fixed high, +# for SDP2 or CDP only. +CONFIG_PLATFORM_EC_USB_PORT_POWER_SMART=y +CONFIG_PLATFORM_EC_USB_PORT_POWER_SMART_CDP_SDP_ONLY=y +CONFIG_PLATFORM_EC_USB_PORT_POWER_SMART_DEFAULT_CDP=y +CONFIG_PLATFORM_EC_USB_PORT_POWER_SMART_INVERTED=y diff --git a/zephyr/program/nissa/yavilla/project.overlay b/zephyr/program/nissa/yavilla/project.overlay new file mode 100644 index 0000000000..97f431022c --- /dev/null +++ b/zephyr/program/nissa/yavilla/project.overlay @@ -0,0 +1,13 @@ +/* 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 "../shi.dtsi" + +#include "cbi.dtsi" +#include "fan.dtsi" +#include "gpio.dtsi" +#include "keyboard.dtsi" +#include "overlay.dtsi" +#include "power_signals.dtsi" diff --git a/zephyr/program/nissa/yavilla/src/board.c b/zephyr/program/nissa/yavilla/src/board.c new file mode 100644 index 0000000000..f89b92ebd8 --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/board.c @@ -0,0 +1,31 @@ +/* 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. + */ +/* yavilla hardware configuration */ +#include "gpio/gpio_int.h" +#include "hooks.h" +#include "task.h" + +#include <zephyr/drivers/gpio.h> +#include <zephyr/drivers/pinctrl.h> +#include <zephyr/init.h> +#include <zephyr/kernel.h> +#include <zephyr/sys/printk.h> +LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); +__override uint8_t board_get_usb_pd_port_count(void) +{ + return 2; +} +/* + * Enable interrupts + */ +static void board_init(void) +{ + /* + * Enable USB-C interrupts. + */ + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_usb_c0)); + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_usb_c1)); +} +DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); diff --git a/zephyr/program/nissa/yavilla/src/charger.c b/zephyr/program/nissa/yavilla/src/charger.c new file mode 100644 index 0000000000..09484fb86a --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/charger.c @@ -0,0 +1,73 @@ +/* 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 "battery.h" +#include "battery_fuel_gauge.h" +#include "charger.h" +#include "console.h" +#include "driver/charger/sm5803.h" +#include "extpower.h" +#include "usb_pd.h" + +#include <zephyr/logging/log.h> + +LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); + +int extpower_is_present(void) +{ + int port; + int rv; + bool acok; + + for (port = 0; port < board_get_usb_pd_port_count(); port++) { + rv = sm5803_is_acok(port, &acok); + if ((rv == EC_SUCCESS) && acok) + return 1; + } + + return 0; +} + +/* + * Yavilla does not have a GPIO indicating whether extpower is present, + * so detect using the charger(s). + */ +__override void board_check_extpower(void) +{ + static int last_extpower_present; + int extpower_present = extpower_is_present(); + + if (last_extpower_present ^ extpower_present) + extpower_handle_update(extpower_present); + + last_extpower_present = extpower_present; +} + +__override void board_hibernate(void) +{ + /* Shut down the chargers */ + if (board_get_usb_pd_port_count() == 2) + sm5803_hibernate(CHARGER_SECONDARY); + sm5803_hibernate(CHARGER_PRIMARY); + LOG_INF("Charger(s) hibernated"); + cflush(); +} + +__override int board_get_default_battery_type(void) +{ + int type = DEFAULT_BATTERY_TYPE; + int cells; + + if (charger_get_battery_cells(CHARGER_PRIMARY, &cells) == EC_SUCCESS) { + if (cells == 3) + type = DEFAULT_BATTERY_TYPE_3S; + if (cells != 2 && cells != 3) + LOG_ERR("Unexpected number of cells"); + } else { + LOG_ERR("Failed to get default battery type"); + } + + return type; +} diff --git a/zephyr/program/nissa/yavilla/src/fan.c b/zephyr/program/nissa/yavilla/src/fan.c new file mode 100644 index 0000000000..07517abbe9 --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/fan.c @@ -0,0 +1,36 @@ +/* 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 "cros_cbi.h" +#include "fan.h" +#include "gpio/gpio.h" +#include "hooks.h" + +#include <zephyr/devicetree.h> +#include <zephyr/drivers/gpio.h> +#include <zephyr/logging/log.h> +LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); + +static void fan_init(void) +{ + int ret; + uint32_t val; + /* + * Retrieve the fan config. + */ + ret = cros_cbi_get_fw_config(FW_FAN, &val); + if (ret != 0) { + LOG_ERR("Error retrieving CBI FW_CONFIG field %d", FW_FAN); + return; + } + if (val != FW_FAN_PRESENT) { + /* Disable the fan */ + fan_set_count(0); + } else { + /* Configure the fan enable GPIO */ + gpio_pin_configure_dt(GPIO_DT_FROM_NODELABEL(gpio_fan_enable), + GPIO_OUTPUT); + } +} +DECLARE_HOOK(HOOK_INIT, fan_init, HOOK_PRIO_POST_FIRST); diff --git a/zephyr/program/nissa/yavilla/src/keyboard.c b/zephyr/program/nissa/yavilla/src/keyboard.c new file mode 100644 index 0000000000..93db22132f --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/keyboard.c @@ -0,0 +1,125 @@ +/* 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 "cros_cbi.h" +#include "ec_commands.h" +#include "gpio_it8xxx2.h" +#include "hooks.h" +#include "keyboard_8042_sharedlib.h" +#include "keyboard_scan.h" +#include "timer.h" + +#include <zephyr/logging/log.h> + +LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); + +/* Keyboard scan setting */ +__override struct keyboard_scan_config keyscan_config = { + /* Increase from 50 us, because KSO_02 passes through the H1. */ + .output_settle_us = 80, + /* Other values should be the same as the default configuration. */ + .debounce_down_us = 9 * MSEC, + .debounce_up_us = 30 * MSEC, + .scan_period_us = 3 * MSEC, + .min_post_scan_delay_us = 1000, + .poll_timeout_us = 100 * MSEC, + .actual_key_mask = { + 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0xff, 0xf6, 0x55, 0xfe, 0xff, 0xff, 0xff, /* full set */ + }, +}; + +static const struct ec_response_keybd_config yavilla_kb_w_kb_light = { + .num_top_row_keys = 13, + .action_keys = { + TK_BACK, /* T1 */ + TK_REFRESH, /* T2 */ + TK_FULLSCREEN, /* T3 */ + TK_OVERVIEW, /* T4 */ + TK_SNAPSHOT, /* T5 */ + TK_BRIGHTNESS_DOWN, /* T6 */ + TK_BRIGHTNESS_UP, /* T7 */ + TK_KBD_BKLIGHT_TOGGLE, /* T8 */ + TK_PLAY_PAUSE, /* T9 */ + TK_MICMUTE, /* T10 */ + TK_VOL_MUTE, /* T11 */ + TK_VOL_DOWN, /* T12 */ + TK_VOL_UP, /* T13 */ + }, + .capabilities = KEYBD_CAP_NUMERIC_KEYPAD, +}; + +static const struct ec_response_keybd_config yavilla_kb_wo_kb_light = { + .num_top_row_keys = 13, + .action_keys = { + TK_BACK, /* T1 */ + TK_REFRESH, /* T2 */ + TK_FULLSCREEN, /* T3 */ + TK_OVERVIEW, /* T4 */ + TK_SNAPSHOT, /* T5 */ + TK_BRIGHTNESS_DOWN, /* T6 */ + TK_BRIGHTNESS_UP, /* T7 */ + TK_PLAY_PAUSE, /* T8 */ + TK_MICMUTE, /* T9 */ + TK_VOL_MUTE, /* T10 */ + TK_VOL_DOWN, /* T11 */ + TK_VOL_UP, /* T12 */ + TK_MENU, /* T13 */ + }, + .capabilities = KEYBD_CAP_NUMERIC_KEYPAD, +}; + +__override const struct ec_response_keybd_config * +board_vivaldi_keybd_config(void) +{ + uint32_t val; + + cros_cbi_get_fw_config(FW_KB_BACKLIGHT, &val); + + if (val == FW_KB_BACKLIGHT_OFF) + return &yavilla_kb_wo_kb_light; + else + return &yavilla_kb_w_kb_light; +} + +/* + * Keyboard layout decided by FW config. + */ +static void kb_layout_init(void) +{ + int ret; + uint32_t val; + + ret = cros_cbi_get_fw_config(FW_KB_LAYOUT, &val); + if (ret != 0) { + LOG_ERR("Error retrieving CBI FW_CONFIG field %d", + FW_KB_LAYOUT); + return; + } + /* + * If keyboard is US2(FW_KB_LAYOUT_US2), we need translate right ctrl + * to backslash(\|) key. + */ + if (val == FW_KB_LAYOUT_US2) + set_scancode_set2(4, 0, get_scancode_set2(2, 7)); +} +DECLARE_HOOK(HOOK_INIT, kb_layout_init, HOOK_PRIO_POST_FIRST); + +/* + * Map keyboard connector pins to EC GPIO pins for factory test. + * Pins mapped to {-1, -1} are skipped. + * The connector has 30 pins total, and there is no pin 0. + */ +const int keyboard_factory_scan_pins[][2] = { + { -1, -1 }, { GPIO_KSOH, 4 }, { GPIO_KSOH, 0 }, { GPIO_KSOH, 1 }, + { GPIO_KSOH, 3 }, { GPIO_KSOH, 2 }, { -1, -1 }, { -1, -1 }, + { GPIO_KSOL, 5 }, { GPIO_KSOL, 6 }, { -1, -1 }, { GPIO_KSOL, 3 }, + { GPIO_KSOL, 2 }, { GPIO_KSI, 0 }, { GPIO_KSOL, 1 }, { GPIO_KSOL, 4 }, + { GPIO_KSI, 3 }, { GPIO_KSI, 2 }, { GPIO_KSOL, 0 }, { GPIO_KSI, 5 }, + { GPIO_KSI, 4 }, { GPIO_KSOL, 7 }, { GPIO_KSI, 6 }, { GPIO_KSI, 7 }, + { GPIO_KSI, 1 }, { -1, -1 }, { GPIO_KSOH, 5 }, { -1, -1 }, + { GPIO_KSOH, 6 }, { -1, -1 }, { -1, -1 }, +}; +const int keyboard_factory_scan_pins_used = + ARRAY_SIZE(keyboard_factory_scan_pins); diff --git a/zephyr/program/nissa/yavilla/src/led.c b/zephyr/program/nissa/yavilla/src/led.c new file mode 100644 index 0000000000..a1ae6b24cf --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/led.c @@ -0,0 +1,231 @@ +/* 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 "battery.h" +#include "charge_manager.h" +#include "charge_state.h" +#include "chipset.h" +#include "ec_commands.h" +#include "gpio.h" +#include "hooks.h" +#include "host_command.h" +#include "led_common.h" + +#include <stdint.h> + +#define BAT_LED_ON 0 +#define BAT_LED_OFF 1 + +#define BATT_LOW_BCT 10 + +#define LED_TICKS_PER_CYCLE 4 +#define LED_TICKS_PER_CYCLE_S3 4 +#define LED_ON_TICKS 2 +#define POWER_LED_ON_S3_TICKS 2 + +const enum ec_led_id supported_led_ids[] = { EC_LED_ID_LEFT_LED, + EC_LED_ID_RIGHT_LED }; + +const int supported_led_ids_count = ARRAY_SIZE(supported_led_ids); + +enum led_color { + LED_OFF = 0, + LED_AMBER, + LED_WHITE, + LED_COLOR_COUNT /* Number of colors, not a color itself */ +}; + +enum led_port { LEFT_PORT = 0, RIGHT_PORT }; + +static void led_set_color_battery(int port, enum led_color color) +{ + const struct gpio_dt_spec *amber_led, *white_led; + + if (port == LEFT_PORT) { + amber_led = GPIO_DT_FROM_NODELABEL(gpio_c0_charger_led_amber_l); + white_led = GPIO_DT_FROM_NODELABEL(gpio_c0_charger_led_white_l); + } else if (port == RIGHT_PORT) { + amber_led = GPIO_DT_FROM_NODELABEL(gpio_c1_charger_led_amber_l); + white_led = GPIO_DT_FROM_NODELABEL(gpio_c1_charger_led_white_l); + } + + switch (color) { + case LED_WHITE: + gpio_pin_set_dt(white_led, BAT_LED_ON); + gpio_pin_set_dt(amber_led, BAT_LED_OFF); + break; + case LED_AMBER: + gpio_pin_set_dt(white_led, BAT_LED_OFF); + gpio_pin_set_dt(amber_led, BAT_LED_ON); + break; + case LED_OFF: + gpio_pin_set_dt(white_led, BAT_LED_OFF); + gpio_pin_set_dt(amber_led, BAT_LED_OFF); + break; + default: + break; + } +} + +void led_get_brightness_range(enum ec_led_id led_id, uint8_t *brightness_range) +{ + switch (led_id) { + case EC_LED_ID_LEFT_LED: + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + break; + case EC_LED_ID_RIGHT_LED: + brightness_range[EC_LED_COLOR_WHITE] = 1; + brightness_range[EC_LED_COLOR_AMBER] = 1; + break; + default: + break; + } +} + +int led_set_brightness(enum ec_led_id led_id, const uint8_t *brightness) +{ + switch (led_id) { + case EC_LED_ID_LEFT_LED: + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color_battery(LEFT_PORT, LED_WHITE); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(LEFT_PORT, LED_AMBER); + else + led_set_color_battery(LEFT_PORT, LED_OFF); + break; + case EC_LED_ID_RIGHT_LED: + if (brightness[EC_LED_COLOR_WHITE] != 0) + led_set_color_battery(RIGHT_PORT, LED_WHITE); + else if (brightness[EC_LED_COLOR_AMBER] != 0) + led_set_color_battery(RIGHT_PORT, LED_AMBER); + else + led_set_color_battery(RIGHT_PORT, LED_OFF); + break; + default: + return EC_ERROR_PARAM1; + } + + return EC_SUCCESS; +} + +/* + * Set active charge port color to the parameter, turn off all others. + * If no port is active (-1), turn off all LEDs. + */ +static void set_active_port_color(enum led_color color) +{ + int port = charge_manager_get_active_charge_port(); + + if (led_auto_control_is_enabled(EC_LED_ID_RIGHT_LED)) + led_set_color_battery(RIGHT_PORT, + (port == RIGHT_PORT) ? color : LED_OFF); + if (led_auto_control_is_enabled(EC_LED_ID_LEFT_LED)) + led_set_color_battery(LEFT_PORT, + (port == LEFT_PORT) ? color : LED_OFF); +} + +static void led_set_battery(void) +{ + static unsigned int battery_ticks; + static int suspend_ticks; + + battery_ticks++; + + /* + * Override battery LEDs for Yavilla, Yavilla is non-power LED + * design, blinking both two side battery white LEDs to indicate + * system suspend with non-charging state. + */ + if (chipset_in_state(CHIPSET_STATE_ANY_SUSPEND) && + charge_get_state() != PWR_STATE_CHARGE) { + suspend_ticks++; + + led_set_color_battery(RIGHT_PORT, + suspend_ticks % LED_TICKS_PER_CYCLE_S3 < + POWER_LED_ON_S3_TICKS ? + LED_WHITE : + LED_OFF); + led_set_color_battery(LEFT_PORT, + suspend_ticks % LED_TICKS_PER_CYCLE_S3 < + POWER_LED_ON_S3_TICKS ? + LED_WHITE : + LED_OFF); + return; + } + + suspend_ticks = 0; + + switch (charge_get_state()) { + case PWR_STATE_CHARGE: + /* Always indicate when charging, even in suspend. */ + set_active_port_color(LED_AMBER); + break; + case PWR_STATE_DISCHARGE: + /* + * Blinking amber LEDs slowly if battery is lower 10 + * percentage. + */ + if (led_auto_control_is_enabled(EC_LED_ID_RIGHT_LED)) { + if (charge_get_percent() < BATT_LOW_BCT) + led_set_color_battery( + RIGHT_PORT, + (battery_ticks % LED_TICKS_PER_CYCLE < + LED_ON_TICKS) ? + LED_AMBER : + LED_OFF); + else + led_set_color_battery(RIGHT_PORT, LED_OFF); + } + + if (led_auto_control_is_enabled(EC_LED_ID_LEFT_LED)) { + if (charge_get_percent() < BATT_LOW_BCT) + led_set_color_battery( + LEFT_PORT, + (battery_ticks % LED_TICKS_PER_CYCLE < + LED_ON_TICKS) ? + LED_AMBER : + LED_OFF); + else + led_set_color_battery(LEFT_PORT, LED_OFF); + } + break; + case PWR_STATE_ERROR: + if (led_auto_control_is_enabled(EC_LED_ID_RIGHT_LED)) { + led_set_color_battery( + RIGHT_PORT, + (battery_ticks & 0x1) ? LED_AMBER : LED_OFF); + } + + if (led_auto_control_is_enabled(EC_LED_ID_LEFT_LED)) { + led_set_color_battery(LEFT_PORT, (battery_ticks & 0x1) ? + LED_AMBER : + LED_OFF); + } + break; + case PWR_STATE_CHARGE_NEAR_FULL: + set_active_port_color(LED_WHITE); + break; + case PWR_STATE_IDLE: /* External power connected in IDLE */ + set_active_port_color(LED_WHITE); + break; + case PWR_STATE_FORCED_IDLE: + set_active_port_color( + (battery_ticks % LED_TICKS_PER_CYCLE < LED_ON_TICKS) ? + LED_AMBER : + LED_OFF); + break; + default: + /* Other states don't alter LED behavior */ + break; + } +} + +/* Called by hook task every TICK(IT83xx 500ms) */ +static void led_tick(void) +{ + led_set_battery(); +} +DECLARE_HOOK(HOOK_TICK, led_tick, HOOK_PRIO_DEFAULT); diff --git a/zephyr/program/nissa/yavilla/src/thermal.c b/zephyr/program/nissa/yavilla/src/thermal.c new file mode 100644 index 0000000000..b2e4796837 --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/thermal.c @@ -0,0 +1,108 @@ +/* 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 "common.h" +#include "fan.h" +#include "temp_sensor/temp_sensor.h" +#include "thermal.h" +#include "util.h" + +#include <ap_power/ap_power_interface.h> + +#define TEMP_CPU TEMP_SENSOR_ID(DT_NODELABEL(temp_cpu)) +#define TEMP_5V TEMP_SENSOR_ID(DT_NODELABEL(temp_5v_regulator)) +#define TEMP_CHARGER TEMP_SENSOR_ID(DT_NODELABEL(temp_charger)) + +struct fan_step { + /* + * Sensor 1~3 trigger point, set -1 if we're not using this + * sensor to determine fan speed. + */ + int8_t on[TEMP_SENSOR_COUNT]; + /* + * Sensor 1~3 trigger point, set -1 if we're not using this + * sensor to determine fan speed. + */ + int8_t off[TEMP_SENSOR_COUNT]; + /* Fan rpm */ + uint16_t rpm[FAN_CH_COUNT]; +}; + +#define FAN_TABLE_ENTRY(nd) \ + { \ + .on = DT_PROP(nd, temp_on), \ + .off = DT_PROP(nd, temp_off), \ + .rpm = DT_PROP(nd, rpm_target), \ + }, + +static const struct fan_step fan_step_table[] = { DT_FOREACH_CHILD( + DT_INST(0, cros_ec_fan_steps), FAN_TABLE_ENTRY) }; + +int fan_table_to_rpm(int fan, int *temp) +{ + /* current fan level */ + static int current_level; + /* previous sensor temperature */ + static int prev_tmp[TEMP_SENSOR_COUNT]; + int i; + /* + * Compare the current and previous temperature, we have + * the three paths : + * 1. decreasing path. (check the release point) + * 2. increasing path. (check the trigger point) + * 3. invariant path. (return the current RPM) + * + * Yavilla thermal table V1-1 + * Increase path judgment: CPU || (5V && Charger) + * Decrease path judgment: CPU && 5V && Charger + */ + if (temp[TEMP_CPU] < prev_tmp[TEMP_CPU] || + temp[TEMP_5V] < prev_tmp[TEMP_5V] || + temp[TEMP_CHARGER] < prev_tmp[TEMP_CHARGER]) { + for (i = current_level; i > 0; i--) { + if (temp[TEMP_CPU] < fan_step_table[i].off[TEMP_CPU] && + temp[TEMP_5V] < fan_step_table[i].off[TEMP_5V] && + temp[TEMP_CHARGER] < + fan_step_table[i].off[TEMP_CHARGER]) { + current_level = i - 1; + } else + break; + } + } else if (temp[TEMP_CPU] > prev_tmp[TEMP_CPU] || + temp[TEMP_5V] > prev_tmp[TEMP_5V] || + temp[TEMP_CHARGER] > prev_tmp[TEMP_CHARGER]) { + for (i = current_level; i < ARRAY_SIZE(fan_step_table); i++) { + if (temp[TEMP_CPU] > fan_step_table[i].on[TEMP_CPU] || + (temp[TEMP_5V] > fan_step_table[i].on[TEMP_5V] && + temp[TEMP_CHARGER] > + fan_step_table[i].on[TEMP_CHARGER])) { + current_level = i + 1; + } else + break; + } + } + if (current_level < 0) + current_level = 0; + + if (current_level >= ARRAY_SIZE(fan_step_table)) + current_level = ARRAY_SIZE(fan_step_table) - 1; + + for (i = 0; i < TEMP_SENSOR_COUNT; ++i) + prev_tmp[i] = temp[i]; + + return fan_step_table[current_level].rpm[fan]; +} + +void board_override_fan_control(int fan, int *temp) +{ + /* + * In common/fan.c pwm_fan_stop() will turn off fan + * when chipset suspend or shutdown. + */ + if (ap_power_in_state(AP_POWER_STATE_ON)) { + fan_set_rpm_mode(fan, 1); + fan_set_rpm_target(fan, fan_table_to_rpm(fan, temp)); + } +} diff --git a/zephyr/program/nissa/yavilla/src/usbc.c b/zephyr/program/nissa/yavilla/src/usbc.c new file mode 100644 index 0000000000..fa280615ee --- /dev/null +++ b/zephyr/program/nissa/yavilla/src/usbc.c @@ -0,0 +1,328 @@ +/* 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 "charge_state_v2.h" +#include "chipset.h" +#include "driver/charger/sm5803.h" +#include "driver/tcpm/it83xx_pd.h" +#include "driver/tcpm/ps8xxx_public.h" +#include "driver/tcpm/tcpci.h" +#include "hooks.h" +#include "system.h" +#include "usb_mux.h" + +#include <zephyr/logging/log.h> + +#include <ap_power/ap_power.h> + +LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); + +/* Vconn control for integrated ITE TCPC */ +void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled) +{ + /* Vconn control is only for port 0 */ + if (port) + return; + + if (cc_pin == USBPD_CC_PIN_1) + gpio_pin_set_dt( + GPIO_DT_FROM_NODELABEL(gpio_en_usb_c0_cc1_vconn), + !!enabled); + else + gpio_pin_set_dt( + GPIO_DT_FROM_NODELABEL(gpio_en_usb_c0_cc2_vconn), + !!enabled); +} + +__override bool pd_check_vbus_level(int port, enum vbus_level level) +{ + return sm5803_check_vbus_level(port, level); +} + +/* + * Putting chargers into LPM when in suspend reduces power draw by about 8mW + * per charger, but also seems critical to correct operation in source mode: + * if chargers are not in LPM when a sink is first connected, VBUS sourcing + * works even if the partner is later removed (causing LPM entry) and + * reconnected (causing LPM exit). If in LPM initially, sourcing VBUS + * consistently causes the charger to report (apparently spurious) overcurrent + * failures. + * + * In short, this is important to making things work correctly but we don't + * understand why. + */ +static void board_chargers_suspend(struct ap_power_ev_callback *const cb, + const struct ap_power_ev_data data) +{ + void (*fn)(int chgnum); + + switch (data.event) { + case AP_POWER_SUSPEND: + fn = sm5803_enable_low_power_mode; + break; + case AP_POWER_RESUME: + fn = sm5803_disable_low_power_mode; + break; + default: + LOG_WRN("%s: power event %d is not recognized", __func__, + data.event); + return; + } + + fn(CHARGER_PRIMARY); + if (board_get_charger_chip_count() > 1) + fn(CHARGER_SECONDARY); +} + +static int board_chargers_suspend_init(const struct device *unused) +{ + static struct ap_power_ev_callback cb = { + .handler = board_chargers_suspend, + .events = AP_POWER_SUSPEND | AP_POWER_RESUME, + }; + ap_power_ev_add_callback(&cb); + return 0; +} +SYS_INIT(board_chargers_suspend_init, APPLICATION, 0); + +int board_set_active_charge_port(int port) +{ + int is_real_port = (port >= 0 && port < board_get_usb_pd_port_count()); + int i; + int old_port; + int rv; + + if (!is_real_port && port != CHARGE_PORT_NONE) + return EC_ERROR_INVAL; + + old_port = charge_manager_get_active_charge_port(); + LOG_INF("Charge update: p%d -> p%d", old_port, port); + + /* Check if port is sourcing VBUS. */ + if (port != CHARGE_PORT_NONE && charger_is_sourcing_otg_power(port)) { + LOG_WRN("Skip enable p%d: already sourcing", port); + return EC_ERROR_INVAL; + } + + /* Disable sinking on all ports except the desired one */ + for (i = 0; i < board_get_usb_pd_port_count(); i++) { + if (i == port) + continue; + + if (sm5803_vbus_sink_enable(i, 0)) + /* + * Do not early-return because this can fail during + * power-on which would put us into a loop. + */ + LOG_WRN("p%d: sink path disable failed.", i); + } + + /* Don't enable anything (stop here) if no ports were requested */ + if ((port == CHARGE_PORT_NONE) || (old_port == port)) + return EC_SUCCESS; + + /* + * Stop the charger IC from switching while changing ports. Otherwise, + * we can overcurrent the adapter we're switching to. (crbug.com/926056) + */ + if (old_port != CHARGE_PORT_NONE) + charger_discharge_on_ac(1); + + /* Enable requested charge port. */ + rv = sm5803_vbus_sink_enable(port, 1); + if (rv) + LOG_WRN("p%d: sink path enable failed: code %d", port, rv); + + /* Allow the charger IC to begin/continue switching. */ + charger_discharge_on_ac(0); + + return rv; +} + +uint16_t tcpc_get_alert_status(void) +{ + /* + * TCPC 0 is embedded in the EC and processes interrupts in the chip + * code (it83xx/intc.c). This function only needs to poll port C1 if + * present. + */ + uint16_t status = 0; + int regval; + + /* Is the C1 port IRQ line asserted? */ + if (!gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_usb_c1_int_odl))) { + /* + * C1 IRQ is shared between BC1.2 and TCPC; poll TCPC to see if + * it asserted the IRQ. + */ + if (!tcpc_read16(1, TCPC_REG_ALERT, ®val)) { + if (regval) + status = PD_STATUS_TCPC_ALERT_1; + } + } + + return status; +} + +void pd_power_supply_reset(int port) +{ + int prev_en; + + if (port < 0 || port >= board_get_usb_pd_port_count()) + return; + + prev_en = charger_is_sourcing_otg_power(port); + + /* Disable Vbus */ + charger_enable_otg_power(port, 0); + + /* Discharge Vbus if previously enabled */ + if (prev_en) + sm5803_set_vbus_disch(port, 1); + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); +} + +int pd_set_power_supply_ready(int port) +{ + enum ec_error_list rv; + + if (port < 0 || port > board_get_usb_pd_port_count()) { + LOG_WRN("Port C%d does not exist, cannot enable VBUS", port); + return EC_ERROR_INVAL; + } + + /* Disable sinking */ + rv = sm5803_vbus_sink_enable(port, 0); + if (rv) { + LOG_WRN("C%d failed to disable sinking: %d", port, rv); + return rv; + } + + /* Disable Vbus discharge */ + rv = sm5803_set_vbus_disch(port, 0); + if (rv) { + LOG_WRN("C%d failed to clear VBUS discharge: %d", port, rv); + return rv; + } + + /* Provide Vbus */ + rv = charger_enable_otg_power(port, 1); + if (rv) { + LOG_WRN("C%d failed to enable VBUS sourcing: %d", port, rv); + return rv; + } + + /* Notify host of power info change. */ + pd_send_host_event(PD_EVENT_POWER_CHANGE); + + return EC_SUCCESS; +} + +__override void typec_set_source_current_limit(int port, enum tcpc_rp_value rp) +{ + int rv; + const int current = rp == TYPEC_RP_3A0 ? 3000 : 1500; + + rv = charger_set_otg_current_voltage(port, current, 5000); + if (rv != EC_SUCCESS) { + LOG_WRN("Failed to set source ilimit on port %d to %d: %d", + port, current, rv); + } +} + +void board_reset_pd_mcu(void) +{ + /* + * Do nothing. The integrated TCPC for C0 lacks a dedicated reset + * command, and C1 (if present) doesn't have a reset pin connected + * to the EC. + */ +} + +#define INT_RECHECK_US 5000 + +/* C0 interrupt line shared by BC 1.2 and charger */ + +static void check_c0_line(void); +DECLARE_DEFERRED(check_c0_line); + +static void notify_c0_chips(void) +{ + usb_charger_task_set_event(0, USB_CHG_EVENT_BC12); + sm5803_interrupt(0); +} + +static void check_c0_line(void) +{ + /* + * If line is still being held low, see if there's more to process from + * one of the chips + */ + if (!gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_usb_c0_int_odl))) { + notify_c0_chips(); + hook_call_deferred(&check_c0_line_data, INT_RECHECK_US); + } +} + +void usb_c0_interrupt(enum gpio_signal s) +{ + /* Cancel any previous calls to check the interrupt line */ + hook_call_deferred(&check_c0_line_data, -1); + + /* Notify all chips using this line that an interrupt came in */ + notify_c0_chips(); + + /* Check the line again in 5ms */ + hook_call_deferred(&check_c0_line_data, INT_RECHECK_US); +} + +/* C1 interrupt line shared by BC 1.2, TCPC, and charger */ +void usb_c1_interrupt(enum gpio_signal s) +{ + /* Charger and BC1.2 are handled in board_process_pd_alert */ + schedule_deferred_pd_interrupt(1); +} + +/* + * Handle charger interrupts in the PD task. Not doing so can lead to a priority + * inversion where we fail to respond to TCPC alerts quickly enough because we + * don't get another edge on a shared IRQ until the other interrupt is cleared + * (or the IRQ is polled again), which happens in lower-priority tasks: the + * high-priority type-C handler is thus blocked on the lower-priority one(s). + * + * To avoid that, we run charger and BC1.2 interrupts synchronously alongside + * PD interrupts so they have the same priority. + */ +void board_process_pd_alert(int port) +{ + /* + * Port 0 doesn't use an external TCPC, so its interrupts don't need + * this special handling. + */ + if (port != 1) + return; + + if (!gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_usb_c1_int_odl))) { + sm5803_handle_interrupt(port); + usb_charger_task_set_event_sync(1, USB_CHG_EVENT_BC12); + } + /* + * Immediately schedule another TCPC interrupt if it seems we haven't + * cleared all pending interrupts. + */ + if (!gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_usb_c1_int_odl))) + schedule_deferred_pd_interrupt(port); +} + +int pd_snk_is_vbus_provided(int port) +{ + int chg_det = 0; + + sm5803_get_chg_det(port, &chg_det); + + return chg_det; +} diff --git a/zephyr/program/nissa/yavilla/yavilla_vif.xml b/zephyr/program/nissa/yavilla/yavilla_vif.xml new file mode 100644 index 0000000000..0df6a844b7 --- /dev/null +++ b/zephyr/program/nissa/yavilla/yavilla_vif.xml @@ -0,0 +1,350 @@ +<?xml version="1.0" encoding="utf-8"?>
+<vif:VIF xmlns:opt="http://usb.org/VendorInfoFileOptionalContent.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vif="http://usb.org/VendorInfoFile.xsd">
+ <vif:VIF_Specification>3.19</vif:VIF_Specification>
+ <vif:VIF_App>
+ <vif:Vendor>USB-IF</vif:Vendor>
+ <vif:Name>VIF Editor</vif:Name>
+ <vif:Version>3.2.4.0</vif:Version>
+ </vif:VIF_App>
+ <vif:Vendor_Name>Google</vif:Vendor_Name>
+ <vif:Model_Part_Number>Yavilla</vif:Model_Part_Number>
+ <vif:Product_Revision>1</vif:Product_Revision>
+ <vif:TID>0</vif:TID>
+ <vif:VIF_Product_Type value="0">Port Product</vif:VIF_Product_Type>
+ <vif:Certification_Type value="1">Reference Platform</vif:Certification_Type>
+ <vif:Product>
+ <!--Product Level Content:-->
+ </vif:Product>
+ <vif:Component>
+ <!--Component 0: Port 0-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Component-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Port_Label>0</vif:Port_Label>
+ <vif:Connector_Type value="2">Type-C®</vif:Connector_Type>
+ <vif:USB4_Supported value="false" />
+ <vif:USB_PD_Support value="true" />
+ <vif:PD_Port_Type value="4">DRP</vif:PD_Port_Type>
+ <vif:Type_C_State_Machine value="2">DRP</vif:Type_C_State_Machine>
+ <vif:Port_Battery_Powered value="true" />
+ <vif:BC_1_2_Support value="2">Charging Port</vif:BC_1_2_Support>
+ <vif:Captive_Cable value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;General PD-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Spec_Revision_Major value="3" />
+ <vif:PD_Spec_Revision_Minor value="1" />
+ <vif:PD_Spec_Version_Major value="1" />
+ <vif:PD_Spec_Version_Minor value="3" />
+ <vif:PD_Specification_Revision value="2">Revision 3</vif:PD_Specification_Revision>
+ <vif:SOP_Capable value="true" />
+ <vif:SOP_P_Capable value="true" />
+ <vif:SOP_PP_Capable value="true" />
+ <vif:SOP_P_Debug_Capable value="false" />
+ <vif:SOP_PP_Debug_Capable value="false" />
+ <vif:Manufacturer_Info_Supported_Port value="true" />
+ <vif:Manufacturer_Info_VID_Port value="6353">18D1</vif:Manufacturer_Info_VID_Port>
+ <vif:Manufacturer_Info_PID_Port value="20570">505A</vif:Manufacturer_Info_PID_Port>
+ <vif:Chunking_Implemented_SOP value="true" />
+ <vif:Unchunked_Extended_Messages_Supported value="false" />
+ <vif:Security_Msgs_Supported_SOP value="false" />
+ <vif:Unconstrained_Power value="false" />
+ <vif:Num_Fixed_Batteries value="1" />
+ <vif:Num_Swappable_Battery_Slots value="0" />
+ <vif:ID_Header_Connector_Type_SOP value="2">USB Type-C® Receptacle</vif:ID_Header_Connector_Type_SOP>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Capabilities-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:USB_Comms_Capable value="true" />
+ <vif:DR_Swap_To_DFP_Supported value="true" />
+ <vif:DR_Swap_To_UFP_Supported value="false" />
+ <vif:VCONN_Swap_To_On_Supported value="true" />
+ <vif:VCONN_Swap_To_Off_Supported value="true" />
+ <vif:Responds_To_Discov_SOP_UFP value="false" />
+ <vif:Responds_To_Discov_SOP_DFP value="true" />
+ <vif:Attempts_Discov_SOP value="true" />
+ <vif:Power_Interruption_Available value="0">No Interruption Possible</vif:Power_Interruption_Available>
+ <vif:Data_Reset_Supported value="false" />
+ <vif:Enter_USB_Supported value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;USB Type-C®-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Type_C_Can_Act_As_Host value="true" />
+ <vif:Type_C_Can_Act_As_Device value="false" />
+ <vif:Type_C_Implements_Try_SRC value="true" />
+ <vif:Type_C_Implements_Try_SNK value="false" />
+ <vif:Type_C_Supports_Audio_Accessory value="false" />
+ <vif:Type_C_Is_VCONN_Powered_Accessory value="false" />
+ <vif:Type_C_Is_Debug_Target_SRC value="true" />
+ <vif:Type_C_Is_Debug_Target_SNK value="true" />
+ <vif:RP_Value value="1">1.5A</vif:RP_Value>
+ <vif:Type_C_Port_On_Hub value="false" />
+ <vif:Type_C_Power_Source value="2">Both</vif:Type_C_Power_Source>
+ <vif:Type_C_Sources_VCONN value="true" />
+ <vif:Type_C_Is_Alt_Mode_Controller value="true" />
+ <vif:Type_C_Is_Alt_Mode_Adapter value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Product Power-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Product_Total_Source_Power_mW value="15000">15000 mW</vif:Product_Total_Source_Power_mW>
+ <vif:Port_Source_Power_Type value="0">Assured</vif:Port_Source_Power_Type>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;USB Host-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Host_Supports_USB_Data value="true" />
+ <vif:Host_Speed value="1">USB 3.2 Gen 1x1</vif:Host_Speed>
+ <vif:Host_Contains_Captive_Retimer value="false" />
+ <vif:Host_Truncates_DP_For_tDHPResponse value="false" />
+ <vif:Host_Is_Embedded value="false" />
+ <vif:Host_Suspend_Supported value="true" />
+ <vif:Is_DFP_On_Hub value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Battery Charging 1.2-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:BC_1_2_Charging_Port_Type value="1">CDP</vif:BC_1_2_Charging_Port_Type>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Source-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Power_As_Source value="15000">15000 mW</vif:PD_Power_As_Source>
+ <vif:EPR_Supported_As_Src value="false" />
+ <vif:USB_Suspend_May_Be_Cleared value="false" />
+ <vif:Sends_Pings value="false" />
+ <vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink value="0">FR_Swap not supported</vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink>
+ <vif:Master_Port value="false" />
+ <vif:Num_Src_PDOs value="1" />
+ <vif:PD_OC_Protection value="true" />
+ <vif:PD_OCP_Method value="0">Over-Current Response</vif:PD_OCP_Method>
+ <!--Bundle: SrcPdoList-->
+ <vif:SrcPdoList>
+ <vif:SrcPDO>
+ <!--Source PDO 1-->
+ <vif:Src_PDO_Supply_Type value="0">Fixed</vif:Src_PDO_Supply_Type>
+ <vif:Src_PDO_Peak_Current value="0">100% IOC</vif:Src_PDO_Peak_Current>
+ <vif:Src_PDO_Voltage value="100">5000 mV</vif:Src_PDO_Voltage>
+ <vif:Src_PDO_Max_Current value="300">3000 mA</vif:Src_PDO_Max_Current>
+ <vif:Src_PD_OCP_OC_Debounce value="0">0 msec</vif:Src_PD_OCP_OC_Debounce>
+ <vif:Src_PD_OCP_OC_Threshold value="300">3000 mA</vif:Src_PD_OCP_OC_Threshold>
+ </vif:SrcPDO>
+ </vif:SrcPdoList>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Sink-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Power_As_Sink value="45000">45000 mW</vif:PD_Power_As_Sink>
+ <vif:EPR_Supported_As_Snk value="false" />
+ <vif:No_USB_Suspend_May_Be_Set value="true" />
+ <vif:GiveBack_May_Be_Set value="false" />
+ <vif:Higher_Capability_Set value="false" />
+ <vif:FR_Swap_Reqd_Type_C_Current_As_Initial_Source value="0">FR_Swap not supported</vif:FR_Swap_Reqd_Type_C_Current_As_Initial_Source>
+ <vif:Num_Snk_PDOs value="3" />
+ <!--Bundle: SnkPdoList-->
+ <vif:SnkPdoList>
+ <vif:SnkPDO>
+ <!--Sink PDO 1-->
+ <vif:Snk_PDO_Supply_Type value="0">Fixed</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Voltage value="100">5000 mV</vif:Snk_PDO_Voltage>
+ <vif:Snk_PDO_Op_Current value="300">3000 mA</vif:Snk_PDO_Op_Current>
+ </vif:SnkPDO>
+ <vif:SnkPDO>
+ <!--Sink PDO 2-->
+ <vif:Snk_PDO_Supply_Type value="1">Battery</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Op_Power value="60">15000 mW</vif:Snk_PDO_Op_Power>
+ <vif:Snk_PDO_Min_Voltage value="95">4750 mV</vif:Snk_PDO_Min_Voltage>
+ <vif:Snk_PDO_Max_Voltage value="300">15000 mV</vif:Snk_PDO_Max_Voltage>
+ </vif:SnkPDO>
+ <vif:SnkPDO>
+ <!--Sink PDO 3-->
+ <vif:Snk_PDO_Supply_Type value="2">Variable</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Min_Voltage value="95">4750 mV</vif:Snk_PDO_Min_Voltage>
+ <vif:Snk_PDO_Max_Voltage value="300">15000 mV</vif:Snk_PDO_Max_Voltage>
+ <vif:Snk_PDO_Op_Current value="300">3000 mA</vif:Snk_PDO_Op_Current>
+ </vif:SnkPDO>
+ </vif:SnkPdoList>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Dual Role-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Accepts_PR_Swap_As_Src value="true" />
+ <vif:Accepts_PR_Swap_As_Snk value="true" />
+ <vif:Requests_PR_Swap_As_Src value="true" />
+ <vif:Requests_PR_Swap_As_Snk value="true" />
+ <vif:FR_Swap_Supported_As_Initial_Sink value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;SOP Discover ID-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:XID_SOP value="0" />
+ <vif:Data_Capable_As_USB_Host_SOP value="true" />
+ <vif:Data_Capable_As_USB_Device_SOP value="false" />
+ <vif:Product_Type_UFP_SOP value="0">Undefined</vif:Product_Type_UFP_SOP>
+ <vif:Product_Type_DFP_SOP value="2">PDUSB Host</vif:Product_Type_DFP_SOP>
+ <vif:DFP_VDO_Port_Number value="0" />
+ <vif:Modal_Operation_Supported_SOP value="false" />
+ <vif:USB_VID_SOP value="6353">18D1</vif:USB_VID_SOP>
+ <vif:PID_SOP value="20570">505A</vif:PID_SOP>
+ <vif:bcdDevice_SOP value="0">0000</vif:bcdDevice_SOP>
+ </vif:Component>
+ <vif:Component>
+ <!--Component 1: Port 1-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Component-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Port_Label>1</vif:Port_Label>
+ <vif:Connector_Type value="2">Type-C®</vif:Connector_Type>
+ <vif:USB4_Supported value="false" />
+ <vif:USB_PD_Support value="true" />
+ <vif:PD_Port_Type value="4">DRP</vif:PD_Port_Type>
+ <vif:Type_C_State_Machine value="2">DRP</vif:Type_C_State_Machine>
+ <vif:Port_Battery_Powered value="true" />
+ <vif:BC_1_2_Support value="2">Charging Port</vif:BC_1_2_Support>
+ <vif:Captive_Cable value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;General PD-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Spec_Revision_Major value="3" />
+ <vif:PD_Spec_Revision_Minor value="1" />
+ <vif:PD_Spec_Version_Major value="1" />
+ <vif:PD_Spec_Version_Minor value="3" />
+ <vif:PD_Specification_Revision value="2">Revision 3</vif:PD_Specification_Revision>
+ <vif:SOP_Capable value="true" />
+ <vif:SOP_P_Capable value="true" />
+ <vif:SOP_PP_Capable value="true" />
+ <vif:SOP_P_Debug_Capable value="false" />
+ <vif:SOP_PP_Debug_Capable value="false" />
+ <vif:Manufacturer_Info_Supported_Port value="true" />
+ <vif:Manufacturer_Info_VID_Port value="6353">18D1</vif:Manufacturer_Info_VID_Port>
+ <vif:Manufacturer_Info_PID_Port value="20570">505A</vif:Manufacturer_Info_PID_Port>
+ <vif:Chunking_Implemented_SOP value="true" />
+ <vif:Unchunked_Extended_Messages_Supported value="false" />
+ <vif:Security_Msgs_Supported_SOP value="false" />
+ <vif:Unconstrained_Power value="false" />
+ <vif:Num_Fixed_Batteries value="1" />
+ <vif:Num_Swappable_Battery_Slots value="0" />
+ <vif:ID_Header_Connector_Type_SOP value="2">USB Type-C® Receptacle</vif:ID_Header_Connector_Type_SOP>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Capabilities-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:USB_Comms_Capable value="true" />
+ <vif:DR_Swap_To_DFP_Supported value="true" />
+ <vif:DR_Swap_To_UFP_Supported value="false" />
+ <vif:VCONN_Swap_To_On_Supported value="true" />
+ <vif:VCONN_Swap_To_Off_Supported value="true" />
+ <vif:Responds_To_Discov_SOP_UFP value="false" />
+ <vif:Responds_To_Discov_SOP_DFP value="true" />
+ <vif:Attempts_Discov_SOP value="true" />
+ <vif:Power_Interruption_Available value="0">No Interruption Possible</vif:Power_Interruption_Available>
+ <vif:Data_Reset_Supported value="false" />
+ <vif:Enter_USB_Supported value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;USB Type-C®-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Type_C_Can_Act_As_Host value="true" />
+ <vif:Type_C_Can_Act_As_Device value="false" />
+ <vif:Type_C_Implements_Try_SRC value="true" />
+ <vif:Type_C_Implements_Try_SNK value="false" />
+ <vif:Type_C_Supports_Audio_Accessory value="false" />
+ <vif:Type_C_Is_VCONN_Powered_Accessory value="false" />
+ <vif:Type_C_Is_Debug_Target_SRC value="true" />
+ <vif:Type_C_Is_Debug_Target_SNK value="true" />
+ <vif:RP_Value value="1">1.5A</vif:RP_Value>
+ <vif:Type_C_Port_On_Hub value="false" />
+ <vif:Type_C_Power_Source value="2">Both</vif:Type_C_Power_Source>
+ <vif:Type_C_Sources_VCONN value="true" />
+ <vif:Type_C_Is_Alt_Mode_Controller value="true" />
+ <vif:Type_C_Is_Alt_Mode_Adapter value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Product Power-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Product_Total_Source_Power_mW value="15000">15000 mW</vif:Product_Total_Source_Power_mW>
+ <vif:Port_Source_Power_Type value="0">Assured</vif:Port_Source_Power_Type>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;USB Host-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Host_Supports_USB_Data value="true" />
+ <vif:Host_Speed value="1">USB 3.2 Gen 1x1</vif:Host_Speed>
+ <vif:Host_Contains_Captive_Retimer value="true" />
+ <vif:Host_Truncates_DP_For_tDHPResponse value="false" />
+ <vif:Host_Is_Embedded value="false" />
+ <vif:Host_Suspend_Supported value="true" />
+ <vif:Is_DFP_On_Hub value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Battery Charging 1.2-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:BC_1_2_Charging_Port_Type value="1">CDP</vif:BC_1_2_Charging_Port_Type>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Source-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Power_As_Source value="15000">15000 mW</vif:PD_Power_As_Source>
+ <vif:EPR_Supported_As_Src value="false" />
+ <vif:USB_Suspend_May_Be_Cleared value="false" />
+ <vif:Sends_Pings value="false" />
+ <vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink value="0">FR_Swap not supported</vif:FR_Swap_Type_C_Current_Capability_As_Initial_Sink>
+ <vif:Master_Port value="false" />
+ <vif:Num_Src_PDOs value="1" />
+ <vif:PD_OC_Protection value="true" />
+ <vif:PD_OCP_Method value="0">Over-Current Response</vif:PD_OCP_Method>
+ <!--Bundle: SrcPdoList-->
+ <vif:SrcPdoList>
+ <vif:SrcPDO>
+ <!--Source PDO 1-->
+ <vif:Src_PDO_Supply_Type value="0">Fixed</vif:Src_PDO_Supply_Type>
+ <vif:Src_PDO_Peak_Current value="0">100% IOC</vif:Src_PDO_Peak_Current>
+ <vif:Src_PDO_Voltage value="100">5000 mV</vif:Src_PDO_Voltage>
+ <vif:Src_PDO_Max_Current value="300">3000 mA</vif:Src_PDO_Max_Current>
+ <vif:Src_PD_OCP_OC_Debounce value="0">0 msec</vif:Src_PD_OCP_OC_Debounce>
+ <vif:Src_PD_OCP_OC_Threshold value="300">3000 mA</vif:Src_PD_OCP_OC_Threshold>
+ </vif:SrcPDO>
+ </vif:SrcPdoList>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;PD Sink-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:PD_Power_As_Sink value="45000">45000 mW</vif:PD_Power_As_Sink>
+ <vif:EPR_Supported_As_Snk value="false" />
+ <vif:No_USB_Suspend_May_Be_Set value="true" />
+ <vif:GiveBack_May_Be_Set value="false" />
+ <vif:Higher_Capability_Set value="false" />
+ <vif:FR_Swap_Reqd_Type_C_Current_As_Initial_Source value="0">FR_Swap not supported</vif:FR_Swap_Reqd_Type_C_Current_As_Initial_Source>
+ <vif:Num_Snk_PDOs value="3" />
+ <!--Bundle: SnkPdoList-->
+ <vif:SnkPdoList>
+ <vif:SnkPDO>
+ <!--Sink PDO 1-->
+ <vif:Snk_PDO_Supply_Type value="0">Fixed</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Voltage value="100">5000 mV</vif:Snk_PDO_Voltage>
+ <vif:Snk_PDO_Op_Current value="300">3000 mA</vif:Snk_PDO_Op_Current>
+ </vif:SnkPDO>
+ <vif:SnkPDO>
+ <!--Sink PDO 2-->
+ <vif:Snk_PDO_Supply_Type value="1">Battery</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Op_Power value="60">15000 mW</vif:Snk_PDO_Op_Power>
+ <vif:Snk_PDO_Min_Voltage value="95">4750 mV</vif:Snk_PDO_Min_Voltage>
+ <vif:Snk_PDO_Max_Voltage value="300">15000 mV</vif:Snk_PDO_Max_Voltage>
+ </vif:SnkPDO>
+ <vif:SnkPDO>
+ <!--Sink PDO 3-->
+ <vif:Snk_PDO_Supply_Type value="2">Variable</vif:Snk_PDO_Supply_Type>
+ <vif:Snk_PDO_Min_Voltage value="95">4750 mV</vif:Snk_PDO_Min_Voltage>
+ <vif:Snk_PDO_Max_Voltage value="300">15000 mV</vif:Snk_PDO_Max_Voltage>
+ <vif:Snk_PDO_Op_Current value="300">3000 mA</vif:Snk_PDO_Op_Current>
+ </vif:SnkPDO>
+ </vif:SnkPdoList>
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;Dual Role-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:Accepts_PR_Swap_As_Src value="true" />
+ <vif:Accepts_PR_Swap_As_Snk value="true" />
+ <vif:Requests_PR_Swap_As_Src value="true" />
+ <vif:Requests_PR_Swap_As_Snk value="true" />
+ <vif:FR_Swap_Supported_As_Initial_Sink value="false" />
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <!--;SOP Discover ID-->
+ <!--;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-->
+ <vif:XID_SOP value="0" />
+ <vif:Data_Capable_As_USB_Host_SOP value="true" />
+ <vif:Data_Capable_As_USB_Device_SOP value="false" />
+ <vif:Product_Type_UFP_SOP value="0">Undefined</vif:Product_Type_UFP_SOP>
+ <vif:Product_Type_DFP_SOP value="2">PDUSB Host</vif:Product_Type_DFP_SOP>
+ <vif:DFP_VDO_Port_Number value="1" />
+ <vif:Modal_Operation_Supported_SOP value="false" />
+ <vif:USB_VID_SOP value="6353">18D1</vif:USB_VID_SOP>
+ <vif:PID_SOP value="20570">505A</vif:PID_SOP>
+ <vif:bcdDevice_SOP value="0">0000</vif:bcdDevice_SOP>
+ </vif:Component>
+</vif:VIF>
diff --git a/zephyr/program/rex/BUILD.py b/zephyr/program/rex/BUILD.py index 82aa3833ec..89aee8b06d 100644 --- a/zephyr/program/rex/BUILD.py +++ b/zephyr/program/rex/BUILD.py @@ -5,7 +5,7 @@ """Define zmake projects for Rex.""" -def register_variant( +def register_rex_project( project_name, kconfig_files=None, ): @@ -25,14 +25,15 @@ def register_variant( here / project_name / "project.overlay", ], kconfig_files=kconfig_files, + inherited_from=["rex"], ) -register_variant( +register_rex_project( project_name="rex", ) -register_variant( +register_rex_project( project_name="rex-sans-sensors", kconfig_files=[ # Common to all projects. diff --git a/zephyr/program/rex/CMakeLists.txt b/zephyr/program/rex/CMakeLists.txt index 27d7dff068..1962569692 100644 --- a/zephyr/program/rex/CMakeLists.txt +++ b/zephyr/program/rex/CMakeLists.txt @@ -4,9 +4,13 @@ cmake_minimum_required(VERSION 3.20.5) find_package(Zephyr REQUIRED HINTS "${ZEPHYR_BASE}") -project(rex) zephyr_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") zephyr_library_sources_ifdef(CONFIG_AP_PWRSEQ "src/board_power.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC "src/usbc_config.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC "src/usb_pd_policy.c") + +if(DEFINED CONFIG_BOARD_REX) + project(rex) + add_subdirectory(rex) +endif() diff --git a/zephyr/program/rex/rex/CMakeLists.txt b/zephyr/program/rex/rex/CMakeLists.txt new file mode 100644 index 0000000000..74189cbbab --- /dev/null +++ b/zephyr/program/rex/rex/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. + +cros_ec_library_include_directories_ifdef(CONFIG_BOARD_REX include) +zephyr_library_sources("src/usb_mux_config.c") diff --git a/zephyr/program/rex/rex/cbi.dtsi b/zephyr/program/rex/rex/cbi.dtsi new file mode 100644 index 0000000000..4d56d350cb --- /dev/null +++ b/zephyr/program/rex/rex/cbi.dtsi @@ -0,0 +1,46 @@ +/* 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. + */ + +/ { + rex-fw-config { + compatible = "cros-ec,cbi-fw-config"; + + /* + * FW_CONFIG field to enable USB DB. + */ + usb-db { + enum-name = "FW_USB_DB"; + start = <12>; + size = <3>; + + io-db-unknown { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_USB_DB_NOT_CONNECTED"; + value = <0>; + }; + io-db-usb3 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_USB_DB_USB3"; + value = <1>; + default; + }; + io-db-usb4-kb8010 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_USB_DB_USB4_KB8010"; + value = <2>; + }; + io-db-usb4-anx7452 { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_USB_DB_USB4_ANX7452"; + value = <3>; + }; + io-db-usb4-hayden { + compatible = "cros-ec,cbi-fw-config-value"; + enum-name = "FW_USB_DB_USB4_HB"; + value = <4>; + }; + }; + }; +}; diff --git a/zephyr/program/rex/rex/project.overlay b/zephyr/program/rex/rex/project.overlay index b9cb51faba..5178aea5ef 100644 --- a/zephyr/program/rex/rex/project.overlay +++ b/zephyr/program/rex/rex/project.overlay @@ -16,5 +16,6 @@ #include "../usbc.dtsi" /* Rex project DTS includes */ +#include "cbi.dtsi" #include "led_pins.dtsi" #include "led_policy.dtsi" diff --git a/zephyr/program/rex/rex/src/usb_mux_config.c b/zephyr/program/rex/rex/src/usb_mux_config.c new file mode 100644 index 0000000000..a549235f3c --- /dev/null +++ b/zephyr/program/rex/rex/src/usb_mux_config.c @@ -0,0 +1,51 @@ +/* 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. + */ + +/* Rex board-specific USB-C mux configuration */ + +#include "console.h" +#include "cros_board_info.h" +#include "cros_cbi.h" +#include "hooks.h" +#include "ioexpander.h" +#include "usb_mux.h" +#include "usbc/usb_muxes.h" + +#include <zephyr/drivers/gpio.h> +#include <zephyr/logging/log.h> + +#ifdef CONFIG_ZTEST + +#undef USB_MUX_ENABLE_ALTERNATIVE +#define USB_MUX_ENABLE_ALTERNATIVE(x) + +#undef TCPC_ENABLE_ALTERNATE_BY_NODELABEL +#define TCPC_ENABLE_ALTERNATE_BY_NODELABEL(x, y) + +#undef PPC_ENABLE_ALTERNATE_BY_NODELABEL +#define PPC_ENABLE_ALTERNATE_BY_NODELABEL(x, y) + +#endif /* CONFIG_ZTEST */ + +LOG_MODULE_DECLARE(rex, CONFIG_REX_LOG_LEVEL); + +static void setup_mux(void) +{ + int ret; + uint32_t val; + + ret = cros_cbi_get_fw_config(FW_USB_DB, &val); + if (ret != 0) { + return; + } + + if (val == FW_USB_DB_NOT_CONNECTED) { + LOG_INF("USB DB: not connected"); + } + if (val == FW_USB_DB_USB3) { + LOG_INF("USB DB: Setting USB3 mux"); + } +} +DECLARE_HOOK(HOOK_INIT, setup_mux, HOOK_PRIO_INIT_I2C); diff --git a/zephyr/program/skyrim/BUILD.py b/zephyr/program/skyrim/BUILD.py index ed0f929409..2719375808 100644 --- a/zephyr/program/skyrim/BUILD.py +++ b/zephyr/program/skyrim/BUILD.py @@ -21,6 +21,7 @@ def register_skyrim_project( # Project-specific KConfig customization. here / project_name / "project.conf", ], + inherited_from=["skyrim"], ) diff --git a/zephyr/program/skyrim/markarth/project.overlay b/zephyr/program/skyrim/markarth/project.overlay index 794a8e5151..3d5f8c3fcb 100644 --- a/zephyr/program/skyrim/markarth/project.overlay +++ b/zephyr/program/skyrim/markarth/project.overlay @@ -22,7 +22,7 @@ /* battery overrides */ batteries { default_battery: lgc_ap19b8m-2 { - compatible = "lgc,ap19b8m-2", "battery-smart"; + compatible = "lgc,ap19b8m", "battery-smart"; }; cosmx_ap20cbl-3 { compatible = "cosmx,ap20cbl-3", "battery-smart"; diff --git a/zephyr/scripts/named_gpios.py b/zephyr/scripts/named_gpios.py new file mode 100644 index 0000000000..d71c2483f8 --- /dev/null +++ b/zephyr/scripts/named_gpios.py @@ -0,0 +1,167 @@ +# 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. + +"""Configure-time checks for the named-gpios node.""" + +import argparse +import inspect +import logging +from pathlib import Path +import pickle +import site +import sys +from typing import List, Optional + + +def verify_no_duplicates(zephyr_base, edt_pickle): + """Verify there are no duplicate GPIOs in the named-gpios node. + + Args: + zephyr_base: pathlib.Path pointing to the Zephyr OS repository. + edt_pickle: pathlib.Path pointing to the EDT object, stored as a pickle + file. + + Returns: + True if no duplicates found. Returns False otherwise. + """ + zephyr_devicetree_path = ( + zephyr_base / "scripts" / "dts" / "python-devicetree" / "src" + ) + + # Add Zephyr's python-devicetree into the source path. + site.addsitedir(zephyr_devicetree_path) + + try: + with open(edt_pickle, "rb") as edt_file: + edt = pickle.load(edt_file) + except FileNotFoundError: + # Skip the GPIOs check if the edt_pickle file doesn't exist. + # UnpicklingErrors will generate a failure. + return True + + # Dictionary of GPIO controllers, indexed by the GPIO controller nodelabel + gpio_ctrls = dict() + duplicates = 0 + count = 0 + + edtlib = inspect.getmodule(edt) + + try: + named_gpios = edt.get_node("/named-gpios") + except edtlib.EDTError: + # If the named-gpios node doesn't exist, return success. + return True + + for node in named_gpios.children.values(): + if "gpios" not in node.props: + continue + + gpios = node.props["gpios"].val + count += 1 + + # edtlib converts a "-gpios" style property to a list of of + # ControllerAndData objects. However, the named-gpios node only + # supports a single GPIO per child, so no need to iterate over + # the list. + gpio = gpios[0] + gpio_pin = gpio.data["pin"] + + # Note that EDT stores the node name (not a nodelabel) in the + # Node.name property. Use the nodelabel, if available as the + # key for gpio_ctrls. + if gpio.controller.labels[0] is not None: + nodelabel = gpio.controller.labels[0] + else: + nodelabel = gpio.controller.name + + if not nodelabel in gpio_ctrls: + # Create a dictionary at each GPIO controller + gpio_ctrls[nodelabel] = dict() + + if gpio_pin in gpio_ctrls[nodelabel]: + logging.error( + "Duplicate GPIOs found at nodes: %s and %s", + gpio_ctrls[nodelabel][gpio_pin], + node.name, + ) + duplicates += 1 + else: + # Store the node name for the new pin + gpio_ctrls[nodelabel][gpio_pin] = node.name + + if duplicates: + logging.error("%d duplicate GPIOs found in %s", duplicates, edt_pickle) + return False + + logging.info("Verified %d GPIOs, no duplicates found", count) + return True + + +# Dictionary used to map log level strings to their corresponding int values. +log_level_map = { + "DEBUG": logging.DEBUG, + "INFO": logging.INFO, + "WARNING": logging.WARNING, + "ERROR": logging.ERROR, + "CRITICAL": logging.CRITICAL, +} + + +def parse_args(argv: Optional[List[str]] = None): + """Returns parsed command-line arguments""" + parser = argparse.ArgumentParser( + prog="named_gpios", + description="Zephyr EC specific devicetree checks", + ) + + parser.add_argument( + "--zephyr-base", + type=Path, + help="Path to Zephyr OS repository", + required=True, + ) + + parser.add_argument( + "--edt-pickle", + type=Path, + help="EDT object file, in pickle format", + required=True, + ) + + parser.add_argument( + "-l", + "--log-level", + choices=log_level_map.values(), + metavar=f"{{{','.join(log_level_map)}}}", + type=lambda x: log_level_map[x], + default=logging.INFO, + help="Set the logging level (default=INFO)", + ) + + return parser.parse_args(argv) + + +def main(argv: Optional[List[str]] = None) -> Optional[int]: + """The main function. + + Args: + argv: Optionally, the command-line to parse, not including argv[0]. + + Returns: + Zero upon success, or non-zero upon failure. + """ + args = parse_args(argv) + + log_format = "%(levelname)s: %(message)s" + + logging.basicConfig(format=log_format, level=args.log_level) + + if not verify_no_duplicates(args.zephyr_base, args.edt_pickle): + return 1 + + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) diff --git a/zephyr/shim/include/config_chip.h b/zephyr/shim/include/config_chip.h index ddc308a4bb..7cfa79cb43 100644 --- a/zephyr/shim/include/config_chip.h +++ b/zephyr/shim/include/config_chip.h @@ -9,8 +9,6 @@ #include <zephyr/devicetree.h> #include <zephyr/toolchain.h> -#include <autoconf.h> - #define SENSOR_NODE DT_PATH(motionsense_sensor) #define SENSOR_INFO_NODE DT_PATH(motionsense_sensor_info) #define SENSOR_ALT_NODE DT_PATH(motionsense_sensor_alt) @@ -414,6 +412,11 @@ CONFIG_PLATFORM_EC_RAA489000_TRICKLE_CHARGE_CURRENT #endif +#undef CONFIG_CHARGER_BYPASS_MODE +#ifdef CONFIG_PLATFORM_EC_CHARGER_BYPASS_MODE +#define CONFIG_CHARGER_BYPASS_MODE +#endif + #undef CONFIG_CHARGER_NARROW_VDC #ifdef CONFIG_PLATFORM_EC_CHARGER_NARROW_VDC #define CONFIG_CHARGER_NARROW_VDC @@ -1695,6 +1698,11 @@ extern char mock_jump_data[CONFIG_PLATFORM_EC_PRESERVED_END_OF_RAM_SIZE]; #define CONFIG_USBC_PPC_KTU1125 #endif +#undef CONFIG_USBC_PPC_NX20P3481 +#ifdef CONFIG_PLATFORM_EC_USBC_PPC_NX20P3481 +#define CONFIG_USBC_PPC_NX20P3481 +#endif + #undef CONFIG_USBC_PPC_NX20P3483 #ifdef CONFIG_PLATFORM_EC_USBC_PPC_NX20P3483 #define CONFIG_USBC_PPC_NX20P3483 diff --git a/zephyr/shim/include/usbc/tcpc_generic_emul.h b/zephyr/shim/include/usbc/tcpc_generic_emul.h index 1ce29fd2e5..9fcff480eb 100644 --- a/zephyr/shim/include/usbc/tcpc_generic_emul.h +++ b/zephyr/shim/include/usbc/tcpc_generic_emul.h @@ -4,6 +4,7 @@ */ #include "driver/tcpm/tcpci.h" +#include "i2c/i2c.h" #include <zephyr/devicetree.h> diff --git a/zephyr/shim/include/usbc/tcpc_rt1718s_emul.h b/zephyr/shim/include/usbc/tcpc_rt1718s_emul.h new file mode 100644 index 0000000000..0d9a95cbea --- /dev/null +++ b/zephyr/shim/include/usbc/tcpc_rt1718s_emul.h @@ -0,0 +1,28 @@ +/* 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. + */ + +#ifndef __ZEPHYR_SHIM_TCPC_RT1718S_EMUL_H +#define __ZEPHYR_SHIM_TCPC_RT1718S_EMUL_H + +#include "driver/tcpm/rt1718s_public.h" + +#include <zephyr/devicetree.h> + +#define RT1718S_EMUL_COMPAT cros_rt1718s_tcpc_emul + +/* clang-format off */ +#define TCPC_CONFIG_RT1718S_EMUL(id) \ + { \ + .bus_type = EC_BUS_TYPE_I2C, \ + .i2c_info = { \ + .port = I2C_PORT_BY_DEV(id), \ + .addr_flags = DT_REG_ADDR(id), \ + }, \ + .drv = &rt1718s_tcpm_drv, \ + .irq_gpio = GPIO_DT_SPEC_GET_OR(id, irq_gpios, {}), \ + } +/* clang-format on */ + +#endif /* __ZEPHYR_SHIM_TPCP_RT1718S_EMUL_H */ diff --git a/zephyr/shim/src/tcpc.c b/zephyr/shim/src/tcpc.c index fcb1d55106..842c2584ab 100644 --- a/zephyr/shim/src/tcpc.c +++ b/zephyr/shim/src/tcpc.c @@ -18,6 +18,7 @@ #include "usbc/tcpc_raa489000.h" #include "usbc/tcpc_rt1715.h" #include "usbc/tcpc_rt1718s.h" +#include "usbc/tcpc_rt1718s_emul.h" #include "usbc/tcpci.h" #include "usbc/utils.h" @@ -48,7 +49,9 @@ LOG_MODULE_REGISTER(tcpc, CONFIG_GPIO_LOG_LEVEL); CHECK_COMPAT(PS8XXX_EMUL_COMPAT, usbc_id, tcpc_id, \ TCPC_CONFIG_PS8XXX_EMUL) \ CHECK_COMPAT(ANX7447_EMUL_COMPAT, usbc_id, tcpc_id, \ - TCPC_CONFIG_ANX7447_EMUL) + TCPC_CONFIG_ANX7447_EMUL) \ + CHECK_COMPAT(RT1718S_EMUL_COMPAT, usbc_id, tcpc_id, \ + TCPC_CONFIG_RT1718S_EMUL) #else #define TCPC_CHIP_FIND_EMUL(...) #endif /* TEST_BUILD */ diff --git a/zephyr/test/ap_power/testcase.yaml b/zephyr/test/ap_power/testcase.yaml index b55e2f3f47..8fbea99560 100644 --- a/zephyr/test/ap_power/testcase.yaml +++ b/zephyr/test/ap_power/testcase.yaml @@ -2,9 +2,12 @@ common: platform_allow: native_posix tests: ap_power.alderlake: - extra_args: CONFIG_EMUL_POWER_SIGNALS=y - CONFIG_X86_NON_DSX_PWRSEQ_ADL=y - CONFIG_AP_X86_INTEL_ADL=y - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI_VW_SLP_S4=y - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI_VW_SLP_S5=y - DTC_OVERLAY_FILE="boards/native_posix.overlay";"boards/alderlake.dts" + extra_dtc_overlay_files: + - boards/native_posix.overlay + - boards/alderlake.dts + extra_configs: + - CONFIG_EMUL_POWER_SIGNALS=y + - CONFIG_X86_NON_DSX_PWRSEQ_ADL=y + - CONFIG_AP_X86_INTEL_ADL=y + - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI_VW_SLP_S4=y + - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI_VW_SLP_S5=y diff --git a/zephyr/test/drivers/CMakeLists.txt b/zephyr/test/drivers/CMakeLists.txt index 32dcf6408f..2d7fc8a56b 100644 --- a/zephyr/test/drivers/CMakeLists.txt +++ b/zephyr/test/drivers/CMakeLists.txt @@ -27,13 +27,16 @@ add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_COMMON_CHARGER common_charger) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_CHARGESPLASH chargesplash) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_FLASH flash) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_ISL923X isl923x) +add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_ISL9241 isl9241) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_I2C_CONTROLLER i2c_controller) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_IT8XXX2_HW_SHA256 it8xxx2_hw_sha256) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_KEYBOARD_SCAN keyboard_scan) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_LED_DRIVER led_driver) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_MKBP mkbp) +add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_NX20P348X nx20p348x) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_PANIC_OUTPUT panic_output) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_POWER_HOST_SLEEP power_host_sleep) +add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_RT1718S rt1718s) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_RT9490 rt9490) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_SHIM_GPIO_ID shim_gpio_id) add_subdirectory_ifdef(CONFIG_LINK_TEST_SUITE_SHIM_PWM_HC shim_pwm_hc) diff --git a/zephyr/test/drivers/Kconfig b/zephyr/test/drivers/Kconfig index 5e61d63e60..256e086bd4 100644 --- a/zephyr/test/drivers/Kconfig +++ b/zephyr/test/drivers/Kconfig @@ -68,6 +68,9 @@ config LINK_TEST_SUITE_HOST_COMMAND_READ_MEMMAP config LINK_TEST_SUITE_ISL923X bool "Link and test the isl923x tests" +config LINK_TEST_SUITE_ISL9241 + bool "Link and test the isl9241 tests" + config LINK_TEST_SUITE_I2C_CONTROLLER bool "Link and test the i2c_controller tests" @@ -94,6 +97,11 @@ config LINK_TEST_SUITE_LOCATE_CHIP_ALTS config LINK_TEST_SUITE_MKBP bool "Link and test the mkbp tests" +config LINK_TEST_SUITE_NX20P348X + bool "Link and test the nx20p348x tests" + select PLATFORM_EC_CONSOLE_CMD_PPC_DUMP + select PLATFORM_EC_USB_PD_LOGGING + config LINK_TEST_SUITE_PANIC_OUTPUT bool "Link and test the panic_output tests" @@ -103,6 +111,12 @@ config LINK_TEST_SUITE_POWER_HOST_SLEEP config LINK_TEST_SUITE_PS8XXX bool "Link and test the ps8xxx tests" +config LINK_TEST_SUITE_RT1718S + bool "Link and test the rt1718s tests" + help + Link tests rt1718s test suite for the TCPM driver related function + tests. + config LINK_TEST_SUITE_RT9490 bool "Link and test the rt9490 tests" diff --git a/zephyr/test/drivers/anx7447/src/low_power_mode.c b/zephyr/test/drivers/anx7447/src/low_power_mode.c index cbcea1955c..91f132ef6d 100644 --- a/zephyr/test/drivers/anx7447/src/low_power_mode.c +++ b/zephyr/test/drivers/anx7447/src/low_power_mode.c @@ -20,7 +20,7 @@ static const int tcpm_anx7447_port = USBC_PORT_C0; ZTEST_SUITE(low_power_mode, drivers_predicate_post_main, NULL, NULL, NULL, NULL); -ZTEST(low_power_mode, enter_low_power_in_source_mode) +ZTEST(low_power_mode, test_enter_low_power_in_source_mode) { uint16_t reg_val = 0; const struct emul *anx7447_emul = EMUL_DT_GET(ANX7447_NODE); @@ -40,7 +40,7 @@ ZTEST(low_power_mode, enter_low_power_in_source_mode) "Role register value is not as expected while entering low power mode"); } -ZTEST(low_power_mode, enter_low_power_not_in_source_mode) +ZTEST(low_power_mode, test_enter_low_power_not_in_source_mode) { uint16_t reg_val = 0; const struct emul *anx7447_emul = EMUL_DT_GET(ANX7447_NODE); diff --git a/zephyr/test/drivers/boards/native_posix.overlay b/zephyr/test/drivers/boards/native_posix.overlay index f577b2b618..d4aefdd4cd 100644 --- a/zephyr/test/drivers/boards/native_posix.overlay +++ b/zephyr/test/drivers/boards/native_posix.overlay @@ -127,10 +127,6 @@ * itself instead of device tree. */ - /* <&gpio0 1 x> is reserved as 'entering-rw' in - * src/platform/ec/zephyr/dts/board-overlays/native_posix.dts - */ - /* In test WP is output because CBI use it, but it is also * input, because test_all_tags set it to enable write * protection. diff --git a/zephyr/test/drivers/common/src/utils.c b/zephyr/test/drivers/common/src/utils.c index 03d280cb68..24d3df6b91 100644 --- a/zephyr/test/drivers/common/src/utils.c +++ b/zephyr/test/drivers/common/src/utils.c @@ -124,6 +124,7 @@ void test_set_chipset_to_g3(void) power_get_state()); } +#if DT_HAS_COMPAT_STATUS_OKAY(cros_isl923x_emul) void connect_source_to_port(struct tcpci_partner_data *partner, struct tcpci_src_emul_data *src, int pdo_index, const struct emul *tcpci_emul, @@ -181,6 +182,7 @@ void disconnect_sink_from_port(const struct emul *tcpci_emul) zassert_ok(tcpci_emul_disconnect_partner(tcpci_emul)); k_sleep(K_SECONDS(1)); } +#endif /* DT_HAS_COMPAT_STATUS_OKAY(cros_isl923x_emul) */ uint8_t acpi_read(uint8_t acpi_addr) { diff --git a/zephyr/test/drivers/default/src/console_cmd/vboot_hash.c b/zephyr/test/drivers/default/src/console_cmd/vboot_hash.c index bdc9dddc66..83a14ff46f 100644 --- a/zephyr/test/drivers/default/src/console_cmd/vboot_hash.c +++ b/zephyr/test/drivers/default/src/console_cmd/vboot_hash.c @@ -24,7 +24,7 @@ struct console_cmd_hash_fixture { uint8_t ro_hash[SHA256_DIGEST_SIZE]; }; -ZTEST_F(console_cmd_hash, get_rw) +ZTEST_F(console_cmd_hash, test_get_rw) { const char *outbuffer; size_t buffer_size; @@ -50,7 +50,7 @@ ZTEST_F(console_cmd_hash, get_rw) zassert_ok(!strstr(outbuffer, hash_buf), "Output was: `%s`", outbuffer); } -ZTEST_F(console_cmd_hash, get_ro) +ZTEST_F(console_cmd_hash, test_get_ro) { const char *outbuffer; size_t buffer_size; @@ -76,7 +76,7 @@ ZTEST_F(console_cmd_hash, get_ro) zassert_ok(!strstr(outbuffer, hash_buf), "Output was: `%s`", outbuffer); } -ZTEST_F(console_cmd_hash, abort) +ZTEST_F(console_cmd_hash, test_abort) { const char *outbuffer; size_t buffer_size; @@ -99,7 +99,7 @@ ZTEST_F(console_cmd_hash, abort) "Output was: `%s`", outbuffer); } -ZTEST_F(console_cmd_hash, custom_range) +ZTEST_F(console_cmd_hash, test_custom_range) { char command[256]; uint32_t offset = flash_get_rw_offset(system_get_active_copy()); @@ -140,7 +140,7 @@ ZTEST_F(console_cmd_hash, custom_range) outbuffer, hash_buf); } -ZTEST_F(console_cmd_hash, custom_range_with_nonce) +ZTEST_F(console_cmd_hash, test_custom_range_with_nonce) { char command[256]; uint32_t offset = flash_get_rw_offset(system_get_active_copy()); @@ -183,7 +183,7 @@ ZTEST_F(console_cmd_hash, custom_range_with_nonce) outbuffer, hash_buf); } -ZTEST(console_cmd_hash, invalid) +ZTEST(console_cmd_hash, test_invalid) { /* Invalid subcommand */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "hash foo")); diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_5v_3a_pd_sink.c b/zephyr/test/drivers/default/src/integration/usbc/usb_5v_3a_pd_sink.c index 6795e72c11..930e393691 100644 --- a/zephyr/test/drivers/default/src/integration/usbc/usb_5v_3a_pd_sink.c +++ b/zephyr/test/drivers/default/src/integration/usbc/usb_5v_3a_pd_sink.c @@ -224,7 +224,7 @@ ZTEST_F(usb_attach_5v_3a_pd_sink, test_disconnect_power_info) * Expected Results * - Sink completes Goto Min PD negotiation */ -ZTEST_F(usb_attach_5v_3a_pd_sink, verify_goto_min) +ZTEST_F(usb_attach_5v_3a_pd_sink, test_verify_goto_min) { pd_dpm_request(0, DPM_REQUEST_GOTO_MIN); k_sleep(K_SECONDS(1)); @@ -243,7 +243,7 @@ ZTEST_F(usb_attach_5v_3a_pd_sink, verify_goto_min) * Expected Results * - Sink received ping message */ -ZTEST_F(usb_attach_5v_3a_pd_sink, verify_ping_msg) +ZTEST_F(usb_attach_5v_3a_pd_sink, test_verify_ping_msg) { tcpci_snk_emul_clear_ping_received(&fixture->snk_ext); diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_attach_src_snk.c b/zephyr/test/drivers/default/src/integration/usbc/usb_attach_src_snk.c index 401a89cb11..c53a416f77 100644 --- a/zephyr/test/drivers/default/src/integration/usbc/usb_attach_src_snk.c +++ b/zephyr/test/drivers/default/src/integration/usbc/usb_attach_src_snk.c @@ -266,7 +266,7 @@ static void integration_usb_attach_snk_then_src_after(void *state) attach_src_snk_common_after(&fixture->my_emulator_state); } -ZTEST_F(integration_usb_attach_src_then_snk, verify_snk_port_pd_info) +ZTEST_F(integration_usb_attach_src_then_snk, test_verify_snk_port_pd_info) { struct ec_response_usb_pd_power_info response; @@ -304,7 +304,7 @@ ZTEST_F(integration_usb_attach_src_then_snk, verify_snk_port_pd_info) response.max_power); } -ZTEST_F(integration_usb_attach_src_then_snk, verify_src_port_pd_info) +ZTEST_F(integration_usb_attach_src_then_snk, test_verify_src_port_pd_info) { struct ec_response_usb_pd_power_info response; @@ -335,7 +335,7 @@ ZTEST_F(integration_usb_attach_src_then_snk, verify_src_port_pd_info) /* current limit */ } -ZTEST_F(integration_usb_attach_snk_then_src, verify_snk_port_pd_info) +ZTEST_F(integration_usb_attach_snk_then_src, test_verify_snk_port_pd_info) { struct ec_response_usb_pd_power_info response; @@ -374,7 +374,7 @@ ZTEST_F(integration_usb_attach_snk_then_src, verify_snk_port_pd_info) response.max_power); } -ZTEST_F(integration_usb_attach_snk_then_src, verify_src_port_pd_info) +ZTEST_F(integration_usb_attach_snk_then_src, test_verify_src_port_pd_info) { struct ec_response_usb_pd_power_info response; @@ -406,7 +406,7 @@ ZTEST_F(integration_usb_attach_snk_then_src, verify_src_port_pd_info) /* current limit */ } -ZTEST_F(integration_usb_attach_src_then_snk, verify_snk_port_typec_status) +ZTEST_F(integration_usb_attach_src_then_snk, test_verify_snk_port_typec_status) { struct ec_response_typec_status response = host_cmd_typec_status(SNK_PORT); @@ -436,7 +436,7 @@ ZTEST_F(integration_usb_attach_src_then_snk, verify_snk_port_typec_status) response.power_role); } -ZTEST_F(integration_usb_attach_src_then_snk, verify_src_port_typec_status) +ZTEST_F(integration_usb_attach_src_then_snk, test_verify_src_port_typec_status) { struct ec_response_typec_status response = host_cmd_typec_status(SRC_PORT); @@ -466,7 +466,7 @@ ZTEST_F(integration_usb_attach_src_then_snk, verify_src_port_typec_status) response.power_role); } -ZTEST_F(integration_usb_attach_snk_then_src, verify_snk_port_typec_status) +ZTEST_F(integration_usb_attach_snk_then_src, test_verify_snk_port_typec_status) { struct ec_response_typec_status response = host_cmd_typec_status(SNK_PORT); @@ -496,7 +496,7 @@ ZTEST_F(integration_usb_attach_snk_then_src, verify_snk_port_typec_status) response.power_role); } -ZTEST_F(integration_usb_attach_snk_then_src, verify_src_port_typec_status) +ZTEST_F(integration_usb_attach_snk_then_src, test_verify_src_port_typec_status) { struct ec_response_typec_status response = host_cmd_typec_status(SRC_PORT); @@ -591,7 +591,7 @@ static void usb_detach_test_after(void *state) attach_src_snk_common_after(&fixture->fixture); } -ZTEST_F(usb_detach_test, verify_detach_src_snk) +ZTEST_F(usb_detach_test, test_verify_detach_src_snk) { struct emul_state *emul_state = &fixture->fixture; struct ec_response_usb_pd_power_info src_power_info = { 0 }; @@ -653,7 +653,7 @@ ZTEST_F(usb_detach_test, verify_detach_src_snk) src_power_info.meas.current_max); } -ZTEST_F(usb_detach_test, verify_detach_snk_src) +ZTEST_F(usb_detach_test, test_verify_detach_snk_src) { struct emul_state *emul_state = &fixture->fixture; struct ec_response_usb_pd_power_info src_power_info = { 0 }; @@ -715,7 +715,7 @@ ZTEST_F(usb_detach_test, verify_detach_snk_src) src_power_info.meas.current_max); } -ZTEST_F(usb_detach_test, verify_detach_sink) +ZTEST_F(usb_detach_test, test_verify_detach_sink) { struct emul_state *emul_state = &fixture->fixture; struct ec_response_usb_pd_power_info pd_power_info = { 0 }; @@ -757,7 +757,7 @@ ZTEST_F(usb_detach_test, verify_detach_sink) pd_power_info.max_power); } -ZTEST_F(usb_detach_test, verify_detach_source) +ZTEST_F(usb_detach_test, test_verify_detach_source) { struct emul_state *emul_state = &fixture->fixture; struct ec_response_usb_pd_power_info pd_power_info = { SNK_PORT }; diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c index 36a417d22c..6284881690 100644 --- a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c +++ b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_bist_shared.c @@ -80,7 +80,7 @@ ZTEST_SUITE(usb_pd_bist_shared, drivers_predicate_post_main, usb_pd_bist_shared_setup, usb_pd_bist_shared_before, usb_pd_bist_shared_after, NULL); -ZTEST_F(usb_pd_bist_shared, verify_bist_shared_mode) +ZTEST_F(usb_pd_bist_shared, test_verify_bist_shared_mode) { uint32_t bist_data; uint32_t f5v_cap; @@ -135,7 +135,7 @@ ZTEST_F(usb_pd_bist_shared, verify_bist_shared_mode) "PDO current didn't decrease after BIST exit"); } -ZTEST_F(usb_pd_bist_shared, verify_bist_shared_no_snk_entry) +ZTEST_F(usb_pd_bist_shared, test_verify_bist_shared_no_snk_entry) { uint32_t bist_data; uint32_t f5v_cap; @@ -169,7 +169,7 @@ ZTEST_F(usb_pd_bist_shared, verify_bist_shared_no_snk_entry) "PDO current incorrect after bad BIST entry"); } -ZTEST_F(usb_pd_bist_shared, verify_bist_shared_exit_no_action) +ZTEST_F(usb_pd_bist_shared, test_verify_bist_shared_exit_no_action) { uint32_t bist_data; uint32_t f5v_cap; @@ -193,7 +193,7 @@ ZTEST_F(usb_pd_bist_shared, verify_bist_shared_exit_no_action) zassert_equal(f5v_cap, 0, "Received unexpected source cap"); } -ZTEST_F(usb_pd_bist_shared, verify_control_bist_shared_mode) +ZTEST_F(usb_pd_bist_shared, test_verify_control_bist_shared_mode) { uint32_t f5v_cap; diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_ctrl_msg.c b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_ctrl_msg.c index 0e5d3eecad..af7564635c 100644 --- a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_ctrl_msg.c +++ b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_ctrl_msg.c @@ -158,7 +158,7 @@ ZTEST_SUITE(usb_pd_ctrl_msg_test_source, drivers_predicate_post_main, usb_pd_ctrl_msg_source_setup, usb_pd_ctrl_msg_before, usb_pd_ctrl_msg_after, NULL); -ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_vconn_swap) +ZTEST_F(usb_pd_ctrl_msg_test_sink, test_verify_vconn_swap) { struct usb_pd_ctrl_msg_test_fixture *super_fixture = &fixture->fixture; struct ec_response_typec_status snk_resp = { 0 }; @@ -181,7 +181,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_vconn_swap) "SNK Returned vconn_role=%u", snk_resp.vconn_role); } -ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_pr_swap) +ZTEST_F(usb_pd_ctrl_msg_test_sink, test_verify_pr_swap) { struct usb_pd_ctrl_msg_test_fixture *super_fixture = &fixture->fixture; struct ec_response_typec_status snk_resp = { 0 }; @@ -228,7 +228,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_pr_swap) * Expected Results * - TypeC status query returns PD_ROLE_DFP */ -ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_dr_swap) +ZTEST_F(usb_pd_ctrl_msg_test_sink, test_verify_dr_swap) { struct ec_response_typec_status typec_status = host_cmd_typec_status(TEST_USB_PORT); @@ -250,7 +250,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_sink, verify_dr_swap) * Expected Results * - Data role does not change on TEST_USB_PORT after DR Swap request. */ -ZTEST_F(usb_pd_ctrl_msg_test_source, verify_dr_swap_rejected) +ZTEST_F(usb_pd_ctrl_msg_test_source, test_verify_dr_swap_rejected) { struct usb_pd_ctrl_msg_test_fixture *super_fixture = &fixture->fixture; struct ec_response_typec_status typec_status = { 0 }; @@ -286,7 +286,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_source, verify_dr_swap_rejected) * Expected Results * - Data role changes after DPM DR Swap request */ -ZTEST_F(usb_pd_ctrl_msg_test_source, verify_dpm_dr_swap) +ZTEST_F(usb_pd_ctrl_msg_test_source, test_verify_dpm_dr_swap) { struct ec_response_typec_status typec_status = { 0 }; @@ -313,7 +313,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_source, verify_dpm_dr_swap) * Expected Results * - TypeC Status Host Command reveals sink capabilility PDOs. */ -ZTEST(usb_pd_ctrl_msg_test_source, verify_dpm_get_sink_cap) +ZTEST(usb_pd_ctrl_msg_test_source, test_verify_dpm_get_sink_cap) { struct ec_response_typec_status typec_status = { 0 }; @@ -334,7 +334,7 @@ ZTEST(usb_pd_ctrl_msg_test_source, verify_dpm_get_sink_cap) * Expected Results * - TypeC Status Host Command reveals sink capabilility PDOs. */ -ZTEST(usb_pd_ctrl_msg_test_sink, verify_get_sink_cap) +ZTEST(usb_pd_ctrl_msg_test_sink, test_verify_get_sink_cap) { struct ec_response_typec_status typec_status = { 0 }; @@ -354,7 +354,7 @@ ZTEST(usb_pd_ctrl_msg_test_sink, verify_get_sink_cap) * Expected Results * - BIST occurs and we transition back to READY state */ -ZTEST_F(usb_pd_ctrl_msg_test_source, verify_bist_tx_mode2) +ZTEST_F(usb_pd_ctrl_msg_test_source, test_verify_bist_tx_mode2) { struct usb_pd_ctrl_msg_test_fixture *super_fixture = &fixture->fixture; uint32_t bdo = BDO(BDO_MODE_CARRIER2, 0); @@ -381,7 +381,7 @@ ZTEST_F(usb_pd_ctrl_msg_test_source, verify_bist_tx_mode2) * Expected Results * - Partner remains in BIST_TX state until hard reset is received. */ -ZTEST_F(usb_pd_ctrl_msg_test_source, verify_bist_tx_test_data) +ZTEST_F(usb_pd_ctrl_msg_test_source, test_verify_bist_tx_test_data) { struct usb_pd_ctrl_msg_test_fixture *super_fixture = &fixture->fixture; uint32_t bdo = BDO(BDO_MODE_TEST_DATA, 0); diff --git a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_rev3.c b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_rev3.c index 6a93e4704d..0ae92b88b4 100644 --- a/zephyr/test/drivers/default/src/integration/usbc/usb_pd_rev3.c +++ b/zephyr/test/drivers/default/src/integration/usbc/usb_pd_rev3.c @@ -176,7 +176,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_batt_cap_invalid) "Invalid battery ref bit should be set"); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_typec_status_using_rmdo) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_verify_typec_status_using_rmdo) { struct ec_params_typec_status params = { .port = TEST_PORT }; struct ec_response_typec_status response; @@ -190,7 +190,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_typec_status_using_rmdo) zassert_equal(response.sop_revision, fixture->source_5v_3a.rmdo >> 16); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_alert_msg) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_verify_alert_msg) { zassert_equal(pd_broadcast_alert_msg(ADO_OTP_EVENT), EC_SUCCESS); @@ -198,7 +198,8 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_alert_msg) zassert_true(fixture->src_ext.alert_received); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_alert_on_power_state_change) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, + test_verify_alert_on_power_state_change) { /* Suspend and check partner received Alert and Status messages */ hook_notify(HOOK_CHIPSET_SUSPEND); @@ -238,7 +239,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_alert_on_power_state_change) } ZTEST_F(usb_attach_5v_3a_pd_source_rev3, - verify_simultaneous_alert_status_resolution) + test_verify_simultaneous_alert_status_resolution) { zassert_false(fixture->src_ext.alert_received); zassert_false(fixture->src_ext.status_received); @@ -292,7 +293,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, } ZTEST_F(usb_attach_5v_3a_pd_source_rev3, - verify_inaction_on_pd_button_press_while_awake) + test_verify_inaction_on_pd_button_press_while_awake) { uint32_t ado; @@ -311,7 +312,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, } ZTEST_F(usb_attach_5v_3a_pd_source_rev3, - verify_inaction_on_invalid_pd_button_press) + test_verify_inaction_on_invalid_pd_button_press) { uint32_t ado; @@ -344,7 +345,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, k_sleep(K_SECONDS(10)); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_startup_on_pd_button_press) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_verify_startup_on_pd_button_press) { uint32_t ado; @@ -376,7 +377,8 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_startup_on_pd_button_press) zassert_true(chipset_in_state(CHIPSET_STATE_ON)); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_chipset_on_pd_button_behavior) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, + test_verify_chipset_on_pd_button_behavior) { uint32_t ado; @@ -443,7 +445,7 @@ ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_chipset_on_pd_button_behavior) k_sleep(K_SECONDS(10)); } -ZTEST_F(usb_attach_5v_3a_pd_source_rev3, verify_uvdm_not_supported) +ZTEST_F(usb_attach_5v_3a_pd_source_rev3, test_verify_uvdm_not_supported) { uint32_t vdm_header = VDO(USB_VID_GOOGLE, 0 /* unstructured */, 0); diff --git a/zephyr/test/drivers/default/src/motion_sense/motion_sense.c b/zephyr/test/drivers/default/src/motion_sense/motion_sense.c index 8291e0e1c6..9ea6509fe3 100644 --- a/zephyr/test/drivers/default/src/motion_sense/motion_sense.c +++ b/zephyr/test/drivers/default/src/motion_sense/motion_sense.c @@ -12,7 +12,7 @@ extern enum chipset_state_mask sensor_active; ZTEST_SUITE(motion_sense, drivers_predicate_post_main, NULL, NULL, NULL, NULL); -ZTEST_USER(motion_sense, ec_motion_sensor_fill_values) +ZTEST_USER(motion_sense, test_ec_motion_sensor_fill_values) { struct ec_response_motion_sensor_data dst = { .data = { 1, 2, 3 }, @@ -25,7 +25,7 @@ ZTEST_USER(motion_sense, ec_motion_sensor_fill_values) zassert_equal(dst.data[2], v[2]); } -ZTEST_USER(motion_sense, ec_motion_sensor_clamp_i16) +ZTEST_USER(motion_sense, test_ec_motion_sensor_clamp_i16) { zassert_equal(ec_motion_sensor_clamp_i16(0), 0); zassert_equal(ec_motion_sensor_clamp_i16(200), 200); @@ -36,7 +36,7 @@ ZTEST_USER(motion_sense, ec_motion_sensor_clamp_i16) NULL); } -ZTEST_USER(motion_sense, ec_motion_sense_get_ec_config) +ZTEST_USER(motion_sense, test_ec_motion_sense_get_ec_config) { /* illegal state, should be translated to S5 */ sensor_active = 42; diff --git a/zephyr/test/drivers/default/src/power_common.c b/zephyr/test/drivers/default/src/power_common.c index 58ca3977f9..529258e553 100644 --- a/zephyr/test/drivers/default/src/power_common.c +++ b/zephyr/test/drivers/default/src/power_common.c @@ -448,7 +448,7 @@ ZTEST(power_common, test_power_board_system_is_idle) /** * Test power console command */ -ZTEST(power_common, power_console_cmd) +ZTEST(power_common, test_power_console_cmd) { const char *buffer; size_t buffer_size; @@ -484,7 +484,7 @@ ZTEST(power_common, power_console_cmd) /** * Test powerinfo console command */ -ZTEST_USER(power_common, powerinfo_console_cmd) +ZTEST_USER(power_common, test_powerinfo_console_cmd) { char expected_buffer[32]; diff --git a/zephyr/test/drivers/default/src/util.c b/zephyr/test/drivers/default/src/util.c index 342ce9b971..ac5aed9736 100644 --- a/zephyr/test/drivers/default/src/util.c +++ b/zephyr/test/drivers/default/src/util.c @@ -8,7 +8,7 @@ #include <zephyr/fff.h> #include <zephyr/ztest.h> -ZTEST(util, reverse) +ZTEST(util, test_reverse) { uint8_t input[] = { 0, 1, 2, 3, 4 }; uint8_t expected[] = { 4, 3, 2, 1, 0 }; @@ -18,7 +18,7 @@ ZTEST(util, reverse) zassert_mem_equal(input, expected, sizeof(input), NULL); } -ZTEST(util, parse_offset_size__normal) +ZTEST(util, test_parse_offset_size__normal) { const char *argv[] = { "cmd", "123", "456" }; int argc = ARRAY_SIZE(argv); @@ -30,7 +30,7 @@ ZTEST(util, parse_offset_size__normal) zassert_equal(456, size, NULL); } -ZTEST(util, parse_offset_size__invalid_param1) +ZTEST(util, test_parse_offset_size__invalid_param1) { const char *argv[] = { "cmd", "xyz" /* <- bad */, "456" }; int argc = ARRAY_SIZE(argv); @@ -41,7 +41,7 @@ ZTEST(util, parse_offset_size__invalid_param1) parse_offset_size(argc, argv, 1, &offset, &size), NULL); } -ZTEST(util, parse_offset_size__invalid_param2) +ZTEST(util, test_parse_offset_size__invalid_param2) { const char *argv[] = { "cmd", "123", "xyz" /* <- bad */ }; int argc = ARRAY_SIZE(argv); @@ -52,7 +52,7 @@ ZTEST(util, parse_offset_size__invalid_param2) parse_offset_size(argc, argv, 1, &offset, &size), NULL); } -ZTEST(util, wait_for_ready) +ZTEST(util, test_wait_for_ready) { uint32_t reg; @@ -66,7 +66,7 @@ ZTEST(util, wait_for_ready) wait_for_ready(®, 1, 1); } -ZTEST(util, binary_from_bits) +ZTEST(util, test_binary_from_bits) { int input[] = { 0, @@ -79,7 +79,7 @@ ZTEST(util, binary_from_bits) zassert_equal(0, binary_from_bits(NULL, 0), NULL); } -ZTEST(util, ternary_from_bits) +ZTEST(util, test_ternary_from_bits) { int input[] = { 0, diff --git a/zephyr/test/drivers/dps/src/dps_config.c b/zephyr/test/drivers/dps/src/dps_config.c index a3c7736e31..aaa3ac14ff 100644 --- a/zephyr/test/drivers/dps/src/dps_config.c +++ b/zephyr/test/drivers/dps/src/dps_config.c @@ -69,13 +69,13 @@ ZTEST_F(dps_config, test_config) *config = fixture->saved_config; } -ZTEST(dps_config, console_cmd__print_info) +ZTEST(dps_config, test_console_cmd__print_info) { /* Print current status to console */ zassert_ok(shell_execute_cmd(get_ec_shell(), "dps"), NULL); } -ZTEST(dps_config, console_cmd__enable) +ZTEST(dps_config, test_console_cmd__enable) { /* Disable DPS first, then try enabling */ dps_enable(false); @@ -86,7 +86,7 @@ ZTEST(dps_config, console_cmd__enable) zassert_true(dps_is_enabled(), NULL); } -ZTEST(dps_config, console_cmd__disable) +ZTEST(dps_config, test_console_cmd__disable) { /* Should already by enabled due to before() function */ zassert_true(dps_is_enabled(), NULL); @@ -96,13 +96,13 @@ ZTEST(dps_config, console_cmd__disable) zassert_false(dps_is_enabled(), NULL); } -ZTEST(dps_config, console_cmd__fakepwr_print) +ZTEST(dps_config, test_console_cmd__fakepwr_print) { /* Print current fake power status to console */ zassert_ok(shell_execute_cmd(get_ec_shell(), "dps fakepwr"), NULL); } -ZTEST(dps_config, console_cmd__fakepwr_enable_disable) +ZTEST(dps_config, test_console_cmd__fakepwr_enable_disable) { zassert_false(dps_is_fake_enabled(), "fakepwr shouldn't be enabled by default"); @@ -119,7 +119,7 @@ ZTEST(dps_config, console_cmd__fakepwr_enable_disable) zassert_false(dps_is_fake_enabled(), NULL); } -ZTEST(dps_config, console_cmd__fakepwr_invalid) +ZTEST(dps_config, test_console_cmd__fakepwr_invalid) { /* Various invalid parameters */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "dps fakepwr 100"), NULL); @@ -129,7 +129,7 @@ ZTEST(dps_config, console_cmd__fakepwr_invalid) NULL); } -ZTEST(dps_config, console_cmd__debuglevel) +ZTEST(dps_config, test_console_cmd__debuglevel) { zassert_ok(shell_execute_cmd(get_ec_shell(), "dps debug 999"), NULL); @@ -137,7 +137,7 @@ ZTEST(dps_config, console_cmd__debuglevel) *dps_get_debug_level()); } -ZTEST(dps_config, console_cmd__setkmore) +ZTEST(dps_config, test_console_cmd__setkmore) { struct dps_config_t *config = dps_get_config(); char cmd[32]; @@ -165,7 +165,7 @@ ZTEST(dps_config, console_cmd__setkmore) config->k_less_pwr + 1); } -ZTEST(dps_config, console_cmd__setkless) +ZTEST(dps_config, test_console_cmd__setkless) { struct dps_config_t *config = dps_get_config(); char cmd[32]; @@ -193,7 +193,7 @@ ZTEST(dps_config, console_cmd__setkless) config->k_more_pwr - 1); } -ZTEST(dps_config, console_cmd__setksample) +ZTEST(dps_config, test_console_cmd__setksample) { struct dps_config_t *config = dps_get_config(); @@ -209,7 +209,7 @@ ZTEST(dps_config, console_cmd__setksample) config->k_sample); } -ZTEST(dps_config, console_cmd__setkwindow) +ZTEST(dps_config, test_console_cmd__setkwindow) { struct dps_config_t *config = dps_get_config(); @@ -222,7 +222,7 @@ ZTEST(dps_config, console_cmd__setkwindow) zassert_equal(4, config->k_window, "k_window is %d", config->k_window); } -ZTEST(dps_config, console_cmd__settcheck) +ZTEST(dps_config, test_console_cmd__settcheck) { struct dps_config_t *config = dps_get_config(); @@ -237,7 +237,7 @@ ZTEST(dps_config, console_cmd__settcheck) config->t_check); } -ZTEST(dps_config, console_cmd__settstable) +ZTEST(dps_config, test_console_cmd__settstable) { struct dps_config_t *config = dps_get_config(); @@ -252,7 +252,7 @@ ZTEST(dps_config, console_cmd__settstable) config->t_stable); } -ZTEST(dps_config, console_cmd__invalid) +ZTEST(dps_config, test_console_cmd__invalid) { /* Non-existent subcommand should fail */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "dps foobar xyz"), NULL); diff --git a/zephyr/test/drivers/dps/src/dps_selection.c b/zephyr/test/drivers/dps/src/dps_selection.c index a06aabc67f..4fd0175ffa 100644 --- a/zephyr/test/drivers/dps/src/dps_selection.c +++ b/zephyr/test/drivers/dps/src/dps_selection.c @@ -167,7 +167,7 @@ static void dps_selection_after(void *data) reset(); } -ZTEST_USER_F(dps_selection, dps_pdo_switch) +ZTEST_USER_F(dps_selection, test_dps_pdo_switch) { struct common_fixture *common = &fixture->common; struct tcpci_src_emul_data *src_ext = &common->src_ext; diff --git a/zephyr/test/drivers/gpio_unhook/src/is_not_ready.c b/zephyr/test/drivers/gpio_unhook/src/is_not_ready.c index ad0e41aa57..b0b6e627b0 100644 --- a/zephyr/test/drivers/gpio_unhook/src/is_not_ready.c +++ b/zephyr/test/drivers/gpio_unhook/src/is_not_ready.c @@ -13,7 +13,7 @@ ZTEST_SUITE(not_ready, drivers_predicate_post_main, NULL, NULL, NULL, NULL); -ZTEST(not_ready, bad_tcpc) +ZTEST(not_ready, test_bad_tcpc) { for (int i = 0; i < CONFIG_USB_PD_PORT_MAX_COUNT; i++) { gpio_flags_t flags; diff --git a/zephyr/test/drivers/host_cmd/src/adc.c b/zephyr/test/drivers/host_cmd/src/adc.c index a6e9beb62c..0931f667d3 100644 --- a/zephyr/test/drivers/host_cmd/src/adc.c +++ b/zephyr/test/drivers/host_cmd/src/adc.c @@ -14,7 +14,7 @@ FAKE_VALUE_FUNC(int, adc_read_channel, enum adc_channel); -ZTEST(hc_adc, normal_path) +ZTEST(hc_adc, test_normal_path) { struct ec_params_adc_read params = { .adc_channel = ADC_TEMP_SENSOR_CHARGER, @@ -31,7 +31,7 @@ ZTEST(hc_adc, normal_path) zassert_equal(123, response.adc_value); } -ZTEST(hc_adc, bad_ch_number) +ZTEST(hc_adc, test_bad_ch_number) { struct ec_params_adc_read params = { .adc_channel = ADC_CH_COUNT + 1, /* Invalid */ diff --git a/zephyr/test/drivers/host_cmd/src/battery_display_soc.c b/zephyr/test/drivers/host_cmd/src/battery_display_soc.c index 34a3881b5d..b158051195 100644 --- a/zephyr/test/drivers/host_cmd/src/battery_display_soc.c +++ b/zephyr/test/drivers/host_cmd/src/battery_display_soc.c @@ -10,7 +10,7 @@ #include <zephyr/ztest.h> -ZTEST_USER(battery_display_soc, happy_path) +ZTEST_USER(battery_display_soc, test_happy_path) { const uint32_t full_charge_as_tenths = CONFIG_BATT_HOST_FULL_FACTOR * 10; diff --git a/zephyr/test/drivers/host_cmd/src/host_command.c b/zephyr/test/drivers/host_cmd/src/host_command.c index e1168648d9..7118fbaab1 100644 --- a/zephyr/test/drivers/host_cmd/src/host_command.c +++ b/zephyr/test/drivers/host_cmd/src/host_command.c @@ -9,7 +9,7 @@ #include <zephyr/ztest.h> -ZTEST(host_cmd_host_commands, get_command_versions__v1) +ZTEST(host_cmd_host_commands, test_get_command_versions__v1) { struct ec_response_get_cmd_versions response; struct ec_params_get_cmd_versions_v1 params = { @@ -23,7 +23,7 @@ ZTEST(host_cmd_host_commands, get_command_versions__v1) zassert_equal(EC_VER_MASK(0) | EC_VER_MASK(1), response.version_mask); } -ZTEST(host_cmd_host_commands, get_command_versions__invalid_cmd) +ZTEST(host_cmd_host_commands, test_get_command_versions__invalid_cmd) { struct ec_response_get_cmd_versions response; struct ec_params_get_cmd_versions_v1 params = { @@ -37,7 +37,7 @@ ZTEST(host_cmd_host_commands, get_command_versions__invalid_cmd) zassert_equal(EC_RES_INVALID_PARAM, rv, "Got %d", rv); } -ZTEST(host_cmd_host_commands, get_comms_status) +ZTEST(host_cmd_host_commands, test_get_comms_status) { struct ec_response_get_comms_status response; int rv; @@ -52,7 +52,7 @@ ZTEST(host_cmd_host_commands, get_comms_status) zassert_false(response.flags); } -ZTEST(host_cmd_host_commands, resend_response) +ZTEST(host_cmd_host_commands, test_resend_response) { struct host_cmd_handler_args args = (struct host_cmd_handler_args)BUILD_HOST_COMMAND_SIMPLE( @@ -70,7 +70,7 @@ ZTEST(host_cmd_host_commands, resend_response) */ } -ZTEST(host_cmd_host_commands, get_proto_version) +ZTEST(host_cmd_host_commands, test_get_proto_version) { struct ec_response_proto_version response; int rv; diff --git a/zephyr/test/drivers/host_cmd/src/motion_sense.c b/zephyr/test/drivers/host_cmd/src/motion_sense.c index 919baf7219..c231f6f55e 100644 --- a/zephyr/test/drivers/host_cmd/src/motion_sense.c +++ b/zephyr/test/drivers/host_cmd/src/motion_sense.c @@ -872,7 +872,7 @@ ZTEST(host_cmd_motion_sense, test_spoof_invalid_mode) NULL); } -ZTEST(host_cmd_motion_sense, set_kb_wake_lid_angle) +ZTEST(host_cmd_motion_sense, test_set_kb_wake_lid_angle) { struct ec_response_motion_sense response; int16_t expected_lid_angle = 45; @@ -885,7 +885,7 @@ ZTEST(host_cmd_motion_sense, set_kb_wake_lid_angle) zassert_equal(expected_lid_angle, response.kb_wake_angle.ret); } -ZTEST(host_cmd_motion_sense, get_lid_angle) +ZTEST(host_cmd_motion_sense, test_get_lid_angle) { struct ec_response_motion_sense response; int rv; diff --git a/zephyr/test/drivers/host_cmd_read_memmap/src/read_memmap.c b/zephyr/test/drivers/host_cmd_read_memmap/src/read_memmap.c index 17ae4109f9..88472a3467 100644 --- a/zephyr/test/drivers/host_cmd_read_memmap/src/read_memmap.c +++ b/zephyr/test/drivers/host_cmd_read_memmap/src/read_memmap.c @@ -14,7 +14,7 @@ FAKE_VOID_FUNC(switch_interrupt, int); #endif -ZTEST(ec_cmd_read_memmap, id) +ZTEST(ec_cmd_read_memmap, test_id) { struct ec_params_read_memmap params = { .offset = EC_MEMMAP_ID, @@ -38,7 +38,7 @@ ZTEST(ec_cmd_read_memmap, id) zassert_equal('C', response[1]); } -ZTEST(ec_cmd_read_memmap, switches) +ZTEST(ec_cmd_read_memmap, test_switches) { struct ec_params_read_memmap params = { .offset = EC_MEMMAP_SWITCHES, @@ -66,7 +66,7 @@ ZTEST(ec_cmd_read_memmap, switches) } } -ZTEST(ec_cmd_read_memmap, invalid) +ZTEST(ec_cmd_read_memmap, test_invalid) { struct ec_params_read_memmap params = { .offset = EC_MEMMAP_ID, diff --git a/zephyr/test/drivers/host_command_memory_dump/src/host_command_memory_dump.c b/zephyr/test/drivers/host_command_memory_dump/src/host_command_memory_dump.c index 322980b784..373c066a3c 100644 --- a/zephyr/test/drivers/host_command_memory_dump/src/host_command_memory_dump.c +++ b/zephyr/test/drivers/host_command_memory_dump/src/host_command_memory_dump.c @@ -222,7 +222,7 @@ static enum ec_status fetch_memory_dump(struct mem_dump *dump) * Ensure that a memory dump returns empty list if requested before being * initialized. */ -ZTEST_USER(memory_dump, dump_before_registered) +ZTEST_USER(memory_dump, test_dump_before_registered) { struct ec_response_memory_dump_get_metadata metadata_response; int rv; @@ -236,7 +236,7 @@ ZTEST_USER(memory_dump, dump_before_registered) } /* Check if thread stack is included in memory dump */ -ZTEST_USER(memory_dump, dump_thread_stack) +ZTEST_USER(memory_dump, test_dump_thread_stack) { const uint32_t magic_val_1 = 0x11111111; const uint32_t magic_val_2 = 0x22222222; @@ -301,7 +301,7 @@ ZTEST_USER(memory_dump, dump_thread_stack) } /* Check if keyscan thread stack is included in memory dump */ -ZTEST_USER(memory_dump, verify_excluded_threads_not_dumped) +ZTEST_USER(memory_dump, test_verify_excluded_threads_not_dumped) { struct mem_dump dump; k_tid_t main_thread; diff --git a/zephyr/test/drivers/i2c_controller/src/i2c_controller.c b/zephyr/test/drivers/i2c_controller/src/i2c_controller.c index 594c3e6888..1044d14cd7 100644 --- a/zephyr/test/drivers/i2c_controller/src/i2c_controller.c +++ b/zephyr/test/drivers/i2c_controller/src/i2c_controller.c @@ -18,7 +18,7 @@ struct i2c_controller_fixture { struct basic_i2c_device_data *emul_data; }; -ZTEST_F(i2c_controller, write_read32_le) +ZTEST_F(i2c_controller, test_write_read32_le) { uint32_t expected = 0xAABBCCDD; uint32_t actual; @@ -38,7 +38,7 @@ ZTEST_F(i2c_controller, write_read32_le) expected); } -ZTEST_F(i2c_controller, write_read32_be) +ZTEST_F(i2c_controller, test_write_read32_be) { uint32_t expected = 0xAABBCCDD; uint32_t actual; @@ -61,7 +61,7 @@ ZTEST_F(i2c_controller, write_read32_be) expected); } -ZTEST_F(i2c_controller, write_read16_be) +ZTEST_F(i2c_controller, test_write_read16_be) { uint16_t expected = 0x1122; int actual; @@ -84,7 +84,7 @@ ZTEST_F(i2c_controller, write_read16_be) (uint16_t)actual, expected); } -ZTEST_F(i2c_controller, read32_fail) +ZTEST_F(i2c_controller, test_read32_fail) { int ret; uint32_t data; @@ -95,7 +95,7 @@ ZTEST_F(i2c_controller, read32_fail) zassert_equal(EC_ERROR_INVAL, ret, "Got %d", ret); } -ZTEST_F(i2c_controller, write32_fail) +ZTEST_F(i2c_controller, test_write32_fail) { int ret; @@ -105,7 +105,7 @@ ZTEST_F(i2c_controller, write32_fail) zassert_equal(EC_ERROR_INVAL, ret, "Got %d", ret); } -ZTEST_F(i2c_controller, field_update16) +ZTEST_F(i2c_controller, test_field_update16) { /* Write a 16-bit value with mask */ @@ -131,7 +131,7 @@ ZTEST_F(i2c_controller, field_update16) EC_ERROR_INVAL); } -ZTEST_F(i2c_controller, read_offset16__one_byte) +ZTEST_F(i2c_controller, test_read_offset16__one_byte) { /* Read 1 byte from a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -149,7 +149,7 @@ ZTEST_F(i2c_controller, read_offset16__one_byte) expected); } -ZTEST_F(i2c_controller, read_offset16__two_bytes) +ZTEST_F(i2c_controller, test_read_offset16__two_bytes) { /* Read 2 bytes from a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -168,7 +168,7 @@ ZTEST_F(i2c_controller, read_offset16__two_bytes) expected); } -ZTEST_F(i2c_controller, read_offset16__two_bytes_be) +ZTEST_F(i2c_controller, test_read_offset16__two_bytes_be) { /* Read 2 bytes from a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -190,7 +190,7 @@ ZTEST_F(i2c_controller, read_offset16__two_bytes_be) expected); } -ZTEST_F(i2c_controller, read_offset16__invalid) +ZTEST_F(i2c_controller, test_read_offset16__invalid) { /* Check length limits */ zassert_ok( @@ -203,7 +203,7 @@ ZTEST_F(i2c_controller, read_offset16__invalid) 1)); } -ZTEST_F(i2c_controller, write_offset16__one_byte) +ZTEST_F(i2c_controller, test_write_offset16__one_byte) { /* Write 1 byte to a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -221,7 +221,7 @@ ZTEST_F(i2c_controller, write_offset16__one_byte) expected); } -ZTEST_F(i2c_controller, write_offset16__two_bytes) +ZTEST_F(i2c_controller, test_write_offset16__two_bytes) { /* Write 2 bytes to a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -239,7 +239,7 @@ ZTEST_F(i2c_controller, write_offset16__two_bytes) expected); } -ZTEST_F(i2c_controller, write_offset16__two_bytes_be) +ZTEST_F(i2c_controller, test_write_offset16__two_bytes_be) { /* Write 2 bytes to a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -259,14 +259,14 @@ ZTEST_F(i2c_controller, write_offset16__two_bytes_be) expected); } -ZTEST_F(i2c_controller, write_offset16__invalid) +ZTEST_F(i2c_controller, test_write_offset16__invalid) { /* Check length limits */ zassert_ok(!i2c_write_offset16(fixture->port, fixture->addr, 0, 0, 3)); zassert_ok(!i2c_write_offset16(fixture->port, fixture->addr, 0, 0, -1)); } -ZTEST_F(i2c_controller, read_offset16_block) +ZTEST_F(i2c_controller, test_read_offset16_block) { /* Read 4 bytes from a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -285,7 +285,7 @@ ZTEST_F(i2c_controller, read_offset16_block) expected); } -ZTEST_F(i2c_controller, write_offset16_block) +ZTEST_F(i2c_controller, test_write_offset16_block) { /* Write 4 bytes to a 16-bit register offset, which will cause us to * access the extended register space of our i2c device @@ -304,7 +304,7 @@ ZTEST_F(i2c_controller, write_offset16_block) expected); } -ZTEST_F(i2c_controller, pec_disabled) +ZTEST_F(i2c_controller, test_pec_disabled) { uint16_t addr_flags; uint8_t write_data[] = { @@ -346,7 +346,7 @@ ZTEST_F(i2c_controller, pec_disabled) EC_ERROR_UNIMPLEMENTED); } -ZTEST_F(i2c_controller, i2c_xfer_unlocked__error_paths) +ZTEST_F(i2c_controller, test_i2c_xfer_unlocked__error_paths) { uint8_t out_buffer[1]; int out_size; diff --git a/zephyr/test/drivers/isl9241/CMakeLists.txt b/zephyr/test/drivers/isl9241/CMakeLists.txt new file mode 100644 index 0000000000..387fe2b85b --- /dev/null +++ b/zephyr/test/drivers/isl9241/CMakeLists.txt @@ -0,0 +1,5 @@ +# 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. + +target_sources(app PRIVATE src/isl9241.c) diff --git a/zephyr/test/drivers/isl9241/src/isl9241.c b/zephyr/test/drivers/isl9241/src/isl9241.c new file mode 100644 index 0000000000..d84d11a454 --- /dev/null +++ b/zephyr/test/drivers/isl9241/src/isl9241.c @@ -0,0 +1,232 @@ +/* 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 "battery_smart.h" +#include "charger.h" +#include "driver/charger/isl9241.h" +#include "driver/charger/isl9241_public.h" +#include "emul/emul_isl9241.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" +#include "test/drivers/utils.h" + +#include <zephyr/shell/shell.h> +#include <zephyr/ztest.h> + +#define ISL9241_NODE DT_NODELABEL(isl9241_emul) + +struct isl9241_driver_fixture { + const struct emul *isl9241_emul; +}; + +static void *isl9241_driver_setup(void) +{ + static struct isl9241_driver_fixture fix; + + fix.isl9241_emul = EMUL_DT_GET(ISL9241_NODE); + + return &fix; +} + +ZTEST_SUITE(isl9241_driver, drivers_predicate_post_main, isl9241_driver_setup, + NULL, NULL, NULL); + +ZTEST(isl9241_driver, test_input_current_limit) +{ + int input_current = 3000; + int temp; + + zassert_ok( + charger_set_input_current_limit(CHARGER_SOLO, input_current)); + zassert_ok(charger_get_input_current_limit(CHARGER_SOLO, &temp)); + zassert_equal(input_current, temp); +} + +ZTEST(isl9241_driver, test_device_id) +{ + int id; + + zassert_ok(charger_device_id(&id)); + zassert_equal(id, 0x000E); +} + +ZTEST(isl9241_driver, test_manuf_id) +{ + int id; + + zassert_ok(charger_manufacturer_id(&id)); + zassert_equal(id, 0x0049); +} + +/* + * Unforuntely, there is no "get frequency" API, so we'll directly compare + * expected register contents for this test + */ +struct frequency_test { + int khz; + uint16_t reg; +}; + +struct frequency_test frequency_table[] = { + { .khz = 1420, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_1420KHZ }, + { .khz = 1180, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_1180KHZ }, + { .khz = 1020, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_1020KHZ }, + { .khz = 890, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_890KHZ }, + { .khz = 808, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_808KHZ }, + { .khz = 724, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_724KHZ }, + { .khz = 656, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_656KHZ }, + { .khz = 600, .reg = ISL9241_CONTROL1_SWITCHING_FREQ_600KHZ }, +}; + +ZTEST_F(isl9241_driver, test_frequency) +{ + for (int i = 0; i < ARRAY_SIZE(frequency_table); i++) { + uint16_t register_peek; + struct frequency_test *t = &frequency_table[i]; + + zassert_ok(charger_set_frequency(t->khz)); + register_peek = isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_CONTROL1); + zassert_equal( + (register_peek & + ISL9241_CONTROL1_SWITCHING_FREQ_MASK) >> + 7, + t->reg, + "Failed to see correct register for %d kHz (0x%04x)\n", + t->khz, register_peek); + } +} + +ZTEST(isl9241_driver, test_options) +{ + /* We're free to set whatever we want in CONTROL0 15:0 */ + int option = ISL9241_CONTROL0_EN_CHARGE_PUMPS | + ISL9241_CONTROL0_EN_BYPASS_GATE; + int temp; + + zassert_ok(charger_set_option(option)); + zassert_ok(charger_get_option(&temp)); + zassert_equal(option, temp); +} + +ZTEST(isl9241_driver, test_inhibit_charge) +{ + int status; + + zassert_ok(charger_set_mode(CHARGE_FLAG_INHIBIT_CHARGE)); + zassert_ok(charger_get_status(&status)); + zassert_equal((status & CHARGER_CHARGE_INHIBITED), + CHARGER_CHARGE_INHIBITED); +} + +ZTEST_F(isl9241_driver, test_por_reset) +{ + zassert_ok(charger_set_mode(CHARGE_FLAG_POR_RESET)); + zassert_equal(isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_CONTROL3), + ISL9241_CONTROL3_DIGITAL_RESET); +} + +ZTEST(isl9241_driver, test_current) +{ + int current = 4000; + int temp; + + zassert_ok(charger_set_current(CHARGER_SOLO, current)); + zassert_ok(charger_get_current(CHARGER_SOLO, &temp)); + zassert_equal(temp, current); +} + +ZTEST(isl9241_driver, test_voltage) +{ + int voltage = 12000; + int temp; + + zassert_ok(charger_set_voltage(CHARGER_SOLO, voltage)); + zassert_ok(charger_get_voltage(CHARGER_SOLO, &temp)); + zassert_equal(temp, voltage); +} + +ZTEST_F(isl9241_driver, test_vbus_voltage) +{ + int voltage = 5088; /* ADC is in 96 mV steps */ + int status; + + isl9241_emul_set_vbus(fixture->isl9241_emul, voltage); + zassert_ok(charger_get_status(&status)); + zassert_equal((status & CHARGER_AC_PRESENT), CHARGER_AC_PRESENT); + + zassert_ok(charger_get_vbus_voltage(0, &status)); + zassert_equal(voltage, status); +} + +ZTEST_F(isl9241_driver, test_vsys_voltage) +{ + int voltage = 9984; /* ADC is in 96 mV steps */ + int temp; + + isl9241_emul_set_vsys(fixture->isl9241_emul, voltage); + zassert_ok(charger_get_vsys_voltage(0, &temp)); + zassert_equal(voltage, temp); +} + +ZTEST(isl9241_driver, test_post_init) +{ + /* Note: function is a no-op for this chip */ + zassert_ok(charger_post_init()); +} + +ZTEST_F(isl9241_driver, test_ac_prochot) +{ + /* Test bounds settings for allowed currents */ + /* Note: AC currents are scaled by the default of 20 */ + int scale = 20 / CONFIG_CHARGER_SENSE_RESISTOR_AC; + int cur = (ISL9241_AC_PROCHOT_CURRENT_MAX + 100) * scale; + + printf("cur %d ", cur); + zassert_ok(isl9241_set_ac_prochot(CHARGER_SOLO, cur)); + printf("%d\n", isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_AC_PROCHOT)); + zassert_equal(isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_AC_PROCHOT), + ISL9241_AC_PROCHOT_CURRENT_MAX); + + cur = (ISL9241_AC_PROCHOT_CURRENT_MIN - 100) * scale; + printf("cur %d ", cur); + zassert_ok(isl9241_set_ac_prochot(CHARGER_SOLO, cur)); + printf("%d\n", isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_AC_PROCHOT)); + zassert_equal(isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_AC_PROCHOT), + ISL9241_AC_PROCHOT_CURRENT_MIN); +} + +ZTEST_F(isl9241_driver, test_dc_prochot) +{ + /* Test bounds settings for allowed currents */ + /* Note: DC currents are scaled by default of 10 */ + int scale = 10 / CONFIG_CHARGER_SENSE_RESISTOR; + int cur = (ISL9241_DC_PROCHOT_CURRENT_MAX + 100) * scale; + + zassert_ok(isl9241_set_dc_prochot(CHARGER_SOLO, cur)); + zassert_equal(isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_DC_PROCHOT), + ISL9241_DC_PROCHOT_CURRENT_MAX); + + cur = (ISL9241_DC_PROCHOT_CURRENT_MIN - 100) * scale; + zassert_ok(isl9241_set_dc_prochot(CHARGER_SOLO, cur)); + zassert_equal(isl9241_emul_peek(fixture->isl9241_emul, + ISL9241_REG_DC_PROCHOT), + ISL9241_DC_PROCHOT_CURRENT_MIN); +} + +ZTEST(isl9241_driver, test_prochot_dump) +{ + /* + * Note: this function's purpose is to print register contents to the + * console for debugging + */ + print_charger_prochot(CHARGER_SOLO); +} diff --git a/zephyr/test/drivers/isl9241/usbc.dts b/zephyr/test/drivers/isl9241/usbc.dts new file mode 100644 index 0000000000..94ddccb7d3 --- /dev/null +++ b/zephyr/test/drivers/isl9241/usbc.dts @@ -0,0 +1,27 @@ +/* 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 { + port0@0 { + compatible = "named-usbc-port"; + chg = <&isl9241_emul>; + }; + }; +}; + +&i2c0 { + status="okay"; + + /delete-node/ isl923x@9; + + isl9241_emul: isl9241_emul@9 { + compatible = "intersil,isl9241"; + status = "okay"; + reg = <0x9>; + }; +}; diff --git a/zephyr/test/drivers/keyboard_scan/src/keyboard_backlight.c b/zephyr/test/drivers/keyboard_scan/src/keyboard_backlight.c index 77131d5d5f..0f07b2fbcd 100644 --- a/zephyr/test/drivers/keyboard_scan/src/keyboard_backlight.c +++ b/zephyr/test/drivers/keyboard_scan/src/keyboard_backlight.c @@ -37,7 +37,7 @@ static uint16_t set_backlight_percent_helper(uint8_t percent) return ec_cmd_pwm_set_keyboard_backlight(NULL, ¶ms); } -ZTEST(keyboard_backlight, host_command_set_backlight__normal) +ZTEST(keyboard_backlight, test_host_command_set_backlight__normal) { /* Set the backlight intensity level to this and verify */ uint8_t expected_percentage = 50; @@ -46,7 +46,7 @@ ZTEST(keyboard_backlight, host_command_set_backlight__normal) zassert_equal(expected_percentage, kblight_get(), NULL); } -ZTEST(keyboard_backlight, host_command_set_backlight__out_of_range) +ZTEST(keyboard_backlight, test_host_command_set_backlight__out_of_range) { /* Too high */ uint8_t expected_percentage = 101; @@ -55,7 +55,7 @@ ZTEST(keyboard_backlight, host_command_set_backlight__out_of_range) set_backlight_percent_helper(expected_percentage), NULL); } -ZTEST(keyboard_backlight, host_command_get_backlight__normal) +ZTEST(keyboard_backlight, test_host_command_get_backlight__normal) { /* Set this backlight intensity and verify via host command */ uint8_t expected_percentage = 50; @@ -74,7 +74,7 @@ ZTEST(keyboard_backlight, host_command_get_backlight__normal) zassert_equal(1, response.enabled, "Got 0x%02x", response.enabled); } -ZTEST(keyboard_backlight, console_command__noargs) +ZTEST(keyboard_backlight, test_console_command__noargs) { /* Command should print current status. Set backlight on and to 70% */ @@ -94,7 +94,7 @@ ZTEST(keyboard_backlight, console_command__noargs) "Actual string: `%s`", outbuffer); } -ZTEST(keyboard_backlight, console_command__set_on) +ZTEST(keyboard_backlight, test_console_command__set_on) { /* Command should enable backlight to given intensity */ @@ -103,7 +103,7 @@ ZTEST(keyboard_backlight, console_command__set_on) zassert_equal(1, kblight_get_current_enable(), NULL); } -ZTEST(keyboard_backlight, console_command__set_off) +ZTEST(keyboard_backlight, test_console_command__set_off) { zassert_ok(set_backlight_percent_helper(40), NULL); k_sleep(K_MSEC(50)); @@ -114,7 +114,7 @@ ZTEST(keyboard_backlight, console_command__set_off) zassert_equal(0, kblight_get_current_enable(), NULL); } -ZTEST(keyboard_backlight, console_command__bad_params) +ZTEST(keyboard_backlight, test_console_command__bad_params) { zassert_equal(EC_ERROR_PARAM1, shell_execute_cmd(get_ec_shell(), "kblight NaN"), NULL); @@ -124,7 +124,7 @@ ZTEST(keyboard_backlight, console_command__bad_params) shell_execute_cmd(get_ec_shell(), "kblight 101"), NULL); } -ZTEST(keyboard_backlight, set_backlight__device_not_ready) +ZTEST(keyboard_backlight, test_set_backlight__device_not_ready) { const struct pwm_dt_spec kblight_pwm_dt = PWM_DT_SPEC_GET(KBLIGHT_PWM_NODE); diff --git a/zephyr/test/drivers/keyboard_scan/src/keyboard_scan.c b/zephyr/test/drivers/keyboard_scan/src/keyboard_scan.c index 71961c0a86..fdae74cac1 100644 --- a/zephyr/test/drivers/keyboard_scan/src/keyboard_scan.c +++ b/zephyr/test/drivers/keyboard_scan/src/keyboard_scan.c @@ -102,7 +102,7 @@ ZTEST(keyboard_scan, test_press_enter) k_sleep(K_MSEC(100)); } -ZTEST(keyboard_scan, console_command_ksstate__noargs) +ZTEST(keyboard_scan, test_console_command_ksstate__noargs) { const char *outbuffer; size_t buffer_size; @@ -124,7 +124,7 @@ ZTEST(keyboard_scan, console_command_ksstate__noargs) zassert_true(keyboard_scan_is_enabled()); } -ZTEST(keyboard_scan, console_command_ksstate__force) +ZTEST(keyboard_scan, test_console_command_ksstate__force) { /* This command forces the keyboard to start scanning (if not already) * and enable state change printing. To test: turn scanning off, run @@ -140,7 +140,7 @@ ZTEST(keyboard_scan, console_command_ksstate__force) zassert_true(keyboard_scan_get_print_state_changes()); } -ZTEST(keyboard_scan, console_command_ksstate__on_off) +ZTEST(keyboard_scan, test_console_command_ksstate__on_off) { /* This command turns state change printing on/off */ @@ -153,13 +153,13 @@ ZTEST(keyboard_scan, console_command_ksstate__on_off) zassert_false(keyboard_scan_get_print_state_changes()); } -ZTEST(keyboard_scan, console_command_ksstate__invalid) +ZTEST(keyboard_scan, test_console_command_ksstate__invalid) { /* Pass a string that cannot be parsed as a bool */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "ksstate xyz")); } -ZTEST(keyboard_scan, console_command_kbpress__noargs) +ZTEST(keyboard_scan, test_console_command_kbpress__noargs) { const char *outbuffer; size_t buffer_size; @@ -176,7 +176,7 @@ ZTEST(keyboard_scan, console_command_kbpress__noargs) outbuffer); } -ZTEST(keyboard_scan, console_command_kbpress__invalid) +ZTEST(keyboard_scan, test_console_command_kbpress__invalid) { /* Row or column number out of range, or wrong type */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "kbpress -1 0")); @@ -195,22 +195,16 @@ ZTEST(keyboard_scan, console_command_kbpress__invalid) */ FAKE_VOID_FUNC(key_state_changed, int, int, uint8_t); -ZTEST(keyboard_scan, console_command_kbpress__press_and_release) +ZTEST(keyboard_scan, test_console_command_kbpress__press) { - /* Pres and release a key */ + /* Press and release a key */ zassert_ok(shell_execute_cmd(get_ec_shell(), "kbpress 1 2")); - /* Hold a key down */ - zassert_ok(shell_execute_cmd(get_ec_shell(), "kbpress 3 4 1")); - - /* Release the key */ - zassert_ok(shell_execute_cmd(get_ec_shell(), "kbpress 3 4 0")); - /* Pause a bit to allow the key scan task to process. */ - k_sleep(K_MSEC(200)); + k_sleep(K_MSEC(500)); - /* Expect four key events */ - zassert_equal(4, key_state_changed_fake.call_count); + /* Expect two key events */ + zassert_equal(2, key_state_changed_fake.call_count); /* Press col=1,row=2 (state==1) */ zassert_equal(1, key_state_changed_fake.arg1_history[0]); @@ -221,19 +215,36 @@ ZTEST(keyboard_scan, console_command_kbpress__press_and_release) zassert_equal(1, key_state_changed_fake.arg1_history[1]); zassert_equal(2, key_state_changed_fake.arg0_history[1]); zassert_false(key_state_changed_fake.arg2_history[1]); +} + +ZTEST(keyboard_scan, test_console_command_kbpress__down_and_up) +{ + /* Hold a key down */ + zassert_ok(shell_execute_cmd(get_ec_shell(), "kbpress 3 4 1")); + + /* Release the key */ + zassert_ok(shell_execute_cmd(get_ec_shell(), "kbpress 3 4 0")); + + /* Pause a bit to allow the key scan task to process. */ + k_sleep(K_MSEC(500)); + + /* Expect two key events */ + zassert_equal(2, key_state_changed_fake.call_count, + "Actual call_count=%d", + key_state_changed_fake.call_count); /* Press col=3,row=4 (state==1) */ - zassert_equal(3, key_state_changed_fake.arg1_history[2]); - zassert_equal(4, key_state_changed_fake.arg0_history[2]); - zassert_true(key_state_changed_fake.arg2_history[2]); + zassert_equal(3, key_state_changed_fake.arg1_history[0]); + zassert_equal(4, key_state_changed_fake.arg0_history[0]); + zassert_true(key_state_changed_fake.arg2_history[0]); /* Release col=3,row=4 (state==0) */ - zassert_equal(3, key_state_changed_fake.arg1_history[3]); - zassert_equal(4, key_state_changed_fake.arg0_history[3]); - zassert_false(key_state_changed_fake.arg2_history[3]); + zassert_equal(3, key_state_changed_fake.arg1_history[1]); + zassert_equal(4, key_state_changed_fake.arg0_history[1]); + zassert_false(key_state_changed_fake.arg2_history[1]); } -ZTEST(keyboard_scan, host_command_simulate_key__locked) +ZTEST(keyboard_scan, test_host_command_simulate_key__locked) { uint16_t ret; @@ -245,7 +256,7 @@ ZTEST(keyboard_scan, host_command_simulate_key__locked) zassert_equal(EC_RES_ACCESS_DENIED, ret, "Command returned %u", ret); } -ZTEST(keyboard_scan, host_command_simulate_key__bad_params) +ZTEST(keyboard_scan, test_host_command_simulate_key__bad_params) { uint16_t ret; @@ -284,7 +295,7 @@ static uint16_t send_keypress_host_command(uint8_t col, uint8_t row, return host_command_process(&args); } -ZTEST(keyboard_scan, host_command_simulate__key_press) +ZTEST(keyboard_scan, test_host_command_simulate__key_press) { uint16_t ret; @@ -316,7 +327,7 @@ ZTEST(keyboard_scan, host_command_simulate__key_press) FAKE_VOID_FUNC(system_enter_hibernate, uint32_t, uint32_t); FAKE_VOID_FUNC(chipset_reset, int); -ZTEST(keyboard_scan, special_key_combos) +ZTEST(keyboard_scan, test_special_key_combos) { system_is_locked_fake.return_val = 0; zassert_false(system_is_locked(), "Expecting unlocked system."); @@ -380,6 +391,11 @@ static void reset_keyboard(void *data) /* Reset KB emulator */ clear_emulated_keys(); + /* Clear debouncing state to prevent latent key presses from appearing + * in a later test. + */ + test_keyboard_scan_debounce_reset(); + /* Reset all mocks. */ RESET_FAKE(key_state_changed); RESET_FAKE(system_is_locked); diff --git a/zephyr/test/drivers/keyboard_scan/src/mkbp_info.c b/zephyr/test/drivers/keyboard_scan/src/mkbp_info.c index 2e3e3ecf94..0588324c91 100644 --- a/zephyr/test/drivers/keyboard_scan/src/mkbp_info.c +++ b/zephyr/test/drivers/keyboard_scan/src/mkbp_info.c @@ -15,7 +15,7 @@ #include <emul/emul_kb_raw.h> -ZTEST(mkbp_info, host_command_mkbp_info__keyboard_info) +ZTEST(mkbp_info, test_host_command_mkbp_info__keyboard_info) { /* Get the number of keyboard rows and columns */ @@ -31,7 +31,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__keyboard_info) zassert_equal(KEYBOARD_COLS_MAX, response.cols, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__supported_buttons) +ZTEST(mkbp_info, test_host_command_mkbp_info__supported_buttons) { /* Get the set of supported buttons */ @@ -47,7 +47,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__supported_buttons) zassert_equal(get_supported_buttons(), response.buttons, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__supported_switches) +ZTEST(mkbp_info, test_host_command_mkbp_info__supported_switches) { /* Get the set of supported switches */ @@ -63,7 +63,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__supported_switches) zassert_equal(get_supported_switches(), response.switches, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__supported_invalid) +ZTEST(mkbp_info, test_host_command_mkbp_info__supported_invalid) { /* Request support info on a non-existent type of input device. */ @@ -79,7 +79,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__supported_invalid) "Host command didn't fail properly: %d", ret); } -ZTEST(mkbp_info, host_command_mkbp_info__current_keyboard_matrix) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_keyboard_matrix) { /* Hold down a key so we can validate the returned keyboard matrix state */ @@ -107,7 +107,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_keyboard_matrix) "Expected key is not pressed"); } -ZTEST(mkbp_info, host_command_mkbp_info__current_host_events) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_host_events) { int ret; union ec_response_get_next_data response; @@ -121,7 +121,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_host_events) zassert_equal((uint32_t)host_get_events(), response.host_event, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__current_host_events64) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_host_events64) { int ret; union ec_response_get_next_data response; @@ -135,7 +135,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_host_events64) zassert_equal(host_get_events(), response.host_event64, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__current_buttons) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_buttons) { int ret; union ec_response_get_next_data response; @@ -149,7 +149,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_buttons) zassert_equal(mkbp_get_button_state(), response.buttons, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__current_switches) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_switches) { int ret; union ec_response_get_next_data response; @@ -163,7 +163,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_switches) zassert_equal(mkbp_get_switch_state(), response.switches, NULL); } -ZTEST(mkbp_info, host_command_mkbp_info__current_invalid) +ZTEST(mkbp_info, test_host_command_mkbp_info__current_invalid) { int ret; union ec_response_get_next_data response; @@ -177,7 +177,7 @@ ZTEST(mkbp_info, host_command_mkbp_info__current_invalid) ret); } -ZTEST(mkbp_info, host_command_mkbp_info__invalid) +ZTEST(mkbp_info, test_host_command_mkbp_info__invalid) { int ret; union ec_response_get_next_data response; diff --git a/zephyr/test/drivers/led_driver/src/led_common.c b/zephyr/test/drivers/led_driver/src/led_common.c index 7bab7498db..d865aba8e0 100644 --- a/zephyr/test/drivers/led_driver/src/led_common.c +++ b/zephyr/test/drivers/led_driver/src/led_common.c @@ -9,7 +9,7 @@ #include <zephyr/fff.h> #include <zephyr/ztest.h> -ZTEST(led_common, host_command__query) +ZTEST(led_common, test_host_command__query) { /* Gets the brightness range for an LED */ @@ -34,7 +34,7 @@ ZTEST(led_common, host_command__query) sizeof(expected_brightness_ranges), NULL); } -ZTEST(led_common, host_command__invalid_led) +ZTEST(led_common, test_host_command__invalid_led) { /* Try accessing info on a non-existent LED */ @@ -51,7 +51,7 @@ ZTEST(led_common, host_command__invalid_led) ret); } -ZTEST(led_common, host_command__supported_channel) +ZTEST(led_common, test_host_command__supported_channel) { /* Try setting brightness on a color channel that is not supported */ @@ -72,7 +72,7 @@ ZTEST(led_common, host_command__supported_channel) ret); } -ZTEST(led_common, host_command__manual_control) +ZTEST(led_common, test_host_command__manual_control) { /* Set brightness for an LED directly */ @@ -100,7 +100,7 @@ ZTEST(led_common, host_command__manual_control) FAKE_VOID_FUNC(board_led_auto_control); -ZTEST(led_common, host_command__auto_control) +ZTEST(led_common, test_host_command__auto_control) { /* Configure an LED for automatic control */ diff --git a/zephyr/test/drivers/nx20p348x/CMakeLists.txt b/zephyr/test/drivers/nx20p348x/CMakeLists.txt new file mode 100644 index 0000000000..b2c202bd5b --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/CMakeLists.txt @@ -0,0 +1,9 @@ +# 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. + +target_include_directories(app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) + +target_sources(app PRIVATE src/nx20p348x.c) +target_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_NX20P3481 app PRIVATE src/nx20p3481.c) +target_sources_ifdef(CONFIG_PLATFORM_EC_USBC_PPC_NX20P3483 app PRIVATE src/nx20p3483.c) diff --git a/zephyr/test/drivers/nx20p348x/include/nx20p348x_test_shared.h b/zephyr/test/drivers/nx20p348x/include/nx20p348x_test_shared.h new file mode 100644 index 0000000000..633dd2e700 --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/include/nx20p348x_test_shared.h @@ -0,0 +1,17 @@ +/* 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. + */ + +#ifndef ZEPHYR_TEST_DRIVERS_NX20_348X_TEST_SHARED_H_ +#define ZEPHYR_TEST_DRIVERS_NX20_348X_TEST_SHARED_H_ + +#include "emul/emul_nx20p348x.h" + +#define TEST_PORT USBC_PORT_C0 + +struct nx20p348x_driver_fixture { + const struct emul *nx20p348x_emul; +}; + +#endif /* ZEPHYR_TEST_DRIVERS_NX20_348X_TEST_SHARED_H_ */ diff --git a/zephyr/test/drivers/nx20p348x/src/nx20p3481.c b/zephyr/test/drivers/nx20p348x/src/nx20p3481.c new file mode 100644 index 0000000000..0897c3e8d1 --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/src/nx20p3481.c @@ -0,0 +1,49 @@ +/* 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 "driver/ppc/nx20p348x.h" +#include "nx20p348x_test_shared.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" +#include "test/drivers/utils.h" +#include "usbc_ppc.h" + +#include <zephyr/shell/shell.h> +#include <zephyr/shell/shell_dummy.h> +#include <zephyr/ztest.h> + +ZTEST_F(nx20p348x_driver, test_sink_enable) +{ + uint8_t reg; + + zassert_ok(ppc_vbus_sink_enable(TEST_PORT, true)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_SWITCH_CONTROL_REG); + zassert_equal(reg & NX20P3481_SWITCH_CONTROL_HVSNK, + NX20P3481_SWITCH_CONTROL_HVSNK); + + zassert_ok(ppc_vbus_sink_enable(TEST_PORT, false)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_SWITCH_CONTROL_REG); + zassert_not_equal(reg & NX20P3481_SWITCH_CONTROL_HVSNK, + NX20P3481_SWITCH_CONTROL_HVSNK); +} + +ZTEST_F(nx20p348x_driver, test_source_enable) +{ + uint8_t reg; + + zassert_ok(ppc_vbus_source_enable(TEST_PORT, true)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_SWITCH_CONTROL_REG); + zassert_equal(reg & NX20P3481_SWITCH_CONTROL_5VSRC, + NX20P3481_SWITCH_CONTROL_5VSRC); + + zassert_ok(ppc_vbus_source_enable(TEST_PORT, false)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_SWITCH_CONTROL_REG); + zassert_not_equal(reg & NX20P3481_SWITCH_CONTROL_5VSRC, + NX20P3481_SWITCH_CONTROL_5VSRC); +} diff --git a/zephyr/test/drivers/nx20p348x/src/nx20p3483.c b/zephyr/test/drivers/nx20p348x/src/nx20p3483.c new file mode 100644 index 0000000000..7d754112a9 --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/src/nx20p3483.c @@ -0,0 +1,27 @@ +/* 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 "nx20p348x_test_shared.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" +#include "test/drivers/utils.h" +#include "usbc_ppc.h" + +#include <zephyr/shell/shell.h> +#include <zephyr/shell/shell_dummy.h> +#include <zephyr/ztest.h> + +ZTEST(nx20p348x_driver, test_sink_enable_timeout_failure) +{ + /* Note: PPC requires a TCPC GPIO to enable its sinking */ + zassert_equal(ppc_vbus_sink_enable(TEST_PORT, true), EC_ERROR_TIMEOUT); +} + +ZTEST(nx20p348x_driver, test_source_enable_timeout_failure) +{ + /* Note: PPC requires a TCPC GPIO to enable its sourcing */ + zassert_equal(ppc_vbus_source_enable(TEST_PORT, true), + EC_ERROR_TIMEOUT); +} diff --git a/zephyr/test/drivers/nx20p348x/src/nx20p348x.c b/zephyr/test/drivers/nx20p348x/src/nx20p348x.c new file mode 100644 index 0000000000..5ec7ba5ae1 --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/src/nx20p348x.c @@ -0,0 +1,227 @@ +/* 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 "battery_smart.h" +#include "charger.h" +#include "console.h" +#include "driver/ppc/nx20p348x.h" +#include "driver/ppc/nx20p348x_public.h" +#include "nx20p348x_test_shared.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" +#include "test/drivers/utils.h" +#include "usb_pd_tcpm.h" + +#include <zephyr/shell/shell.h> +#include <zephyr/shell/shell_dummy.h> +#include <zephyr/ztest.h> + +#define NX20P383X_NODE DT_NODELABEL(nx20p348x_emul) + +static void *nx20p348x_driver_setup(void) +{ + static struct nx20p348x_driver_fixture fix; + + fix.nx20p348x_emul = EMUL_DT_GET(NX20P383X_NODE); + + return &fix; +} + +ZTEST_SUITE(nx20p348x_driver, drivers_predicate_post_main, + nx20p348x_driver_setup, NULL, NULL, NULL); + +struct curr_limit_pair { + enum tcpc_rp_value rp; + uint8_t reg; +}; + +/* Note: Register values are slightly higher to account for overshoot */ +static struct curr_limit_pair currents[] = { + { .rp = TYPEC_RP_3A0, .reg = NX20P348X_ILIM_3_200 }, + { .rp = TYPEC_RP_1A5, .reg = NX20P348X_ILIM_1_600 }, + { .rp = TYPEC_RP_USB, .reg = NX20P348X_ILIM_0_600 }, +}; + +ZTEST_F(nx20p348x_driver, test_source_curr_limits) +{ + for (int i = 0; i < ARRAY_SIZE(currents); i++) { + uint8_t read; + + ppc_set_vbus_source_current_limit(TEST_PORT, currents[i].rp); + read = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_5V_SRC_OCP_THRESHOLD_REG); + zassert_equal( + (read & NX20P348X_ILIM_MASK), currents[i].reg, + "Failed to see correct threshold for Rp %d (reg: 0x%02x)", + currents[i].rp, read); + } +} + +ZTEST_F(nx20p348x_driver, test_discharge_vbus) +{ + uint8_t reg; + + zassert_ok(ppc_discharge_vbus(TEST_PORT, true)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_DEVICE_CONTROL_REG); + zassert_equal((reg & NX20P348X_CTRL_VBUSDIS_EN), + NX20P348X_CTRL_VBUSDIS_EN); + + zassert_ok(ppc_discharge_vbus(TEST_PORT, false)); + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_DEVICE_CONTROL_REG); + zassert_not_equal((reg & NX20P348X_CTRL_VBUSDIS_EN), + NX20P348X_CTRL_VBUSDIS_EN); +} + +ZTEST(nx20p348x_driver, test_ppc_dump) +{ + const struct shell *shell_zephyr = get_ec_shell(); + const char *outbuffer; + size_t buffer_size; + + shell_backend_dummy_clear_output(shell_zephyr); + + /* This chip supports PPC dump, so should return success */ + zassert_ok(shell_execute_cmd(shell_zephyr, "ppc_dump 0")); + outbuffer = shell_backend_dummy_get_output(shell_zephyr, &buffer_size); + + zassert_true(buffer_size > 0); + + /* Weakly verify something reasonable was output to console */ + zassert_not_null(strstr(outbuffer, "]: 0x")); +} + +ZTEST_F(nx20p348x_driver, test_db_exit_err) +{ + uint8_t reg; + + /* Test an error to exit dead battery mode */ + nx20p348x_emul_set_interrupt1(fixture->nx20p348x_emul, + NX20P348X_INT1_DBEXIT_ERR); + + /* Give the interrupt time to process */ + k_sleep(K_MSEC(500)); + + /* Interrupt should have set DB exit in the control register */ + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_DEVICE_CONTROL_REG); + zassert_equal((reg & NX20P348X_CTRL_DB_EXIT), NX20P348X_CTRL_DB_EXIT); +} + +ZTEST_F(nx20p348x_driver, test_db_exit_err_max) +{ + uint8_t reg; + + /* Set a DB exit error 10 times */ + for (int i = 0; i < 10; i++) { + nx20p348x_emul_set_interrupt1(fixture->nx20p348x_emul, + NX20P348X_INT1_DBEXIT_ERR); + k_sleep(K_MSEC(500)); + } + + /* Interrupt should now be masked by the driver */ + reg = nx20p348x_emul_peek(fixture->nx20p348x_emul, + NX20P348X_INTERRUPT1_MASK_REG); + zassert_equal((reg & NX20P348X_INT1_DBEXIT_ERR), + NX20P348X_INT1_DBEXIT_ERR); +} + +/* Add filler in case of event data */ +#define MAX_RESPONSE_PD_LOG_ENTRY_SIZE (sizeof(struct ec_response_pd_log) + 16) + +static void flush_pd_log(void) +{ + uint8_t response_buffer[MAX_RESPONSE_PD_LOG_ENTRY_SIZE]; + struct ec_response_pd_log *response = + (struct ec_response_pd_log *)response_buffer; + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_SIMPLE(EC_CMD_PD_GET_LOG_ENTRY, 0); + + args.response = response; + args.response_max = sizeof(response_buffer); + + for (int i = 0; i < 10; i++) { + zassert_ok(host_command_process(&args)); + + if (response->type == PD_EVENT_NO_ENTRY) + return; + + k_sleep(K_MSEC(500)); + } + + zassert_unreachable("Failed to flush PD log"); +} + +ZTEST_F(nx20p348x_driver, test_vbus_overcurrent) +{ + uint8_t response_buffer[MAX_RESPONSE_PD_LOG_ENTRY_SIZE]; + struct ec_response_pd_log *response = + (struct ec_response_pd_log *)response_buffer; + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_SIMPLE(EC_CMD_PD_GET_LOG_ENTRY, 0); + + flush_pd_log(); + + /* Set up overcurrent */ + nx20p348x_emul_set_interrupt1(fixture->nx20p348x_emul, + NX20P348X_INT1_OC_5VSRC); + k_sleep(K_MSEC(500)); + + args.response = response; + args.response_max = sizeof(response_buffer); + + zassert_ok(host_command_process(&args)); + zassert_equal(TEST_PORT, PD_LOG_PORT(response->size_port)); + zassert_equal(0, PD_LOG_SIZE(response->size_port)); + zassert_equal(PD_EVENT_PS_FAULT, response->type); + zassert_equal(PS_FAULT_OCP, response->data); +} + +ZTEST_F(nx20p348x_driver, test_vbus_reverse_current) +{ + uint8_t response_buffer[MAX_RESPONSE_PD_LOG_ENTRY_SIZE]; + struct ec_response_pd_log *response = + (struct ec_response_pd_log *)response_buffer; + struct host_cmd_handler_args args = + BUILD_HOST_COMMAND_SIMPLE(EC_CMD_PD_GET_LOG_ENTRY, 0); + + flush_pd_log(); + + /* Set up reverse current */ + nx20p348x_emul_set_interrupt1(fixture->nx20p348x_emul, + NX20P348X_INT1_RCP_5VSRC); + k_sleep(K_MSEC(500)); + + args.response = response; + args.response_max = sizeof(response_buffer); + + zassert_ok(host_command_process(&args)); + zassert_equal(TEST_PORT, PD_LOG_PORT(response->size_port)); + zassert_equal(0, PD_LOG_SIZE(response->size_port)); + zassert_equal(PD_EVENT_PS_FAULT, response->type); + zassert_equal(PS_FAULT_OCP, response->data); +} + +ZTEST_F(nx20p348x_driver, test_vbus_short) +{ + const struct shell *shell_zephyr = get_ec_shell(); + const char *outbuffer; + size_t buffer_size; + + shell_backend_dummy_clear_output(shell_zephyr); + + /* Set up Vbus short, which we only report in the console */ + nx20p348x_emul_set_interrupt1(fixture->nx20p348x_emul, + NX20P348X_INT1_SC_5VSRC); + k_sleep(K_MSEC(500)); + + outbuffer = shell_backend_dummy_get_output(shell_zephyr, &buffer_size); + + zassert_true(buffer_size > 0); + + /* Weakly verify something reasonable was output to console */ + zassert_not_null(strstr(outbuffer, "short")); +} diff --git a/zephyr/test/drivers/nx20p348x/usbc.dts b/zephyr/test/drivers/nx20p348x/usbc.dts new file mode 100644 index 0000000000..86fb5781d6 --- /dev/null +++ b/zephyr/test/drivers/nx20p348x/usbc.dts @@ -0,0 +1,26 @@ +/* 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 { + port0@0 { + compatible = "named-usbc-port"; + ppc = <&nx20p348x_emul>; + }; + }; +}; + +&i2c2 { + status="okay"; + + nx20p348x_emul: nx20p348x_emul@9 { + compatible = "nxp,nx20p348x"; + status = "okay"; + reg = <0x71>; + irq-gpios = < &gpio0 14 GPIO_ACTIVE_LOW >; + }; +}; diff --git a/zephyr/test/drivers/ps8xxx/src/multi_port.c b/zephyr/test/drivers/ps8xxx/src/multi_port.c index f3b5d7d066..76bcbb4c38 100644 --- a/zephyr/test/drivers/ps8xxx/src/multi_port.c +++ b/zephyr/test/drivers/ps8xxx/src/multi_port.c @@ -41,7 +41,7 @@ ZTEST(multi_port, test_multiple_ports) "port 0 and port 1 contains duplicate information.\n"); } -ZTEST(multi_port, fw_version_cache) +ZTEST(multi_port, test_fw_version_cache) { zassert_ok(tcpci_emul_set_reg(ps8xxx_emul_0, PS8XXX_REG_FW_REV, 0x12), "Unable to set firmware rev for emulator 0.\n"); diff --git a/zephyr/test/drivers/rt1718s/CMakeLists.txt b/zephyr/test/drivers/rt1718s/CMakeLists.txt new file mode 100644 index 0000000000..2d0af8b6c5 --- /dev/null +++ b/zephyr/test/drivers/rt1718s/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/tcpc.c) diff --git a/zephyr/test/drivers/rt1718s/ppc_tcpc.dts b/zephyr/test/drivers/rt1718s/ppc_tcpc.dts new file mode 100644 index 0000000000..c32dea6019 --- /dev/null +++ b/zephyr/test/drivers/rt1718s/ppc_tcpc.dts @@ -0,0 +1,31 @@ +/* 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 <dt-bindings/usb_pd_tcpm.h> + +/ { + usbc { + port0@0 { + compatible = "named-usbc-port"; + tcpc = <&rt1718s_emul>; + }; + }; +}; + +&i2c0 { + status="okay"; + + rt1718s_emul: rt1718s_emul@2c { + compatible = "cros,rt1718s-tcpc-emul", "richtek,rt1718s-tcpc"; + + status = "okay"; + + reg = <0x2c>; + tcpc-flags = <( + TCPC_FLAGS_ALERT_OD | + TCPC_FLAGS_CONTROL_VCONN | + TCPC_FLAGS_CONTROL_FRS)>; + }; +}; diff --git a/zephyr/test/drivers/rt1718s/prj.conf b/zephyr/test/drivers/rt1718s/prj.conf new file mode 100644 index 0000000000..a38bde7b92 --- /dev/null +++ b/zephyr/test/drivers/rt1718s/prj.conf @@ -0,0 +1,7 @@ +# 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. + +CONFIG_PLATFORM_EC_USB_PD_TCPC_LOW_POWER=y +CONFIG_PLATFORM_EC_USB_PD_TCPM_SBU=y +CONFIG_PLATFORM_EC_USB_PD_FRS_TCPC=y diff --git a/zephyr/test/drivers/rt1718s/src/tcpc.c b/zephyr/test/drivers/rt1718s/src/tcpc.c new file mode 100644 index 0000000000..8259b6f097 --- /dev/null +++ b/zephyr/test/drivers/rt1718s/src/tcpc.c @@ -0,0 +1,244 @@ +/* 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 "driver/tcpm/rt1718s.h" +#include "driver/tcpm/rt1718s_public.h" +#include "driver/tcpm/tcpci.h" +#include "emul/tcpc/emul_rt1718s.h" +#include "test/drivers/stubs.h" +#include "test/drivers/test_state.h" + +#include <zephyr/drivers/emul.h> +#include <zephyr/logging/log.h> +#include <zephyr/sys/slist.h> +#include <zephyr/ztest.h> +LOG_MODULE_REGISTER(rt1718s_tcpc_test, CONFIG_TCPCI_EMUL_LOG_LEVEL); + +#define RT1718S_NODE DT_NODELABEL(rt1718s_emul) + +static const int tcpm_rt1718s_port = USBC_PORT_C0; +static const struct emul *rt1718s_emul = EMUL_DT_GET(RT1718S_NODE); + +static void rt1718s_clear_set_reg_history(void *f) +{ + rt1718s_emul_reset_set_history(rt1718s_emul); +} + +ZTEST_SUITE(rt1718s_tcpc, drivers_predicate_post_main, NULL, + rt1718s_clear_set_reg_history, rt1718s_clear_set_reg_history, NULL); + +static uint16_t get_emul_reg(const struct emul *emul, int reg) +{ + uint16_t val; + + zassert_ok(rt1718s_emul_get_reg(emul, reg, &val), + "Cannot get reg %x on rt1718s emul", reg); + return val; +} + +static void compare_reg_val_with_mask(const struct emul *emul, int reg, + uint16_t expected, uint16_t mask) +{ + uint16_t masked_val = get_emul_reg(emul, reg) & mask; + uint16_t masked_expected = expected & mask; + + zassert_equal(masked_val, masked_expected, + "expected register %x with mask %x should be %x, get %x", + reg, mask, masked_expected, masked_val); +} + +static void test_bc12_reg_init_settings(const struct emul *emul) +{ + /* Vendor defined BC12 function is enabled */ + compare_reg_val_with_mask(emul, RT1718S_RT_MASK6, + RT1718S_RT_MASK6_M_BC12_SNK_DONE | + RT1718S_RT_MASK6_M_BC12_TA_CHG, + 0xFF); + compare_reg_val_with_mask(emul, RT1718S_RT2_SBU_CTRL_01, + RT1718S_RT2_SBU_CTRL_01_DPDM_VIEN | + RT1718S_RT2_SBU_CTRL_01_DM_SWEN | + RT1718S_RT2_SBU_CTRL_01_DP_SWEN, + 0xFF); + /* 2.7v mode is disabled */ + compare_reg_val_with_mask(emul, RT1718S_RT2_BC12_SNK_FUNC, 0, + RT1718S_RT2_BC12_SNK_FUNC_SPEC_TA_EN); + /* DCDT is set to 600ms timeout */ + compare_reg_val_with_mask(emul, RT1718S_RT2_BC12_SNK_FUNC, + RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_600MS, + RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_MASK); + /* vlgc option is disabled */ + compare_reg_val_with_mask(emul, RT1718S_RT2_BC12_SNK_FUNC, 0, + RT1718S_RT2_BC12_SNK_FUNC_VLGC_OPT); + /* DPDM voltage selection is set to 65V */ + compare_reg_val_with_mask( + emul, RT1718S_RT2_DPDM_CTR1_DPDM_SET, + RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_0_65V, + RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_MASK); + /* Sink wait vbus is disabled */ + compare_reg_val_with_mask(emul, RT1718S_RT2_BC12_SNK_FUNC, 0, + RT1718S_RT2_BC12_SNK_FUNC_BC12_WAIT_VBUS); +} + +static void test_common_reg_init_settings(const struct emul *emul) +{ + /* VBUS_VOL_SEL is set to 20V */ + compare_reg_val_with_mask(emul, RT1718S_RT2_VBUS_VOL_CTRL, + RT1718S_VBUS_VOL_TO_REG(20), + RT1718S_RT2_VBUS_VOL_CTRL_VOL_SEL); + /* VCONN_OCP_SEL is set to 400mA */ + compare_reg_val_with_mask(emul, RT1718S_VCONN_CONTROL_3, 0x7F, + RT1718S_VCONN_CONTROL_3_VCONN_OCP_SEL); + /* Vconn OCP shoot detection is increased from 200ns to 3~5us */ + compare_reg_val_with_mask(emul, RT1718S_VCON_CTRL4, 0, + RT1718S_VCON_CTRL4_OCP_CP_EN); + /* FOD function is disabled */ + compare_reg_val_with_mask(emul, 0xCF, 0, 0x40); + /* Exit shipping mode request is set */ + compare_reg_val_with_mask(emul, RT1718S_SYS_CTRL1, 0, + RT1718S_SYS_CTRL1_TCPC_CONN_INVALID); + compare_reg_val_with_mask(emul, RT1718S_SYS_CTRL1, 0xFF, + RT1718S_SYS_CTRL1_SHIPPING_OFF); + /* Alert and fault is cleared */ + compare_reg_val_with_mask(emul, TCPC_REG_FAULT_STATUS, 0, 0xFF); + compare_reg_val_with_mask(emul, TCPC_REG_ALERT, 0, 0xFFFF); + /* + * TODO Validate vendor defined alert mask is set once tcpci emul fix. + */ + /* FRS settings: Rx frs and valid vbus fall is set to unmasked */ + compare_reg_val_with_mask(emul, RT1718S_RT_MASK1, 0xFF, + RT1718S_RT_MASK1_M_RX_FRS | + RT1718S_RT_MASK1_M_VBUS_FRS_LOW); +} + +ZTEST(rt1718s_tcpc, test_init_with_device_id_es1) +{ + rt1718s_emul_set_device_id(rt1718s_emul, RT1718S_DEVICE_ID_ES1); + zassert_ok(rt1718s_tcpm_drv.init(tcpm_rt1718s_port), + "Cannot initialize rt1718s"); + test_bc12_reg_init_settings(rt1718s_emul); + test_common_reg_init_settings(rt1718s_emul); + + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCONN_CONTROL_3, 0xFF, + RT1718S_VCONN_CONTROL_3_VCONN_OVP_DEG); +} + +ZTEST(rt1718s_tcpc, test_init_with_device_id_es2) +{ + rt1718s_emul_set_device_id(rt1718s_emul, RT1718S_DEVICE_ID_ES2); + zassert_ok(rt1718s_tcpm_drv.init(tcpm_rt1718s_port), + "Cannot initialize rt1718s"); + test_bc12_reg_init_settings(rt1718s_emul); + test_common_reg_init_settings(rt1718s_emul); + + compare_reg_val_with_mask(rt1718s_emul, TCPC_REG_FAULT_CTRL, 0xFF, + TCPC_REG_FAULT_CTRL_VCONN_OCP_FAULT_DIS); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCON_CTRL4, 0, + RT1718S_VCON_CTRL4_UVP_CP_EN | + RT1718S_VCON_CTRL4_OCP_CP_EN); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCONN_CONTROL_2, 0xFF, + RT1718S_VCONN_CONTROL_2_OVP_EN_CC1 | + RT1718S_VCONN_CONTROL_2_OVP_EN_CC2); +} + +ZTEST(rt1718s_tcpc, test_set_vconn_enable) +{ + struct _snode *iter_node = NULL; + struct set_reg_entry_t *iter_entry = NULL; + struct set_reg_entry_t *set_vconn_limit_on_entry = NULL; + struct set_reg_entry_t *set_vconn_limit_off_entry = NULL; + struct rt1718s_emul_data *rt1718s_data = rt1718s_emul->data; + struct _slist *set_private_reg_history = + &rt1718s_data->set_private_reg_history; + + zassert_ok(rt1718s_tcpm_drv.set_vconn(tcpm_rt1718s_port, true)); + + iter_node = sys_slist_peek_head(set_private_reg_history); + while (iter_node != NULL) { + iter_entry = SYS_SLIST_CONTAINER(iter_node, iter_entry, node); + if (iter_entry->reg == RT1718S_VCON_CTRL3 && + (iter_entry->val & RT1718S_VCON_LIMIT_MODE) == 1) { + set_vconn_limit_on_entry = iter_entry; + break; + } + iter_node = iter_node->next; + } + /* b/233698718#comment9 workaround should applied */ + zassert_not_null(set_vconn_limit_on_entry, + "No entry for setting RT1718S_VCON_CTRL3"); + while (iter_node != NULL) { + iter_entry = SYS_SLIST_CONTAINER(iter_node, iter_entry, node); + if (iter_entry->reg == RT1718S_VCON_CTRL3 && + (iter_entry->val & RT1718S_VCON_LIMIT_MODE) == 0) { + set_vconn_limit_off_entry = iter_entry; + break; + } + iter_node = iter_node->next; + } + zassert_not_null(set_vconn_limit_off_entry, + "No entry for setting RT1718S_VCON_CTRL3"); + zassert_true( + (set_vconn_limit_off_entry->access_time - + set_vconn_limit_on_entry->access_time) >= 10, + "Workaround for two setting Vconn limit is smaller than 10ms"); + + /* rt1718s should be in shutdown mode. */ + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCON_CTRL3, 0x0, + RT1718S_VCON_LIMIT_MODE); + /* Vconn RVP should be enabled. */ + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCONN_CONTROL_2, 0xFF, + RT1718S_VCONN_CONTROL_2_RVP_EN); +} + +ZTEST(rt1718s_tcpc, test_set_vconn_disable) +{ + zassert_ok(rt1718s_tcpm_drv.set_vconn(tcpm_rt1718s_port, false)); + /* Vconn RVP should be disabled. */ + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VCONN_CONTROL_2, 0, + RT1718S_VCONN_CONTROL_2_RVP_EN); +} + +ZTEST(rt1718s_tcpc, test_enter_low_power_mode) +{ + zassert_ok(rt1718s_tcpm_drv.enter_low_power_mode(tcpm_rt1718s_port)); + compare_reg_val_with_mask( + rt1718s_emul, RT1718S_SYS_CTRL2, RT1718S_SYS_CTRL2_LPWR_EN, + RT1718S_SYS_CTRL2_LPWR_EN | RT1718S_SYS_CTRL2_BMCIO_OSC_EN); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_RT2_SBU_CTRL_01, 0, + 0xFF); +} + +ZTEST(rt1718s_tcpc, test_set_sbu) +{ + uint8_t mask = RT1718S_RT2_SBU_CTRL_01_SBU_VIEN | + RT1718S_RT2_SBU_CTRL_01_SBU1_SWEN | + RT1718S_RT2_SBU_CTRL_01_SBU2_SWEN; + + zassert_ok(rt1718s_tcpm_drv.set_sbu(tcpm_rt1718s_port, true)); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_RT2_SBU_CTRL_01, 0xFF, + mask); + + zassert_ok(rt1718s_tcpm_drv.set_sbu(tcpm_rt1718s_port, false)); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_RT2_SBU_CTRL_01, 0, + mask); +} + +ZTEST(rt1718s_tcpc, test_set_frs) +{ + zassert_ok(rt1718s_tcpm_drv.set_frs_enable(tcpm_rt1718s_port, true)); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_FRS_CTRL2, + RT1718S_FRS_CTRL2_RX_FRS_EN | + RT1718S_FRS_CTRL2_VBUS_FRS_EN | 0x10, + 0xFF); + compare_reg_val_with_mask( + rt1718s_emul, RT1718S_VBUS_CTRL_EN, + RT1718S_VBUS_CTRL_EN_GPIO2_VBUS_PATH_EN | + RT1718S_VBUS_CTRL_EN_GPIO1_VBUS_PATH_EN | 0x3F, + 0xFF); + + zassert_ok(rt1718s_tcpm_drv.set_frs_enable(tcpm_rt1718s_port, false)); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_FRS_CTRL2, 0x10, 0xFF); + compare_reg_val_with_mask(rt1718s_emul, RT1718S_VBUS_CTRL_EN, 0x3F, + 0xFF); +} diff --git a/zephyr/test/drivers/rt9490/src/charger.c b/zephyr/test/drivers/rt9490/src/charger.c index 2d892f9432..4c08065e09 100644 --- a/zephyr/test/drivers/rt9490/src/charger.c +++ b/zephyr/test/drivers/rt9490/src/charger.c @@ -14,7 +14,7 @@ static const struct emul *emul = EMUL_DT_GET(DT_NODELABEL(rt9490)); static const int chgnum = CHARGER_SOLO; -ZTEST(rt9490_chg, current) +ZTEST(rt9490_chg, test_current) { struct { int reg; @@ -51,7 +51,7 @@ ZTEST(rt9490_chg, current) zassert_not_equal(rt9490_drv.set_current(chgnum, 5001), 0, NULL); } -ZTEST(rt9490_chg, voltage) +ZTEST(rt9490_chg, test_voltage) { struct { int reg; @@ -89,7 +89,7 @@ ZTEST(rt9490_chg, voltage) zassert_not_equal(rt9490_drv.set_voltage(chgnum, 18801), 0, NULL); } -ZTEST(rt9490_chg, otg) +ZTEST(rt9490_chg, test_otg) { struct { int reg_v, reg_c, expected_v, expected_c; @@ -134,7 +134,7 @@ ZTEST(rt9490_chg, otg) zassert_equal(rt9490_drv.is_sourcing_otg_power(chgnum, 0), false, NULL); } -ZTEST(rt9490_chg, aicr) +ZTEST(rt9490_chg, test_aicr) { struct { int reg; @@ -206,7 +206,7 @@ ZTEST(rt9490_chg, test_option) zassert_true(opt == 0, NULL); } -ZTEST(rt9490_chg, misc_info) +ZTEST(rt9490_chg, test_misc_info) { int status; int device_id; diff --git a/zephyr/test/drivers/testcase.yaml b/zephyr/test/drivers/testcase.yaml index 054e76131b..d4c6fc7e75 100644 --- a/zephyr/test/drivers/testcase.yaml +++ b/zephyr/test/drivers/testcase.yaml @@ -3,372 +3,462 @@ common: tests: drivers.default: timeout: 360 - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay" - extra_configs: - - CONFIG_LINK_TEST_SUITE_DEFAULT=y - - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y - - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y - - CONFIG_PLATFORM_EC_USB_PD_DPS=y - - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y - - CONFIG_PLATFORM_EC_CONSOLE_CMD_TCPC_DUMP=y + extra_configs: + - CONFIG_LINK_TEST_SUITE_DEFAULT=y + - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y + - CONFIG_PLATFORM_EC_USB_PD_DPS=y + - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y + - CONFIG_PLATFORM_EC_CONSOLE_CMD_TCPC_DUMP=y + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay drivers.default.bring_up: timeout: 360 - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay" - extra_configs: - - CONFIG_LINK_TEST_SUITE_DEFAULT=y - - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y - - CONFIG_PLATFORM_EC_BRINGUP=y - - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y - - CONFIG_PLATFORM_EC_USB_PD_DPS=y - - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y + extra_configs: + - CONFIG_LINK_TEST_SUITE_DEFAULT=y + - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_PLATFORM_EC_BRINGUP=y + - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y + - CONFIG_PLATFORM_EC_USB_PD_DPS=y + - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay drivers.default.console_cmds: timeout: 360 - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay" extra_configs: - - CONFIG_LINK_TEST_SUITE_DEFAULT_CONSOLE_CMDS=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_LINK_TEST_SUITE_DEFAULT_CONSOLE_CMDS=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay drivers.default.console_cmds.gpio_keys: timeout: 360 - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay;default/boards/power_button.dtsi" extra_configs: - - CONFIG_LINK_TEST_SUITE_DEFAULT_CONSOLE_CMDS=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y - - CONFIG_PLATFORM_EC_POWER_BUTTON=n + - CONFIG_LINK_TEST_SUITE_DEFAULT_CONSOLE_CMDS=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_PLATFORM_EC_POWER_BUTTON=n + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay + - default/boards/power_button.dtsi drivers.default.mock_power: timeout: 360 - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay" - extra_configs: - - CONFIG_LINK_TEST_SUITE_DEFAULT=y - - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y - - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y - - CONFIG_POWER_SEQUENCE_MOCK=y - - CONFIG_PLATFORM_EC_USB_PD_DPS=y - - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y + extra_configs: + - CONFIG_LINK_TEST_SUITE_DEFAULT=y + - CONFIG_LINK_TEST_SUITE_USB_MALFUNCTION_SINK=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y + - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_PLATFORM_EC_USB_PD_DPS=y + - CONFIG_PLATFORM_EC_I2C_PASSTHRU_RESTRICTED=y + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay drivers.amd_fp6_usb_mux: extra_dtc_overlay_files: - - ./boards/native_posix.overlay - - ./amd_fp6_usb_mux/usbc.dts + - ./boards/native_posix.overlay + - ./amd_fp6_usb_mux/usbc.dts extra_configs: - - CONFIG_LINK_TEST_SUITE_AMD_FP6_USB_MUX=y + - CONFIG_LINK_TEST_SUITE_AMD_FP6_USB_MUX=y drivers.anx7447: - extra_args: CONF_FILE="prj.conf;anx7447/prj.conf" - DTC_OVERLAY_FILE="./boards/native_posix.overlay;./anx7447/tcpc_policy.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_ANX7447=y + - CONFIG_LINK_TEST_SUITE_ANX7447=y + extra_conf_files: + - prj.conf + - anx7447/prj.conf + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./anx7447/tcpc_policy.dts drivers.ap_mux_control: - extra_args: CONF_FILE="prj.conf;ap_mux_control/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_AP_MUX_CONTROL=y + - CONFIG_LINK_TEST_SUITE_AP_MUX_CONTROL=y + extra_conf_files: + - prj.conf + - ap_mux_control/prj.conf drivers.ap_vdm_control: - extra_args: CONF_FILE="prj.conf;ap_vdm_control/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_AP_VDM_CONTROL=y + - CONFIG_LINK_TEST_SUITE_AP_VDM_CONTROL=y + extra_conf_files: + - prj.conf + - ap_vdm_control/prj.conf drivers.ap_vdm_control_disabled: - extra_args: CONF_FILE="prj.conf;ap_vdm_control/prj.conf" extra_configs: - - CONFIG_PLATFORM_EC_USB_PD_VDM_AP_CONTROL=n - - CONFIG_LINK_TEST_SUITE_AP_VDM_CONTROL=y + - CONFIG_PLATFORM_EC_USB_PD_VDM_AP_CONTROL=n + - CONFIG_LINK_TEST_SUITE_AP_VDM_CONTROL=y + extra_conf_files: + - prj.conf + - ap_vdm_control/prj.conf drivers.button: timeout: 360 extra_configs: - - CONFIG_LINK_TEST_SUITE_BUTTON=y - - CONFIG_PLATFORM_EC_CMD_BUTTON=y - - CONFIG_PLATFORM_EC_VOLUME_BUTTONS=y - - CONFIG_PLATFORM_EC_EMULATED_SYSRQ=y + - CONFIG_LINK_TEST_SUITE_BUTTON=y + - CONFIG_PLATFORM_EC_CMD_BUTTON=y + - CONFIG_PLATFORM_EC_VOLUME_BUTTONS=y + - CONFIG_PLATFORM_EC_EMULATED_SYSRQ=y drivers.cbi_flash: - extra_args: DTC_OVERLAY_FILE="./boards/native_posix.overlay;./cbi_flash/binman.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_CBI_FLASH=y - - CONFIG_PLATFORM_EC_CBI_FLASH=y - - CONFIG_PLATFORM_EC_FLASH_SIZE_BYTES=0x80000 + - CONFIG_LINK_TEST_SUITE_CBI_FLASH=y + - CONFIG_PLATFORM_EC_CBI_FLASH=y + - CONFIG_PLATFORM_EC_FLASH_SIZE_BYTES=0x80000 + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./cbi_flash/binman.dts drivers.common_cbi: extra_configs: - - CONFIG_LINK_TEST_SUITE_COMMON_CBI=y - - CONFIG_PLATFORM_EC_EEPROM_CBI_WP=y + - CONFIG_LINK_TEST_SUITE_COMMON_CBI=y + - CONFIG_PLATFORM_EC_EEPROM_CBI_WP=y drivers.common_cbi_gpio: extra_configs: - - CONFIG_LINK_TEST_SUITE_COMMON_CBI_GPIO=y - - CONFIG_PLATFORM_EC_CBI_GPIO=y + - CONFIG_LINK_TEST_SUITE_COMMON_CBI_GPIO=y + - CONFIG_PLATFORM_EC_CBI_GPIO=y drivers.common_charger: extra_configs: - - CONFIG_PLATFORM_EC_CHARGER_INPUT_CURRENT_DERATE_PCT=5 - - CONFIG_PLATFORM_EC_CHARGER_MIN_INPUT_CURRENT_LIMIT=100 - - CONFIG_LINK_TEST_SUITE_COMMON_CHARGER=y - # Set to focus testing for Herobrine - # Config is y only in nissa - - CONFIG_PLATFORM_EC_CHARGER_RAA489000=n - - CONFIG_PLATFORM_EC_CHARGER_RUNTIME_CONFIG=y + - CONFIG_PLATFORM_EC_CHARGER_INPUT_CURRENT_DERATE_PCT=5 + - CONFIG_PLATFORM_EC_CHARGER_MIN_INPUT_CURRENT_LIMIT=100 + - CONFIG_LINK_TEST_SUITE_COMMON_CHARGER=y + # Set to focus testing for Herobrine + # Config is y only in nissa + - CONFIG_PLATFORM_EC_CHARGER_RAA489000=n + - CONFIG_PLATFORM_EC_CHARGER_RUNTIME_CONFIG=y drivers.chargesplash: timeout: 360 extra_configs: - - CONFIG_LINK_TEST_SUITE_CHARGESPLASH=y + - CONFIG_LINK_TEST_SUITE_CHARGESPLASH=y drivers.chargesplash.mock_power: timeout: 360 extra_configs: - - CONFIG_LINK_TEST_SUITE_CHARGESPLASH=y - - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_LINK_TEST_SUITE_CHARGESPLASH=y + - CONFIG_POWER_SEQUENCE_MOCK=y drivers.console: extra_configs: - - CONFIG_LINK_TEST_SUITE_CONSOLE=y + - CONFIG_LINK_TEST_SUITE_CONSOLE=y drivers.console_cmd_crash: - extra_args: CONF_FILE="prj.conf;default/prj.conf" - DTC_OVERLAY_FILE="default/boards/native_posix.overlay" extra_configs: - - CONFIG_LINK_TEST_SUITE_CONSOLE_CMD_CRASH=y - - CONFIG_PLATFORM_EC_CONSOLE_CMD_CRASH=y - - CONFIG_ASSERT_TEST=y + - CONFIG_LINK_TEST_SUITE_CONSOLE_CMD_CRASH=y + - CONFIG_PLATFORM_EC_CONSOLE_CMD_CRASH=y + - CONFIG_ASSERT_TEST=y + extra_conf_files: + - prj.conf + - default/prj.conf + extra_dtc_overlay_files: + - default/boards/native_posix.overlay drivers.console_cmd_mfallow: - extra_args: CONF_FILE="prj.conf;console_cmd_mfallow/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_CONSOLE_CMD_MFALLOW=y + - CONFIG_LINK_TEST_SUITE_CONSOLE_CMD_MFALLOW=y + extra_conf_files: + - prj.conf + - console_cmd_mfallow/prj.conf drivers.dps: - extra_args: CONF_FILE="prj.conf;dps/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_PD_DPS=y + - CONFIG_LINK_TEST_SUITE_USB_PD_DPS=y + extra_conf_files: + - prj.conf + - dps/prj.conf drivers.flash: extra_configs: - - CONFIG_LINK_TEST_SUITE_FLASH=y - - CONFIG_PLATFORM_EC_CONSOLE_CMD_FLASH=y + - CONFIG_LINK_TEST_SUITE_FLASH=y + - CONFIG_PLATFORM_EC_CONSOLE_CMD_FLASH=y drivers.flash.page_layout: extra_configs: - - CONFIG_LINK_TEST_SUITE_FLASH=y - - CONFIG_SHELL_BACKEND_DUMMY_BUF_SIZE=500 - - CONFIG_PLATFORM_EC_CONSOLE_CMD_FLASH=y - - CONFIG_PLATFORM_EC_USE_ZEPHYR_FLASH_PAGE_LAYOUT=y + - CONFIG_LINK_TEST_SUITE_FLASH=y + - CONFIG_SHELL_BACKEND_DUMMY_BUF_SIZE=500 + - CONFIG_PLATFORM_EC_CONSOLE_CMD_FLASH=y + - CONFIG_PLATFORM_EC_USE_ZEPHYR_FLASH_PAGE_LAYOUT=y drivers.gpio_unhook: extra_configs: - - CONFIG_LINK_TEST_SUITE_GPIO_UNHOOK=y - - CONFIG_GPIO_GET_CONFIG=y + - CONFIG_LINK_TEST_SUITE_GPIO_UNHOOK=y + - CONFIG_GPIO_GET_CONFIG=y drivers.host_cmd: extra_configs: - - CONFIG_LINK_TEST_SUITE_HOST_COMMANDS=y - - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y - - CONFIG_PLATFORM_EC_USB_PD_LOGGING=y - - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y - - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y + - CONFIG_LINK_TEST_SUITE_HOST_COMMANDS=y + - CONFIG_PLATFORM_EC_BATTERY_CUT_OFF=y + - CONFIG_PLATFORM_EC_USB_PD_LOGGING=y + - CONFIG_PLATFORM_EC_LID_ANGLE_UPDATE=y + - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y drivers.host_cmd_read_memmap: extra_configs: - - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_READ_MEMMAP=y - - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y - - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI=n - - CONFIG_PLATFORM_EC_HOST_INTERFACE_SHI=y + - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_READ_MEMMAP=y + - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y + - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI=n + - CONFIG_PLATFORM_EC_HOST_INTERFACE_SHI=y drivers.host_cmd_read_memmap.no_switches: extra_configs: - - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_READ_MEMMAP=y - - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y - - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI=n - - CONFIG_PLATFORM_EC_HOST_INTERFACE_SHI=y - - CONFIG_PLATFORM_EC_SWITCH=n + - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_READ_MEMMAP=y + - CONFIG_PLATFORM_EC_HOST_COMMAND_STATUS=y + - CONFIG_PLATFORM_EC_HOST_INTERFACE_ESPI=n + - CONFIG_PLATFORM_EC_HOST_INTERFACE_SHI=y + - CONFIG_PLATFORM_EC_SWITCH=n drivers.isl923x: extra_configs: - - CONFIG_LINK_TEST_SUITE_ISL923X=y + - CONFIG_LINK_TEST_SUITE_ISL923X=y drivers.isl923x.mock_power: extra_configs: - - CONFIG_LINK_TEST_SUITE_ISL923X=y - - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_LINK_TEST_SUITE_ISL923X=y + - CONFIG_POWER_SEQUENCE_MOCK=y + drivers.isl9241: + extra_configs: + - CONFIG_LINK_TEST_SUITE_ISL9241=y + - CONFIG_PLATFORM_EC_CHARGER_DUMP_PROCHOT=y + - CONFIG_PLATFORM_EC_CHARGER_ISL9241=y + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./isl9241/usbc.dts drivers.i2c_controller: - extra_args: DTC_OVERLAY_FILE="./boards/native_posix.overlay;i2c_controller/i2c.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_I2C_CONTROLLER=y + - CONFIG_LINK_TEST_SUITE_I2C_CONTROLLER=y + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - i2c_controller/i2c.dts drivers.it8xxx2_hw_sha256: extra_configs: - - CONFIG_LINK_TEST_SUITE_IT8XXX2_HW_SHA256=y - - CONFIG_PLATFORM_EC_SHA256_HW_ACCELERATE=y + - CONFIG_LINK_TEST_SUITE_IT8XXX2_HW_SHA256=y + - CONFIG_PLATFORM_EC_SHA256_HW_ACCELERATE=y drivers.keyboard_scan: extra_configs: - - CONFIG_LINK_TEST_SUITE_KEYBOARD_SCAN=y + - CONFIG_LINK_TEST_SUITE_KEYBOARD_SCAN=y drivers.led_driver: - extra_args: CONF_FILE="prj.conf;led_driver/prj.conf" - DTC_OVERLAY_FILE="./boards/native_posix.overlay;./led_driver/led_pins.dts;./led_driver/led_policy.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_LED_DRIVER=y + - CONFIG_LINK_TEST_SUITE_LED_DRIVER=y + extra_conf_files: + - prj.conf + - led_driver/prj.conf + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./led_driver/led_pins.dts + - ./led_driver/led_policy.dts drivers.led_common: extra_configs: - - CONFIG_LINK_TEST_SUITE_LED_COMMON=y - - CONFIG_PLATFORM_EC_LED_DT=n + - CONFIG_LINK_TEST_SUITE_LED_COMMON=y + - CONFIG_PLATFORM_EC_LED_DT=n drivers.locate_chip: extra_configs: - - CONFIG_LINK_TEST_SUITE_LOCATE_CHIP_ALTS=y - - CONFIG_PLATFORM_EC_CBI=n + - CONFIG_LINK_TEST_SUITE_LOCATE_CHIP_ALTS=y + - CONFIG_PLATFORM_EC_CBI=n drivers.mkbp: extra_configs: - - CONFIG_LINK_TEST_SUITE_MKBP=y - - CONFIG_PLATFORM_EC_KEYBOARD_PROTOCOL_MKBP=y - - CONFIG_PLATFORM_EC_MKBP_INPUT_DEVICES=y - - CONFIG_PLATFORM_EC_MKBP_EVENT=y - - CONFIG_PLATFORM_EC_MKBP_USE_GPIO=y - - CONFIG_PLATFORM_EC_KEYBOARD_KEYPAD=y - tags: - common - mkbp + - CONFIG_LINK_TEST_SUITE_MKBP=y + - CONFIG_PLATFORM_EC_KEYBOARD_PROTOCOL_MKBP=y + - CONFIG_PLATFORM_EC_MKBP_INPUT_DEVICES=y + - CONFIG_PLATFORM_EC_MKBP_EVENT=y + - CONFIG_PLATFORM_EC_MKBP_USE_GPIO=y + - CONFIG_PLATFORM_EC_KEYBOARD_KEYPAD=y + tags: common mkbp + drivers.nx20p3481: + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./nx20p348x/usbc.dts + extra_configs: + - CONFIG_LINK_TEST_SUITE_NX20P348X=y + - CONFIG_PLATFORM_EC_USBC_PPC_NX20P3481=y + - CONFIG_PLATFORM_EC_USBC_PPC_NX20P3483=n + drivers.nx20p3483: + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./nx20p348x/usbc.dts + extra_configs: + - CONFIG_LINK_TEST_SUITE_NX20P348X=y + - CONFIG_PLATFORM_EC_USBC_PPC_NX20P3483=y drivers.panic_output: extra_configs: - - CONFIG_LINK_TEST_SUITE_PANIC_OUTPUT=y - - CONFIG_PLATFORM_EC_CONSOLE_CMD_CRASH=y - - CONFIG_ZTEST_THREAD_PRIORITY=1 + - CONFIG_LINK_TEST_SUITE_PANIC_OUTPUT=y + - CONFIG_PLATFORM_EC_CONSOLE_CMD_CRASH=y + - CONFIG_ZTEST_THREAD_PRIORITY=1 drivers.power_host_sleep: extra_configs: - - CONFIG_LINK_TEST_SUITE_POWER_HOST_SLEEP=y - # Make tests independent of chipset specific code - - CONFIG_AP_ARM_QUALCOMM_SC7280=n - - CONFIG_PLATFORM_EC_POWERSEQ_SC7280=n - - - CONFIG_POWER_SEQUENCE_MOCK=y - - CONFIG_PLATFORM_EC_POWERSEQ_HOST_SLEEP=y + - CONFIG_LINK_TEST_SUITE_POWER_HOST_SLEEP=y + # Make tests independent of chipset specific code + - CONFIG_AP_ARM_QUALCOMM_SC7280=n + - CONFIG_PLATFORM_EC_POWERSEQ_SC7280=n + - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_PLATFORM_EC_POWERSEQ_HOST_SLEEP=y drivers.ps8xxx: - extra_args: > - CONF_FILE="prj.conf;ps8xxx/prj.conf" - DTC_OVERLAY_FILE="./boards/native_posix.overlay;./ps8xxx/usbc.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_PS8XXX=y + - CONFIG_LINK_TEST_SUITE_PS8XXX=y + extra_conf_files: + - prj.conf + - ps8xxx/prj.conf + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./ps8xxx/usbc.dts" + drivers.rt1718s: + extra_configs: + - CONFIG_LINK_TEST_SUITE_RT1718S=y + extra_conf_files: + - prj.conf + - rt1718s/prj.conf + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./rt1718s/ppc_tcpc.dts drivers.rt9490: - extra_args: CONF_FILE="prj.conf;rt9490/prj.conf" - DTC_OVERLAY_FILE="./boards/native_posix.overlay;./rt9490/charger.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_RT9490=y + - CONFIG_LINK_TEST_SUITE_RT9490=y + extra_conf_files: + - prj.conf + - rt9490/prj.conf + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./rt9490/charger.dts drivers.shim_gpio_id: - extra_args: CONF_FILE="prj.conf" - DTC_OVERLAY_FILE="boards/native_posix.overlay;shim_gpio_id/gpio_id.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_SHIM_GPIO_ID=y + - CONFIG_LINK_TEST_SUITE_SHIM_GPIO_ID=y + extra_conf_files: + - prj.conf + extra_dtc_overlay_files: + - boards/native_posix.overlay + - shim_gpio_id/gpio_id.dts drivers.shim_pwm_hc: extra_configs: - - CONFIG_LINK_TEST_SUITE_SHIM_PWM_HC=y + - CONFIG_LINK_TEST_SUITE_SHIM_PWM_HC=y drivers.shim_rtc: extra_configs: - - CONFIG_LINK_TEST_SUITE_SHIM_RTC=y - - CONFIG_PLATFORM_EC_RTC=y - - CONFIG_PLATFORM_EC_HOSTCMD=y - - CONFIG_PLATFORM_EC_HOSTCMD_RTC=y + - CONFIG_LINK_TEST_SUITE_SHIM_RTC=y + - CONFIG_PLATFORM_EC_RTC=y + - CONFIG_PLATFORM_EC_HOSTCMD=y + - CONFIG_PLATFORM_EC_HOSTCMD_RTC=y drivers.system: - tags: - common - system + tags: common system extra_configs: - - CONFIG_LINK_TEST_SUITE_SYSTEM=y - - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_LINK_TEST_SUITE_SYSTEM=y + - CONFIG_POWER_SEQUENCE_MOCK=y drivers.system_board_version_cbi: - tags: - common - system + tags: common system extra_configs: - - CONFIG_LINK_TEST_SUITE_SYSTEM=y - - CONFIG_PLATFORM_EC_BOARD_VERSION_CBI=y - - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_LINK_TEST_SUITE_SYSTEM=y + - CONFIG_PLATFORM_EC_BOARD_VERSION_CBI=y + - CONFIG_POWER_SEQUENCE_MOCK=y drivers.timer: extra_configs: - - CONFIG_LINK_TEST_SUITE_TIMER=y + - CONFIG_LINK_TEST_SUITE_TIMER=y drivers.usb_common: extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_COMMON=y + - CONFIG_LINK_TEST_SUITE_USB_COMMON=y drivers.usb_port_power_dumb: - extra_args: DTC_OVERLAY_FILE="./boards/native_posix.overlay;./usb_port_power_dumb/usba.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_PORT_POWER_DUMB=y - - CONFIG_PLATFORM_EC_USB_PORT_POWER_DUMB=y + - CONFIG_LINK_TEST_SUITE_USB_PORT_POWER_DUMB=y + - CONFIG_PLATFORM_EC_USB_PORT_POWER_DUMB=y + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./usb_port_power_dumb/usba.dts drivers.usb_pd_discharge: extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_COMMON=y - - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE=y - - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE_PPC=y - - CONFIG_PLATFORM_EC_USB_PD_FLAGS=y + - CONFIG_LINK_TEST_SUITE_USB_COMMON=y + - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE=y + - CONFIG_PLATFORM_EC_USB_PD_DISCHARGE_PPC=y + - CONFIG_PLATFORM_EC_USB_PD_FLAGS=y drivers.usb_pd_discovery: extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_PD_DISCOVERY=y + - CONFIG_LINK_TEST_SUITE_USB_PD_DISCOVERY=y drivers.usb_pd_flags: extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_COMMON=y - - CONFIG_PLATFORM_EC_USB_PD_FLAGS=y - - CONFIG_PLATFORM_EC_USB_PD_RUNTIME_FLAGS=y + - CONFIG_LINK_TEST_SUITE_USB_COMMON=y + - CONFIG_PLATFORM_EC_USB_PD_FLAGS=y + - CONFIG_PLATFORM_EC_USB_PD_RUNTIME_FLAGS=y drivers.usb_retimer_fw_update: timeout: 120 - extra_args: CONF_FILE="prj.conf;usb_retimer_fw_update/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_USB_RETIMER_FW_UPDATE=y + - CONFIG_LINK_TEST_SUITE_USB_RETIMER_FW_UPDATE=y + extra_conf_files: + - prj.conf + - usb_retimer_fw_update/prj.conf drivers.usbc_alt_mode: - extra_args: CONF_FILE="prj.conf;usbc_alt_mode/prj.conf" extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_ALT_MODE=y + - CONFIG_LINK_TEST_SUITE_USBC_ALT_MODE=y timeout: 120 + extra_conf_files: + - prj.conf + - usbc_alt_mode/prj.conf drivers.usbc_alt_mode_ec_entry: - extra_args: CONF_FILE="prj.conf;usbc_alt_mode/prj.conf" timeout: 120 extra_configs: - - CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY=n - - CONFIG_LINK_TEST_SUITE_USBC_ALT_MODE=y - - CONFIG_POWER_SEQUENCE_MOCK=y + - CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY=n + - CONFIG_LINK_TEST_SUITE_USBC_ALT_MODE=y + - CONFIG_POWER_SEQUENCE_MOCK=y + extra_conf_files: + - prj.conf + - usbc_alt_mode/prj.conf drivers.usbc_console_pd: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_CONSOLE_PD=y + - CONFIG_LINK_TEST_SUITE_USBC_CONSOLE_PD=y drivers.usbc_console_pd_legacy: - extra_args: > - DTC_OVERLAY_FILE="default/boards/native_posix.overlay;./usbc_console_pd/usbc_legacy.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_CONSOLE_PD=y - - CONFIG_PLATFORM_EC_TCPC_INTERRUPT=n + - CONFIG_LINK_TEST_SUITE_USBC_CONSOLE_PD=y + - CONFIG_PLATFORM_EC_TCPC_INTERRUPT=n + extra_dtc_overlay_files: + - default/boards/native_posix.overlay + - ./usbc_console_pd/usbc_legacy.dts drivers.usbc_ctvpd: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_CTVPD=y + - CONFIG_LINK_TEST_SUITE_USBC_CTVPD=y drivers.usbc_frs: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_FRS=y - - CONFIG_PLATFORM_EC_USB_PD_FRS_TCPC=y + - CONFIG_LINK_TEST_SUITE_USBC_FRS=y + - CONFIG_PLATFORM_EC_USB_PD_FRS_TCPC=y drivers.usbc_ocp: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_OCP=y + - CONFIG_LINK_TEST_SUITE_USBC_OCP=y drivers.usbc_ppc: - extra_args: > - DTC_OVERLAY_FILE="default/boards/native_posix.overlay;./usbc_ppc/ppc_alts.dts" extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_PPC=y - - CONFIG_PLATFORM_EC_BC12_SINGLE_DRIVER=n + - CONFIG_LINK_TEST_SUITE_USBC_PPC=y + - CONFIG_PLATFORM_EC_BC12_SINGLE_DRIVER=n + extra_dtc_overlay_files: + - default/boards/native_posix.overlay + - ./usbc_ppc/ppc_alts.dts drivers.usbc_tcpc: extra_dtc_overlay_files: - - default/boards/native_posix.overlay - - usbc_tcpc/tcpc_alts.dts + - default/boards/native_posix.overlay + - usbc_tcpc/tcpc_alts.dts extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_TCPC=y + - CONFIG_LINK_TEST_SUITE_USBC_TCPC=y drivers.usbc_retimer.anx7483: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_RETIMER_ANX7483=y + - CONFIG_LINK_TEST_SUITE_USBC_RETIMER_ANX7483=y drivers.usbc_retimer.ps8811: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_RETIMER_PS8811=y + - CONFIG_LINK_TEST_SUITE_USBC_RETIMER_PS8811=y drivers.usbc_svdm_dfp_only: - extra_args: CONF_FILE="prj.conf;usbc_svdm_dfp_only/prj.conf" - DTC_OVERLAY_FILE="usbc_svdm_dfp_only/boards/native_posix.overlay" extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_SVDM_DFP_ONLY=y + - CONFIG_LINK_TEST_SUITE_USBC_SVDM_DFP_ONLY=y + extra_conf_files: + - prj.conf + - usbc_svdm_dfp_only/prj.conf + extra_dtc_overlay_files: + - usbc_svdm_dfp_only/boards/native_posix.overlay drivers.usbc_tbt_mode: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_TBT_MODE=y + - CONFIG_LINK_TEST_SUITE_USBC_TBT_MODE=y drivers.usbc_usb4_mode: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_USB4_MODE=y - - CONFIG_PLATFORM_EC_USB_PD_DATA_RESET_MSG=y + - CONFIG_LINK_TEST_SUITE_USBC_USB4_MODE=y + - CONFIG_PLATFORM_EC_USB_PD_DATA_RESET_MSG=y drivers.usbc_vconn_swap: extra_configs: - - CONFIG_LINK_TEST_SUITE_USBC_VCONN_SWAP=y + - CONFIG_LINK_TEST_SUITE_USBC_VCONN_SWAP=y drivers.host_cmd_thread: extra_configs: - - CONFIG_LINK_TEST_SUITE_HOST_CMD_THREAD=y - - CONFIG_TASK_HOSTCMD_THREAD_MAIN=y + - CONFIG_LINK_TEST_SUITE_HOST_CMD_THREAD=y + - CONFIG_TASK_HOSTCMD_THREAD_MAIN=y drivers.pi3usb9201: extra_configs: - - CONFIG_LINK_TEST_SUITE_PI3USB9201=y + - CONFIG_LINK_TEST_SUITE_PI3USB9201=y drivers.memmap: extra_configs: - - CONFIG_LINK_TEST_SUITE_MEMMAP=y + - CONFIG_LINK_TEST_SUITE_MEMMAP=y drivers.host_command_memory_dump: extra_configs: - - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_MEMORY_DUMP=y - - CONFIG_PLATFORM_EC_HOST_COMMAND_MEMORY_DUMP=y - - CONFIG_PLATFORM_EC_KEYBOARD_PROTOCOL_8042=y + - CONFIG_LINK_TEST_SUITE_HOST_COMMAND_MEMORY_DUMP=y + - CONFIG_PLATFORM_EC_HOST_COMMAND_MEMORY_DUMP=y + - CONFIG_PLATFORM_EC_KEYBOARD_PROTOCOL_8042=y diff --git a/zephyr/test/drivers/timer/src/timer.c b/zephyr/test/drivers/timer/src/timer.c index 5cbdae1ea8..abc5d0a88f 100644 --- a/zephyr/test/drivers/timer/src/timer.c +++ b/zephyr/test/drivers/timer/src/timer.c @@ -25,7 +25,7 @@ FAKE_VALUE_FUNC(int, __hw_clock_source_init64, uint64_t); FAKE_VALUE_FUNC(uint8_t *, system_get_jump_tag, uint16_t, int *, int *); -ZTEST(timer, init_from_jump_tag) +ZTEST(timer, test_init_from_jump_tag) { /* When initializing after a system jump, the timer should get set to * the time before the jump (stored in a jump tag) @@ -42,7 +42,7 @@ ZTEST(timer, init_from_jump_tag) __hw_clock_source_init64_fake.arg0_history[0], NULL); } -ZTEST(timer, init_from_zero) +ZTEST(timer, test_init_from_zero) { /* When there is no jump tag, the timer should initialize to zero. */ @@ -56,7 +56,7 @@ ZTEST(timer, init_from_zero) zassert_equal(0, __hw_clock_source_init64_fake.arg0_history[0], NULL); } -ZTEST(timer, console_cmd_gettime) +ZTEST(timer, test_console_cmd_gettime) { /* Should print the current time */ timestamp_t fake_time; @@ -76,7 +76,7 @@ ZTEST(timer, console_cmd_gettime) "Actual: '%s'", outbuffer); } -ZTEST(timer, console_cmd_timerinfo) +ZTEST(timer, test_console_cmd_timerinfo) { /* Prints current time and info on running timers. */ timestamp_t fake_time; diff --git a/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c b/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c index 8696fb68f3..fb466d66ab 100644 --- a/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c +++ b/zephyr/test/drivers/usb_pd_discovery/src/usb_pd_discovery.c @@ -69,7 +69,7 @@ ZTEST_SUITE(usb_pd_discovery, drivers_predicate_post_main, usb_pd_discovery_after, NULL); /* First up: Plain and correct DP response */ -ZTEST_F(usb_pd_discovery, verify_discovery) +ZTEST_F(usb_pd_discovery, test_verify_discovery) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; @@ -132,7 +132,7 @@ ZTEST_F(usb_pd_discovery, verify_discovery) } /* Now: Duplicate the DP SID */ -ZTEST_F(usb_pd_discovery, verify_svid_duplicate) +ZTEST_F(usb_pd_discovery, test_verify_svid_duplicate) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; @@ -188,7 +188,7 @@ ZTEST_F(usb_pd_discovery, verify_svid_duplicate) } /* Forget to 0 terminate the SVIDs */ -ZTEST_F(usb_pd_discovery, verify_bad_termination) +ZTEST_F(usb_pd_discovery, test_verify_bad_termination) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; @@ -244,7 +244,7 @@ ZTEST_F(usb_pd_discovery, verify_bad_termination) } /* Reply with a NAK to DiscoverModes */ -ZTEST_F(usb_pd_discovery, verify_modes_nak) +ZTEST_F(usb_pd_discovery, test_verify_modes_nak) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; @@ -294,7 +294,7 @@ ZTEST_F(usb_pd_discovery, verify_modes_nak) } /* Reply with the wrong SVID to DiscoverModes */ -ZTEST_F(usb_pd_discovery, verify_bad_mode) +ZTEST_F(usb_pd_discovery, test_verify_bad_mode) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; @@ -347,7 +347,7 @@ ZTEST_F(usb_pd_discovery, verify_bad_mode) } /* Reply without required mode VDO */ -ZTEST_F(usb_pd_discovery, verify_modes_missing) +ZTEST_F(usb_pd_discovery, test_verify_modes_missing) { struct tcpci_partner_data *partner = &fixture->partner; uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; diff --git a/zephyr/test/drivers/usb_port_power_dumb/src/usb_port_power_dumb.c b/zephyr/test/drivers/usb_port_power_dumb/src/usb_port_power_dumb.c index e651bb57d8..67bf48453e 100644 --- a/zephyr/test/drivers/usb_port_power_dumb/src/usb_port_power_dumb.c +++ b/zephyr/test/drivers/usb_port_power_dumb/src/usb_port_power_dumb.c @@ -37,7 +37,7 @@ static int check_gpio_status_for_port(int port_id) return gpio_get_level(usb_port_enable[port_id]); } -ZTEST(usb_port_power_dumb, console_command__noargs) +ZTEST(usb_port_power_dumb, test_console_command__noargs) { const char *outbuffer; size_t buffer_size; @@ -54,7 +54,7 @@ ZTEST(usb_port_power_dumb, console_command__noargs) zassert_false(check_gpio_status_for_port(PORT_ID), NULL); } -ZTEST(usb_port_power_dumb, console_command__modify_port_status) +ZTEST(usb_port_power_dumb, test_console_command__modify_port_status) { const char *outbuffer; size_t buffer_size; @@ -73,7 +73,7 @@ ZTEST(usb_port_power_dumb, console_command__modify_port_status) zassert_true(check_gpio_status_for_port(PORT_ID), NULL); } -ZTEST(usb_port_power_dumb, console_command__invalid) +ZTEST(usb_port_power_dumb, test_console_command__invalid) { /* Various bad input */ zassert_ok(!shell_execute_cmd(get_ec_shell(), "usbchargemode NaN"), @@ -88,7 +88,7 @@ ZTEST(usb_port_power_dumb, console_command__invalid) NULL); } -ZTEST(usb_port_power_dumb, host_command__enable) +ZTEST(usb_port_power_dumb, test_host_command__enable) { int ret; struct ec_params_usb_charge_set_mode params = { @@ -102,7 +102,7 @@ ZTEST(usb_port_power_dumb, host_command__enable) zassert_true(check_gpio_status_for_port(PORT_ID), NULL); } -ZTEST(usb_port_power_dumb, host_command__invalid_port_id) +ZTEST(usb_port_power_dumb, test_host_command__invalid_port_id) { int ret; struct ec_params_usb_charge_set_mode params = { @@ -117,7 +117,7 @@ ZTEST(usb_port_power_dumb, host_command__invalid_port_id) zassert_false(check_gpio_status_for_port(PORT_ID), NULL); } -ZTEST(usb_port_power_dumb, host_command__invalid_mode) +ZTEST(usb_port_power_dumb, test_host_command__invalid_mode) { int ret; struct ec_params_usb_charge_set_mode params = { diff --git a/zephyr/test/drivers/usb_retimer_fw_update/src/usb_retimer_fw_update.c b/zephyr/test/drivers/usb_retimer_fw_update/src/usb_retimer_fw_update.c index 21a471f22a..e5f6c23ed6 100644 --- a/zephyr/test/drivers/usb_retimer_fw_update/src/usb_retimer_fw_update.c +++ b/zephyr/test/drivers/usb_retimer_fw_update/src/usb_retimer_fw_update.c @@ -77,7 +77,7 @@ static void usb_retimer_fw_update_after(void *data) ZTEST_SUITE(usb_retimer_fw_update, drivers_predicate_post_main, NULL, usb_retimer_fw_update_before, usb_retimer_fw_update_after, NULL); -ZTEST(usb_retimer_fw_update, verify_query_port) +ZTEST(usb_retimer_fw_update, test_verify_query_port) { /* Write our command to query ports */ acpi_write(EC_ACPI_MEM_USB_RETIMER_FW_UPDATE, @@ -88,7 +88,7 @@ ZTEST(usb_retimer_fw_update, verify_query_port) "Failed to see port in query"); } -ZTEST(usb_retimer_fw_update, verify_suspend_port) +ZTEST(usb_retimer_fw_update, test_verify_suspend_port) { /* Write our command to suspend the port */ acpi_write(EC_ACPI_MEM_USB_RETIMER_FW_UPDATE, @@ -104,7 +104,7 @@ ZTEST(usb_retimer_fw_update, verify_suspend_port) "Failed to see successful suspend"); } -ZTEST(usb_retimer_fw_update, verify_resume_port) +ZTEST(usb_retimer_fw_update, test_verify_resume_port) { usb_retimer_fw_update_suspend_port(); @@ -122,7 +122,7 @@ ZTEST(usb_retimer_fw_update, verify_resume_port) "Failed to see successful resume"); } -ZTEST(usb_retimer_fw_update, verify_get_mux) +ZTEST(usb_retimer_fw_update, test_verify_get_mux) { struct ec_response_typec_status typec_status; @@ -141,7 +141,7 @@ ZTEST(usb_retimer_fw_update, verify_get_mux) } /* Commands which first require suspend to be run */ -ZTEST(usb_retimer_fw_update, verify_set_mux_usb) +ZTEST(usb_retimer_fw_update, test_verify_set_mux_usb) { struct ec_response_typec_status typec_status; @@ -165,7 +165,7 @@ ZTEST(usb_retimer_fw_update, verify_set_mux_usb) USB_PD_MUX_USB_ENABLED, "Status mux disagreement"); } -ZTEST(usb_retimer_fw_update, verify_set_mux_safe) +ZTEST(usb_retimer_fw_update, test_verify_set_mux_safe) { struct ec_response_typec_status typec_status; @@ -189,7 +189,7 @@ ZTEST(usb_retimer_fw_update, verify_set_mux_safe) USB_PD_MUX_SAFE_MODE, "Status mux disagreement"); } -ZTEST(usb_retimer_fw_update, verify_set_mux_tbt) +ZTEST(usb_retimer_fw_update, test_verify_set_mux_tbt) { struct ec_response_typec_status typec_status; @@ -213,7 +213,7 @@ ZTEST(usb_retimer_fw_update, verify_set_mux_tbt) USB_PD_MUX_TBT_COMPAT_ENABLED, "Status mux disagreement"); } -ZTEST(usb_retimer_fw_update, verify_update_disconnect) +ZTEST(usb_retimer_fw_update, test_verify_update_disconnect) { uint64_t command_start; @@ -252,7 +252,7 @@ ZTEST(usb_retimer_fw_update, verify_update_disconnect) } /* Verify we get an error if port isn't suspended */ -ZTEST(usb_retimer_fw_update, verify_mux_usb_error) +ZTEST(usb_retimer_fw_update, test_verify_mux_usb_error) { /* Set the mux to USB on unsuspended port */ acpi_write(EC_ACPI_MEM_USB_RETIMER_FW_UPDATE, diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c index 9f57db83fa..17959e185a 100644 --- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c +++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode.c @@ -208,7 +208,7 @@ static void usbc_alt_mode_after(void *data) fixture->charger_emul); } -ZTEST_F(usbc_alt_mode, verify_discovery) +ZTEST_F(usbc_alt_mode, test_verify_discovery) { uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; struct ec_response_typec_discovery *discovery = @@ -239,7 +239,7 @@ ZTEST_F(usbc_alt_mode, verify_discovery) "DP mode VDOs did not match"); } -ZTEST_F(usbc_alt_mode, verify_discovery_params_too_small) +ZTEST_F(usbc_alt_mode, test_verify_discovery_params_too_small) { struct ec_response_typec_discovery discovery; @@ -252,7 +252,7 @@ ZTEST_F(usbc_alt_mode, verify_discovery_params_too_small) zassert_equal(discovery.svid_count, 0); } -ZTEST_F(usbc_alt_mode, verify_displayport_mode_entry) +ZTEST_F(usbc_alt_mode, test_verify_displayport_mode_entry) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); @@ -303,7 +303,7 @@ ZTEST_F(usbc_alt_mode, verify_displayport_mode_entry) zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 1); } -ZTEST_F(usbc_alt_mode, verify_bad_hpd_irq_reject) +ZTEST_F(usbc_alt_mode, test_verify_bad_hpd_irq_reject) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); @@ -344,7 +344,7 @@ ZTEST_F(usbc_alt_mode, verify_bad_hpd_irq_reject) zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 0); } -ZTEST_F(usbc_alt_mode, verify_hpd_clear) +ZTEST_F(usbc_alt_mode, test_verify_hpd_clear) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); @@ -402,7 +402,7 @@ ZTEST_F(usbc_alt_mode, verify_hpd_clear) zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 0); } -ZTEST_F(usbc_alt_mode, verify_hpd_irq_set) +ZTEST_F(usbc_alt_mode, test_verify_hpd_irq_set) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); @@ -463,7 +463,7 @@ ZTEST_F(usbc_alt_mode, verify_hpd_irq_set) zassert_equal(gpio_emul_output_get(gpio->port, gpio->pin), 1); } -ZTEST_F(usbc_alt_mode, verify_discovery_via_pd_host_cmd) +ZTEST_F(usbc_alt_mode, test_verify_discovery_via_pd_host_cmd) { struct ec_params_usb_pd_info_request params = { .port = TEST_PORT }; struct ec_params_usb_pd_discovery_entry response; @@ -528,7 +528,7 @@ static void usbc_alt_mode_dp_unsupported_after(void *data) * When the partner advertises DP mode support but refuses to enter, discovery * should still work as if the partner were compliant. */ -ZTEST_F(usbc_alt_mode_dp_unsupported, verify_discovery) +ZTEST_F(usbc_alt_mode_dp_unsupported, test_verify_discovery) { if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); @@ -568,7 +568,7 @@ ZTEST_F(usbc_alt_mode_dp_unsupported, verify_discovery) * When the partner advertises DP support but refuses to enter DP mode, the TCPM * should try once and then give up. */ -ZTEST_F(usbc_alt_mode_dp_unsupported, verify_displayport_mode_nonentry) +ZTEST_F(usbc_alt_mode_dp_unsupported, test_verify_displayport_mode_nonentry) { if (IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { host_cmd_typec_control_enter_mode(TEST_PORT, TYPEC_MODE_DP); diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c index 10bc4a7012..6d1286b2e5 100644 --- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c +++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode__require_ap_mode_entry.c @@ -14,7 +14,7 @@ /* Tests that require CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY enabled */ -ZTEST_F(usbc_alt_mode, verify_displayport_mode_reentry) +ZTEST_F(usbc_alt_mode, test_verify_displayport_mode_reentry) { if (!IS_ENABLED(CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY)) { ztest_test_skip(); @@ -46,7 +46,7 @@ ZTEST_F(usbc_alt_mode, verify_displayport_mode_reentry) USB_PD_MUX_DP_ENABLED, "Failed to see DP mux set"); } -ZTEST_F(usbc_alt_mode, verify_mode_exit_via_pd_host_cmd) +ZTEST_F(usbc_alt_mode, test_verify_mode_exit_via_pd_host_cmd) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); @@ -95,7 +95,7 @@ ZTEST_F(usbc_alt_mode, verify_mode_exit_via_pd_host_cmd) zassert_equal((status.mux_state & USB_PD_MUX_DP_ENABLED), 0); } -ZTEST_F(usbc_alt_mode, verify_early_status_hpd_set) +ZTEST_F(usbc_alt_mode, test_verify_early_status_hpd_set) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_hpd); diff --git a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode_ec_mode_entry.c b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode_ec_mode_entry.c index e36ba57e26..8344b37ee9 100644 --- a/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode_ec_mode_entry.c +++ b/zephyr/test/drivers/usbc_alt_mode/src/usbc_alt_mode_ec_mode_entry.c @@ -17,7 +17,7 @@ /* Tests that require CONFIG_PLATFORM_EC_USB_PD_REQUIRE_AP_MODE_ENTRY disabled */ -ZTEST_F(usbc_alt_mode, verify_displayport_mode_power_cycle) +ZTEST_F(usbc_alt_mode, test_verify_displayport_mode_power_cycle) { struct ec_response_typec_status status; diff --git a/zephyr/test/drivers/usbc_console_pd/src/usbc_console_pd.c b/zephyr/test/drivers/usbc_console_pd/src/usbc_console_pd.c index 37908ce1e4..3e876052f9 100644 --- a/zephyr/test/drivers/usbc_console_pd/src/usbc_console_pd.c +++ b/zephyr/test/drivers/usbc_console_pd/src/usbc_console_pd.c @@ -124,7 +124,7 @@ static void usbc_console_pd_after(void *data) common_after(&outer->common); } -ZTEST_USER_F(usbc_console_pd, pd_command) +ZTEST_USER_F(usbc_console_pd, test_pd_command) { struct common_fixture *common = &fixture->common; struct tcpci_src_emul_data *src_ext = &common->src_ext; diff --git a/zephyr/test/drivers/usbc_ctvpd/src/main.c b/zephyr/test/drivers/usbc_ctvpd/src/main.c index 0bd6639d83..909a52daa9 100644 --- a/zephyr/test/drivers/usbc_ctvpd/src/main.c +++ b/zephyr/test/drivers/usbc_ctvpd/src/main.c @@ -125,7 +125,7 @@ static void usbc_ctvpd_after(void *data) ZTEST_SUITE(usbc_ctvpd, drivers_predicate_post_main, usbc_ctvpd_setup, usbc_ctvpd_before, usbc_ctvpd_after, NULL); -ZTEST_USER_F(usbc_ctvpd, verify_discovery) +ZTEST_USER_F(usbc_ctvpd, test_verify_discovery) { uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; struct ec_response_typec_discovery *discovery = @@ -148,7 +148,7 @@ ZTEST_USER_F(usbc_ctvpd, verify_discovery) "Discovered SOP identity ACK did not match"); } -ZTEST_USER_F(usbc_ctvpd, verify_no_vconn_swap) +ZTEST_USER_F(usbc_ctvpd, test_verify_no_vconn_swap) { struct ec_response_typec_status status = host_cmd_typec_status(TEST_PORT); diff --git a/zephyr/test/drivers/usbc_ppc/ppc_alts.dts b/zephyr/test/drivers/usbc_ppc/ppc_alts.dts index 09488dc91e..ed84ff0662 100644 --- a/zephyr/test/drivers/usbc_ppc/ppc_alts.dts +++ b/zephyr/test/drivers/usbc_ppc/ppc_alts.dts @@ -17,9 +17,10 @@ &i2c0 { ppc_nx20p348x_alt: nx20p348x@77 { - compatible = "nxp,nx20p348x", "cros,i2c-mock"; + compatible = "nxp,nx20p348x"; status = "okay"; reg = <0x77>; + irq-gpios = < &gpio0 14 GPIO_ACTIVE_LOW >; is-alt; }; diff --git a/zephyr/test/drivers/usbc_tbt_mode/src/usbc_tbt_mode.c b/zephyr/test/drivers/usbc_tbt_mode/src/usbc_tbt_mode.c index 2fc895bb27..38476eb36c 100644 --- a/zephyr/test/drivers/usbc_tbt_mode/src/usbc_tbt_mode.c +++ b/zephyr/test/drivers/usbc_tbt_mode/src/usbc_tbt_mode.c @@ -211,7 +211,7 @@ static void usbc_tbt_mode_after(void *data) tcpci_partner_common_clear_logged_msgs(&fix->partner); } -ZTEST_F(usbc_tbt_mode, verify_discovery) +ZTEST_F(usbc_tbt_mode, test_verify_discovery) { uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; struct ec_response_typec_discovery *discovery = @@ -247,7 +247,7 @@ ZTEST_F(usbc_tbt_mode, verify_discovery) } /* Without an e-marked cable, TBT mode cannot be entered */ -ZTEST_F(usbc_tbt_mode, verify_tbt_entry_fail) +ZTEST_F(usbc_tbt_mode, test_verify_tbt_entry_fail) { struct ec_response_typec_status status; @@ -285,7 +285,7 @@ ZTEST_F(usbc_tbt_mode, verify_tbt_entry_fail) } /* With passive e-marked cable, TBT mode can be entered on SOP only */ -ZTEST_F(usbc_tbt_mode, verify_tbt_passive_entry_exit) +ZTEST_F(usbc_tbt_mode, test_verify_tbt_passive_entry_exit) { struct ec_response_typec_status status; diff --git a/zephyr/test/drivers/usbc_usb4_mode/src/usbc_usb4_mode.c b/zephyr/test/drivers/usbc_usb4_mode/src/usbc_usb4_mode.c index b8bb6809a4..4c21aaeac4 100644 --- a/zephyr/test/drivers/usbc_usb4_mode/src/usbc_usb4_mode.c +++ b/zephyr/test/drivers/usbc_usb4_mode/src/usbc_usb4_mode.c @@ -163,7 +163,7 @@ static void usbc_usb4_mode_after(void *data) tcpci_partner_common_clear_logged_msgs(&fix->partner); } -ZTEST_F(usbc_usb4_mode, verify_discovery) +ZTEST_F(usbc_usb4_mode, test_verify_discovery) { uint8_t response_buffer[EC_LPC_HOST_PACKET_SIZE]; struct ec_response_typec_discovery *discovery = @@ -188,7 +188,7 @@ ZTEST_F(usbc_usb4_mode, verify_discovery) } /* Without an e-marked cable, USB4 mode cannot be entered */ -ZTEST_F(usbc_usb4_mode, verify_usb4_entry_fail) +ZTEST_F(usbc_usb4_mode, test_verify_usb4_entry_fail) { struct ec_response_typec_status status; @@ -217,7 +217,7 @@ ZTEST_F(usbc_usb4_mode, verify_usb4_entry_fail) } /* With passive e-marked cable, USB4 mode can be entered on SOP only */ -ZTEST_F(usbc_usb4_mode, verify_usb4_passive_entry_exit) +ZTEST_F(usbc_usb4_mode, test_verify_usb4_passive_entry_exit) { struct ec_response_typec_status status; diff --git a/zephyr/test/drivers/usbc_vconn_swap/src/usbc_vconn_swap.c b/zephyr/test/drivers/usbc_vconn_swap/src/usbc_vconn_swap.c index bc1eb6cd0d..a0e373c9d8 100644 --- a/zephyr/test/drivers/usbc_vconn_swap/src/usbc_vconn_swap.c +++ b/zephyr/test/drivers/usbc_vconn_swap/src/usbc_vconn_swap.c @@ -153,7 +153,7 @@ static void usbc_vconn_swap_not_supported_after(void *data) common_after(&outer->common); } -ZTEST_F(usbc_vconn_swap, vconn_swap_before_discovery) +ZTEST_F(usbc_vconn_swap, test_vconn_swap_before_discovery) { struct ec_response_typec_status status = host_cmd_typec_status(TEST_PORT); @@ -162,7 +162,7 @@ ZTEST_F(usbc_vconn_swap, vconn_swap_before_discovery) "TCPM did not initiate VCONN Swap after attach"); } -ZTEST_F(usbc_vconn_swap, vconn_swap_via_host_command) +ZTEST_F(usbc_vconn_swap, test_vconn_swap_via_host_command) { struct ec_response_typec_status status = host_cmd_typec_status(TEST_PORT); @@ -181,7 +181,7 @@ ZTEST_F(usbc_vconn_swap, vconn_swap_via_host_command) ZTEST_SUITE(usbc_vconn_swap, drivers_predicate_post_main, usbc_vconn_swap_setup, usbc_vconn_swap_before, usbc_vconn_swap_after, NULL); -ZTEST_F(usbc_vconn_swap_not_supported, vconn_swap_force_vconn) +ZTEST_F(usbc_vconn_swap_not_supported, test_vconn_swap_force_vconn) { struct ec_response_typec_status status = host_cmd_typec_status(TEST_PORT); diff --git a/zephyr/test/kingler/src/fakes.c b/zephyr/test/kingler/src/fakes.c index 52befc59c4..fd06ab2eb1 100644 --- a/zephyr/test/kingler/src/fakes.c +++ b/zephyr/test/kingler/src/fakes.c @@ -19,6 +19,7 @@ FAKE_VOID_FUNC(switch_interrupt, enum gpio_signal); FAKE_VOID_FUNC(tcpc_alert_event, enum gpio_signal); FAKE_VOID_FUNC(ppc_interrupt, enum gpio_signal); FAKE_VOID_FUNC(bc12_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(chipset_warm_reset_interrupt, enum gpio_signal); #ifndef CONFIG_TEST_KINGLER_CCD FAKE_VOID_FUNC(ccd_interrupt, enum gpio_signal); #endif diff --git a/zephyr/test/kingler/testcase.yaml b/zephyr/test/kingler/testcase.yaml index c6507043f7..04e580fe22 100644 --- a/zephyr/test/kingler/testcase.yaml +++ b/zephyr/test/kingler/testcase.yaml @@ -1,56 +1,52 @@ -# 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. - common: platform_allow: native_posix tests: kingler.steelix: - extra_args: - DTC_OVERLAY_FILE="kingler.steelix.overlay" extra_configs: - - CONFIG_TEST_STEELIX_RUSTY=y - - CONFIG_TEST_FORM_FACTOR_CONVERTIBLE=y - - CONFIG_PLATFORM_EC_ACCELGYRO_LSM6DSM=y + - CONFIG_TEST_STEELIX_RUSTY=y + - CONFIG_TEST_FORM_FACTOR_CONVERTIBLE=y + - CONFIG_PLATFORM_EC_ACCELGYRO_LSM6DSM=y + extra_dtc_overlay_files: + - kingler.steelix.overlay kingler.rusty: - extra_args: - DTC_OVERLAY_FILE="kingler.steelix.overlay" extra_configs: - - CONFIG_TEST_STEELIX_RUSTY=y - - CONFIG_TEST_FORM_FACTOR_CLAMSHELL=y - - CONFIG_PLATFORM_EC_ACCELGYRO_LSM6DSM=y + - CONFIG_TEST_STEELIX_RUSTY=y + - CONFIG_TEST_FORM_FACTOR_CLAMSHELL=y + - CONFIG_PLATFORM_EC_ACCELGYRO_LSM6DSM=y + extra_dtc_overlay_files: + - kingler.steelix.overlay kingler.db_detect_typec: - extra_args: - DTC_OVERLAY_FILE="kingler.default.overlay" extra_configs: - - CONFIG_TEST_DB_DETECT_TYPEC=y - - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + - CONFIG_TEST_DB_DETECT_TYPEC=y + - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + extra_dtc_overlay_files: + - kingler.default.overlay kingler.db_detect_hdmi: - extra_args: - DTC_OVERLAY_FILE="kingler.default.overlay" extra_configs: - - CONFIG_TEST_DB_DETECT_HDMI=y - - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + - CONFIG_TEST_DB_DETECT_HDMI=y + - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + extra_dtc_overlay_files: + - kingler.default.overlay kingler.db_detect_none: - extra_args: - DTC_OVERLAY_FILE="kingler.steelix.overlay" extra_configs: - - CONFIG_TEST_DB_DETECT_NONE=y - - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + - CONFIG_TEST_DB_DETECT_NONE=y + - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + extra_dtc_overlay_files: + - kingler.steelix.overlay kingler.ccd: - extra_args: - DTC_OVERLAY_FILE="kingler.default.overlay" extra_configs: - - CONFIG_TEST_KINGLER_CCD=y + - CONFIG_TEST_KINGLER_CCD=y + extra_dtc_overlay_files: + - kingler.default.overlay kingler.alt_sensor: - extra_args: - DTC_OVERLAY_FILE="kingler.steelix.overlay" extra_configs: - - CONFIG_TEST_STEELIX_RUSTY=y - - CONFIG_TEST_ALT_SENSOR_PROBE=y + - CONFIG_TEST_STEELIX_RUSTY=y + - CONFIG_TEST_ALT_SENSOR_PROBE=y + extra_dtc_overlay_files: + - kingler.steelix.overlay kingler.voltorb: - extra_args: - DTC_OVERLAY_FILE="kingler.default.overlay" extra_configs: - - CONFIG_TEST_VOLTORB=y - - CONFIG_TEST_USB_PD_POLICY=y + - CONFIG_TEST_VOLTORB=y + - CONFIG_TEST_USB_PD_POLICY=y + extra_dtc_overlay_files: + - kingler.default.overlay diff --git a/zephyr/test/krabby/prj.conf b/zephyr/test/krabby/prj.conf index 3de743c076..58b208ef7d 100644 --- a/zephyr/test/krabby/prj.conf +++ b/zephyr/test/krabby/prj.conf @@ -38,3 +38,5 @@ CONFIG_PLATFORM_EC_USB_POWER_DELIVERY=y CONFIG_PLATFORM_EC_VBOOT_HASH=n CONFIG_PLATFORM_EC_USBC_PPC=y + +CONFIG_NATIVE_UART_0_ON_STDINOUT=y diff --git a/zephyr/test/krabby/src/fake.c b/zephyr/test/krabby/src/fake.c index 9baff6f74d..5c83e1cb88 100644 --- a/zephyr/test/krabby/src/fake.c +++ b/zephyr/test/krabby/src/fake.c @@ -12,6 +12,7 @@ FAKE_VOID_FUNC(button_interrupt, enum gpio_signal); FAKE_VOID_FUNC(chipset_reset_request_interrupt, enum gpio_signal); FAKE_VOID_FUNC(power_signal_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(chipset_warm_reset_interrupt, enum gpio_signal); FAKE_VOID_FUNC(chipset_watchdog_interrupt, enum gpio_signal); FAKE_VOID_FUNC(extpower_interrupt, enum gpio_signal); FAKE_VOID_FUNC(usb_a0_interrupt, enum gpio_signal); diff --git a/zephyr/test/krabby/src/power_seq.c b/zephyr/test/krabby/src/power_seq.c index d01fbad035..de88342831 100644 --- a/zephyr/test/krabby/src/power_seq.c +++ b/zephyr/test/krabby/src/power_seq.c @@ -32,6 +32,9 @@ FAKE_VALUE_FUNC(int, system_jumped_late); #define S5_INACTIVE_SEC 11 +/* mt8186 is_held flag */ +extern bool is_held; + static void set_signal_state(enum power_state state) { const struct gpio_dt_spec *ap_ec_sysrst_odl = @@ -59,6 +62,8 @@ static void set_signal_state(enum power_state state) zassert_unreachable("state %d not supported", state); } + /* reset is_held flag */ + is_held = false; task_wake(TASK_ID_CHIPSET); k_sleep(K_SECONDS(1)); } @@ -69,8 +74,8 @@ static void power_seq_before(void *f) set_test_runner_tid(); /* Start from G3 */ - set_signal_state(POWER_G3); power_set_state(POWER_G3); + set_signal_state(POWER_G3); k_sleep(K_SECONDS(S5_INACTIVE_SEC)); RESET_FAKE(chipset_pre_init_hook); diff --git a/zephyr/test/krabby/testcase.yaml b/zephyr/test/krabby/testcase.yaml index 82bd8cd3ef..c9a683f316 100644 --- a/zephyr/test/krabby/testcase.yaml +++ b/zephyr/test/krabby/testcase.yaml @@ -1,35 +1,33 @@ -# 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. - common: platform_allow: native_posix tests: krabby.default: - extra_args: DTC_OVERLAY_FILE="krabby.default.overlay" extra_configs: - - CONFIG_TEST_KRABBY=y - - CONFIG_AP_ARM_MTK_MT8186=y - - CONFIG_MUX_INIT_ADC=y - - CONFIG_PLATFORM_EC_CHIPSET_RESUME_INIT_HOOK=y - - CONFIG_PLATFORM_EC_EXTPOWER_GPIO=y - - CONFIG_PLATFORM_EC_POWERSEQ=y - - CONFIG_PLATFORM_EC_POWERSEQ_PP5000_CONTROL=n - - CONFIG_SHIMMED_TASKS=y + - CONFIG_TEST_KRABBY=y + - CONFIG_AP_ARM_MTK_MT8186=y + - CONFIG_MUX_INIT_ADC=y + - CONFIG_PLATFORM_EC_CHIPSET_RESUME_INIT_HOOK=y + - CONFIG_PLATFORM_EC_EXTPOWER_GPIO=y + - CONFIG_PLATFORM_EC_POWERSEQ=y + - CONFIG_PLATFORM_EC_POWERSEQ_PP5000_CONTROL=n + - CONFIG_SHIMMED_TASKS=y + extra_dtc_overlay_files: + - krabby.default.overlay krabby.tentacruel: - extra_args: DTC_OVERLAY_FILE="krabby.tentacruel.overlay" extra_configs: - - CONFIG_TEST_TENTACRUEL=y - - CONFIG_PLATFORM_EC_CHARGER_PROFILE_OVERRIDE=y - - CONFIG_EEPROM=y - - CONFIG_EEPROM_SIMULATOR=n - - CONFIG_EMUL_EEPROM_AT2X=y - - CONFIG_PLATFORM_EC_MOTIONSENSE=y - - CONFIG_PLATFORM_EC_DYNAMIC_MOTION_SENSOR_COUNT=y - - CONFIG_PLATFORM_EC_GMR_TABLET_MODE=y - - CONFIG_PLATFORM_EC_TABLET_MODE=y - - CONFIG_PLATFORM_EC_LID_ANGLE=y - - CONFIG_PLATFORM_EC_ACCELGYRO_BMI260=y - - CONFIG_PLATFORM_EC_ACCELGYRO_BMI_COMM_I2C=y - - CONFIG_PLATFORM_EC_USBC_PPC_RT1739=y - - CONFIG_PLATFORM_EC_BC12_SINGLE_DRIVER=n + - CONFIG_TEST_TENTACRUEL=y + - CONFIG_PLATFORM_EC_CHARGER_PROFILE_OVERRIDE=y + - CONFIG_EEPROM=y + - CONFIG_EEPROM_SIMULATOR=n + - CONFIG_EMUL_EEPROM_AT2X=y + - CONFIG_PLATFORM_EC_MOTIONSENSE=y + - CONFIG_PLATFORM_EC_DYNAMIC_MOTION_SENSOR_COUNT=y + - CONFIG_PLATFORM_EC_GMR_TABLET_MODE=y + - CONFIG_PLATFORM_EC_TABLET_MODE=y + - CONFIG_PLATFORM_EC_LID_ANGLE=y + - CONFIG_PLATFORM_EC_ACCELGYRO_BMI260=y + - CONFIG_PLATFORM_EC_ACCELGYRO_BMI_COMM_I2C=y + - CONFIG_PLATFORM_EC_USBC_PPC_RT1739=y + - CONFIG_PLATFORM_EC_BC12_SINGLE_DRIVER=n + extra_dtc_overlay_files: + - krabby.tentacruel.overlay diff --git a/zephyr/test/math/src/fixed_point_int_sqrtf.c b/zephyr/test/math/src/fixed_point_int_sqrtf.c index 4403980a96..f949084f28 100644 --- a/zephyr/test/math/src/fixed_point_int_sqrtf.c +++ b/zephyr/test/math/src/fixed_point_int_sqrtf.c @@ -8,12 +8,12 @@ #include <zephyr/ztest.h> -ZTEST_USER(math, int_sqrtf_negative) +ZTEST_USER(math, test_int_sqrtf_negative) { zassert_equal(int_sqrtf(-100), 0); } -ZTEST_USER(math, int_sqrtf_overflow) +ZTEST_USER(math, test_int_sqrtf_overflow) { zassert_equal(int_sqrtf(INT64_MAX), INT32_MAX); } diff --git a/zephyr/test/math/src/mask.c b/zephyr/test/math/src/mask.c index c986834eb8..e3bce982a5 100644 --- a/zephyr/test/math/src/mask.c +++ b/zephyr/test/math/src/mask.c @@ -10,7 +10,7 @@ #include <zephyr/ztest.h> -ZTEST_USER(math, bitmask_uint64) +ZTEST_USER(math, test_bitmask_uint64) { zassert_equal(bitmask_uint64(-1), 0); zassert_equal(bitmask_uint64(64), 0); diff --git a/zephyr/test/math/src/math_util.c b/zephyr/test/math/src/math_util.c index 184dd2b999..e5d9d8c9f2 100644 --- a/zephyr/test/math/src/math_util.c +++ b/zephyr/test/math/src/math_util.c @@ -10,7 +10,7 @@ #include <zephyr/ztest.h> -ZTEST_USER(math, arc_cos__x_below_range) +ZTEST_USER(math, test_arc_cos__x_below_range) { fp_t result = arc_cos(FLOAT_TO_FP(-1.1)); @@ -18,7 +18,7 @@ ZTEST_USER(math, arc_cos__x_below_range) "arc_cos(-1.1) was %d", FP_TO_INT(result)); } -ZTEST_USER(math, arc_cos__x_above_range) +ZTEST_USER(math, test_arc_cos__x_above_range) { fp_t result = arc_cos(FLOAT_TO_FP(1.1)); @@ -26,7 +26,7 @@ ZTEST_USER(math, arc_cos__x_above_range) "arc_cos(1.1) was %d", FP_TO_INT(result)); } -ZTEST_USER(math, int_sqrtf) +ZTEST_USER(math, test_int_sqrtf) { zassert_equal(int_sqrtf(0), 0); zassert_equal(int_sqrtf(15), 3); @@ -36,13 +36,13 @@ ZTEST_USER(math, int_sqrtf) zassert_equal(int_sqrtf(1000000000000000005), 1000000000); } -ZTEST_USER(math, fp_sqrtf) +ZTEST_USER(math, test_fp_sqrtf) { zassert_within(fp_sqrtf(FLOAT_TO_FP(15)), FLOAT_TO_FP(3.872983), FLOAT_TO_FP(0.001), NULL); } -ZTEST_USER(math, print_ints) +ZTEST_USER(math, test_print_ints) { char buffer[10]; diff --git a/zephyr/test/math/src/vector.c b/zephyr/test/math/src/vector.c index e588be52af..344cb80f48 100644 --- a/zephyr/test/math/src/vector.c +++ b/zephyr/test/math/src/vector.c @@ -8,7 +8,7 @@ #include <zephyr/ztest.h> -ZTEST_USER(math, cosine_of_angle_diff__zero_magnitude_vector) +ZTEST_USER(math, test_cosine_of_angle_diff__zero_magnitude_vector) { intv3_t v0 = { 0, 0, 0 }; intv3_t v1 = { 1, 1, 1 }; @@ -17,7 +17,7 @@ ZTEST_USER(math, cosine_of_angle_diff__zero_magnitude_vector) zassert_equal(cosine_of_angle_diff(v1, v0), 0); } -ZTEST_USER(math, rotate_inv__null_matrix) +ZTEST_USER(math, test_rotate_inv__null_matrix) { intv3_t v = { 1, 2, 3 }; intv3_t r = { 4, 5, 6 }; diff --git a/zephyr/test/math/testcase.yaml b/zephyr/test/math/testcase.yaml index cd33e70553..465591e5a0 100644 --- a/zephyr/test/math/testcase.yaml +++ b/zephyr/test/math/testcase.yaml @@ -2,6 +2,8 @@ common: platform_allow: native_posix tests: util.math.fixed_point: - extra_args: OVERLAY_CONFIG=./fixed_point.conf + extra_overlay_confs: + - ./fixed_point.conf util.math.floating_point: - extra_args: OVERLAY_CONFIG=./floating_point.conf + extra_overlay_confs: + - ./floating_point.conf diff --git a/zephyr/test/nissa/CMakeLists.txt b/zephyr/test/nissa/CMakeLists.txt new file mode 100644 index 0000000000..dc351aa3b6 --- /dev/null +++ b/zephyr/test/nissa/CMakeLists.txt @@ -0,0 +1,17 @@ +# 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. + +cmake_minimum_required(VERSION 3.13.1) +find_package(Zephyr REQUIRED HINTS "${ZEPHYR_BASE}") +project(nissa) + +add_subdirectory(${PLATFORM_EC}/zephyr/test/test_utils test_utils) + +zephyr_include_directories("${PLATFORM_EC_PROGRAM_DIR}/nissa/include") + +target_sources(app PRIVATE src/stubs.c src/sub_board.c) + +target_sources(app PRIVATE + ${PLATFORM_EC_PROGRAM_DIR}/nissa/src/sub_board.c + ${PLATFORM_EC_PROGRAM_DIR}/nissa/src/common.c) diff --git a/zephyr/test/nissa/Kconfig b/zephyr/test/nissa/Kconfig new file mode 100644 index 0000000000..f8215bbf37 --- /dev/null +++ b/zephyr/test/nissa/Kconfig @@ -0,0 +1,9 @@ +# 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. + +module = NISSA +module-str = Nissa board-specific code (unit tests) +source "subsys/logging/Kconfig.template.log_config" + +source "Kconfig.zephyr" diff --git a/zephyr/test/nissa/README.md b/zephyr/test/nissa/README.md new file mode 100644 index 0000000000..17737fcba5 --- /dev/null +++ b/zephyr/test/nissa/README.md @@ -0,0 +1,3 @@ +Tests for board specific code under `zephyr/program/nissa/` + +Run with ./twister -T zephyr/test/nissa diff --git a/zephyr/test/nissa/boards/generic_npcx.dts b/zephyr/test/nissa/boards/generic_npcx.dts new file mode 100644 index 0000000000..1639dc80c8 --- /dev/null +++ b/zephyr/test/nissa/boards/generic_npcx.dts @@ -0,0 +1,179 @@ +/* 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. + * + * Device tree for a generic Nissa device based on a NPCX EC, suitable for board + * unit tests. + */ +#include <npcx_emul.dts> +#include "../program/nissa/cbi.dtsi" + +/ { + aliases { + /* type-C */ + gpio-usb-c1-int-odl = &gpio_sb_1; + /* type-A */ + gpio-en-usb-a1-vbus = &gpio_sb_2; + /* HDMI */ + gpio-en-rails-odl = &gpio_sb_1; + gpio-hdmi-en-odl = &gpio_sb_3; + gpio-hpd-odl = &gpio_sb_4; + /* LTE */ + gpio-en-sub-s5-rails = &gpio_sb_2; + }; + + gpio-interrupts { + compatible = "cros-ec,gpio-interrupts"; + + int_usb_c0: usb_c0 { + irq-pin = <&gpio_usb_c0_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "usb_interrupt_c0"; + }; + + int_usb_c1: usb_c1 { + irq-pin = <&gpio_sb_1>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "usb_interrupt_c1"; + }; + }; + + named-gpios { + compatible = "named-gpios"; + + gpio_ec_soc_dsw_pwrok: ec_soc_dsw_pwrok { + gpios = <&gpio6 1 GPIO_OUTPUT>; + }; + + gpio_ec_soc_hdmi_hpd: ec_soc_hdmi_hpd { + gpios = <&gpioe 4 GPIO_OUTPUT>; + }; + + entering_rw { + gpios = <&gpio0 3 GPIO_OUTPUT>; + enum-name = "GPIO_ENTERING_RW"; + }; + + gpio_en_pp5000_pen_x: en_pp5000_pen_x { + gpios = <&gpioe 2 GPIO_OUTPUT>; + }; + + gpio_en_slp_z: en_slp_z { + gpios = <&gpioe 1 GPIO_OUTPUT>; + }; + + gpio_hdmi_sel: hdmi_sel { + gpios = <&gpioc 6 GPIO_OUTPUT>; + }; + + gpio_usb_a0_enable: usb_a0_enable { + gpios = <&gpio1 0 GPIO_OUTPUT>; + }; + + gpio_usb_a0_ilimit_sdp: usb_a0_ilimit_sdp { + gpios = <&gpio1 2 GPIO_OUTPUT>; + enum-name = "GPIO_USB1_ILIM_SEL"; + }; + + gpio_sub_usb_a1_ilimit_sdp: usb_a1_ilimit_sdp { + gpios = <&gpio1 3 GPIO_OUTPUT>; + enum-name = "GPIO_USB2_ILIM_SEL"; + }; + + gpio_usb_c0_int_odl: usb_c0_int_odl { + gpios = <&gpio0 1 GPIO_INPUT_PULL_UP>; + }; + + gpio_sb_1: sb-1 { + gpios = <&gpio0 2 GPIO_PULL_UP>; + no-auto-init; + }; + + gpio_sb_2: sb-2 { + gpios = <&gpiod 4 GPIO_OUTPUT>; + no-auto-init; + }; + + gpio_sb_3: sb-3 { + gpios = <&gpiof 4 0>; + no-auto-init; + }; + + gpio_sb_4: sb-4 { + gpios = <&gpiof 5 GPIO_INPUT>; + no-auto-init; + }; + }; + + named-i2c-ports { + compatible = "named-i2c-ports"; + i2c_ec_i2c_usb_c0: ec_i2c_usb_c0 { + i2c-port = <&i2c_ctrl0>; + enum-names = "I2C_PORT_USB_C0_TCPC"; + }; + i2c_ec_i2c_sub_usb_c1: ec_i2c_sub_usb_c1 { + i2c-port = <&i2c_ctrl1>; + enum-names = "I2C_PORT_USB_C1_TCPC"; + }; + }; + + usba { + compatible = "cros-ec,usba-port-enable-pins"; + enable-pins = <&gpio_usb_a0_enable &gpio_sb_2>; + status = "okay"; + }; + + usbc { + #address-cells = <1>; + #size-cells = <0>; + port0@0 { + compatible = "named-usbc-port"; + reg = <0>; + tcpc = <&tcpci_emul_0>; + usb-mux-chain-0 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&virtual_mux_0>; + }; + }; + port1@1 { + compatible = "named-usbc-port"; + reg = <1>; + tcpc = <&tcpci_emul_1>; + usb-mux-chain-1 { + compatible = "cros-ec,usb-mux-chain"; + usb-muxes = <&virtual_mux_1>; + }; + usb_mux_chain_1_no_mux: usb-mux-chain-1-alternate { + compatible = "cros-ec,usb-mux-chain"; + alternative-chain; + usb-muxes = <&virtual_mux_1>; + }; + }; + port0-muxes { + virtual_mux_0: virtual-mux-0 { + compatible = "cros-ec,usbc-mux-virtual"; + }; + }; + port1-muxes { + virtual_mux_1: virtual-mux-1 { + compatible = "cros-ec,usbc-mux-virtual"; + }; + }; + }; +}; + +&i2c_ctrl0 { + tcpci_emul_0: tcpci_emul@82 { + compatible = "cros,tcpci-generic-emul"; + status = "okay"; + reg = <0x82>; + }; +}; + +&i2c_ctrl1 { + tcpci_emul_1: tcpci_emul@82 { + compatible = "cros,tcpci-generic-emul"; + status = "okay"; + reg = <0x82>; + }; +}; diff --git a/zephyr/test/nissa/prj.conf b/zephyr/test/nissa/prj.conf new file mode 100644 index 0000000000..3d4f0e5f3d --- /dev/null +++ b/zephyr/test/nissa/prj.conf @@ -0,0 +1,24 @@ +# 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. + +CONFIG_ZTEST=y +CONFIG_ZTEST_ASSERT_VERBOSE=1 +CONFIG_ZTEST_NEW_API=y +CONFIG_ASSERT=y + +CONFIG_CROS_EC=y +CONFIG_PLATFORM_EC=y + +# Configuration used for Nissa boards, with some items that aren't relevant +# disabled so they don't depend on us defining items they want. +CONFIG_PLATFORM_EC_USBC=y +CONFIG_PLATFORM_EC_USBC_PPC=n +CONFIG_PLATFORM_EC_USB_MUX_RUNTIME_CONFIG=y +CONFIG_PLATFORM_EC_USB_PD_DISCHARGE=n +CONFIG_PLATFORM_EC_USB_CHARGER=n +CONFIG_PLATFORM_EC_USB_PD_HOST_CMD=n +CONFIG_PLATFORM_EC_USB_PORT_ENABLE_DYNAMIC=y + +# Allow the test fixture to use k_malloc +CONFIG_HEAP_MEM_POOL_SIZE=1024
\ No newline at end of file diff --git a/zephyr/test/nissa/src/stubs.c b/zephyr/test/nissa/src/stubs.c new file mode 100644 index 0000000000..970232197e --- /dev/null +++ b/zephyr/test/nissa/src/stubs.c @@ -0,0 +1,27 @@ +/* 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. + * + * Function stubs needed for building Nissa board code, but that aren't + * meaningful to testing. + */ + +#include "common.h" + +__overridable void pd_power_supply_reset(int port) +{ +} + +__overridable int pd_set_power_supply_ready(int port) +{ + return 0; +} + +__overridable void pd_set_input_current_limit(int port, uint32_t max_ma, + uint32_t supply_voltage) +{ +} + +__overridable void usb_interrupt_c0(enum gpio_signal signal) +{ +} diff --git a/zephyr/test/nissa/src/sub_board.c b/zephyr/test/nissa/src/sub_board.c new file mode 100644 index 0000000000..78b5b19143 --- /dev/null +++ b/zephyr/test/nissa/src/sub_board.c @@ -0,0 +1,245 @@ +/* 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. + * + * Unit tests for program/nissa/src/sub_board.c. + */ +#include "cros_cbi.h" +#include "hooks.h" +#include "nissa_hdmi.h" +#include "nissa_sub_board.h" +#include "usb_pd.h" + +#include <zephyr/drivers/gpio/gpio_emul.h> +#include <zephyr/fff.h> +#include <zephyr/kernel.h> +#include <zephyr/ztest.h> + +#include <ap_power/ap_power.h> +#include <ap_power/ap_power_events.h> + +FAKE_VALUE_FUNC(int, cros_cbi_get_fw_config, enum cbi_fw_config_field_id, + uint32_t *); +FAKE_VOID_FUNC(usb_interrupt_c1, enum gpio_signal); + +/* + * Private bits of board code that are visible for testing. + * + * The cached sub-board ID needs to be cleared by tests so we can run multiple + * tests per process, and usb_pd_count_init() needs to run following each update + * of reported sub-board. + */ +extern enum nissa_sub_board_type nissa_cached_sub_board; +void board_usb_pd_count_init(void); + +/* Shim GPIO initialization from devicetree. */ +int init_gpios(const struct device *unused); + +static uint32_t fw_config_value; + +/** Set the value of the CBI fw_config field returned by the fake. */ +static void set_fw_config_value(uint32_t value) +{ + fw_config_value = value; + board_usb_pd_count_init(); +} + +/** Custom fake for cros_cgi_get_fw_config(). */ +static int get_fake_fw_config_field(enum cbi_fw_config_field_id field_id, + uint32_t *value) +{ + *value = fw_config_value; + return 0; +} + +#define ASSERT_GPIO_FLAGS(spec, expected) \ + do { \ + gpio_flags_t flags; \ + zassert_ok(gpio_emul_flags_get((spec)->port, (spec)->pin, \ + &flags)); \ + zassert_equal(flags, expected, \ + "actual value was %#x; expected %#x", flags, \ + expected); \ + } while (0) + +static int get_gpio_output(const struct gpio_dt_spec *const spec) +{ + return gpio_emul_output_get(spec->port, spec->pin); +} + +struct nissa_sub_board_fixture { + const struct gpio_dt_spec *sb_1; + const struct gpio_dt_spec *sb_2; + const struct gpio_dt_spec *sb_3; + const struct gpio_dt_spec *sb_4; +}; + +static void *suite_setup_fn() +{ + struct nissa_sub_board_fixture *fixture = + k_malloc(sizeof(struct nissa_sub_board_fixture)); + + zassume_not_null(fixture); + fixture->sb_1 = GPIO_DT_FROM_NODELABEL(gpio_sb_1); + fixture->sb_2 = GPIO_DT_FROM_NODELABEL(gpio_sb_2); + fixture->sb_3 = GPIO_DT_FROM_NODELABEL(gpio_sb_3); + fixture->sb_4 = GPIO_DT_FROM_NODELABEL(gpio_sb_4); + + return fixture; +} + +static void test_before_fn(void *fixture_) +{ + struct nissa_sub_board_fixture *fixture = fixture_; + + /* Reset cached global state. */ + nissa_cached_sub_board = NISSA_SB_UNKNOWN; + fw_config_value = -1; + + /* Return the fake fw_config value. */ + RESET_FAKE(cros_cbi_get_fw_config); + cros_cbi_get_fw_config_fake.custom_fake = get_fake_fw_config_field; + + /* Unconfigure sub-board GPIOs. */ + gpio_pin_configure_dt(fixture->sb_1, GPIO_DISCONNECTED); + gpio_pin_configure_dt(fixture->sb_2, GPIO_DISCONNECTED); + gpio_pin_configure_dt(fixture->sb_3, GPIO_DISCONNECTED); + gpio_pin_configure_dt(fixture->sb_4, GPIO_DISCONNECTED); + /* Reset C1 interrupt to deasserted. */ + gpio_emul_input_set(fixture->sb_1->port, fixture->sb_1->pin, 1); + + RESET_FAKE(usb_interrupt_c1); +} + +ZTEST_SUITE(nissa_sub_board, NULL, suite_setup_fn, test_before_fn, NULL, NULL); + +ZTEST_F(nissa_sub_board, test_usb_c_a) +{ + /* Set the sub-board, reported configuration is correct. */ + set_fw_config_value(FW_SUB_BOARD_1); + zassert_equal(nissa_get_sb_type(), NISSA_SB_C_A); + zassert_equal(board_get_usb_pd_port_count(), 2); + + /* Should have fetched CBI exactly once, asking for the sub-board. */ + zassert_equal(cros_cbi_get_fw_config_fake.call_count, 1); + zassert_equal(cros_cbi_get_fw_config_fake.arg0_history[0], + FW_SUB_BOARD); + + /* Run IO configuration in init. */ + init_gpios(NULL); + hook_notify(HOOK_INIT); + + /* Check that the sub-board GPIOs are configured correctly. */ + ASSERT_GPIO_FLAGS(fixture->sb_2 /* A1 VBUS enable */, GPIO_OUTPUT); + ASSERT_GPIO_FLAGS(fixture->sb_1 /* C1 interrupt */, + GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_EDGE_FALLING); + + /* USB-C1 interrupt is handled. */ + RESET_FAKE(usb_interrupt_c1); + gpio_emul_input_set(fixture->sb_1->port, fixture->sb_1->pin, 0); + zassert_equal(usb_interrupt_c1_fake.call_count, 1, + "usb_interrupt was called %d times", + usb_interrupt_c1_fake.call_count); +} + +ZTEST_F(nissa_sub_board, test_usb_c_lte) +{ + set_fw_config_value(FW_SUB_BOARD_2); + zassert_equal(nissa_get_sb_type(), NISSA_SB_C_LTE); + zassert_equal(board_get_usb_pd_port_count(), 2); + + init_gpios(NULL); + hook_notify(HOOK_INIT); + + /* GPIOs are configured as expected. */ + ASSERT_GPIO_FLAGS(fixture->sb_2 /* Standby power enable */, + GPIO_OUTPUT | GPIO_OUTPUT_INIT_LOW); + ASSERT_GPIO_FLAGS(fixture->sb_1 /* C1 interrupt */, + GPIO_INPUT | GPIO_PULL_UP | GPIO_INT_EDGE_FALLING); + + /* USB interrupt is handled. */ + RESET_FAKE(usb_interrupt_c1); + gpio_emul_input_set(fixture->sb_1->port, fixture->sb_1->pin, 0); + zassert_equal(usb_interrupt_c1_fake.call_count, 1, + "usb_interrupt was called %d times", + usb_interrupt_c1_fake.call_count); + + /* LTE power gets enabled on S5. */ + ap_power_ev_send_callbacks(AP_POWER_PRE_INIT); + zassert_equal(get_gpio_output(fixture->sb_2), 1); + /* And disabled on G3. */ + ap_power_ev_send_callbacks(AP_POWER_HARD_OFF); + zassert_equal(get_gpio_output(fixture->sb_2), 0); +} + +ZTEST_F(nissa_sub_board, test_usb_a_hdmi) +{ + set_fw_config_value(FW_SUB_BOARD_3); + zassert_equal(nissa_get_sb_type(), NISSA_SB_HDMI_A); + zassert_equal(board_get_usb_pd_port_count(), 1); + + init_gpios(NULL); + hook_notify(HOOK_INIT); + + /* USB-A controls are enabled. */ + ASSERT_GPIO_FLAGS(fixture->sb_2 /* A1 VBUS enable */, GPIO_OUTPUT); + + /* + * HDMI IOs configured as expected. The HDMI power enable and DDC select + * pins are impossible to test because emulated GPIOs don't support + * open-drain mode, so this only checks HPD. + */ + ASSERT_GPIO_FLAGS(fixture->sb_4, + GPIO_INPUT | GPIO_ACTIVE_LOW | GPIO_INT_EDGE_BOTH); + + /* Power events adjust HDMI port power as expected. */ + ap_power_ev_send_callbacks(AP_POWER_PRE_INIT); + zassert_equal(get_gpio_output(GPIO_DT_FROM_NODELABEL(gpio_hdmi_sel)), + 1); + ap_power_ev_send_callbacks(AP_POWER_STARTUP); + ap_power_ev_send_callbacks(AP_POWER_SHUTDOWN); + ap_power_ev_send_callbacks(AP_POWER_HARD_OFF); + zassert_equal(get_gpio_output(GPIO_DT_FROM_NODELABEL(gpio_hdmi_sel)), + 0); + + /* HPD input gets copied through to the output, and inverted. */ + gpio_emul_input_set(fixture->sb_4->port, fixture->sb_4->pin, 1); + zassert_equal( + get_gpio_output(GPIO_DT_FROM_NODELABEL(gpio_ec_soc_hdmi_hpd)), + 0); + gpio_emul_input_set(fixture->sb_4->port, fixture->sb_4->pin, 0); + zassert_equal( + get_gpio_output(GPIO_DT_FROM_NODELABEL(gpio_ec_soc_hdmi_hpd)), + 1); +} + +ZTEST(nissa_sub_board, test_unset_board) +{ + /* fw_config with an unset sub-board means none is present. */ + set_fw_config_value(0); + zassert_equal(nissa_get_sb_type(), NISSA_SB_NONE); + zassert_equal(board_get_usb_pd_port_count(), 1); +} + +static int get_fw_config_error(enum cbi_fw_config_field_id field, + uint32_t *value) +{ + return EC_ERROR_UNKNOWN; +} + +ZTEST(nissa_sub_board, test_cbi_error) +{ + /* + * Reading fw_config from CBI returns an error, so sub-board is treated + * as absent. + */ + cros_cbi_get_fw_config_fake.custom_fake = get_fw_config_error; + zassert_equal(nissa_get_sb_type(), NISSA_SB_NONE); +} + +/** Override default HDMI configuration to exercise the power enable as well. */ +__override void nissa_configure_hdmi_power_gpios(void) +{ + nissa_configure_hdmi_rails(); + nissa_configure_hdmi_vcc(); +} diff --git a/zephyr/test/nissa/testcase.yaml b/zephyr/test/nissa/testcase.yaml new file mode 100644 index 0000000000..c9b568e326 --- /dev/null +++ b/zephyr/test/nissa/testcase.yaml @@ -0,0 +1,10 @@ +# 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. + +common: + platform_allow: native_posix +tests: + nissa.sub_board: + extra_dtc_overlay_files: + - "boards/generic_npcx.dts" diff --git a/zephyr/test/qcom_power/testcase.yaml b/zephyr/test/qcom_power/testcase.yaml index fba474392b..026032d06b 100644 --- a/zephyr/test/qcom_power/testcase.yaml +++ b/zephyr/test/qcom_power/testcase.yaml @@ -3,6 +3,8 @@ common: tests: qcom_power.default: {} qcom_power.power_gpio_keys: - extra_args: DTC_OVERLAY_FILE="./boards/native_posix.overlay;./boards/power_button.dtsi" extra_configs: - - CONFIG_PLATFORM_EC_POWER_BUTTON=n + - CONFIG_PLATFORM_EC_POWER_BUTTON=n + extra_dtc_overlay_files: + - ./boards/native_posix.overlay + - ./boards/power_button.dtsi diff --git a/zephyr/test/rex/CMakeLists.txt b/zephyr/test/rex/CMakeLists.txt index da2b456f2c..b9e1b1410a 100644 --- a/zephyr/test/rex/CMakeLists.txt +++ b/zephyr/test/rex/CMakeLists.txt @@ -15,3 +15,6 @@ target_sources_ifdef(CONFIG_TEST_USB_PD_POLICY app PRIVATE ${PLATFORM_EC_PROGRAM target_sources_ifdef(CONFIG_TEST_BOARD_POWER app PRIVATE src/board_power.c) target_sources_ifdef(CONFIG_TEST_BOARD_POWER app PRIVATE ${PLATFORM_EC_PROGRAM_DIR}/rex/src/board_power.c) + +target_sources_ifdef(CONFIG_TEST_BOARD_USB_MUX_CONFIG app PRIVATE src/usb_mux_config.c) +target_sources_ifdef(CONFIG_TEST_BOARD_USB_MUX_CONFIG app PRIVATE ${PLATFORM_EC_PROGRAM_DIR}/rex/rex/src/usb_mux_config.c) diff --git a/zephyr/test/rex/Kconfig b/zephyr/test/rex/Kconfig index f50890be10..ee844046be 100644 --- a/zephyr/test/rex/Kconfig +++ b/zephyr/test/rex/Kconfig @@ -2,6 +2,12 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +config TEST_BOARD_USB_MUX_CONFIG + bool "Run the tests intended for usb_mux_config" + help + Include usb_mux_config.c into the binary and test their + functions. + config TEST_USB_PD_POLICY bool "Run the tests intended for usb_pd_policy" help diff --git a/zephyr/test/rex/board_power.dtsi b/zephyr/test/rex/board_power.dtsi index 3f6369757b..e5f90dfa80 100644 --- a/zephyr/test/rex/board_power.dtsi +++ b/zephyr/test/rex/board_power.dtsi @@ -23,14 +23,14 @@ /* GPIO_PULL_UP will cause this start asserted, * i.e. not pressed. */ - gpios = <&gpio0 1 (GPIO_INPUT | GPIO_PULL_UP)>; + gpios = <&gpio0 3 (GPIO_INPUT | GPIO_PULL_UP)>; enum-name = "GPIO_POWER_BUTTON_L"; }; gpio_wp_l: wp_l { - gpios = <&gpio0 3 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; + gpios = <&gpio0 4 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; }; entering-rw { - gpios = <&gpio0 1 GPIO_OUTPUT_LOW>; + gpios = <&gpio0 5 GPIO_OUTPUT_LOW>; enum-name = "GPIO_ENTERING_RW"; }; }; diff --git a/zephyr/test/rex/boards/rex/rex.dtsi b/zephyr/test/rex/boards/rex/rex.dtsi new file mode 100644 index 0000000000..0f30563537 --- /dev/null +++ b/zephyr/test/rex/boards/rex/rex.dtsi @@ -0,0 +1,7 @@ +/* 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 "../native_posix.overlay" +#include "../../../../program/rex/rex/cbi.dtsi" diff --git a/zephyr/test/rex/src/usb_mux_config.c b/zephyr/test/rex/src/usb_mux_config.c new file mode 100644 index 0000000000..fe4e69feb8 --- /dev/null +++ b/zephyr/test/rex/src/usb_mux_config.c @@ -0,0 +1,74 @@ +/* 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 "cros_cbi.h" +#include "hooks.h" +#include "usb_mux.h" +#include "usbc/usb_muxes.h" + +#include <zephyr/devicetree.h> +#include <zephyr/fff.h> +#include <zephyr/ztest.h> + +FAKE_VALUE_FUNC(int, cros_cbi_get_fw_config, enum cbi_fw_config_field_id, + uint32_t *); + +int mock_cros_cbi_get_fw_config(enum cbi_fw_config_field_id field_id, + uint32_t *value) +{ + *value = FW_USB_DB_USB3; + return 0; +} + +int mock_cros_cbi_get_fw_config_no_usb_db(enum cbi_fw_config_field_id field_id, + uint32_t *value) +{ + *value = FW_USB_DB_NOT_CONNECTED; + return 0; +} + +int mock_cros_cbi_get_fw_config_error(enum cbi_fw_config_field_id field_id, + uint32_t *value) +{ + return -1; +} + +static void usb_mux_config_before(void *fixture) +{ + ARG_UNUSED(fixture); + + RESET_FAKE(cros_cbi_get_fw_config); +} + +ZTEST_USER(usb_mux_config, test_setup_mux) +{ + cros_cbi_get_fw_config_fake.custom_fake = mock_cros_cbi_get_fw_config; + + hook_notify(HOOK_INIT); + + zassert_equal(1, cros_cbi_get_fw_config_fake.call_count); +} + +ZTEST_USER(usb_mux_config, test_setup_mux_no_usb_db) +{ + cros_cbi_get_fw_config_fake.custom_fake = + mock_cros_cbi_get_fw_config_no_usb_db; + + hook_notify(HOOK_INIT); + + zassert_equal(1, cros_cbi_get_fw_config_fake.call_count); +} + +ZTEST_USER(usb_mux_config, test_setup_mux_error_reading_cbi) +{ + cros_cbi_get_fw_config_fake.custom_fake = + mock_cros_cbi_get_fw_config_error; + + hook_notify(HOOK_INIT); + + zassert_equal(1, cros_cbi_get_fw_config_fake.call_count); +} + +ZTEST_SUITE(usb_mux_config, NULL, NULL, usb_mux_config_before, NULL, NULL); diff --git a/zephyr/test/rex/testcase.yaml b/zephyr/test/rex/testcase.yaml index abd5955435..9331a51956 100644 --- a/zephyr/test/rex/testcase.yaml +++ b/zephyr/test/rex/testcase.yaml @@ -20,3 +20,9 @@ tests: - CONFIG_AP_POWER_EVENTS_MOCK=y - CONFIG_POWER_SIGNALS_MOCK=y - CONFIG_AP_EVENTS=n + + rex.rex.usb_mux_config: + extra_dtc_overlay_files: + - boards/rex/rex.dtsi + extra_configs: + - CONFIG_TEST_BOARD_USB_MUX_CONFIG=y diff --git a/zephyr/test/skyrim/testcase.yaml b/zephyr/test/skyrim/testcase.yaml index 43ea40da6f..b2bf8d2a06 100644 --- a/zephyr/test/skyrim/testcase.yaml +++ b/zephyr/test/skyrim/testcase.yaml @@ -82,11 +82,11 @@ tests: - CONFIG_TEST_BOARD_PPC_CONFIG=y skyrim.skyrim.form_factor: - extra_args: - DTC_OVERLAY_FILE="./boards/skyrim/skyrim.dtsi;" extra_configs: - CONFIG_TEST_BOARD_SKYRIM=y - CONFIG_TEST_BOARD_FORM_FACTOR=y + extra_dtc_overlay_files: + - ./boards/skyrim/skyrim.dtsi # Winterhold tests skyrim.winterhold: diff --git a/zephyr/test/skyrim/tests/baseboard/src/usb_pd_policy.c b/zephyr/test/skyrim/tests/baseboard/src/usb_pd_policy.c index 1a8e5e8805..10c9e93b1a 100644 --- a/zephyr/test/skyrim/tests/baseboard/src/usb_pd_policy.c +++ b/zephyr/test/skyrim/tests/baseboard/src/usb_pd_policy.c @@ -19,7 +19,7 @@ FAKE_VALUE_FUNC(int, ppc_vbus_sink_enable, int, int); int board_is_sourcing_vbus(int port); -ZTEST(usb_pd_policy, pd_check_vconn_swap) +ZTEST(usb_pd_policy, test_pd_check_vconn_swap) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_pg_pwr_s5); @@ -37,7 +37,7 @@ ZTEST(usb_pd_policy, pd_check_vconn_swap) zassert_false(pd_check_vconn_swap(1)); } -ZTEST(usb_pd_policy, pd_power_supply_reset_c0_success) +ZTEST(usb_pd_policy, test_pd_power_supply_reset_c0_success) { ppc_vbus_source_enable_fake.return_val = EC_SUCCESS; ppc_vbus_sink_enable_fake.return_val = EC_SUCCESS; @@ -61,7 +61,7 @@ ZTEST(usb_pd_policy, pd_power_supply_reset_c0_success) zassert_equal(pd_send_host_event_fake.call_count, 1); } -ZTEST(usb_pd_policy, pd_power_supply_reset_c1_success) +ZTEST(usb_pd_policy, test_pd_power_supply_reset_c1_success) { ppc_vbus_source_enable_fake.return_val = EC_SUCCESS; ppc_vbus_sink_enable_fake.return_val = EC_SUCCESS; @@ -85,7 +85,7 @@ ZTEST(usb_pd_policy, pd_power_supply_reset_c1_success) zassert_equal(pd_send_host_event_fake.call_count, 1); } -ZTEST(usb_pd_policy, pd_set_power_supply_ready_c0_success) +ZTEST(usb_pd_policy, test_pd_set_power_supply_ready_c0_success) { ppc_vbus_source_enable_fake.return_val = EC_SUCCESS; ppc_vbus_sink_enable_fake.return_val = EC_SUCCESS; @@ -115,7 +115,7 @@ ZTEST(usb_pd_policy, pd_set_power_supply_ready_c0_success) zassert_equal(pd_send_host_event_fake.call_count, 1); } -ZTEST(usb_pd_policy, pd_set_power_supply_ready_c1_success) +ZTEST(usb_pd_policy, test_pd_set_power_supply_ready_c1_success) { ppc_vbus_source_enable_fake.return_val = EC_SUCCESS; ppc_vbus_sink_enable_fake.return_val = EC_SUCCESS; @@ -145,7 +145,7 @@ ZTEST(usb_pd_policy, pd_set_power_supply_ready_c1_success) zassert_equal(pd_send_host_event_fake.call_count, 1); } -ZTEST(usb_pd_policy, pd_set_power_supply_ready_c0_failure) +ZTEST(usb_pd_policy, test_pd_set_power_supply_ready_c0_failure) { /* Test with ppc_vbus_sink_enable_fake failing. */ ppc_vbus_sink_enable_fake.return_val = EC_ERROR_INVAL; @@ -169,7 +169,7 @@ ZTEST(usb_pd_policy, pd_set_power_supply_ready_c0_failure) zassert_equal(pd_send_host_event_fake.call_count, 0); } -ZTEST(usb_pd_policy, pd_set_power_supply_ready_c1_failure) +ZTEST(usb_pd_policy, test_pd_set_power_supply_ready_c1_failure) { /* Test with ppc_vbus_sink_enable_fake failing. */ ppc_vbus_sink_enable_fake.return_val = EC_ERROR_INVAL; @@ -193,7 +193,7 @@ ZTEST(usb_pd_policy, pd_set_power_supply_ready_c1_failure) zassert_equal(pd_send_host_event_fake.call_count, 0); } -ZTEST(usb_pd_policy, board_pd_set_frs_enable) +ZTEST(usb_pd_policy, test_board_pd_set_frs_enable) { const struct gpio_dt_spec *c0 = GPIO_DT_FROM_NODELABEL(gpio_usb_c0_tcpc_fastsw_ctl_en); @@ -214,7 +214,7 @@ ZTEST(usb_pd_policy, board_pd_set_frs_enable) zassert_equal(gpio_emul_output_get(c1->port, c1->pin), 0); } -ZTEST(usb_pd_policy, board_is_sourcing_vbus_c0_true) +ZTEST(usb_pd_policy, test_board_is_sourcing_vbus_c0_true) { tcpm_get_src_ctrl_fake.return_val = true; zassert_true(board_is_sourcing_vbus(0)); @@ -223,7 +223,7 @@ ZTEST(usb_pd_policy, board_is_sourcing_vbus_c0_true) zassert_equal(tcpm_get_src_ctrl_fake.arg0_val, 0); } -ZTEST(usb_pd_policy, board_is_sourcing_vbus_c0_false) +ZTEST(usb_pd_policy, test_board_is_sourcing_vbus_c0_false) { tcpm_get_src_ctrl_fake.return_val = false; zassert_false(board_is_sourcing_vbus(0)); @@ -232,7 +232,7 @@ ZTEST(usb_pd_policy, board_is_sourcing_vbus_c0_false) zassert_equal(tcpm_get_src_ctrl_fake.arg0_val, 0); } -ZTEST(usb_pd_policy, board_is_sourcing_vbus_c1_true) +ZTEST(usb_pd_policy, test_board_is_sourcing_vbus_c1_true) { tcpm_get_src_ctrl_fake.return_val = true; zassert_true(board_is_sourcing_vbus(1)); @@ -241,7 +241,7 @@ ZTEST(usb_pd_policy, board_is_sourcing_vbus_c1_true) zassert_equal(tcpm_get_src_ctrl_fake.arg0_val, 1); } -ZTEST(usb_pd_policy, board_is_sourcing_vbus_c1_false) +ZTEST(usb_pd_policy, test_board_is_sourcing_vbus_c1_false) { tcpm_get_src_ctrl_fake.return_val = false; zassert_false(board_is_sourcing_vbus(1)); diff --git a/zephyr/test/skyrim/tests/common/src/alt_charger.c b/zephyr/test/skyrim/tests/common/src/alt_charger.c index c03d31aaeb..0bd641fad0 100644 --- a/zephyr/test/skyrim/tests/common/src/alt_charger.c +++ b/zephyr/test/skyrim/tests/common/src/alt_charger.c @@ -38,7 +38,7 @@ static void alt_charger_before(void *fixture) ZTEST_SUITE(alt_charger, NULL, NULL, alt_charger_before, NULL, NULL); -ZTEST(alt_charger, normal_charger) +ZTEST(alt_charger, test_normal_charger) { alt_charger = false; alt_charger_init(); @@ -46,7 +46,7 @@ ZTEST(alt_charger, normal_charger) zassert_equal(chg_enable_alternate_test_fake.call_count, 0); } -ZTEST(alt_charger, alt_charger) +ZTEST(alt_charger, test_alt_charger) { alt_charger = true; alt_charger_init(); diff --git a/zephyr/test/skyrim/tests/common/src/fan.c b/zephyr/test/skyrim/tests/common/src/fan.c index 4968938298..275a7f1463 100644 --- a/zephyr/test/skyrim/tests/common/src/fan.c +++ b/zephyr/test/skyrim/tests/common/src/fan.c @@ -51,7 +51,7 @@ static void fan_before(void *fixture) ZTEST_SUITE(fan, NULL, NULL, fan_before, NULL, NULL); -ZTEST(fan, board_supports_pcore_ocp) +ZTEST(fan, test_board_supports_pcore_ocp) { /* Only supported for board version > 3. */ board_version = 2; @@ -62,7 +62,7 @@ ZTEST(fan, board_supports_pcore_ocp) zassert_true(board_supports_pcore_ocp()); } -ZTEST(fan, fan_init) +ZTEST(fan, test_fan_init) { /* Only disable fans on board version >= 3. */ fan_present = false; diff --git a/zephyr/test/skyrim/tests/common/src/ppc_config.c b/zephyr/test/skyrim/tests/common/src/ppc_config.c index ca759fa66a..0527520413 100644 --- a/zephyr/test/skyrim/tests/common/src/ppc_config.c +++ b/zephyr/test/skyrim/tests/common/src/ppc_config.c @@ -25,7 +25,7 @@ int board_aoz1380_set_vbus_source_current_limit(int port, ZTEST_SUITE(ppc_config, NULL, NULL, ppc_config_before, NULL, NULL); -ZTEST(ppc_config, board_aoz1380_set_vbus_source_current_limit) +ZTEST(ppc_config, test_board_aoz1380_set_vbus_source_current_limit) { int rv; const struct gpio_dt_spec *gpio = @@ -48,7 +48,7 @@ ZTEST(ppc_config, board_aoz1380_set_vbus_source_current_limit) zassert_equal(rv, EC_ERROR_INVAL); } -ZTEST(ppc_config, ppc_interrupt) +ZTEST(ppc_config, test_ppc_interrupt) { ppc_interrupt(GPIO_USB_C0_PPC_INT_ODL); zassert_equal(aoz1380_interrupt_fake.call_count, 1); diff --git a/zephyr/test/skyrim/tests/frostflow/src/usb_mux_config.c b/zephyr/test/skyrim/tests/frostflow/src/usb_mux_config.c index 3a4b80d347..688453d13f 100644 --- a/zephyr/test/skyrim/tests/frostflow/src/usb_mux_config.c +++ b/zephyr/test/skyrim/tests/frostflow/src/usb_mux_config.c @@ -19,7 +19,7 @@ int board_c1_ps8818_mux_set(const struct usb_mux *me, mux_state_t mux_state); ZTEST_SUITE(usb_mux_config, NULL, NULL, NULL, NULL, NULL); -ZTEST(usb_mux_config, board_c0_amd_fp6_mux_set) +ZTEST(usb_mux_config, test_board_c0_amd_fp6_mux_set) { const struct gpio_dt_spec *c0 = GPIO_DT_FROM_NODELABEL(ioex_usb_c0_sbu_flip); @@ -48,7 +48,7 @@ ZTEST(usb_mux_config, board_c0_amd_fp6_mux_set) zassert_equal(gpio_emul_output_get(c1->port, c1->pin), 1); } -ZTEST(usb_mux_config, board_c1_ps8818_mux_set) +ZTEST(usb_mux_config, test_board_c1_ps8818_mux_set) { const struct gpio_dt_spec *gpio = GPIO_DT_FROM_NODELABEL(gpio_usb_c1_in_hpd); diff --git a/zephyr/test/skyrim/tests/winterhold/src/ppc_config.c b/zephyr/test/skyrim/tests/winterhold/src/ppc_config.c index 4fce497faf..0f319d8ea4 100644 --- a/zephyr/test/skyrim/tests/winterhold/src/ppc_config.c +++ b/zephyr/test/skyrim/tests/winterhold/src/ppc_config.c @@ -20,7 +20,7 @@ void ppc_interrupt(enum gpio_signal signal); ZTEST_SUITE(ppc_config, NULL, NULL, ppc_config_before, NULL, NULL); -ZTEST(ppc_config, ppc_interrupt_c0) +ZTEST(ppc_config, test_ppc_interrupt_c0) { ppc_interrupt(GPIO_USB_C0_PPC_INT_ODL); zassert_equal(nx20p348x_interrupt_fake.call_count, 1); @@ -28,7 +28,7 @@ ZTEST(ppc_config, ppc_interrupt_c0) zassert_equal(nx20p348x_interrupt_fake.arg0_val, 0); } -ZTEST(ppc_config, ppc_interrupt_c1) +ZTEST(ppc_config, test_ppc_interrupt_c1) { ppc_interrupt(GPIO_USB_C1_PPC_INT_ODL); zassert_equal(nx20p348x_interrupt_fake.call_count, 1); diff --git a/zephyr/test/system_safe_mode/prj.conf b/zephyr/test/system_safe_mode/prj.conf index 6ecdbe1b16..6c520dd235 100644 --- a/zephyr/test/system_safe_mode/prj.conf +++ b/zephyr/test/system_safe_mode/prj.conf @@ -13,6 +13,7 @@ CONFIG_TASK_HOSTCMD_THREAD_DEDICATED=y CONFIG_PLATFORM_EC_HOSTCMD=y CONFIG_ASSERT_TEST=y CONFIG_SHIMMED_TASKS=y +CONFIG_TASKS_SET_TEST_RUNNER_TID_RULE=y # Disable because not needed CONFIG_PLATFORM_EC_BACKLIGHT_LID=n diff --git a/zephyr/test/system_shim/testcase.yaml b/zephyr/test/system_shim/testcase.yaml index 29b5fa55c0..bd49c15791 100644 --- a/zephyr/test/system_shim/testcase.yaml +++ b/zephyr/test/system_shim/testcase.yaml @@ -4,5 +4,6 @@ common: system tests: system_shim.default: - extra_args: DTC_OVERLAY_FILE="./default.overlay" + extra_dtc_overlay_files: + - ./default.overlay system_shim.no_chosen: {} diff --git a/zephyr/test/vboot_efs2/boards/native_posix.overlay b/zephyr/test/vboot_efs2/boards/native_posix.overlay index 54bc09ace0..157ca70510 100644 --- a/zephyr/test/vboot_efs2/boards/native_posix.overlay +++ b/zephyr/test/vboot_efs2/boards/native_posix.overlay @@ -25,7 +25,7 @@ gpios = <&gpio0 3 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; }; usb_c0_tcpc_int_odl: usb_c0_tcpc_int_odl { - gpios = <&gpio0 4 GPIO_INPUT>; + gpios = <&gpio0 4 (GPIO_INPUT | GPIO_ACTIVE_LOW)>; }; ec_batt_pres_odl { gpios = <&gpio0 5 GPIO_INPUT>; diff --git a/zephyr/zmake/tests/test_project.py b/zephyr/zmake/tests/test_project.py index 327d119bad..6acde6a48b 100644 --- a/zephyr/zmake/tests/test_project.py +++ b/zephyr/zmake/tests/test_project.py @@ -138,7 +138,11 @@ CONFIG_FILE_1 = """ register_raw_project(project_name="one", zephyr_board="one") register_host_project(project_name="two") register_npcx_project(project_name="three", zephyr_board="three") -register_binman_project(project_name="four", zephyr_board="four") +register_binman_project( + project_name="four", + zephyr_board="four", + inherited_from="baseboard" +) """ CONFIG_FILE_2 = """ @@ -146,6 +150,7 @@ register_raw_project( project_name="five", zephyr_board="foo", dts_overlays=[here / "gpio.dts"], + inherited_from=["root", "myboard"], ) """ @@ -174,9 +179,11 @@ def test_find_projects(tmp_path): assert projects["four"].config.project_dir == cf1_dir assert projects["four"].config.zephyr_board == "four" + assert projects["four"].config.full_name == "baseboard.four" assert projects["five"].config.project_dir == cf2_dir assert projects["five"].config.zephyr_board == "foo" + assert projects["five"].config.full_name == "root.myboard.five" def test_find_projects_name_conflict(tmp_path): @@ -218,6 +225,9 @@ another = some_variant.variant( tmp_path / "gpio.dts", tmp_path / "another.dts", ] + assert projects["some"].config.full_name == "some" + assert projects["some-variant"].config.full_name == "some.some-variant" + assert projects["another"].config.full_name == "some.some-variant.another" @pytest.mark.parametrize( diff --git a/zephyr/zmake/zmake/compare_builds.py b/zephyr/zmake/zmake/compare_builds.py index 6f1f804f68..54d51dd18a 100644 --- a/zephyr/zmake/zmake/compare_builds.py +++ b/zephyr/zmake/zmake/compare_builds.py @@ -8,6 +8,7 @@ import dataclasses import logging import os import pathlib +import shlex import subprocess import sys @@ -51,7 +52,14 @@ def git_do_checkout(module_name, work_dir, git_source, dst_dir, git_ref): dst_dir: Destination directory for the checkout, relative to the work_dir. git_ref: Git reference to checkout. """ - cmd = ["git", "clone", "--quiet", "--no-checkout", git_source, dst_dir] + cmd = [ + "git", + "clone", + "--quiet", + "--no-checkout", + "file://" + str(git_source), + str(dst_dir), + ] try: subprocess.run( @@ -62,7 +70,7 @@ def git_do_checkout(module_name, work_dir, git_source, dst_dir, git_ref): stderr=subprocess.DEVNULL, ) except subprocess.CalledProcessError: - logging.error("Clone failed for %s", module_name) + logging.error("Clone failed for %s: %s", module_name, shlex.join(cmd)) sys.exit(1) cmd = ["git", "-C", dst_dir, "checkout", "--quiet", git_ref] @@ -75,7 +83,12 @@ def git_do_checkout(module_name, work_dir, git_source, dst_dir, git_ref): stderr=subprocess.DEVNULL, ) except subprocess.CalledProcessError: - logging.error("Checkout of %s failed for %s", git_ref, module_name) + logging.error( + "Checkout of %s failed for %s: %s", + git_ref, + module_name, + shlex.join(cmd), + ) sys.exit(1) diff --git a/zephyr/zmake/zmake/project.py b/zephyr/zmake/zmake/project.py index 3c18520b55..2c91e27ba7 100644 --- a/zephyr/zmake/zmake/project.py +++ b/zephyr/zmake/zmake/project.py @@ -52,6 +52,20 @@ class ProjectConfig: default_factory=list ) project_dir: pathlib.Path = dataclasses.field(default_factory=pathlib.Path) + inherited_from: typing.Iterable[str] = dataclasses.field( + default_factory=list + ) + + @property + def full_name(self) -> str: + """Get the full project name, e.g. baseboard.variant""" + inherited_from = ( + [self.inherited_from] + if isinstance(self.inherited_from, str) + else self.inherited_from + ) + + return ".".join([*inherited_from, self.project_name]) class Project: @@ -198,12 +212,16 @@ class ProjectRegistrationHandler: Another ProjectRegistrationHandler. """ new_config = dataclasses.asdict(self.base_config) + new_config["inherited_from"] = [ + *self.base_config.inherited_from, + self.base_config.project_name, + ] + for key, value in kwargs.items(): if isinstance(value, list): new_config[key] = [*new_config[key], *value] else: new_config[key] = value - return self.register_func(**new_config) diff --git a/zephyr/zmake/zmake/zmake.py b/zephyr/zmake/zmake/zmake.py index 6b7f2b2ded..70988a12c5 100644 --- a/zephyr/zmake/zmake/zmake.py +++ b/zephyr/zmake/zmake/zmake.py @@ -483,11 +483,6 @@ class Zmake: if static_version else {} ), - **( - {"EXTRA_CFLAGS": "-save-temps=obj"} - if save_temps - else {} - ), }, ) if cmake_defs: @@ -521,6 +516,10 @@ class Zmake: base_config |= zmake.build_config.BuildConfig( kconfig_defs={"CONFIG_COVERAGE": "y"} ) + if save_temps: + base_config |= zmake.build_config.BuildConfig( + kconfig_defs={"CONFIG_COMPILER_SAVE_TEMPS": "y"} + ) if allow_warnings: base_config |= zmake.build_config.BuildConfig( cmake_defs={"ALLOW_WARNINGS": "ON"} |