diff options
Diffstat (limited to 'board/fizz')
-rw-r--r-- | board/fizz/board.c | 113 | ||||
-rw-r--r-- | board/fizz/gpio.inc | 5 | ||||
-rw-r--r-- | board/fizz/usb_pd_policy.c | 64 |
3 files changed, 100 insertions, 82 deletions
diff --git a/board/fizz/board.c b/board/fizz/board.c index 2861ee5fbe..6bbaf25e70 100644 --- a/board/fizz/board.c +++ b/board/fizz/board.c @@ -92,21 +92,14 @@ static void adp_in_deferred(void) if (!level) { /* BJ is inserted but the voltage isn't effective because PU3 * is still disabled. */ - pi.voltage = 19000; - if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) { - /* If type-c voltage is higher than BJ voltage, PU3 will - * shut down due to reverse current protection. So, we - * need to lower the voltage first. */ - if (charge_manager_get_charger_voltage() > pi.voltage) { - pd_set_external_voltage_limit( - CHARGE_PORT_TYPEC0, pi.voltage); - hook_call_deferred(&adp_in_deferred_data, - ADP_DEBOUNCE_MS * MSEC); - return; - } - /* Set it to the default. Will be updated by AP. */ + pi.voltage = 19500; + if (chipset_in_state(CHIPSET_STATE_ANY_OFF)) + /* + * It doesn't matter what we set here because we'll + * brown out anyway when charge_manager switches + * input. + */ pi.current = 3330; - } } charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, DEDICATED_CHARGE_PORT, &pi); @@ -469,16 +462,15 @@ static void board_init(void) } DECLARE_HOOK(HOOK_INIT, board_init, HOOK_PRIO_DEFAULT); -void board_set_charge_limit(int port, int supplier, int charge_ma, - int max_ma, int charge_mv) -{ - /* Turn on/off power shortage alert. Performs the same check as - * system_can_boot_ap(). It's repeated here because charge_manager - * hasn't updated charge_current/voltage when board_set_charge_limit - * is called. */ - led_alert(charge_ma * charge_mv < - CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW * 1000); +/* Mapping to the old schematics */ +#define GPIO_U42_P GPIO_TYPE_C_60W +#define GPIO_U22_C GPIO_TYPE_C_65W +/* + * Board version 2.1 or before uses a different current monitoring circuitry. + */ +static void set_charge_limit(int charge_ma) +{ /* * We have two FETs connected to two registers: PR257 & PR258. * These control thresholds of the over current monitoring system. @@ -508,6 +500,81 @@ void board_set_charge_limit(int port, int supplier, int charge_ma, } } +void board_set_charge_limit(int port, int supplier, int charge_ma, + int max_ma, int charge_mv) +{ + uint32_t brd_ver = 0; + int p87w = 0, p65w = 0, p60w = 0; + + /* + * Turn on/off power shortage alert. Performs the same check as + * system_can_boot_ap(). It's repeated here because charge_manager + * hasn't updated charge_current/voltage when board_set_charge_limit + * is called. + */ + led_alert(charge_ma * charge_mv < + CONFIG_CHARGER_LIMIT_POWER_THRESH_CHG_MW * 1000); + + /* + * In terms of timing, this should always work because + * HOOK_PRIO_CHARGE_MANAGER_INIT is notified after HOOK_PRIO_INIT_I2C. + * If CBI isn't initialized or contains invalid data, we assume it's + * a new board. + */ + if (cbi_get_board_version(&brd_ver) == EC_SUCCESS && brd_ver < 0x0202) + return set_charge_limit(charge_ma); + /* + * We have three FETs connected to three registers: PR257, PR258, + * PR7824. These control the thresholds of the current monitoring + * system. + * + * PR257 PR7824 PR258 + * For BJ (65W or 90W) off off off + * For 4.35A (87W) on off off + * For 3.25A (65W) off off on + * For 3.00A (60W) off on off + * + * The system power consumption is capped by PR259, which is stuffed + * differently depending on the SKU (65W v.s. 90W or U42 v.s. U22). + * So, we only need to monitor type-c adapters. For example: + * + * a 90W system powered by 65W type-c charger + * b 65W system powered by 60W type-c charger + * c 65W system powered by 87W type-c charger + * + * In a case such as (c), we actually do not need to monitor the current + * because the max is capped by PR259. + * + * AP is expected to read type-c adapter wattage from EC and control + * power consumption to avoid over-current or system browns out. + * + */ + if (supplier != CHARGE_SUPPLIER_DEDICATED) { + /* Apple 87W charger offers 4.3A @20V. */ + if (charge_ma >= 4300) { + p87w = 1; + } else if (charge_ma >= 3250) { + p65w = 1; + } else if (charge_ma >= 3000) { + p60w = 1; + } else { + /* + * TODO:http://crosbug.com/p/65013352. + * The current monitoring system doesn't support lower + * current. These currents are most likely not enough to + * power the system. However, if they're needed, EC can + * monitor PMON_PSYS and trigger H_PROCHOT by itself. + */ + p60w = 1; + CPRINTS("Current %dmA not supported", charge_ma); + } + } + + gpio_set_level(GPIO_TYPE_C_87W, p87w); + gpio_set_level(GPIO_TYPE_C_65W, p65w); + gpio_set_level(GPIO_TYPE_C_60W, p60w); +} + enum battery_present battery_is_present(void) { /* The GPIO is low when the battery is present */ diff --git a/board/fizz/gpio.inc b/board/fizz/gpio.inc index f28d550e84..716cc35c7f 100644 --- a/board/fizz/gpio.inc +++ b/board/fizz/gpio.inc @@ -40,8 +40,9 @@ GPIO(CCD_MODE_ODL, PIN(6, 3), GPIO_INPUT) /* Case Closed Debug Mode */ GPIO(EC_HAVEN_RESET_ODL, PIN(0, 2), GPIO_ODR_HIGH) /* H1 Reset */ GPIO(ENTERING_RW, PIN(7, 6), GPIO_OUTPUT) /* EC Entering RW */ GPIO(PMIC_INT_L, PIN(6, 0), GPIO_INPUT) /* PMIC interrupt */ -GPIO(U42_P, PIN(3, 3), GPIO_OUTPUT | GPIO_PULL_DOWN) -GPIO(U22_C, PIN(3, 4), GPIO_OUTPUT | GPIO_PULL_DOWN) +GPIO(TYPE_C_60W, PIN(3, 3), GPIO_OUTPUT | GPIO_PULL_DOWN) +GPIO(TYPE_C_65W, PIN(3, 4), GPIO_OUTPUT | GPIO_PULL_DOWN) +GPIO(TYPE_C_87W, PIN(4, 4), GPIO_OUTPUT | GPIO_PULL_DOWN) GPIO(POWER_RATE, PIN(7, 1), GPIO_INPUT) /* High: i3/5/7. Low: Celeron */ /* Fizz specific pins */ diff --git a/board/fizz/usb_pd_policy.c b/board/fizz/usb_pd_policy.c index 1d87c7eb75..3a607c50d1 100644 --- a/board/fizz/usb_pd_policy.c +++ b/board/fizz/usb_pd_policy.c @@ -218,29 +218,6 @@ int pd_custom_vdm(int port, int cnt, uint32_t *payload, return 0; } -#define CHARGE_PORT_SYSJUMP_TAG 0x4350 /* "CP" - Charge Port */ -#define CHARGE_PORT_HOOK_VERSION 1 - -static int restore_active_charge_port(struct charge_port_info *cpi) -{ - int version, size; - const struct charge_port_info *prev; - - if (!(system_get_reset_flags() & RESET_FLAG_SYSJUMP)) - return EC_ERROR_UNCHANGED; - - prev = (const struct charge_port_info *)system_get_jump_tag( - CHARGE_PORT_SYSJUMP_TAG, &version, &size); - if (!prev || version != CHARGE_PORT_HOOK_VERSION || - size != sizeof(*prev)) - return EC_ERROR_INVAL; - - cpi->current = prev->current; - cpi->voltage = prev->voltage; - - return EC_SUCCESS; -} - /* * Since fizz has no battery, it must source all of its power from either * USB-C or the barrel jack (preferred). Fizz operates in continuous safe @@ -274,14 +251,8 @@ static void board_charge_manager_init(void) typec_set_input_current_limit(port, 3000, 5000); break; case CHARGE_PORT_BARRELJACK: - /* TODO: Once transition from GPIO to CBI completes, get BJ - * adapter info locally. No need to save & restore it. */ - if (restore_active_charge_port(&cpi)) { - /* Set it to the default. Will be updated by AP. */ - CPRINTS("Previous charge info not found. Use default."); - cpi.voltage = 19000; - cpi.current = 3330; - } + cpi.voltage = 19500; + cpi.current = 3330; charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, DEDICATED_CHARGE_PORT, &cpi); break; @@ -290,24 +261,6 @@ static void board_charge_manager_init(void) DECLARE_HOOK(HOOK_INIT, board_charge_manager_init, HOOK_PRIO_CHARGE_MANAGER_INIT + 1); -static void preserve_active_charge_port(void) -{ - struct charge_port_info cpi; - - /* If it's not a dedicated charge port, we don't bother. Saving & - * restoring PD charger info is a much bigger problem. */ - if (charge_manager_get_active_charge_port() != DEDICATED_CHARGE_PORT) - return; - cpi.current = charge_manager_get_charger_current(); - cpi.voltage = charge_manager_get_charger_voltage(); - CPRINTS("Saving charge port info: %dmA %dmV", cpi.current, cpi.voltage); - cflush(); - - system_add_jump_tag(CHARGE_PORT_SYSJUMP_TAG, CHARGE_PORT_HOOK_VERSION, - sizeof(cpi), &cpi); -} -DECLARE_HOOK(HOOK_SYSJUMP, preserve_active_charge_port, HOOK_PRIO_DEFAULT); - int board_set_active_charge_port(int port) { const int active_port = charge_manager_get_active_charge_port(); @@ -326,6 +279,7 @@ int board_set_active_charge_port(int port) switch (port) { case CHARGE_PORT_TYPEC0: + /* This is connected to TP on board version 2.2+ thus no-op */ gpio_set_level(GPIO_USB_C0_CHARGE_L, 0); gpio_set_level(GPIO_AC_JACK_CHARGE_L, 1); gpio_enable_interrupt(GPIO_ADP_IN_L); @@ -334,15 +288,11 @@ int board_set_active_charge_port(int port) /* Make sure BJ adapter is sourcing power */ if (gpio_get_level(GPIO_ADP_IN_L)) return EC_ERROR_INVAL; + /* This will cause brown out when switching from type-c on + * board version 2.2+ thus the rest of the code is no-op. */ gpio_set_level(GPIO_AC_JACK_CHARGE_L, 0); - /* If this is switching from type-c to BJ, we have to wait until - * PU3 comes up to keep the system continuously powered. - * NX20P5090 datasheet says turn-on time for 20V is 29 msec. */ - if (active_port == CHARGE_PORT_TYPEC0) - msleep(30); - /* We don't check type-c voltage here. If it's higher than - * BJ voltage, we'll brown out due to the reverse current - * protection of PU3. */ + /* If type-c voltage > BJ voltage, we'll brown out due to the + * reverse current protection of PU3 but it's intended. */ gpio_set_level(GPIO_USB_C0_CHARGE_L, 1); gpio_disable_interrupt(GPIO_ADP_IN_L); break; |