diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 8cca3108ff0a..d721b7daa21f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -174,3 +174,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpci_override_toggling); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_typec_tcpci_get_vbus); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_store_partner_src_caps); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_get_timer); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_typec_tcpm_modify_src_caps); diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 847fdc3a033c..eba5bc0c9731 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -5487,9 +5487,38 @@ static void tcpm_pd_event_handler(struct kthread_work *work) } if (events & TCPM_CC_EVENT) { enum typec_cc_status cc1, cc2; + bool modified = false; if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0) _tcpm_cc_change(port, cc1, cc2); + + trace_android_vh_typec_tcpm_modify_src_caps(&port->nr_src_pdo, + &port->src_pdo, &modified); + if (modified) { + int ret; + + switch (port->state) { + case SRC_UNATTACHED: + case SRC_ATTACH_WAIT: + case SRC_TRYWAIT: + tcpm_set_cc(port, tcpm_rp_cc(port)); + break; + case SRC_SEND_CAPABILITIES: + case SRC_SEND_CAPABILITIES_TIMEOUT: + case SRC_NEGOTIATE_CAPABILITIES: + case SRC_READY: + case SRC_WAIT_NEW_CAPABILITIES: + port->caps_count = 0; + port->upcoming_state = SRC_SEND_CAPABILITIES; + ret = tcpm_ams_start(port, POWER_NEGOTIATION); + if (ret == -EAGAIN) + port->upcoming_state = INVALID_STATE; + break; + default: + break; + } + } + } if (events & TCPM_FRS_EVENT) { if (port->state == SNK_READY) { diff --git a/include/trace/hooks/typec.h b/include/trace/hooks/typec.h index 365d9b681a04..afad3c1dc53f 100644 --- a/include/trace/hooks/typec.h +++ b/include/trace/hooks/typec.h @@ -46,6 +46,10 @@ DECLARE_HOOK(android_vh_typec_store_partner_src_caps, TP_PROTO(unsigned int *nr_source_caps, u32 (*source_caps)[]), TP_ARGS(nr_source_caps, source_caps)); -#endif /* _TRACE_HOOK_UFSHCD_H */ +DECLARE_HOOK(android_vh_typec_tcpm_modify_src_caps, + TP_PROTO(unsigned int *nr_src_pdo, u32 (*src_pdo)[], bool *modified), + TP_ARGS(nr_src_pdo, src_pdo, modified)); + +#endif /* _TRACE_HOOK_TYPEC_H */ /* This part must be outside protection */ #include