summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Yilun Lin <yllin@chromium.org>2021-11-26 13:10:35 +0800
committerCommit Bot <commit-bot@chromium.org>2021-12-01 03:20:47 +0000
commitfa02962cc2697fc9374a9b0d04c4bc66c7a4fbdb (patch)
treeb8acc8caa5a68045426b9ffc8bacb33470584cf8
parent82a59bd513a8dc8546c39f3be506e10e3f117a1b (diff)
downloadchrome-ec-fa02962cc2697fc9374a9b0d04c4bc66c7a4fbdb.tar.gz
zephyr: corsola: refactor daughterboard detection
move the daughterboard detection out of the usbc_config.c BUG=b:207802869 TEST=zmake test all BRANCH=none Change-Id: Ie23915d116cfbfd161f640eeea342e18d2647216 Signed-off-by: Eric Yilun Lin <yllin@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3303262 Auto-Submit: Eric Yilun Lin <yllin@google.com> Commit-Queue: Eric Yilun Lin <yllin@google.com> Tested-by: Eric Yilun Lin <yllin@google.com> Reviewed-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--zephyr/projects/corsola/CMakeLists.txt2
-rw-r--r--zephyr/projects/corsola/include/gpio_map.h8
-rw-r--r--zephyr/projects/corsola/include/variant_db_detection.h32
-rw-r--r--zephyr/projects/corsola/src/baseboard_common.h15
-rw-r--r--zephyr/projects/corsola/src/krabby/usbc_config.c4
-rw-r--r--zephyr/projects/corsola/src/usbc_config.c62
-rw-r--r--zephyr/projects/corsola/src/variant_db_detection.c65
7 files changed, 120 insertions, 68 deletions
diff --git a/zephyr/projects/corsola/CMakeLists.txt b/zephyr/projects/corsola/CMakeLists.txt
index e6e68005c8..3856119707 100644
--- a/zephyr/projects/corsola/CMakeLists.txt
+++ b/zephyr/projects/corsola/CMakeLists.txt
@@ -16,6 +16,8 @@ zephyr_library_sources(
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")
+zephyr_library_sources_ifdef(CONFIG_VARIANT_CORSOLA_DB_DETECTION
+ "src/variant_db_detection.c")
if(DEFINED CONFIG_BOARD_KRABBY)
project(krabby)
diff --git a/zephyr/projects/corsola/include/gpio_map.h b/zephyr/projects/corsola/include/gpio_map.h
index 2cb421a6be..6db8f94b76 100644
--- a/zephyr/projects/corsola/include/gpio_map.h
+++ b/zephyr/projects/corsola/include/gpio_map.h
@@ -13,6 +13,14 @@
#define GPIO_ENTERING_RW GPIO_UNIMPLEMENTED
+/* daughterboard GPIO remap */
+#define GPIO_EN_HDMI_PWR GPIO_EC_X_GPIO1
+#define GPIO_USB_C1_FRS_EN GPIO_EC_X_GPIO1
+#define GPIO_USB_C1_PPC_INT_ODL GPIO_X_EC_GPIO2
+#define GPIO_PS185_EC_DP_HPD GPIO_X_EC_GPIO2
+#define GPIO_USB_C1_DP_IN_HPD GPIO_EC_X_GPIO3
+#define GPIO_PS185_PWRDN_ODL GPIO_EC_X_GPIO3
+
/* TODO: support CONFIG_WP_ACTIVE_HIGH for zephyr */
#define GPIO_WP GPIO_UNIMPLEMENTED
#define GPIO_WP_L GPIO_UNIMPLEMENTED
diff --git a/zephyr/projects/corsola/include/variant_db_detection.h b/zephyr/projects/corsola/include/variant_db_detection.h
new file mode 100644
index 0000000000..40853016f8
--- /dev/null
+++ b/zephyr/projects/corsola/include/variant_db_detection.h
@@ -0,0 +1,32 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Corsola daughter board detection */
+
+#ifndef __CROS_EC_CORSOLA_DB_DETECTION_H
+#define __CROS_EC_CORSOLA_DB_DETECTION_H
+
+enum corsola_db_type {
+ CORSOLA_DB_NONE = -1,
+ CORSOLA_DB_TYPEC,
+ CORSOLA_DB_HDMI,
+ CORSOLA_DB_COUNT,
+};
+
+#ifdef CONFIG_VARIANT_CORSOLA_DB_DETECTION
+/*
+ * Get the connected daughterboard type.
+ *
+ * @return The daughterboard type.
+ */
+enum corsola_db_type corsola_get_db_type(void);
+#else
+inline enum corsola_db_type corsola_get_db_type(void)
+{
+ return CORSOLA_DB_NONE;
+};
+#endif /* CONFIG_VARIANT_CORSOLA_DB_DETECTION */
+
+#endif /* __CROS_EC_CORSOLA_DB_DETECTION_H */
diff --git a/zephyr/projects/corsola/src/baseboard_common.h b/zephyr/projects/corsola/src/baseboard_common.h
index c0328ba4e1..075100e12f 100644
--- a/zephyr/projects/corsola/src/baseboard_common.h
+++ b/zephyr/projects/corsola/src/baseboard_common.h
@@ -8,25 +8,10 @@
#ifndef __CROS_EC_BASEBOARD_COMMON_H
#define __CROS_EC_BASEBOARD_COMMON_H
-/* GPIO name remapping */
-#define GPIO_EN_HDMI_PWR GPIO_EC_X_GPIO1
-#define GPIO_USB_C1_FRS_EN GPIO_EC_X_GPIO1
-#define GPIO_USB_C1_PPC_INT_ODL GPIO_X_EC_GPIO2
-#define GPIO_PS185_EC_DP_HPD GPIO_X_EC_GPIO2
-#define GPIO_USB_C1_DP_IN_HPD GPIO_EC_X_GPIO3
-#define GPIO_PS185_PWRDN_ODL GPIO_EC_X_GPIO3
-
#ifndef __ASSEMBLER__
#include "gpio_signal.h"
-enum board_sub_board {
- SUB_BOARD_NONE = -1,
- SUB_BOARD_TYPEC,
- SUB_BOARD_HDMI,
- SUB_BOARD_COUNT,
-};
-
/**
* board_get_version() - Get the board version
*
diff --git a/zephyr/projects/corsola/src/krabby/usbc_config.c b/zephyr/projects/corsola/src/krabby/usbc_config.c
index ee5d9483eb..8a942ed8c4 100644
--- a/zephyr/projects/corsola/src/krabby/usbc_config.c
+++ b/zephyr/projects/corsola/src/krabby/usbc_config.c
@@ -9,9 +9,11 @@
#include "driver/usb_mux/ps8743.h"
#include "hooks.h"
+#include "variant_db_detection.h"
+
void board_usb_mux_init(void)
{
- if (board_get_sub_board() == SUB_BOARD_TYPEC) {
+ if (corsola_get_db_type() == CORSOLA_DB_TYPEC) {
ps8743_tune_usb_eq(&usb_muxes[1],
PS8743_USB_EQ_TX_12_8_DB,
PS8743_USB_EQ_RX_12_8_DB);
diff --git a/zephyr/projects/corsola/src/usbc_config.c b/zephyr/projects/corsola/src/usbc_config.c
index ff7e32d0d7..10a6b57093 100644
--- a/zephyr/projects/corsola/src/usbc_config.c
+++ b/zephyr/projects/corsola/src/usbc_config.c
@@ -36,6 +36,8 @@
#include "usb_pd_tcpm.h"
#include "usbc_ppc.h"
+#include "variant_db_detection.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)
@@ -49,7 +51,6 @@ const struct charger_config_t chg_chips[] = {
};
/* Baseboard */
-
static void baseboard_init(void)
{
gpio_enable_interrupt(GPIO_USB_C0_PPC_BC12_INT_ODL);
@@ -57,55 +58,13 @@ static void baseboard_init(void)
}
DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_DEFAULT-1);
-/* Sub-board */
-
-enum board_sub_board board_get_sub_board(void)
-{
- static enum board_sub_board sub = SUB_BOARD_NONE;
-
- if (sub != SUB_BOARD_NONE)
- return sub;
-
- /* HDMI board has external pull high. */
- if (gpio_get_level(GPIO_EC_X_GPIO3)) {
- sub = SUB_BOARD_HDMI;
- /* Only has 1 PPC with HDMI subboard */
- ppc_cnt = 1;
- /* EC_X_GPIO1 */
- gpio_set_flags(GPIO_EN_HDMI_PWR, GPIO_OUT_HIGH);
- /* X_EC_GPIO2 */
- gpio_set_flags(GPIO_PS185_EC_DP_HPD, GPIO_INT_BOTH);
- /* EC_X_GPIO3 */
- gpio_set_flags(GPIO_PS185_PWRDN_ODL, GPIO_ODR_HIGH);
- } else {
- sub = SUB_BOARD_TYPEC;
- /* EC_X_GPIO1 */
- gpio_set_flags(GPIO_USB_C1_FRS_EN, GPIO_OUT_LOW);
- /* X_EC_GPIO2 */
- gpio_set_flags(GPIO_USB_C1_PPC_INT_ODL,
- GPIO_INT_BOTH | GPIO_PULL_UP);
- /* EC_X_GPIO3 */
- gpio_set_flags(GPIO_USB_C1_DP_IN_HPD, GPIO_OUT_LOW);
- }
-
- CPRINTS("Detect %s SUB", sub == SUB_BOARD_HDMI ? "HDMI" : "TYPEC");
- return sub;
-}
-
-static void sub_board_init(void)
-{
- board_get_sub_board();
-}
-DECLARE_HOOK(HOOK_INIT, sub_board_init, HOOK_PRIO_INIT_I2C - 1);
-
-/* Detect subboard */
static void board_tcpc_init(void)
{
/* C1: GPIO_USB_C1_PPC_INT_ODL & HDMI: GPIO_PS185_EC_DP_HPD */
gpio_enable_interrupt(GPIO_X_EC_GPIO2);
/* If this is not a Type-C subboard, disable the task. */
- if (board_get_sub_board() != SUB_BOARD_TYPEC)
+ if (corsola_get_db_type() != CORSOLA_DB_TYPEC)
task_disable_task(TASK_ID_PD_C1);
}
/* Must be done after I2C and subboard */
@@ -149,7 +108,7 @@ void bc12_interrupt(enum gpio_signal signal)
static void board_sub_bc12_init(void)
{
- if (board_get_sub_board() == SUB_BOARD_TYPEC)
+ if (corsola_get_db_type() == CORSOLA_DB_TYPEC)
gpio_enable_interrupt(GPIO_USB_C1_BC12_CHARGER_INT_ODL);
else
/* If this is not a Type-C subboard, disable the task. */
@@ -160,7 +119,7 @@ DECLARE_HOOK(HOOK_INIT, board_sub_bc12_init, HOOK_PRIO_INIT_I2C + 1);
__override uint8_t board_get_usb_pd_port_count(void)
{
- if (board_get_sub_board() == SUB_BOARD_TYPEC)
+ if (corsola_get_db_type() == CORSOLA_DB_TYPEC)
return CONFIG_USB_PD_PORT_MAX_COUNT;
else
return CONFIG_USB_PD_PORT_MAX_COUNT - 1;
@@ -298,8 +257,7 @@ void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled)
int board_set_active_charge_port(int port)
{
int i;
- int is_valid_port = port == 0 || (port == 1 && board_get_sub_board() ==
- SUB_BOARD_TYPEC);
+ 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;
@@ -379,12 +337,12 @@ static void hdmi_hpd_interrupt(enum gpio_signal signal)
/* HDMI/TYPE-C function shared subboard interrupt */
void x_ec_interrupt(enum gpio_signal signal)
{
- int sub = board_get_sub_board();
+ int sub = corsola_get_db_type();
- if (sub == SUB_BOARD_TYPEC)
+ if (sub == CORSOLA_DB_TYPEC)
/* C1: PPC interrupt */
syv682x_interrupt(1);
- else if (sub == SUB_BOARD_HDMI)
+ else if (sub == CORSOLA_DB_HDMI)
hdmi_hpd_interrupt(signal);
else
CPRINTS("Undetected subboard interrupt.");
@@ -394,7 +352,7 @@ int ppc_get_alert_status(int port)
{
if (port == 0)
return gpio_get_level(GPIO_USB_C0_PPC_BC12_INT_ODL) == 0;
- if (port == 1 && board_get_sub_board() == SUB_BOARD_TYPEC)
+ if (port == 1 && corsola_get_db_type() == CORSOLA_DB_TYPEC)
return gpio_get_level(GPIO_USB_C1_PPC_INT_ODL) == 0;
return 0;
diff --git a/zephyr/projects/corsola/src/variant_db_detection.c b/zephyr/projects/corsola/src/variant_db_detection.c
new file mode 100644
index 0000000000..340d54a196
--- /dev/null
+++ b/zephyr/projects/corsola/src/variant_db_detection.c
@@ -0,0 +1,65 @@
+/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Corsola daughter board detection */
+
+#include "console.h"
+#include "gpio.h"
+#include "hooks.h"
+
+#include "variant_db_detection.h"
+
+#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ## args)
+#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ## args)
+
+static void corsola_db_config(enum corsola_db_type type)
+{
+ switch (type) {
+ case CORSOLA_DB_HDMI:
+ /* EC_X_GPIO1 */
+ gpio_set_flags(GPIO_EN_HDMI_PWR, GPIO_OUT_HIGH);
+ /* X_EC_GPIO2 */
+ gpio_set_flags(GPIO_PS185_EC_DP_HPD, GPIO_INT_BOTH);
+ /* EC_X_GPIO3 */
+ gpio_set_flags(GPIO_PS185_PWRDN_ODL, GPIO_ODR_HIGH);
+ return;
+ case CORSOLA_DB_TYPEC:
+ /* EC_X_GPIO1 */
+ gpio_set_flags(GPIO_USB_C1_FRS_EN, GPIO_OUT_LOW);
+ /* X_EC_GPIO2 */
+ gpio_set_flags(GPIO_USB_C1_PPC_INT_ODL,
+ GPIO_INT_BOTH | GPIO_PULL_UP);
+ /* EC_X_GPIO3 */
+ gpio_set_flags(GPIO_USB_C1_DP_IN_HPD, GPIO_OUT_LOW);
+ return;
+ default:
+ break;
+
+ }
+}
+
+enum corsola_db_type corsola_get_db_type(void)
+{
+ static enum corsola_db_type db = CORSOLA_DB_NONE;
+
+ if (db != CORSOLA_DB_NONE)
+ return db;
+
+ if (!gpio_get_level(GPIO_HDMI_PRSNT_ODL))
+ db = CORSOLA_DB_HDMI;
+ else
+ db = CORSOLA_DB_TYPEC;
+
+ corsola_db_config(db);
+
+ CPRINTS("Detect %s DB", db == CORSOLA_DB_HDMI ? "HDMI" : "TYPEC");
+ return db;
+}
+
+static void corsola_db_init(void)
+{
+ corsola_get_db_type();
+}
+DECLARE_HOOK(HOOK_INIT, corsola_db_init, HOOK_PRIO_INIT_I2C - 1);