diff options
author | jeffrey <jeffrey_lin@pegatron.corp-partner.google.com> | 2022-09-15 10:39:59 +0800 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-09-19 09:39:49 +0000 |
commit | d8c655abeb90fecc68b24a542dca6313ac3df777 (patch) | |
tree | 21cc570360eeab75403401cbacd59b9998492777 /zephyr/projects/corsola | |
parent | 1a479db23caba8c32724c5b70941507324e46271 (diff) | |
download | chrome-ec-d8c655abeb90fecc68b24a542dca6313ac3df777.tar.gz |
tentacruel : Modify typec port 0 config
Modify port 0 ppc config to syv682 and bc12 config to pi3usb9201.
BUG=b:238263725
TEST=zmake build tentacruel --clobber
check port 0 can work normally.
BRANCH=None
LOW_COVERAGE_REASON=krabby board test under developement(b/243841599)
Signed-off-by: jeffrey <jeffrey_lin@pegatron.corp-partner.google.com>
Change-Id: I0b183783e93090b2247e01c18ebc72b6180eb753
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3897911
Code-Coverage: Ting Shen <phoenixshen@chromium.org>
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
Reviewed-by: Chen-Tsung Hsieh <chentsung@chromium.org>
Reviewed-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'zephyr/projects/corsola')
-rw-r--r-- | zephyr/projects/corsola/CMakeLists.txt | 2 | ||||
-rw-r--r-- | zephyr/projects/corsola/gpio_tentacruel.dts | 13 | ||||
-rw-r--r-- | zephyr/projects/corsola/i2c_tentacruel.dts | 15 | ||||
-rw-r--r-- | zephyr/projects/corsola/interrupts_tentacruel.dts | 11 | ||||
-rw-r--r-- | zephyr/projects/corsola/prj_tentacruel.conf | 1 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/krabby/usbc_config_tentacruel.c | 224 | ||||
-rw-r--r-- | zephyr/projects/corsola/usbc_tentacruel.dts | 3 |
7 files changed, 260 insertions, 9 deletions
diff --git a/zephyr/projects/corsola/CMakeLists.txt b/zephyr/projects/corsola/CMakeLists.txt index c50c84e879..f92bb2b702 100644 --- a/zephyr/projects/corsola/CMakeLists.txt +++ b/zephyr/projects/corsola/CMakeLists.txt @@ -60,7 +60,7 @@ elseif(DEFINED CONFIG_BOARD_TENTACRUEL) zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC "src/krabby/usb_pd_policy.c") zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC - "src/krabby/usbc_config.c") + "src/krabby/usbc_config_tentacruel.c") elseif(DEFINED CONFIG_BOARD_MAGIKARP) project(magikarp) diff --git a/zephyr/projects/corsola/gpio_tentacruel.dts b/zephyr/projects/corsola/gpio_tentacruel.dts index 6113718b0d..75607cb561 100644 --- a/zephyr/projects/corsola/gpio_tentacruel.dts +++ b/zephyr/projects/corsola/gpio_tentacruel.dts @@ -70,8 +70,13 @@ gpio_x_ec_gpio2: x_ec_gpio2 { gpios = <&gpiob 2 GPIO_INPUT>; }; - usb_c0_ppc_bc12_int_odl: usb_c0_ppc_bc12_int_odl { + usb_c0_ppc_int_odl: usb_c0_ppc_int_odl { gpios = <&gpiod 1 GPIO_INPUT>; + enum-name = "GPIO_USB_C0_PPC_INT_ODL"; + }; + usb_c0_bc12_int_odl: usb_c0_bc12_int_odl { + gpios = <&gpiof 1 GPIO_INPUT>; + enum-name = "GPIO_USB_C0_BC12_INT_ODL"; }; usb_c1_bc12_charger_int_odl: usb_c1_bc12_charger_int_odl { gpios = <&gpioj 4 GPIO_INPUT>; @@ -116,8 +121,9 @@ en_pp5000_usb_a0_vbus: en_pp5000_usb_a0_vbus { gpios = <&gpiob 7 GPIO_OUTPUT_LOW>; }; - usb_c0_ppc_frsinfo: usb_c0_ppc_frsinfo { - gpios = <&gpiof 0 GPIO_INPUT>; + usb_c0_frs_en: usb_c0_frs_en { + gpios = <&gpiof 0 GPIO_OUTPUT_LOW>; + enum-name = "GPIO_USB_C0_FRS_EN"; }; ec_batt_pres_odl: ec_batt_pres_odl { gpios = <&gpioc 0 GPIO_INPUT>; @@ -187,7 +193,6 @@ <&gpioa 6 GPIO_INPUT_PULL_DOWN>, <&gpioa 7 GPIO_INPUT_PULL_DOWN>, <&gpiod 7 GPIO_INPUT_PULL_DOWN>, - <&gpiof 1 GPIO_INPUT_PULL_DOWN>, <&gpioh 0 GPIO_INPUT_PULL_DOWN>, <&gpioh 6 GPIO_INPUT_PULL_DOWN>, <&gpioi 3 GPIO_INPUT_PULL_DOWN>, diff --git a/zephyr/projects/corsola/i2c_tentacruel.dts b/zephyr/projects/corsola/i2c_tentacruel.dts index 84e2363f68..ceb1ed1c3a 100644 --- a/zephyr/projects/corsola/i2c_tentacruel.dts +++ b/zephyr/projects/corsola/i2c_tentacruel.dts @@ -5,6 +5,21 @@ #include "i2c_krabby_tentacruel.dtsi" +&i2c2 { + bc12_port0: pi3usb9201@5f { + compatible = "pericom,pi3usb9201"; + status = "okay"; + reg = <0x5f>; + irq = <&int_usb_c0_bc12>; + }; + ppc_port0: syv682x@40 { + compatible = "silergy,syv682x"; + status = "okay"; + reg = <0x40>; + frs_en_gpio = <&usb_c0_frs_en>; + }; +}; + &i2c4 { ps8743_mux_1: ps8743-mux-1@10 { compatible = "parade,ps8743"; diff --git a/zephyr/projects/corsola/interrupts_tentacruel.dts b/zephyr/projects/corsola/interrupts_tentacruel.dts index 06458e1063..c35461304e 100644 --- a/zephyr/projects/corsola/interrupts_tentacruel.dts +++ b/zephyr/projects/corsola/interrupts_tentacruel.dts @@ -91,10 +91,15 @@ flags = <GPIO_INT_EDGE_BOTH>; handler = "x_ec_interrupt"; }; - int_usb_c0_ppc_bc12: usb_c0_ppc_bc12 { - irq-pin = <&usb_c0_ppc_bc12_int_odl>; + int_usb_c0_ppc: usb_c0_ppc { + irq-pin = <&usb_c0_ppc_int_odl>; flags = <GPIO_INT_EDGE_FALLING>; - handler = "c0_bc12_interrupt"; + handler = "ppc_interrupt"; + }; + int_usb_c0_bc12: usb_c0_bc12 { + irq-pin = <&usb_c0_bc12_int_odl>; + flags = <GPIO_INT_EDGE_FALLING>; + handler = "bc12_interrupt"; }; int_usb_c1_bc12_charger: usb_c1_bc12_charger { irq-pin = <&usb_c1_bc12_charger_int_odl>; diff --git a/zephyr/projects/corsola/prj_tentacruel.conf b/zephyr/projects/corsola/prj_tentacruel.conf index bbf442c8a1..71cc9d9694 100644 --- a/zephyr/projects/corsola/prj_tentacruel.conf +++ b/zephyr/projects/corsola/prj_tentacruel.conf @@ -6,6 +6,7 @@ CONFIG_BOARD_TENTACRUEL=y # USB-C +CONFIG_PLATFORM_EC_BC12_DETECT_PI3USB9201=y CONFIG_PLATFORM_EC_USB_MUX_TUSB546=n CONFIG_PLATFORM_EC_USB_MUX_PS8743=y diff --git a/zephyr/projects/corsola/src/krabby/usbc_config_tentacruel.c b/zephyr/projects/corsola/src/krabby/usbc_config_tentacruel.c new file mode 100644 index 0000000000..248a92a87b --- /dev/null +++ b/zephyr/projects/corsola/src/krabby/usbc_config_tentacruel.c @@ -0,0 +1,224 @@ +/* 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. + */ + +/* Tentacruel board-specific USB-C configuration */ + +#include "adc.h" +#include "baseboard_usbc_config.h" +#include "bc12/pi3usb9201_public.h" +#include "charge_manager.h" +#include "charger.h" +#include "console.h" +#include "cros_board_info.h" +#include "driver/charger/rt9490.h" +#include "driver/ppc/rt1739.h" +#include "driver/tcpm/it83xx_pd.h" +#include "driver/usb_mux/ps8743.h" +#include "gpio/gpio_int.h" +#include "hooks.h" +#include "ppc/syv682x_public.h" +#include "usb_mux/it5205_public.h" +#include "usbc_ppc.h" +#include "usbc/ppc.h" + +#include "variant_db_detection.h" +#include <zephyr/logging/log.h> + +#define CPRINTSUSB(format, args...) cprints(CC_USBCHARGE, format, ##args) +#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ##args) +#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ##args) + +LOG_MODULE_REGISTER(alt_dev_replacement); + +#define BOARD_VERSION_UNKNOWN 0xffffffff + +/* Check board version to decide which ppc/bc12 is used. */ +static bool board_has_syv_ppc(void) +{ + static uint32_t board_version = BOARD_VERSION_UNKNOWN; + + if (board_version == BOARD_VERSION_UNKNOWN) { + if (cbi_get_board_version(&board_version) != EC_SUCCESS) { + LOG_ERR("Failed to get board version."); + board_version = 0; + } + } + + return (board_version >= 3); +} + +static void check_alternate_devices(void) +{ + /* Configure the PPC driver */ + if (board_has_syv_ppc()) + /* Arg is the USB port number */ + PPC_ENABLE_ALTERNATE(0); +} +DECLARE_HOOK(HOOK_INIT, check_alternate_devices, HOOK_PRIO_DEFAULT); + +void bc12_interrupt(enum gpio_signal signal) +{ + usb_charger_task_set_event(0, USB_CHG_EVENT_BC12); +} + +static void board_usbc_init(void) +{ + if (board_has_syv_ppc()) { + /* Enable PPC interrupts. */ + gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_usb_c0_ppc)); + + /* Enable BC1.2 interrupts. */ + gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_usb_c0_bc12)); + } else { + gpio_enable_dt_interrupt( + GPIO_INT_FROM_NODELABEL(int_usb_c0_ppc)); + } +} +DECLARE_HOOK(HOOK_INIT, board_usbc_init, HOOK_PRIO_POST_DEFAULT); + +void ppc_interrupt(enum gpio_signal signal) +{ + if (board_has_syv_ppc()) { + if (signal == GPIO_SIGNAL(DT_NODELABEL(usb_c0_ppc_int_odl))) { + syv682x_interrupt(0); + } + } else { + rt1739_interrupt(0); + } + + if (signal == GPIO_SIGNAL(DT_ALIAS(gpio_usb_c1_ppc_int_odl))) { + syv682x_interrupt(1); + } +} + +int ppc_get_alert_status(int port) +{ + if (port == 0) { + return gpio_pin_get_dt( + GPIO_DT_FROM_NODELABEL(usb_c0_ppc_int_odl)) == 0; + } + if (port == 1 && corsola_get_db_type() == CORSOLA_DB_TYPEC) { + return gpio_pin_get_dt(GPIO_DT_FROM_ALIAS( + gpio_usb_c1_ppc_int_odl)) == 0; + } + + return 0; +} + +const struct cc_para_t *board_get_cc_tuning_parameter(enum usbpd_port port) +{ + const static struct cc_para_t + cc_parameter[CONFIG_USB_PD_ITE_ACTIVE_PORT_COUNT] = { + { + .rising_time = + IT83XX_TX_PRE_DRIVING_TIME_1_UNIT, + .falling_time = + IT83XX_TX_PRE_DRIVING_TIME_2_UNIT, + }, + { + .rising_time = + IT83XX_TX_PRE_DRIVING_TIME_1_UNIT, + .falling_time = + IT83XX_TX_PRE_DRIVING_TIME_2_UNIT, + }, + }; + + return &cc_parameter[port]; +} + +void board_overcurrent_event(int port, int is_overcurrented) +{ + /* TODO: check correct operation for Corsola */ +} + +uint16_t tcpc_get_alert_status(void) +{ + /* + * C0 & C1: TCPC is embedded in the EC and processes interrupts in the + * chip code (it83xx/intc.c) + */ + return 0; +} + +void board_reset_pd_mcu(void) +{ + /* + * C0 & C1: TCPC is embedded in the EC and processes interrupts in the + * chip code (it83xx/intc.c) + */ +} + +int board_set_active_charge_port(int port) +{ + int i; + int is_valid_port = (port >= 0 && port < board_get_usb_pd_port_count()); + + if (!is_valid_port && port != CHARGE_PORT_NONE) { + return EC_ERROR_INVAL; + } + + if (port == CHARGE_PORT_NONE) { + CPRINTS("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)) { + CPRINTS("Disabling C%d as sink failed.", i); + } + } + + return EC_SUCCESS; + } + + /* Check if the port is sourcing VBUS. */ + if (ppc_is_sourcing_vbus(port)) { + CPRINTS("Skip enable C%d", port); + return EC_ERROR_INVAL; + } + + CPRINTS("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)) { + CPRINTS("C%d: sink path disable failed.", i); + } + } + + /* Enable requested charge port. */ + if (ppc_vbus_sink_enable(port, 1)) { + CPRINTS("C%d: sink path enable failed.", port); + return EC_ERROR_UNKNOWN; + } + + return EC_SUCCESS; +} + +#ifdef CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT +enum adc_channel board_get_vbus_adc(int port) +{ + if (port == 0) { + return ADC_VBUS_C0; + } + if (port == 1) { + return ADC_VBUS_C1; + } + CPRINTSUSB("Unknown vbus adc port id: %d", port); + return ADC_VBUS_C0; +} +#endif /* CONFIG_USB_PD_VBUS_MEASURE_ADC_EACH_PORT */ diff --git a/zephyr/projects/corsola/usbc_tentacruel.dts b/zephyr/projects/corsola/usbc_tentacruel.dts index 0e0473cd86..bb105a8e08 100644 --- a/zephyr/projects/corsola/usbc_tentacruel.dts +++ b/zephyr/projects/corsola/usbc_tentacruel.dts @@ -11,8 +11,9 @@ port0@0 { compatible = "named-usbc-port"; reg = <0>; - bc12 = <&bc12_ppc_port0>; + bc12 = <&bc12_port0>; ppc = <&bc12_ppc_port0>; + ppc_alt = <&ppc_port0>; tcpc = <&usbpd0>; chg = <&charger>; usb-mux-chain-0 { |