From 17e0734e88c26d63658952c8cad73ef847a7b277 Mon Sep 17 00:00:00 2001 From: Eric Yilun Lin Date: Mon, 26 Sep 2022 17:04:06 +0800 Subject: corsola: mux DP AUX when CCD mode enabled Mux the DP AUX path away from CCD port to prevent the AUX channel interferes the CCD SBU pins communication. Also, defaults DP_AUX_PATH_SEL to 1 to align the default states across corsola projects and for lower power consumption. BUG=b:248171274 TEST=set ccd_mode_odl 0, and ensure the DP_AUX_PATH=1 BRANCH=none Change-Id: I3dd1a50dca6381e80564d49a6baeb3cef25c7924 Signed-off-by: Eric Yilun Lin Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3917683 Commit-Queue: Ting Shen Tested-by: Eric Yilun Lin Code-Coverage: Zoss Auto-Submit: Eric Yilun Lin Reviewed-by: Ting Shen --- zephyr/projects/corsola/CMakeLists.txt | 1 + zephyr/projects/corsola/gpio_kingler.dts | 4 +- zephyr/projects/corsola/gpio_krabby.dts | 6 +- zephyr/projects/corsola/gpio_magikarp.dts | 2 +- zephyr/projects/corsola/gpio_steelix.dts | 4 +- zephyr/projects/corsola/gpio_tentacruel.dts | 6 +- .../corsola/include/baseboard_usbc_config.h | 1 + zephyr/projects/corsola/interrupts_kingler.dts | 5 + zephyr/projects/corsola/interrupts_krabby.dts | 5 + zephyr/projects/corsola/interrupts_magikarp.dts | 5 + zephyr/projects/corsola/interrupts_tentacruel.dts | 5 + zephyr/projects/corsola/src/board.c | 37 +++++++ zephyr/projects/corsola/src/usbc_config.c | 5 + zephyr/test/kingler/CMakeLists.txt | 2 + zephyr/test/kingler/Kconfig | 5 + zephyr/test/kingler/common.dts | 13 +++ zephyr/test/kingler/src/ccd.c | 110 +++++++++++++++++++++ zephyr/test/kingler/src/fakes.c | 3 + zephyr/test/kingler/testcase.yaml | 4 + 19 files changed, 214 insertions(+), 9 deletions(-) create mode 100644 zephyr/projects/corsola/src/board.c create mode 100644 zephyr/test/kingler/src/ccd.c diff --git a/zephyr/projects/corsola/CMakeLists.txt b/zephyr/projects/corsola/CMakeLists.txt index f2535d6e68..16acc329e2 100644 --- a/zephyr/projects/corsola/CMakeLists.txt +++ b/zephyr/projects/corsola/CMakeLists.txt @@ -10,6 +10,7 @@ cros_ec_library_include_directories(include) # Include selected EC source from the baseboard zephyr_library_sources( + "src/board.c" "src/board_chipset.c" "src/hibernate.c" ) diff --git a/zephyr/projects/corsola/gpio_kingler.dts b/zephyr/projects/corsola/gpio_kingler.dts index d3a4c1be90..9a827a06dd 100644 --- a/zephyr/projects/corsola/gpio_kingler.dts +++ b/zephyr/projects/corsola/gpio_kingler.dts @@ -167,7 +167,7 @@ gpios = <&gpio6 2 GPIO_OUTPUT_LOW>; }; dp_aux_path_sel: dp_aux_path_sel { - gpios = <&gpio6 3 GPIO_OUTPUT_LOW>; + gpios = <&gpio6 3 GPIO_OUTPUT_HIGH>; }; gpio_ec_bl_en_od: ec_bl_en_od { gpios = <&gpio4 0 (GPIO_ODR_LOW | GPIO_VOLTAGE_1P8)>; @@ -216,7 +216,7 @@ gpios = <&gpioe 2 GPIO_INPUT>; enum-name = "GPIO_VOLUME_DOWN_L"; }; - ccd_mode_odl { + gpio_ccd_mode_odl: ccd_mode_odl { gpios = <&gpioe 5 GPIO_INPUT>; enum-name = "GPIO_CCD_MODE_ODL"; }; diff --git a/zephyr/projects/corsola/gpio_krabby.dts b/zephyr/projects/corsola/gpio_krabby.dts index eb2314cec0..5f06609f43 100644 --- a/zephyr/projects/corsola/gpio_krabby.dts +++ b/zephyr/projects/corsola/gpio_krabby.dts @@ -155,6 +155,10 @@ gpios = <&gpiod 4 GPIO_OUTPUT_LOW>; enum-name = "GPIO_PACKET_MODE_EN"; }; + gpio_ccd_mode_odl: ccd_mode_odl { + gpios = <&gpioc 4 GPIO_INPUT>; + enum-name = "GPIO_CCD_MODE_ODL"; + }; }; hibernate-wake-pins { @@ -174,8 +178,6 @@ <&gpioe 1 GPIO_INPUT>, /* ec_pen_chg_dis_odl */ <&gpioh 3 GPIO_ODR_HIGH>, - /* ccd_mode_odl */ - <&gpioc 4 GPIO_INPUT>, /* unnamed nc pins */ <&gpioa 3 GPIO_INPUT_PULL_DOWN>, <&gpioa 6 GPIO_INPUT_PULL_DOWN>, diff --git a/zephyr/projects/corsola/gpio_magikarp.dts b/zephyr/projects/corsola/gpio_magikarp.dts index d1862ed75c..b97358b5fd 100644 --- a/zephyr/projects/corsola/gpio_magikarp.dts +++ b/zephyr/projects/corsola/gpio_magikarp.dts @@ -155,7 +155,7 @@ gpios = <&gpiod 4 GPIO_OUTPUT_LOW>; enum-name = "GPIO_PACKET_MODE_EN"; }; - ccd_mode_odl { + gpio_ccd_mode_odl: ccd_mode_odl { gpios = <&gpioc 4 GPIO_INPUT>; enum-name = "GPIO_CCD_MODE_ODL"; }; diff --git a/zephyr/projects/corsola/gpio_steelix.dts b/zephyr/projects/corsola/gpio_steelix.dts index 299d809583..14120e6d7d 100644 --- a/zephyr/projects/corsola/gpio_steelix.dts +++ b/zephyr/projects/corsola/gpio_steelix.dts @@ -173,7 +173,7 @@ gpios = <&gpio6 2 GPIO_OUTPUT_LOW>; }; dp_aux_path_sel: dp_aux_path_sel { - gpios = <&gpio6 3 GPIO_OUTPUT_LOW>; + gpios = <&gpio6 3 GPIO_OUTPUT_HIGH>; }; gpio_ec_bl_en_od: ec_bl_en_od { gpios = <&gpio4 0 (GPIO_ODR_LOW | GPIO_VOLTAGE_1P8)>; @@ -222,7 +222,7 @@ gpios = <&gpioe 2 GPIO_INPUT>; enum-name = "GPIO_VOLUME_DOWN_L"; }; - ccd_mode_odl { + gpio_ccd_mode_odl: ccd_mode_odl { gpios = <&gpioe 5 GPIO_INPUT>; enum-name = "GPIO_CCD_MODE_ODL"; }; diff --git a/zephyr/projects/corsola/gpio_tentacruel.dts b/zephyr/projects/corsola/gpio_tentacruel.dts index 8c2e67ecb4..a9ac9e8eac 100644 --- a/zephyr/projects/corsola/gpio_tentacruel.dts +++ b/zephyr/projects/corsola/gpio_tentacruel.dts @@ -161,6 +161,10 @@ gpios = <&gpiod 4 GPIO_OUTPUT_LOW>; enum-name = "GPIO_PACKET_MODE_EN"; }; + gpio_ccd_mode_odl: ccd_mode_odl { + gpios = <&gpioc 4 GPIO_INPUT>; + enum-name = "GPIO_CCD_MODE_ODL"; + }; }; hibernate-wake-pins { @@ -180,8 +184,6 @@ <&gpioe 1 GPIO_INPUT>, /* ec_pen_chg_dis_odl */ <&gpioh 3 GPIO_ODR_HIGH>, - /* ccd_mode_odl */ - <&gpioc 4 GPIO_INPUT>, /* unnamed nc pins */ <&gpioa 3 GPIO_INPUT_PULL_DOWN>, <&gpioa 6 GPIO_INPUT_PULL_DOWN>, diff --git a/zephyr/projects/corsola/include/baseboard_usbc_config.h b/zephyr/projects/corsola/include/baseboard_usbc_config.h index ddd80a0152..66610fec5e 100644 --- a/zephyr/projects/corsola/include/baseboard_usbc_config.h +++ b/zephyr/projects/corsola/include/baseboard_usbc_config.h @@ -17,6 +17,7 @@ #endif void ppc_interrupt(enum gpio_signal signal); +void ccd_interrupt(enum gpio_signal signal); /* USB-A ports */ enum usba_port { USBA_PORT_A0 = 0, USBA_PORT_COUNT }; diff --git a/zephyr/projects/corsola/interrupts_kingler.dts b/zephyr/projects/corsola/interrupts_kingler.dts index 38b8c2e24d..f3da785a60 100644 --- a/zephyr/projects/corsola/interrupts_kingler.dts +++ b/zephyr/projects/corsola/interrupts_kingler.dts @@ -105,5 +105,10 @@ flags = ; handler = "gmr_tablet_switch_isr"; }; + int_ccd_mode_odl: ccd-mode-odl { + irq-pin = <&gpio_ccd_mode_odl>; + flags = ; + handler = "ccd_interrupt"; + }; }; }; diff --git a/zephyr/projects/corsola/interrupts_krabby.dts b/zephyr/projects/corsola/interrupts_krabby.dts index 7f2df00937..3caf4660ae 100644 --- a/zephyr/projects/corsola/interrupts_krabby.dts +++ b/zephyr/projects/corsola/interrupts_krabby.dts @@ -101,5 +101,10 @@ flags = ; handler = "rt9490_bc12_dt_interrupt"; }; + int_ccd_mode_odl: ccd-mode-odl { + irq-pin = <&gpio_ccd_mode_odl>; + flags = ; + handler = "ccd_interrupt"; + }; }; }; diff --git a/zephyr/projects/corsola/interrupts_magikarp.dts b/zephyr/projects/corsola/interrupts_magikarp.dts index 06458e1063..3d02300884 100644 --- a/zephyr/projects/corsola/interrupts_magikarp.dts +++ b/zephyr/projects/corsola/interrupts_magikarp.dts @@ -101,5 +101,10 @@ flags = ; handler = "rt9490_bc12_dt_interrupt"; }; + int_ccd_mode_odl: ccd-mode-odl { + irq-pin = <&gpio_ccd_mode_odl>; + flags = ; + handler = "ccd_interrupt"; + }; }; }; diff --git a/zephyr/projects/corsola/interrupts_tentacruel.dts b/zephyr/projects/corsola/interrupts_tentacruel.dts index c35461304e..11229daf36 100644 --- a/zephyr/projects/corsola/interrupts_tentacruel.dts +++ b/zephyr/projects/corsola/interrupts_tentacruel.dts @@ -106,5 +106,10 @@ flags = ; handler = "rt9490_bc12_dt_interrupt"; }; + int_ccd_mode_odl: ccd-mode-odl { + irq-pin = <&gpio_ccd_mode_odl>; + flags = ; + handler = "ccd_interrupt"; + }; }; }; diff --git a/zephyr/projects/corsola/src/board.c b/zephyr/projects/corsola/src/board.c new file mode 100644 index 0000000000..93a2443191 --- /dev/null +++ b/zephyr/projects/corsola/src/board.c @@ -0,0 +1,37 @@ +/* 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 "console.h" +#include "hooks.h" +#include "typec_control.h" +#include "usb_dp_alt_mode.h" +#include "usb_mux.h" +#include "usb_pd.h" +#include "usbc_ppc.h" + +#include "baseboard_usbc_config.h" + +#define CPRINTS(format, args...) cprints(CC_USB, format, ##args) + +static void ccd_interrupt_deferred(void) +{ + /* + * If CCD_MODE_ODL asserts, it means there's a debug accessory connected + * and we should enable the SBU FETs. + */ + typec_set_sbu(CONFIG_CCD_USBC_PORT_NUMBER, 1); + + /* Mux DP AUX away when CCD enabled to prevent the AUX channel + * interferes the SBU pins. + */ + CPRINTS("CCD Enabled, mux DP_AUX_PATH_SEL to 1"); + gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel), 1); +} +DECLARE_DEFERRED(ccd_interrupt_deferred); + +void ccd_interrupt(enum gpio_signal signal) +{ + hook_call_deferred(&ccd_interrupt_deferred_data, 0); +} diff --git a/zephyr/projects/corsola/src/usbc_config.c b/zephyr/projects/corsola/src/usbc_config.c index daf3e5a5cc..e3a2796de5 100644 --- a/zephyr/projects/corsola/src/usbc_config.c +++ b/zephyr/projects/corsola/src/usbc_config.c @@ -49,6 +49,11 @@ static void baseboard_init(void) #ifdef CONFIG_VARIANT_CORSOLA_USBA gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_usba)); #endif + /* If CCD mode has enabled before init, force the ccd_interrupt. */ + if (!gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_ccd_mode_odl))) { + ccd_interrupt(GPIO_CCD_MODE_ODL); + } + gpio_enable_dt_interrupt(GPIO_INT_FROM_NODELABEL(int_ccd_mode_odl)); } DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_PRE_DEFAULT); diff --git a/zephyr/test/kingler/CMakeLists.txt b/zephyr/test/kingler/CMakeLists.txt index a78c4dd497..6747b2ed99 100644 --- a/zephyr/test/kingler/CMakeLists.txt +++ b/zephyr/test/kingler/CMakeLists.txt @@ -28,3 +28,5 @@ target_sources_ifdef(CONFIG_TEST_DB_DETECT_NONE app PRIVATE src/db_detect_none.c) target_sources_ifdef(CONFIG_TEST_ALT_SENSOR_PROBE app PRIVATE src/alt_sensor.c) +target_sources_ifdef(CONFIG_TEST_KINGLER_CCD +app PRIVATE src/ccd.c ${PLATFORM_EC}/zephyr/projects/corsola/src/board.c) diff --git a/zephyr/test/kingler/Kconfig b/zephyr/test/kingler/Kconfig index 67454c5894..930185a5ef 100644 --- a/zephyr/test/kingler/Kconfig +++ b/zephyr/test/kingler/Kconfig @@ -48,4 +48,9 @@ config TEST_ALT_SENSOR_PROBE Include alt_sensor.c into the binary to test the alt sensor probe via SSFC. +config TEST_KINGLER_CCD + bool "Run the tests intended for alt sensor probe" + help + Include alt_sensor.c into the binary to test the alt sensor probe via + SSFC. source "Kconfig.zephyr" diff --git a/zephyr/test/kingler/common.dts b/zephyr/test/kingler/common.dts index cf851a9ed0..39b6f25036 100644 --- a/zephyr/test/kingler/common.dts +++ b/zephyr/test/kingler/common.dts @@ -7,6 +7,19 @@ #include / { + usbc { + #address-cells = <1>; + #size-cells = <0>; + port0@0 { + compatible = "named-usbc-port"; + reg = <0>; + }; + port1@1 { + compatible = "named-usbc-port"; + reg = <1>; + }; + }; + /* These are temporary just to get the test to build. * Should be replaced with the correct accel drivers, * but we're not testing that code right now anyway. diff --git a/zephyr/test/kingler/src/ccd.c b/zephyr/test/kingler/src/ccd.c new file mode 100644 index 0000000000..1b46631dc6 --- /dev/null +++ b/zephyr/test/kingler/src/ccd.c @@ -0,0 +1,110 @@ +/* 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 "zephyr/kernel.h" +#include +#include +#include + +#include "gpio_signal.h" +#include "gpio/gpio_int.h" +#include "hooks.h" + +FAKE_VOID_FUNC(typec_set_sbu, int, bool); +/* fake definitions to pass build */ +FAKE_VOID_FUNC(bmi3xx_interrupt, enum gpio_signal); +FAKE_VOID_FUNC(x_ec_interrupt, enum gpio_signal); + +#define FFF_FAKES_LIST(FAKE) \ + FAKE(typec_set_sbu) \ + FAKE(bmi3xx_interrupt) \ + FAKE(x_ec_interrupt) + +struct kingler_ccd_fixture { + int default_ccd_lvl; + int default_aux_path_lvl; +}; + +static void *ccd_setup(void) +{ + static struct kingler_ccd_fixture f; + + return &f; +} + +static void kingler_ccd_reset_rule_before(const struct ztest_unit_test *test, + void *data) +{ + ARG_UNUSED(test); + ARG_UNUSED(data); + FFF_FAKES_LIST(RESET_FAKE); + FFF_RESET_HISTORY(); +} +ZTEST_RULE(kingler_ccd_reset_rule, kingler_ccd_reset_rule_before, NULL); + +static void kingler_ccd_before(void *data) +{ + struct kingler_ccd_fixture *f = (struct kingler_ccd_fixture *)data; + + f->default_ccd_lvl = + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(gpio_ccd_mode_odl)); + f->default_aux_path_lvl = + gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel)); + + zassert_ok(gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_ccd_mode_odl))); +} + +static void kingler_ccd_after(void *data) +{ + struct kingler_ccd_fixture *f = (struct kingler_ccd_fixture *)data; + + zassert_ok(gpio_disable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_ccd_mode_odl))); + zassert_ok(gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_ccd_mode_odl), + f->default_ccd_lvl)); + zassert_ok(gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel), + f->default_aux_path_lvl)); +} + +ZTEST_SUITE(kingler_ccd, NULL, ccd_setup, kingler_ccd_before, kingler_ccd_after, + NULL); + +ZTEST_F(kingler_ccd, test_dp_aux_path) +{ + const struct device *ccd_mode_odl_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(gpio_ccd_mode_odl), gpios)); + const gpio_port_pins_t ccd_mode_odl_pin = + DT_GPIO_PIN(DT_NODELABEL(gpio_ccd_mode_odl), gpios); + const struct device *dp_aux_gpio = DEVICE_DT_GET( + DT_GPIO_CTLR(DT_NODELABEL(dp_aux_path_sel), gpios)); + const gpio_port_pins_t dp_aux_pin = + DT_GPIO_PIN(DT_NODELABEL(dp_aux_path_sel), gpios); + + /* reset CCD mode and mux AUX path to CCD port by default */ + zassert_ok(gpio_emul_input_set(ccd_mode_odl_gpio, ccd_mode_odl_pin, 1), + NULL); + zassert_ok(gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(dp_aux_path_sel), 0), + NULL); + zassert_equal(0, gpio_emul_output_get(dp_aux_gpio, dp_aux_pin), NULL); + + /* CCD asserts and trigger ccd_interrupt */ + zassert_ok(gpio_emul_input_set(ccd_mode_odl_gpio, ccd_mode_odl_pin, 0), + NULL); + k_sleep(K_MSEC(100)); + + zassert_equal(1, typec_set_sbu_fake.call_count, NULL); + /* CCD triggered, aux path has to be muxed to port 1 */ + zassert_equal(1, gpio_emul_output_get(dp_aux_gpio, dp_aux_pin), NULL); + + /* CCD deasserts */ + zassert_ok(gpio_emul_input_set(ccd_mode_odl_gpio, ccd_mode_odl_pin, 1), + NULL); + + k_sleep(K_MSEC(100)); + /* do not touch dp aux path when CCD deasserted */ + zassert_equal(1, gpio_emul_output_get(dp_aux_gpio, dp_aux_pin), NULL); + zassert_equal(1, typec_set_sbu_fake.call_count, NULL); +} diff --git a/zephyr/test/kingler/src/fakes.c b/zephyr/test/kingler/src/fakes.c index bc6e2ae523..9b3194f18a 100644 --- a/zephyr/test/kingler/src/fakes.c +++ b/zephyr/test/kingler/src/fakes.c @@ -18,6 +18,9 @@ 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); +#ifndef CONFIG_TEST_KINGLER_CCD +FAKE_VOID_FUNC(ccd_interrupt, enum gpio_signal); +#endif #ifdef CONFIG_TEST_STEELIX_RUSTY FAKE_VOID_FUNC(x_ec_interrupt, enum gpio_signal); diff --git a/zephyr/test/kingler/testcase.yaml b/zephyr/test/kingler/testcase.yaml index 1083e1f804..9b7e9f58ff 100644 --- a/zephyr/test/kingler/testcase.yaml +++ b/zephyr/test/kingler/testcase.yaml @@ -30,6 +30,10 @@ tests: extra_configs: - CONFIG_TEST_DB_DETECT_NONE=y - CONFIG_VARIANT_CORSOLA_DB_DETECTION=y + kingler.ccd: + extra_args: DTC_OVERLAY_FILE="./common.dts;../projects/corsola/interrupts_kingler.dts;../projects/corsola/cbi_steelix.dts;../projects/corsola/gpio_steelix.dts" + extra_configs: + - CONFIG_TEST_KINGLER_CCD=y kingler.alt_sensor: extra_args: DTC_OVERLAY_FILE="./common.dts;../projects/corsola/interrupts_kingler.dts;../projects/corsola/interrupts_steelix.dts;../projects/corsola/cbi_steelix.dts;../projects/corsola/gpio_steelix.dts" extra_configs: -- cgit v1.2.1