From 26b4617c4311860b15b6761734673c527cbc74ad Mon Sep 17 00:00:00 2001 From: Daisuke Nojiri Date: Tue, 14 Nov 2017 09:47:27 -0800 Subject: charge_manager: Add EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT Usually, the max current and supply voltage of dedicated chargers are not known to the EC. This patch adds EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT, which allows the host to change the max current and supply voltage of the dedicated charge port. BUG=b:64442692 BRANCH=none TEST=make runtests && buildall. Boot Fizz and let coreboot set the adapter current and voltage. Change-Id: I29b3f5762f8b316ca363c23e230530cdf4ca207a Signed-off-by: Daisuke Nojiri Reviewed-on: https://chromium-review.googlesource.com/769152 --- board/fizz/board.c | 3 ++- board/fizz/board.h | 1 + board/fizz/usb_pd_policy.c | 4 ++-- board/glkrvp/board.h | 1 + board/glkrvp/chg_usb_pd.c | 2 +- common/charge_manager.c | 27 +++++++++++++++++++++++++++ include/charge_manager.h | 4 ++++ include/ec_commands.h | 10 ++++++++++ 8 files changed, 48 insertions(+), 4 deletions(-) diff --git a/board/fizz/board.c b/board/fizz/board.c index 8e345c1ad4..7c0e79854b 100644 --- a/board/fizz/board.c +++ b/board/fizz/board.c @@ -102,7 +102,8 @@ static void adp_in_deferred(void) pi.current = 3330; } } - charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, 1, &pi); + charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, + DEDICATED_CHARGE_PORT, &pi); /* * Explicitly notifies the host that BJ is plugged or unplugged * (when running on a type-c adapter). diff --git a/board/fizz/board.h b/board/fizz/board.h index 33b4ee1741..69326bd1b9 100644 --- a/board/fizz/board.h +++ b/board/fizz/board.h @@ -112,6 +112,7 @@ /* Charge ports */ #undef CONFIG_DEDICATED_CHARGE_PORT_COUNT #define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1 +#define DEDICATED_CHARGE_PORT 1 /* USB-A config */ #define CONFIG_USB_PORT_POWER_DUMB diff --git a/board/fizz/usb_pd_policy.c b/board/fizz/usb_pd_policy.c index 5dc807cc82..717a30fb22 100644 --- a/board/fizz/usb_pd_policy.c +++ b/board/fizz/usb_pd_policy.c @@ -258,8 +258,8 @@ static void board_charge_manager_init(void) cpi.current = 4620; else cpi.current = 3330; - charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, 1, - &cpi); + charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, + DEDICATED_CHARGE_PORT, &cpi); break; } } diff --git a/board/glkrvp/board.h b/board/glkrvp/board.h index 2115be6d3b..541f7f675b 100644 --- a/board/glkrvp/board.h +++ b/board/glkrvp/board.h @@ -49,6 +49,7 @@ /* DC Jack charge ports */ #undef CONFIG_DEDICATED_CHARGE_PORT_COUNT #define CONFIG_DEDICATED_CHARGE_PORT_COUNT 1 +#define DEDICATED_CHARGE_PORT 2 /* Keyboard */ #define CONFIG_KEYBOARD_PROTOCOL_8042 diff --git a/board/glkrvp/chg_usb_pd.c b/board/glkrvp/chg_usb_pd.c index da37894a1a..730c1f671b 100644 --- a/board/glkrvp/chg_usb_pd.c +++ b/board/glkrvp/chg_usb_pd.c @@ -27,7 +27,7 @@ enum glkrvp_charge_ports { TYPE_C_PORT_0, TYPE_C_PORT_1, - DC_JACK_PORT_0, + DC_JACK_PORT_0 = DEDICATED_CHARGE_PORT, }; const struct tcpc_config_t tcpc_config[CONFIG_USB_PD_PORT_COUNT] = { diff --git a/common/charge_manager.c b/common/charge_manager.c index dbf97f000b..e2256fdcfc 100644 --- a/common/charge_manager.c +++ b/common/charge_manager.c @@ -1103,6 +1103,33 @@ 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 int 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 = { + .current = p->current_lim, + .voltage = p->voltage_lim, + }; + + /* + * Allow a change only if the dedicated charge port is used. Host needs + * to apply a change every time a dedicated charger is plugged. + */ + if (charge_port != DEDICATED_CHARGE_PORT) + return EC_RES_UNAVAILABLE; + + charge_manager_update_charge(CHARGE_SUPPLIER_DEDICATED, + DEDICATED_CHARGE_PORT, &ci); + + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT, + hc_override_dedicated_charger_limit, + EC_VER_MASK(0)); +#endif + static int command_charge_port_override(int argc, char **argv) { int port = OVERRIDE_OFF; diff --git a/include/charge_manager.h b/include/charge_manager.h index 0f2624129e..1e988203e8 100644 --- a/include/charge_manager.h +++ b/include/charge_manager.h @@ -101,6 +101,10 @@ enum ceil_requestor { #define CHARGE_PORT_COUNT \ (CONFIG_USB_PD_PORT_COUNT + CONFIG_DEDICATED_CHARGE_PORT_COUNT) +#if (CONFIG_DEDICATED_CHARGE_PORT_COUNT > 0) && !defined(DEDICATED_CHARGE_PORT) +#error "DEDICATED_CHARGE_PORT must be defined" +#endif + /** * Update charge ceiling for a given port. The ceiling can be set independently diff --git a/include/ec_commands.h b/include/ec_commands.h index b2abacb83a..3a0d960ef1 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -3726,6 +3726,16 @@ struct __ec_align2 ec_params_external_power_limit_v1 { #define EC_POWER_LIMIT_NONE 0xffff +/* + * Set maximum voltage & current of a dedicated charge port + */ +#define EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT 0x00A3 + +struct __ec_align2 ec_params_dedicated_charger_limit { + uint16_t current_lim; /* in mA */ + uint16_t voltage_lim; /* in mV */ +}; + /*****************************************************************************/ /* Hibernate/Deep Sleep Commands */ -- cgit v1.2.1