summaryrefslogtreecommitdiff
path: root/board/servo_v4
diff options
context:
space:
mode:
Diffstat (limited to 'board/servo_v4')
-rw-r--r--board/servo_v4/usb_pd_policy.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c
index 06462405f8..f874e4dbe9 100644
--- a/board/servo_v4/usb_pd_policy.c
+++ b/board/servo_v4/usb_pd_policy.c
@@ -378,10 +378,17 @@ static int board_set_rp(int rp)
return EC_SUCCESS;
}
+/* Shadow what would be in TCPC register state. */
+static int rp_value_stored = TYPEC_RP_USB;
+static int cc_pull_stored = TYPEC_CC_RD;
+
int pd_set_rp_rd(int port, int cc_pull, int rp_value)
{
int rv = EC_SUCCESS;
+ if (port != 1)
+ return EC_ERROR_UNIMPLEMENTED;
+
/* By default disconnect all Rp/Rd resistors from both CC lines */
/* Set Rd for CC1/CC2 to High-Z. */
gpio_set_flags(GPIO_USB_DUT_CC1_RD, GPIO_INPUT);
@@ -412,12 +419,27 @@ int pd_set_rp_rd(int port, int cc_pull, int rp_value)
gpio_set_flags(GPIO_USB_DUT_CC2_RD, GPIO_OUT_LOW);
}
+ rp_value_stored = rp_value;
+ cc_pull_stored = cc_pull;
+
return rv;
}
int board_select_rp_value(int port, int rp)
{
- return pd_set_rp_rd(port, TYPEC_CC_RP, rp);
+ if (port != 1)
+ return EC_ERROR_UNIMPLEMENTED;
+
+ /*
+ * Update Rp value to indicate non-pd power available.
+ * Do not change pull direction though.
+ */
+ if ((rp != rp_value_stored) && (cc_pull_stored == TYPEC_CC_RP)) {
+ rp_value_stored = rp;
+ return pd_set_rp_rd(port, TYPEC_CC_RP, rp);
+ }
+
+ return EC_SUCCESS;
}
int charge_manager_get_source_pdo(const uint32_t **src_pdo, const int port)
@@ -646,7 +668,7 @@ static void do_cc(int disable_dts_new, int allow_src_new)
disable_dts_mode = 0;
allow_src_mode = 0;
/* Remove Rp/Rd on both CC lines */
- board_select_rp_value(DUT, TYPEC_RP_RESERVED);
+ pd_set_rp_rd(DUT, TYPEC_CC_RP, TYPEC_RP_RESERVED);
/* Some time for DUT to detach, use tErrorRecovery */
msleep(25);