summaryrefslogtreecommitdiff
path: root/baseboard/cherry/usb_pd_policy.c
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2021-03-30 17:39:49 +0800
committerCommit Bot <commit-bot@chromium.org>2021-07-29 09:59:05 +0000
commit11be0bd36e7a91c0469f917f6ec767df14c2c80f (patch)
treeb45d311fc73172f04f824d5b715a5617aa180a36 /baseboard/cherry/usb_pd_policy.c
parent06309cebb69bc3d1f4711249463d013a76f9d950 (diff)
downloadchrome-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.c44
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);
}
-