summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Marheine <pmarheine@chromium.org>2022-02-09 14:22:23 +1100
committerCommit Bot <commit-bot@chromium.org>2022-02-14 01:06:18 +0000
commit8cd46139b04cd7f57451e98a2cd40fe801388671 (patch)
treeca63f927294dea5fe6f1e92c4eff3e0e0cd53d17
parent56209bc92f7ff0290d3fe2f22804b31bda23f001 (diff)
downloadchrome-ec-8cd46139b04cd7f57451e98a2cd40fe801388671.tar.gz
nissa/nereid: implement pd_power_supply_reset
This safely resets the charger for a port when requested by the policy engine, including discharging VBUS. The implementation is borrowed from dedede. BUG=b:201000844 TEST=build and flash nereid BRANCH=none Change-Id: I6bae0828ab4e24aaeadf5ff84c888c6c52148f08 Signed-off-by: Peter Marheine <pmarheine@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3449991 Reviewed-by: Andrew McRae <amcrae@google.com>
-rw-r--r--zephyr/projects/nissa/prj_nereid.conf3
-rw-r--r--zephyr/projects/nissa/src/nereid/usbc.c16
2 files changed, 19 insertions, 0 deletions
diff --git a/zephyr/projects/nissa/prj_nereid.conf b/zephyr/projects/nissa/prj_nereid.conf
index 9396e85655..4b02818032 100644
--- a/zephyr/projects/nissa/prj_nereid.conf
+++ b/zephyr/projects/nissa/prj_nereid.conf
@@ -33,6 +33,9 @@ CONFIG_PLATFORM_EC_USB_PD_TCPM_DRIVER_IT8XXX2=y
CONFIG_PLATFORM_EC_USB_PD_VBUS_DETECT_CHARGER=y
# SM5803 controls power path on both ports
CONFIG_PLATFORM_EC_USB_PD_5V_CHARGER_CTRL=y
+# SM5803 can discharge VBUS, but not via one of the available options;
+# pd_power_supply_reset() does discharge.
+CONFIG_PLATFORM_EC_USB_PD_DISCHARGE=n
# The EC is put into programming mode while firmware is running
# (after releasing reset) and PD after being reset will hard-reset
# the port if a contract was already set up. If the system has no
diff --git a/zephyr/projects/nissa/src/nereid/usbc.c b/zephyr/projects/nissa/src/nereid/usbc.c
index ed582e4dd7..920299e55b 100644
--- a/zephyr/projects/nissa/src/nereid/usbc.c
+++ b/zephyr/projects/nissa/src/nereid/usbc.c
@@ -95,6 +95,22 @@ uint16_t tcpc_get_alert_status(void)
void pd_power_supply_reset(int port)
{
+ int prev_en;
+
+ if (port < 0 || port >= board_get_usb_pd_port_count())
+ return;
+
+ prev_en = charger_is_sourcing_otg_power(port);
+
+ /* Disable Vbus */
+ charger_enable_otg_power(port, 0);
+
+ /* Discharge Vbus if previously enabled */
+ if (prev_en)
+ sm5803_set_vbus_disch(port, 1);
+
+ /* Notify host of power info change. */
+ pd_send_host_event(PD_EVENT_POWER_CHANGE);
}
int pd_set_power_supply_ready(int port)