summaryrefslogtreecommitdiff
path: root/zephyr/projects/corsola
diff options
context:
space:
mode:
authorjeffrey <jeffrey_lin@pegatron.corp-partner.google.com>2022-09-15 10:39:59 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-09-19 09:39:49 +0000
commitd8c655abeb90fecc68b24a542dca6313ac3df777 (patch)
tree21cc570360eeab75403401cbacd59b9998492777 /zephyr/projects/corsola
parent1a479db23caba8c32724c5b70941507324e46271 (diff)
downloadchrome-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.txt2
-rw-r--r--zephyr/projects/corsola/gpio_tentacruel.dts13
-rw-r--r--zephyr/projects/corsola/i2c_tentacruel.dts15
-rw-r--r--zephyr/projects/corsola/interrupts_tentacruel.dts11
-rw-r--r--zephyr/projects/corsola/prj_tentacruel.conf1
-rw-r--r--zephyr/projects/corsola/src/krabby/usbc_config_tentacruel.c224
-rw-r--r--zephyr/projects/corsola/usbc_tentacruel.dts3
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 {