diff options
Diffstat (limited to 'board/servo_v4/usb_pd_policy.c')
-rw-r--r-- | board/servo_v4/usb_pd_policy.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/board/servo_v4/usb_pd_policy.c b/board/servo_v4/usb_pd_policy.c index 9ba5356791..b6c395a860 100644 --- a/board/servo_v4/usb_pd_policy.c +++ b/board/servo_v4/usb_pd_policy.c @@ -58,6 +58,19 @@ static struct vbus_prop vbus[CONFIG_USB_PD_PORT_COUNT]; static struct vbus_prop vbus_pend; static uint8_t vbus_rp = TYPEC_RP_RESERVED; +/* Voltage thresholds for no connect */ +static int pd_src_vnc[TYPEC_RP_RESERVED][2] = { + {PD_SRC_3_0_VNC_MV, PD_SRC_1_5_VNC_MV}, + {PD_SRC_1_5_VNC_MV, PD_SRC_DEF_VNC_MV}, + {PD_SRC_3_0_VNC_MV, PD_SRC_DEF_VNC_MV}, +}; +/* Voltage thresholds for Ra attach */ +static int pd_src_rd_threshold[TYPEC_RP_RESERVED][2] = { + {PD_SRC_3_0_RD_THRESH_MV, PD_SRC_1_5_RD_THRESH_MV}, + {PD_SRC_1_5_RD_THRESH_MV, PD_SRC_DEF_RD_THRESH_MV}, + {PD_SRC_3_0_RD_THRESH_MV, PD_SRC_DEF_RD_THRESH_MV}, +}; + static void board_manage_dut_port(void) { int rp; @@ -165,6 +178,38 @@ static void board_update_chg_vbus(int max_ma, int vbus_mv) hook_call_deferred(&board_manage_chg_port_data, 0); } +int pd_tcpc_cc_nc(int port, int cc_volt, int cc_sel) +{ + int rp_index; + + /* Can never be called from CHG port as it's sink only */ + if (port == CHG) + return 0; + + rp_index = vbus_rp; + /* Ensure that rp_index doens't exceed the array size */ + if (rp_index >= TYPEC_RP_RESERVED) + rp_index = 0; + + return cc_volt >= pd_src_vnc[rp_index][cc_sel]; +} + +int pd_tcpc_cc_ra(int port, int cc_volt, int cc_sel) +{ + int rp_index; + + /* Can never be called from CHG port as it's sink only */ + if (port == CHG) + return 0; + + rp_index = vbus_rp; + /* Ensure that rp_index doens't exceed the array size */ + if (rp_index >= TYPEC_RP_RESERVED) + rp_index = 0; + + return cc_volt < pd_src_rd_threshold[rp_index][cc_sel]; +} + int board_select_rp_value(int port, int rp) { return pd_set_rp_rd(port, TYPEC_CC_RP, rp); |