summaryrefslogtreecommitdiff
path: root/common/usb_pd_protocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/usb_pd_protocol.c')
-rw-r--r--common/usb_pd_protocol.c55
1 files changed, 20 insertions, 35 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index 82a3e5a91c..e522d4bac4 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -195,11 +195,6 @@ enum vdm_states {
VDM_STATE_BUSY = 2,
};
-enum pd_request_types {
- PD_REQUEST_MIN,
- PD_REQUEST_MAX,
-};
-
#ifdef CONFIG_USB_PD_DUAL_ROLE
/* Port dual-role state */
enum pd_dual_role_states drp_state = PD_DRP_TOGGLE_OFF;
@@ -776,14 +771,25 @@ static void pd_store_src_cap(int port, int cnt, uint32_t *src_caps)
pd_src_caps[port][i] = *src_caps++;
}
-static void pd_send_request_msg(int port, enum pd_request_types request)
+static void pd_send_request_msg(int port)
{
uint32_t rdo, curr_limit, supply_voltage;
int res;
- /* we were waiting for them, let's process them */
- res = pd_choose_voltage(pd_src_cap_cnt[port], pd_src_caps[port], &rdo,
- &curr_limit, &supply_voltage);
+#ifdef CONFIG_CHARGE_MANAGER
+ int charging = (charge_manager_get_active_charge_port() == port);
+#else
+ const int charging = 1;
+#endif
+ /* Clear new power request */
+ pd[port].new_power_request = 0;
+
+ /* Build and send request RDO */
+ /* If this port is not actively charging, select vSafe5V */
+ res = pd_build_request(pd_src_cap_cnt[port], pd_src_caps[port],
+ &rdo, &curr_limit, &supply_voltage,
+ charging ? PD_REQUEST_MAX : PD_REQUEST_VSAFE5V);
+
if (res != EC_SUCCESS)
/*
* If fail to choose voltage, do nothing, let source re-send
@@ -791,15 +797,6 @@ static void pd_send_request_msg(int port, enum pd_request_types request)
*/
return;
-#ifdef CONFIG_CHARGE_MANAGER
- /* Set max. limit, but apply 500mA ceiling */
- charge_manager_set_ceil(port, PD_MIN_MA);
- pd_set_input_current_limit(port, curr_limit, supply_voltage);
- /* Negotiate for Vsafe5V, if requested */
- if (request == PD_REQUEST_MIN)
- pd_choose_voltage_min(pd_src_cap_cnt[port], pd_src_caps[port],
- &rdo, &curr_limit, &supply_voltage);
-#endif
pd[port].curr_limit = curr_limit;
pd[port].supply_voltage = supply_voltage;
res = send_request(port, rdo);
@@ -844,12 +841,10 @@ static void handle_data_request(int port, uint16_t head,
pd_store_src_cap(port, cnt, payload);
/* src cap 0 should be fixed PDO */
pd_update_pdo_flags(port, payload[0]);
-#ifdef CONFIG_CHARGE_MANAGER
- if (charge_manager_get_active_charge_port() == port)
- pd_send_request_msg(port, PD_REQUEST_MAX);
- else
-#endif
- pd_send_request_msg(port, PD_REQUEST_MIN);
+
+ pd_process_source_cap(port, pd_src_cap_cnt[port],
+ pd_src_caps[port]);
+ pd_send_request_msg(port);
}
break;
#endif /* CONFIG_USB_PD_DUAL_ROLE */
@@ -2031,17 +2026,7 @@ void pd_task(void)
/* Check for new power to request */
if (pd[port].new_power_request) {
- pd[port].new_power_request = 0;
-#ifdef CONFIG_CHARGE_MANAGER
- if (charge_manager_get_active_charge_port()
- != port)
- pd_send_request_msg(port,
- PD_REQUEST_MIN);
- else if (charge_manager_get_active_charge_port()
- == port)
-#endif
- pd_send_request_msg(port,
- PD_REQUEST_MAX);
+ pd_send_request_msg(port);
break;
}