diff options
Diffstat (limited to 'common/usb_pd_protocol.c')
-rw-r--r-- | common/usb_pd_protocol.c | 55 |
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; } |