diff options
author | Eric Yilun Lin <yllin@chromium.org> | 2021-11-26 13:10:35 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-12-01 03:20:47 +0000 |
commit | fa02962cc2697fc9374a9b0d04c4bc66c7a4fbdb (patch) | |
tree | b8acc8caa5a68045426b9ffc8bacb33470584cf8 | |
parent | 82a59bd513a8dc8546c39f3be506e10e3f117a1b (diff) | |
download | chrome-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.txt | 2 | ||||
-rw-r--r-- | zephyr/projects/corsola/include/gpio_map.h | 8 | ||||
-rw-r--r-- | zephyr/projects/corsola/include/variant_db_detection.h | 32 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/baseboard_common.h | 15 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/krabby/usbc_config.c | 4 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/usbc_config.c | 62 | ||||
-rw-r--r-- | zephyr/projects/corsola/src/variant_db_detection.c | 65 |
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); |