summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2017-11-14 09:47:27 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-11-28 10:22:27 -0800
commit26b4617c4311860b15b6761734673c527cbc74ad (patch)
tree253fa8da12eb1cdab65e53f3d9f78142ba45bef2
parent675bdc2e2c58cd36161dcec98a5240eb22b43fda (diff)
downloadchrome-ec-26b4617c4311860b15b6761734673c527cbc74ad.tar.gz
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 <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/769152
-rw-r--r--board/fizz/board.c3
-rw-r--r--board/fizz/board.h1
-rw-r--r--board/fizz/usb_pd_policy.c4
-rw-r--r--board/glkrvp/board.h1
-rw-r--r--board/glkrvp/chg_usb_pd.c2
-rw-r--r--common/charge_manager.c27
-rw-r--r--include/charge_manager.h4
-rw-r--r--include/ec_commands.h10
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 */