diff options
author | Ting Shen <phoenixshen@google.com> | 2021-03-30 17:39:49 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-07-29 09:59:05 +0000 |
commit | 11be0bd36e7a91c0469f917f6ec767df14c2c80f (patch) | |
tree | b45d311fc73172f04f824d5b715a5617aa180a36 /baseboard/cherry/usb_pd_policy.c | |
parent | 06309cebb69bc3d1f4711249463d013a76f9d950 (diff) | |
download | chrome-ec-11be0bd36e7a91c0469f917f6ec767df14c2c80f.tar.gz |
cherry: enable usb pd
BUG=b:177391887
TEST=verify pd works
BRANCH=main
Signed-off-by: Ting Shen <phoenixshen@google.com>
Change-Id: Ied4516abef3d544b8b4bdf8355f0f9fc305629a3
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2793783
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
Tested-by: Ting Shen <phoenixshen@chromium.org>
Reviewed-by: Eric Yilun Lin <yllin@google.com>
Diffstat (limited to 'baseboard/cherry/usb_pd_policy.c')
-rw-r--r-- | baseboard/cherry/usb_pd_policy.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/baseboard/cherry/usb_pd_policy.c b/baseboard/cherry/usb_pd_policy.c index db15e93567..5ef026b95a 100644 --- a/baseboard/cherry/usb_pd_policy.c +++ b/baseboard/cherry/usb_pd_policy.c @@ -2,8 +2,12 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ +#include "adc.h" +#include "atomic.h" #include "charge_manager.h" #include "chipset.h" +#include "driver/tcpm/rt1718s.h" +#include "driver/tcpm/tcpci.h" #include "timer.h" #include "usb_dp_alt_mode.h" #include "usb_mux.h" @@ -42,7 +46,7 @@ void svdm_set_hpd_gpio(int port, int en) static void aux_switch_port(int port) { if (port != AUX_PORT_NONE) - gpio_set_level_verbose(CC_USBPD, GPIO_DP_PATH_SEL, port); + gpio_set_level_verbose(CC_USBPD, GPIO_DP_PATH_SEL, !port); aux_port = port; } @@ -166,7 +170,33 @@ __override void svdm_exit_dp_mode(int port) int pd_snk_is_vbus_provided(int port) { - return ppc_is_vbus_present(port); + static atomic_t vbus_prev[CONFIG_USB_PD_PORT_MAX_COUNT]; + int vbus; + + /* + * Use ppc_is_vbus_present for all ports on Cherry, and + * port 1 on other devices. + */ + if (IS_ENABLED(BOARD_CHERRY) || port == 1) + return ppc_is_vbus_present(port); + + /* b/181203590: use ADC for port 0 (syv682x) */ + vbus = (adc_read_channel(ADC_VBUS) >= PD_V_SINK_DISCONNECT_MAX); + +#ifdef CONFIG_USB_CHARGER + /* + * There's no PPC to inform VBUS change for usb_charger, so inform + * the usb_charger now. + */ + if (!!(vbus_prev[port] != vbus)) + usb_charger_vbus_change(port, vbus); + + if (vbus) + atomic_or(&vbus_prev[port], 1); + else + atomic_clear(&vbus_prev[port]); +#endif + return vbus; } void pd_power_supply_reset(int port) @@ -182,6 +212,9 @@ void pd_power_supply_reset(int port) if (prev_en) pd_set_vbus_discharge(port, 1); + if (port == 1) + rt1718s_gpio_ctrl(RT1718S_GPIO_DISABLED); + /* Notify host of power info change. */ pd_send_host_event(PD_EVENT_POWER_CHANGE); } @@ -208,6 +241,12 @@ int pd_set_power_supply_ready(int port) if (rv) return rv; + if (port == 1) { + rv = rt1718s_gpio_ctrl(RT1718S_GPIO_ENABLE_SOURCE); + if (rv) + return rv; + } + /* Notify host of power info change. */ pd_send_host_event(PD_EVENT_POWER_CHANGE); @@ -218,4 +257,3 @@ int board_vbus_source_enabled(int port) { return ppc_is_sourcing_vbus(port); } - |