diff options
Diffstat (limited to 'common/charge_manager.c')
-rw-r--r-- | common/charge_manager.c | 362 |
1 files changed, 202 insertions, 160 deletions
diff --git a/common/charge_manager.c b/common/charge_manager.c index f8a08b7fa8..3e8b937e53 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -1,4 +1,4 @@ -/* Copyright 2014 The Chromium OS Authors. All rights reserved. +/* Copyright 2014 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ @@ -6,6 +6,7 @@ #include "adc.h" #include "atomic.h" #include "battery.h" +#include "builtin/assert.h" #include "charge_manager.h" #include "charge_ramp.h" #include "charge_state_v2.h" @@ -30,13 +31,13 @@ #error Mock defined HAS_MOCK_CHARGE_MANAGER #endif -#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args) +#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ##args) #define POWER(charge_port) ((charge_port.current) * (charge_port.voltage)) /* Timeout for delayed override power swap, allow for 500ms extra */ -#define POWER_SWAP_TIMEOUT (PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON + \ - PD_T_SAFE_0V + 500 * MSEC) +#define POWER_SWAP_TIMEOUT \ + (PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON + PD_T_SAFE_0V + 500 * MSEC) /* * Default charge supplier priority @@ -70,15 +71,13 @@ __overridable const int supplier_priority[] = { [CHARGE_SUPPLIER_OTHER] = 4, [CHARGE_SUPPLIER_VBUS] = 4, #endif -#ifdef CONFIG_WIRELESS_CHARGER_P9221_R7 - [CHARGE_SUPPLIER_WPC_BPP] = 5, - [CHARGE_SUPPLIER_WPC_EPP] = 5, - [CHARGE_SUPPLIER_WPC_GPP] = 5, -#endif }; BUILD_ASSERT(ARRAY_SIZE(supplier_priority) == CHARGE_SUPPLIER_COUNT); +const char *charge_supplier_name[] = { CHARGE_SUPPLIER_NAME }; +BUILD_ASSERT(ARRAY_SIZE(charge_supplier_name) == CHARGE_SUPPLIER_COUNT); + /* Keep track of available charge for each charge port. */ static struct charge_port_info available_charge[CHARGE_SUPPLIER_COUNT] [CHARGE_PORT_COUNT]; @@ -150,7 +149,7 @@ enum charge_manager_change_type { CHANGE_DUALROLE, }; -static int is_pd_port(int port) +int is_pd_port(int port) { return port >= 0 && port < board_get_usb_pd_port_count(); } @@ -204,9 +203,8 @@ static int is_connected(int port) */ static int charge_manager_spoof_dualrole_capability(void) { - return (system_get_image_copy() == EC_IMAGE_RO && - system_is_locked()) || !left_safe_mode; - + return (system_get_image_copy() == EC_IMAGE_RO && system_is_locked()) || + !left_safe_mode; } #endif /* !CONFIG_CHARGE_MANAGER_DRP_CHARGING */ @@ -257,9 +255,9 @@ static int charge_manager_is_seeded(void) if (!is_valid_port(j)) continue; if (available_charge[i][j].current == - CHARGE_CURRENT_UNINITIALIZED || + CHARGE_CURRENT_UNINITIALIZED || available_charge[i][j].voltage == - CHARGE_VOLTAGE_UNINITIALIZED) + CHARGE_VOLTAGE_UNINITIALIZED) return 0; } } @@ -340,8 +338,8 @@ static enum charge_supplier get_current_supplier(int port) return supplier; } -static enum usb_power_roles get_current_power_role(int port, - enum charge_supplier supplier) +static enum usb_power_roles +get_current_power_role(int port, enum charge_supplier supplier) { enum usb_power_roles role; if (charge_port == port) @@ -397,30 +395,38 @@ static int get_vbus_voltage(int port, enum usb_power_roles current_role) int charge_manager_get_vbus_voltage(int port) { - return get_vbus_voltage(port, get_current_power_role(port, - get_current_supplier(port))); + return get_vbus_voltage( + port, get_current_power_role(port, get_current_supplier(port))); } #ifdef CONFIG_CMD_VBUS -static int command_vbus(int argc, char **argv) +static int command_vbus(int argc, const char **argv) { /* port = -1 to print all the ports */ int port = -1; + int vbus, vsys; if (argc == 2) port = atoi(argv[1]); - for (int i = 0; i < board_get_usb_pd_port_count(); i++) { - if (port < 0 || i == port) - ccprintf("VBUS C%d = %d mV\n", i, - charge_manager_get_vbus_voltage(i)); + ccprintf(" VBUS VSYS\n"); + for (int i = 0; i < CHARGE_PORT_COUNT; i++) { + if (port < 0 || i == port) { + vbus = charge_manager_get_vbus_voltage(i); + if (charger_get_vsys_voltage(i, &vsys)) + vsys = -1; + ccprintf(" P%d %6dmV ", i, vbus); + if (vsys >= 0) + ccprintf("%6dmV\n", vsys); + else + ccprintf("(unknown)\n"); + } } return EC_SUCCESS; } -DECLARE_CONSOLE_COMMAND(vbus, command_vbus, - "[port]", - "VBUS of the given port"); +DECLARE_CONSOLE_COMMAND(vbus, command_vbus, "[port]", + "Print VBUS & VSYS of the given port"); #endif /** @@ -429,8 +435,9 @@ DECLARE_CONSOLE_COMMAND(vbus, command_vbus, * @param port Charge port. * @param r USB PD power info to be updated. */ -static void charge_manager_fill_power_info(int port, - struct ec_response_usb_pd_power_info *r) +static void +charge_manager_fill_power_info(int port, + struct ec_response_usb_pd_power_info *r) { enum charge_supplier sup = get_current_supplier(port); @@ -461,6 +468,8 @@ static void charge_manager_fill_power_info(int port, } } else { int use_ramp_current; + uint32_t max_mv, max_ma, pdo, unused; + switch (sup) { case CHARGE_SUPPLIER_PD: r->type = USB_CHG_TYPE_PD; @@ -486,30 +495,32 @@ static void charge_manager_fill_power_info(int port, r->type = USB_CHG_TYPE_VBUS; break; #endif -#ifdef CONFIG_WIRELESS_CHARGER_P9221_R7 - /* - * Todo:need kernel add wpc device node in power_supply - * before that use USB_CHG_TYPE_PROPRIETARY to present WPC. - */ - case CHARGE_SUPPLIER_WPC_BPP: - case CHARGE_SUPPLIER_WPC_EPP: - case CHARGE_SUPPLIER_WPC_GPP: - r->type = USB_CHG_TYPE_PROPRIETARY; - break; -#endif #if CONFIG_DEDICATED_CHARGE_PORT_COUNT > 0 case CHARGE_SUPPLIER_DEDICATED: r->type = USB_CHG_TYPE_DEDICATED; break; #endif default: -#ifdef CONFIG_WIRELESS_CHARGER_P9221_R7 - r->type = USB_CHG_TYPE_VBUS; -#else r->type = USB_CHG_TYPE_OTHER; -#endif } - r->meas.voltage_max = available_charge[sup][port].voltage; + + if (IS_ENABLED(CONFIG_USB_PD_DPS) && dps_is_enabled() && + sup == CHARGE_SUPPLIER_PD) { + /* + * Returns the maximum power the system can request when + * DPS enabled. This is to prevent the system think it's + * using a low power charger. + */ + pd_find_pdo_index(pd_get_src_cap_cnt(port), + pd_get_src_caps(port), + pd_get_max_voltage(), &pdo); + pd_extract_pdo_power(pdo, &max_ma, &max_mv, &unused); + } else { + max_mv = available_charge[sup][port].voltage; + max_ma = available_charge[sup][port].current; + } + + r->meas.voltage_max = max_mv; /* * Report unknown charger CHARGE_DETECT_DELAY after supplier @@ -523,15 +534,15 @@ static void charge_manager_fill_power_info(int port, * lose power again). */ #ifdef CONFIG_BATTERY - if (get_time().val < registration_time[port].val + - CHARGE_DETECT_DELAY) + if (get_time().val < + registration_time[port].val + CHARGE_DETECT_DELAY) r->type = USB_CHG_TYPE_UNKNOWN; #endif #if defined(HAS_TASK_CHG_RAMP) || defined(CONFIG_CHARGE_RAMP_HW) /* Read ramped current if active charging port */ - use_ramp_current = - (charge_port == port) && chg_ramp_allowed(port, sup); + use_ramp_current = (charge_port == port) && + chg_ramp_allowed(port, sup); #else use_ramp_current = 0; #endif @@ -548,17 +559,15 @@ static void charge_manager_fill_power_info(int port, * If ramp is not allowed, max current is just the * available charge current. */ - r->meas.current_max = chg_ramp_is_stable() ? - r->meas.current_lim : chg_ramp_max(port, sup, - available_charge[sup][port].current); + r->meas.current_max = + chg_ramp_is_stable() ? + r->meas.current_lim : + chg_ramp_max(port, sup, max_ma); - r->max_power = - r->meas.current_max * r->meas.voltage_max; } else { - r->meas.current_max = r->meas.current_lim = - available_charge[sup][port].current; - r->max_power = POWER(available_charge[sup][port]); + r->meas.current_max = r->meas.current_lim = max_ma; } + r->max_power = r->meas.current_max * r->meas.voltage_max; r->meas.voltage_now = get_vbus_voltage(port, r->role); } @@ -588,8 +597,8 @@ void charge_manager_save_log(int port) (pinfo.dualrole ? CHARGE_FLAGS_DUAL_ROLE : 0); pd_log_event(PD_EVENT_MCU_CHARGE, - PD_LOG_PORT_SIZE(port, sizeof(pinfo.meas)), - flags, &pinfo.meas); + PD_LOG_PORT_SIZE(port, sizeof(pinfo.meas)), flags, + &pinfo.meas); } #endif /* CONFIG_USB_PD_LOGGING */ @@ -650,7 +659,6 @@ static void charge_manager_get_best_charge_port(int *new_port, /* Skip port selection on OVERRIDE_DONT_CHARGE. */ if (override_port != OVERRIDE_DONT_CHARGE) { - /* * Charge supplier selection logic: * 1. Prefer DPS charge port. @@ -680,8 +688,7 @@ static void charge_manager_get_best_charge_port(int *new_port, * charge on another override port. */ if (override_port != OVERRIDE_OFF && - override_port == port && - override_port != j) + override_port == port && override_port != j) continue; #ifndef CONFIG_CHARGE_MANAGER_DRP_CHARGING @@ -706,31 +713,36 @@ static void charge_manager_get_best_charge_port(int *new_port, supplier = i; port = j; break; - /* Select if no supplier chosen yet. */ + /* Select if no supplier chosen yet. */ } else if (supplier == CHARGE_SUPPLIER_NONE || - /* ..or if supplier priority is higher. */ - supplier_priority[i] < - supplier_priority[supplier] || - /* ..or if this is our override port. */ - (j == override_port && - port != override_port) || - /* ..or if priority is tied and.. */ - (supplier_priority[i] == - supplier_priority[supplier] && - /* candidate port can supply more power or.. */ - (candidate_port_power > best_port_power || - /* - * candidate port is the active port and can - * supply the same amount of power. - */ - (candidate_port_power == best_port_power && - charge_port == j)))) { + /* ..or if supplier priority is + higher. */ + supplier_priority[i] < + supplier_priority[supplier] || + /* ..or if this is our override port. + */ + (j == override_port && + port != override_port) || + /* ..or if priority is tied and.. */ + (supplier_priority[i] == + supplier_priority[supplier] && + /* candidate port can supply more + power or.. */ + (candidate_port_power > + best_port_power || + /* + * candidate port is the active + * port and can supply the same + * amount of power. + */ + (candidate_port_power == + best_port_power && + charge_port == j)))) { supplier = i; port = j; best_port_power = candidate_port_power; } } - } #ifdef CONFIG_BATTERY @@ -738,8 +750,7 @@ static void charge_manager_get_best_charge_port(int *new_port, * if no battery present then retain same charge port * and charge supplier to avoid the port switching */ - if (charge_port != CHARGE_SUPPLIER_NONE && - charge_port != port && + if (charge_port != CHARGE_SUPPLIER_NONE && charge_port != port && (battery_is_present() == BP_NO || (battery_is_present() == BP_YES && battery_is_cut_off() != BATTERY_CUTOFF_STATE_NORMAL))) { @@ -782,9 +793,8 @@ static void charge_manager_refresh(void) * the port, for example, if the port has become a charge * source. */ - if (active_charge_port_initialized && - new_port == charge_port && - new_supplier == charge_supplier) + if (active_charge_port_initialized && new_port == charge_port && + new_supplier == charge_supplier) break; /* @@ -844,8 +854,8 @@ static void charge_manager_refresh(void) /* Enforce port charge ceiling. */ ceil = charge_manager_get_ceil(new_port); if (left_safe_mode && ceil != CHARGE_CEIL_NONE) - new_charge_current = MIN(ceil, - new_charge_current_uncapped); + new_charge_current = + MIN(ceil, new_charge_current_uncapped); else new_charge_current = new_charge_current_uncapped; @@ -866,19 +876,19 @@ static void charge_manager_refresh(void) if (new_port != charge_port || new_charge_current != charge_current || new_supplier != charge_supplier) { #ifdef HAS_TASK_CHG_RAMP - chg_ramp_charge_supplier_change( - new_port, new_supplier, new_charge_current, - registration_time[new_port], - new_charge_voltage); + chg_ramp_charge_supplier_change(new_port, new_supplier, + new_charge_current, + registration_time[new_port], + new_charge_voltage); #else #ifdef CONFIG_CHARGE_RAMP_HW /* Enable or disable charge ramp */ charger_set_hw_ramp(chg_ramp_allowed(new_port, new_supplier)); #endif board_set_charge_limit(new_port, new_supplier, - new_charge_current, - new_charge_current_uncapped, - new_charge_voltage); + new_charge_current, + new_charge_current_uncapped, + new_charge_voltage); #endif /* HAS_TASK_CHG_RAMP */ power_changed = 1; @@ -946,9 +956,9 @@ static void charge_manager_refresh(void) if (is_pd_port(updated_new_port)) { /* Check if we can get requested voltage/current */ if ((IS_ENABLED(CONFIG_USB_PD_TCPMV1) && - IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE)) || + IS_ENABLED(CONFIG_USB_PD_DUAL_ROLE)) || (IS_ENABLED(CONFIG_USB_PD_TCPMV2) && - IS_ENABLED(CONFIG_USB_PE_SM))) { + IS_ENABLED(CONFIG_USB_PE_SM))) { uint32_t pdo; uint32_t max_voltage; uint32_t max_current; @@ -959,9 +969,9 @@ static void charge_manager_refresh(void) * than requested. If yes, send new power request */ if (pd_get_requested_voltage(updated_new_port) != - charge_voltage || + charge_voltage || pd_get_requested_current(updated_new_port) != - charge_current_uncapped) + charge_current_uncapped) new_req = true; if (IS_ENABLED(CONFIG_USB_PD_DPS) && dps_is_enabled()) { @@ -996,9 +1006,11 @@ static void charge_manager_refresh(void) if (is_pd_port(updated_old_port)) pd_set_new_power_request(updated_old_port); - if (power_changed) + if (power_changed) { + hook_notify(HOOK_POWER_SUPPLY_CHANGE); /* notify host of power info change */ pd_send_host_event(PD_EVENT_POWER_CHANGE); + } } DECLARE_DEFERRED(charge_manager_refresh); @@ -1031,8 +1043,7 @@ DECLARE_DEFERRED(charger_detect_debounced); * @param charge Charge port current / voltage. */ static void charge_manager_make_change(enum charge_manager_change_type change, - int supplier, - int port, + int supplier, int port, const struct charge_port_info *charge) { int i; @@ -1048,9 +1059,8 @@ static void charge_manager_make_change(enum charge_manager_change_type change, case CHANGE_CHARGE: /* Ignore changes where charge is identical */ if (available_charge[supplier][port].current == - charge->current && - available_charge[supplier][port].voltage == - charge->voltage) + charge->current && + available_charge[supplier][port].voltage == charge->voltage) return; if (charge->current > 0 && available_charge[supplier][port].current == 0) @@ -1084,12 +1094,13 @@ static void charge_manager_make_change(enum charge_manager_change_type change, } /* Remove override when a charger is plugged */ - if (clear_override && override_port != port + if (clear_override && + override_port != port #ifndef CONFIG_CHARGE_MANAGER_DRP_CHARGING /* only remove override when it's a dedicated charger */ && dualrole_capability[port] == CAP_DEDICATED #endif - ) { + ) { override_port = OVERRIDE_OFF; if (delayed_override_port != OVERRIDE_OFF) { delayed_override_port = OVERRIDE_OFF; @@ -1117,7 +1128,7 @@ static void charge_manager_make_change(enum charge_manager_change_type change, /* * If we have a charge on our delayed override port within * the deadline, make it our override port. - */ + */ if (port == delayed_override_port && charge->current > 0 && is_sink(delayed_override_port) && get_time().val < delayed_override_deadline.val) { @@ -1202,11 +1213,10 @@ void typec_set_input_current_limit(int port, typec_current_t max_ma, NULL); } -void charge_manager_update_charge(int supplier, - int port, +void charge_manager_update_charge(int supplier, int port, const struct charge_port_info *charge) { - struct charge_port_info zero = {0}; + struct charge_port_info zero = { 0 }; if (!charge) charge = &zero; charge_manager_make_change(CHANGE_CHARGE, supplier, port, charge); @@ -1230,6 +1240,21 @@ void charge_manager_leave_safe_mode(void) if (left_safe_mode) return; + /* + * Sometimes the fuel gauge will report that it has + * sufficient state of charge and remaining capacity, + * but in actuality it doesn't. When the EC sees that + * information, it trusts it and leaves charge manager + * safe mode. Doing so will allow CHARGE_PORT_NONE to + * be selected, thereby cutting off the input FETs. + * When the battery cannot provide the charge it claims, + * the system loses power, shuts down, and the battery + * is not charged even though the charger is plugged in. + * By waiting 500ms, we can avoid the selection of + * CHARGE_PORT_NONE around init time and not cut off the + * input FETs. + */ + msleep(500); CPRINTS("%s()", __func__); cflush(); left_safe_mode = 1; @@ -1288,8 +1313,8 @@ int charge_manager_set_override(int port) if (override_port != port) { override_port = port; if (charge_manager_is_seeded()) - hook_call_deferred( - &charge_manager_refresh_data, 0); + hook_call_deferred(&charge_manager_refresh_data, + 0); } } /* @@ -1297,13 +1322,13 @@ int charge_manager_set_override(int port) * power swap and set the delayed override for swap completion. */ else if (!is_sink(port) && dualrole_capability[port] == CAP_DUALROLE) { - delayed_override_deadline.val = get_time().val + - POWER_SWAP_TIMEOUT; + delayed_override_deadline.val = + get_time().val + POWER_SWAP_TIMEOUT; delayed_override_port = port; hook_call_deferred(&charge_override_timeout_data, POWER_SWAP_TIMEOUT); pd_request_power_swap(port); - /* Can't charge from requested port -- return error. */ + /* Can't charge from requested port -- return error. */ } else retval = EC_ERROR_INVAL; @@ -1361,7 +1386,7 @@ int charge_manager_get_power_limit_uw(void) /* Bitmap of ports used as power source */ static volatile uint32_t source_port_bitmap; -BUILD_ASSERT(sizeof(source_port_bitmap)*8 >= CONFIG_USB_PD_PORT_MAX_COUNT); +BUILD_ASSERT(sizeof(source_port_bitmap) * 8 >= CONFIG_USB_PD_PORT_MAX_COUNT); static inline int has_other_active_source(int port) { @@ -1392,7 +1417,7 @@ static int can_supply_max_current(int port) if (p == port) continue; if (source_port_rp[p] == - CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT) + CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT) return 0; } return 1; @@ -1418,8 +1443,8 @@ void charge_manager_source_port(int port, int enable) /* Set port limit according to policy */ for (p = 0; p < board_get_usb_pd_port_count(); p++) { rp = can_supply_max_current(p) ? - CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT : - CONFIG_USB_PD_PULLUP; + CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT : + CONFIG_USB_PD_PULLUP; source_port_rp[p] = rp; #ifdef CONFIG_USB_PD_LOGGING @@ -1471,8 +1496,7 @@ static enum ec_status hc_pd_power_info(struct host_cmd_handler_args *args) args->response_size = sizeof(*r); return EC_RES_SUCCESS; } -DECLARE_HOST_COMMAND(EC_CMD_USB_PD_POWER_INFO, - hc_pd_power_info, +DECLARE_HOST_COMMAND(EC_CMD_USB_PD_POWER_INFO, hc_pd_power_info, EC_VER_MASK(0)); static enum ec_status hc_charge_port_count(struct host_cmd_handler_args *args) @@ -1484,8 +1508,7 @@ static enum ec_status hc_charge_port_count(struct host_cmd_handler_args *args) return EC_RES_SUCCESS; } -DECLARE_HOST_COMMAND(EC_CMD_CHARGE_PORT_COUNT, - hc_charge_port_count, +DECLARE_HOST_COMMAND(EC_CMD_CHARGE_PORT_COUNT, hc_charge_port_count, EC_VER_MASK(0)); static enum ec_status @@ -1499,15 +1522,15 @@ hc_charge_port_override(struct host_cmd_handler_args *args) return EC_RES_INVALID_PARAM; return charge_manager_set_override(override_port) == EC_SUCCESS ? - EC_RES_SUCCESS : EC_RES_ERROR; + EC_RES_SUCCESS : + EC_RES_ERROR; } -DECLARE_HOST_COMMAND(EC_CMD_PD_CHARGE_PORT_OVERRIDE, - hc_charge_port_override, +DECLARE_HOST_COMMAND(EC_CMD_PD_CHARGE_PORT_OVERRIDE, hc_charge_port_override, EC_VER_MASK(0)); #if CONFIG_DEDICATED_CHARGE_PORT_COUNT > 0 -static enum ec_status hc_override_dedicated_charger_limit( - struct host_cmd_handler_args *args) +static enum ec_status +hc_override_dedicated_charger_limit(struct host_cmd_handler_args *args) { const struct ec_params_dedicated_charger_limit *p = args->params; struct charge_port_info ci = { @@ -1528,11 +1551,10 @@ static enum ec_status hc_override_dedicated_charger_limit( return EC_RES_SUCCESS; } DECLARE_HOST_COMMAND(EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT, - hc_override_dedicated_charger_limit, - EC_VER_MASK(0)); + hc_override_dedicated_charger_limit, EC_VER_MASK(0)); #endif -static int command_charge_port_override(int argc, char **argv) +static int command_charge_port_override(int argc, const char **argv) { int port = OVERRIDE_OFF; int ret = EC_SUCCESS; @@ -1546,12 +1568,12 @@ static int command_charge_port_override(int argc, char **argv) ret = charge_manager_set_override(port); } - ccprintf("Override: %d\n", (argc >= 2 && ret == EC_SUCCESS) ? - port : override_port); + ccprintf("Override: %d\n", + (argc >= 2 && ret == EC_SUCCESS) ? port : override_port); return ret; } -DECLARE_CONSOLE_COMMAND(chgoverride, command_charge_port_override, - "[port | -1 | -2]", +DECLARE_CONSOLE_COMMAND( + chgoverride, command_charge_port_override, "[port | -1 | -2]", "Force charging from a given port (-1 = off, -2 = disable charging)"); #ifdef CONFIG_CHARGE_MANAGER_EXTERNAL_POWER_LIMIT @@ -1588,16 +1610,14 @@ hc_external_power_limit(struct host_cmd_handler_args *args) { const struct ec_params_external_power_limit_v1 *p = args->params; - charge_manager_set_external_power_limit(p->current_lim, - p->voltage_lim); + charge_manager_set_external_power_limit(p->current_lim, p->voltage_lim); return EC_RES_SUCCESS; } -DECLARE_HOST_COMMAND(EC_CMD_EXTERNAL_POWER_LIMIT, - hc_external_power_limit, +DECLARE_HOST_COMMAND(EC_CMD_EXTERNAL_POWER_LIMIT, hc_external_power_limit, EC_VER_MASK(1)); -static int command_external_power_limit(int argc, char **argv) +static int command_external_power_limit(int argc, const char **argv) { int max_current; int max_voltage; @@ -1623,41 +1643,63 @@ static int command_external_power_limit(int argc, char **argv) return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(chglim, command_external_power_limit, - "[max_current (mA)] [max_voltage (mV)]", - "Set max charger current / voltage"); + "[max_current (mA)] [max_voltage (mV)]", + "Set max charger current / voltage"); #endif /* CONFIG_CHARGE_MANAGER_EXTERNAL_POWER_LIMIT */ #ifdef CONFIG_CMD_CHARGE_SUPPLIER_INFO -static int charge_supplier_info(int argc, char **argv) +static int charge_supplier_info(int argc, const char **argv) { - ccprintf("port=%d, type=%d, cur=%dmA, vtg=%dmV, lsm=%d\n", - charge_manager_get_active_charge_port(), - charge_supplier, - charge_current, - charge_voltage, - left_safe_mode); - + int p, s; + int port_printed; + + ccprintf("\n"); + ccprintf("Port --Supplier-- Prio -Available Power-\n"); + for (p = 0; p < CHARGE_PORT_COUNT; p++) { + port_printed = 0; + for (s = 0; s < CHARGE_SUPPLIER_COUNT; s++) { + if (available_charge[s][p].current == 0 && + available_charge[s][p].voltage == 0) + continue; + if (charge_manager_get_active_charge_port() == p && + charge_manager_get_supplier() == s) + ccprintf("*"); + else + ccprintf(" "); + if (!port_printed) { + ccprintf("P%d ", p); + port_printed = 1; + } else { + ccprintf(" "); + } + ccprintf("%-10s %4d %5dmA %5dmV\n", + charge_supplier_name[s], supplier_priority[s], + available_charge[s][p].current, + available_charge[s][p].voltage); + } + } + ccprintf("\n"); + ccprintf(" %s safe mode\n", left_safe_mode ? "Left" : "In"); + ccprintf(" Override port = P%d\n", charge_manager_get_override()); + ccprintf("\n"); return 0; } -DECLARE_CONSOLE_COMMAND(chgsup, charge_supplier_info, - NULL, "print chg supplier info"); +DECLARE_CONSOLE_COMMAND(chgsup, charge_supplier_info, NULL, + "print chg supplier info"); #endif -__overridable -int board_charge_port_is_sink(int port) +__overridable int board_charge_port_is_sink(int port) { return 1; } -__overridable -int board_charge_port_is_connected(int port) +__overridable int board_charge_port_is_connected(int port) { return 1; } -__overridable -void board_fill_source_power_info(int port, - struct ec_response_usb_pd_power_info *r) +__overridable void +board_fill_source_power_info(int port, struct ec_response_usb_pd_power_info *r) { r->meas.voltage_now = 0; r->meas.voltage_max = 0; |