From 1a1bdaf3a0631dd66974bc1e1fd9c3084512a016 Mon Sep 17 00:00:00 2001 From: Sue Chen Date: Tue, 4 May 2021 11:24:04 +0800 Subject: Limozeen: buck IC solution LAZOR model uses DA9313. The other model uses I2C to check that the dut has LN9310 or buck IC. Set VBOB_EN instead of SWITCH_ON_L for buck IC. BUG=b:190250108 BRANCH=trogdor TEST=Make sure dut can power on. Signed-off-by: Sue Chen Change-Id: Ib70d7e37323747e270c44658bb38ccfa48532a80 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2943986 Reviewed-by: Wai-Hong Tam Tested-by: Wai-Hong Tam Commit-Queue: Wai-Hong Tam --- board/lazor/sku.c | 15 ++++++++++ board/lazor/sku.h | 3 ++ board/lazor/switchcap.c | 77 ++++++++++++++++++++++--------------------------- 3 files changed, 52 insertions(+), 43 deletions(-) diff --git a/board/lazor/sku.c b/board/lazor/sku.c index fa271b5475..a4ef6c6b22 100644 --- a/board/lazor/sku.c +++ b/board/lazor/sku.c @@ -84,3 +84,18 @@ __override uint16_t board_get_ps8xxx_product_id(int port) return PS8805_PRODUCT_ID; } + +int board_has_da9313(void) +{ + return get_model() == LAZOR; +} + +int board_has_buck_ic(void) +{ + return get_model() == LIMOZEEN && system_get_board_version() == 0; +} + +int board_has_ln9310(void) +{ + return get_model() == LIMOZEEN && system_get_board_version() != 0; +} diff --git a/board/lazor/sku.h b/board/lazor/sku.h index d37b502bd4..22b3c6d723 100644 --- a/board/lazor/sku.h +++ b/board/lazor/sku.h @@ -9,5 +9,8 @@ #define __CROS_EC_SKU_H int board_is_clamshell(void); +int board_has_da9313(void); +int board_has_ln9310(void); +int board_has_buck_ic(void); #endif /* __CROS_EC_SKU_H */ diff --git a/board/lazor/switchcap.c b/board/lazor/switchcap.c index b22bb57673..16f4a54c79 100644 --- a/board/lazor/switchcap.c +++ b/board/lazor/switchcap.c @@ -12,6 +12,7 @@ #include "i2c.h" #include "power/qcom.h" #include "system.h" +#include "sku.h" #define CPRINTS(format, args...) cprints(CC_I2C, format, ## args) #define CPRINTF(format, args...) cprintf(CC_I2C, format, ## args) @@ -22,31 +23,24 @@ const struct ln9310_config_t ln9310_config = { .i2c_addr_flags = LN9310_I2C_ADDR_0_FLAGS, }; -static int board_has_ln9310(void) +static void switchcap_init(void) { - static int ln9310_present = -1; - int status, val; - - /* Cache the status of LN9310 present or not */ - if (ln9310_present == -1) { - status = i2c_read8(ln9310_config.i2c_port, - ln9310_config.i2c_addr_flags, - LN9310_REG_CHIP_ID, - &val); + if (board_has_da9313()) { + CPRINTS("Use switchcap: DA9313"); /* - * Any error reading LN9310 CHIP_ID over I2C means the chip - * not present. Fallback to use DA9313 switchcap. + * When the chip in power down mode, it outputs high-Z. + * Set pull-down to avoid floating. */ - ln9310_present = !status && val == LN9310_CHIP_ID; - } - - return ln9310_present; -} + gpio_set_flags(GPIO_DA9313_GPIO0, GPIO_INPUT | GPIO_PULL_DOWN); -static void switchcap_init(void) -{ - if (board_has_ln9310()) { + /* + * Configure DA9313 enable, push-pull output. Don't set the + * level here; otherwise, it will override its value and + * shutdown the switchcap when sysjump to RW. + */ + gpio_set_flags(GPIO_SWITCHCAP_ON, GPIO_OUTPUT); + } else if (board_has_ln9310()) { CPRINTS("Use switchcap: LN9310"); /* Configure and enable interrupt for LN9310 */ @@ -84,47 +78,44 @@ static void switchcap_init(void) gpio_set_level(GPIO_SWITCHCAP_ON_L, 1); ln9310_init(); } + } else if (board_has_buck_ic()) { + CPRINTS("Use Buck IC"); } else { - CPRINTS("Use switchcap: DA9313"); - - /* - * When the chip in power down mode, it outputs high-Z. - * Set pull-down to avoid floating. - */ - gpio_set_flags(GPIO_DA9313_GPIO0, GPIO_INPUT | GPIO_PULL_DOWN); - - /* - * Configure DA9313 enable, push-pull output. Don't set the - * level here; otherwise, it will override its value and - * shutdown the switchcap when sysjump to RW. - */ - gpio_set_flags(GPIO_SWITCHCAP_ON, GPIO_OUTPUT); + CPRINTS("ERROR: No switchcap solution"); } } DECLARE_HOOK(HOOK_INIT, switchcap_init, HOOK_PRIO_DEFAULT); void board_set_switchcap_power(int enable) { - if (board_has_ln9310()) { + if (board_has_da9313()) { + gpio_set_level(GPIO_SWITCHCAP_ON, enable); + } else if (board_has_ln9310()) { gpio_set_level(GPIO_SWITCHCAP_ON_L, !enable); ln9310_software_enable(enable); - } else { - gpio_set_level(GPIO_SWITCHCAP_ON, enable); + } else if (board_has_buck_ic()) { + gpio_set_level(GPIO_VBOB_EN, enable); } } int board_is_switchcap_enabled(void) { - if (board_has_ln9310()) - return !gpio_get_level(GPIO_SWITCHCAP_ON_L); - else + if (board_has_da9313()) return gpio_get_level(GPIO_SWITCHCAP_ON); + else if (board_has_ln9310()) + return !gpio_get_level(GPIO_SWITCHCAP_ON_L); + + /* Board has buck ic*/ + return gpio_get_level(GPIO_VBOB_EN); } int board_is_switchcap_power_good(void) { - if (board_has_ln9310()) - return ln9310_power_good(); - else + if (board_has_da9313()) return gpio_get_level(GPIO_DA9313_GPIO0); + else if (board_has_ln9310()) + return ln9310_power_good(); + + /* Board has buck ic no way to check POWER GOOD */ + return 1; } -- cgit v1.2.1