diff --git a/drivers/usb/typec/mmi_tcpc/inc/pd_core.h b/drivers/usb/typec/mmi_tcpc/inc/pd_core.h index 996c09f2c589..a593e39b5119 100644 --- a/drivers/usb/typec/mmi_tcpc/inc/pd_core.h +++ b/drivers/usb/typec/mmi_tcpc/inc/pd_core.h @@ -868,6 +868,7 @@ struct pd_port { uint8_t state_machine; uint8_t pd_connect_state; + uint8_t pd_vdm_verify_state; uint8_t pe_pd_state; uint8_t pe_vdm_state; @@ -1233,6 +1234,7 @@ void pd_lock_msg_output(struct pd_port *pd_port); void pd_unlock_msg_output(struct pd_port *pd_port); int pd_update_connect_state(struct pd_port *pd_port, uint8_t state); +int pd_update_vdm_verify_state(struct pd_port *pd_port, uint8_t state); /* ---- PD notify TCPC Policy Engine State Changed ---- */ diff --git a/drivers/usb/typec/mmi_tcpc/inc/tcpci.h b/drivers/usb/typec/mmi_tcpc/inc/tcpci.h index c2cf3c03238f..e9088ab1d0b8 100644 --- a/drivers/usb/typec/mmi_tcpc/inc/tcpci.h +++ b/drivers/usb/typec/mmi_tcpc/inc/tcpci.h @@ -154,6 +154,7 @@ int tcpci_notify_typec_state(struct tcpc_device *tcpc); int tcpci_notify_role_swap( struct tcpc_device *tcpc, uint8_t event, uint8_t role); int tcpci_notify_pd_state(struct tcpc_device *tcpc, uint8_t connect); +int tcpci_notify_pd_vdm_verify(struct tcpc_device *tcpc, uint8_t vdm_verify); int tcpci_set_intrst(struct tcpc_device *tcpc, bool en); int tcpci_enable_watchdog(struct tcpc_device *tcpc, bool en); diff --git a/drivers/usb/typec/mmi_tcpc/inc/tcpm.h b/drivers/usb/typec/mmi_tcpc/inc/tcpm.h index d72ea2c4d17c..b8e42300fe04 100644 --- a/drivers/usb/typec/mmi_tcpc/inc/tcpm.h +++ b/drivers/usb/typec/mmi_tcpc/inc/tcpm.h @@ -146,10 +146,14 @@ enum { TCP_NOTIFY_WD_STATUS, TCP_NOTIFY_CABLE_TYPE, TCP_NOTIFY_MISC_END = TCP_NOTIFY_CABLE_TYPE, + + /*mmi pd vdm verify*/ + TCP_NOTIFY_PD_VDM_VERIFY, }; struct tcp_ny_pd_state { uint8_t connected; + uint8_t vdm_verify; }; struct tcp_ny_swap_state { diff --git a/drivers/usb/typec/mmi_tcpc/pd_core.c b/drivers/usb/typec/mmi_tcpc/pd_core.c index 81f6ccd8d5bd..ba6790f7a47e 100644 --- a/drivers/usb/typec/mmi_tcpc/pd_core.c +++ b/drivers/usb/typec/mmi_tcpc/pd_core.c @@ -1410,6 +1410,18 @@ int pd_update_connect_state(struct pd_port *pd_port, uint8_t state) return tcpci_notify_pd_state(tcpc, state); } +int pd_update_vdm_verify_state(struct pd_port *pd_port, uint8_t state) +{ + struct tcpc_device __maybe_unused *tcpc = pd_port->tcpc; + + if (pd_port->pd_vdm_verify_state == state) + return 0; + + pd_port->pd_vdm_verify_state = state; + PE_INFO("pd_vdm_verify_state=%d\n", state); + return tcpci_notify_pd_vdm_verify(tcpc, state); +} + #ifdef CONFIG_USB_PD_REV30 /* diff --git a/drivers/usb/typec/mmi_tcpc/pd_dpm_mmi_adapter.c b/drivers/usb/typec/mmi_tcpc/pd_dpm_mmi_adapter.c index f518fd07acf9..9887bed65749 100644 --- a/drivers/usb/typec/mmi_tcpc/pd_dpm_mmi_adapter.c +++ b/drivers/usb/typec/mmi_tcpc/pd_dpm_mmi_adapter.c @@ -280,6 +280,9 @@ int mmi_notify_pe_ready(struct pd_port *pd_port, case MMI_VERIFY: mmi_adapter_verify(pd_port,svid_data); break; + case MMI_READY: + pd_update_vdm_verify_state(pd_port, true); + break; default: break; } diff --git a/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c b/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c index 78d4b7a4cc04..968941d279d0 100644 --- a/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c +++ b/drivers/usb/typec/mmi_tcpc/rt_pd_manager.c @@ -81,11 +81,13 @@ enum iio_psy_property { POWER_SUPPLY_IIO_OTG_ENABLE, POWER_SUPPLY_IIO_TYPEC_MODE, POWER_SUPPLY_IIO_PD_ACTIVE, + POWER_SUPPLY_IIO_MMI_PD_VDM_VERIFY, POWER_SUPPLY_IIO_PROP_MAX, }; static const char * const iio_channel_map[] = { "usb_real_type", "otg_enable", "typec_mode", "pd_active", + "mmi_pd_vdm_verify", }; static int mmi_get_psy_iio_property(struct rt_pd_manager_data *rpmd, @@ -635,6 +637,13 @@ static int pd_tcp_notifier_call(struct notifier_block *nb, break; } break; + case TCP_NOTIFY_PD_VDM_VERIFY: + dev_info(rpmd->dev, "%s mmi pd vdm verify state = %d\n", + __func__, noti->pd_state.vdm_verify); + val.intval = noti->pd_state.vdm_verify; + mmi_set_psy_iio_property(rpmd, + POWER_SUPPLY_IIO_MMI_PD_VDM_VERIFY, &val); + break; default: break; }; diff --git a/drivers/usb/typec/mmi_tcpc/tcpci.c b/drivers/usb/typec/mmi_tcpc/tcpci.c index 6adbefc7d229..8e5995c443c1 100644 --- a/drivers/usb/typec/mmi_tcpc/tcpci.c +++ b/drivers/usb/typec/mmi_tcpc/tcpci.c @@ -531,6 +531,17 @@ int tcpci_notify_pd_state(struct tcpc_device *tcpc, uint8_t connect) return ret; } +int tcpci_notify_pd_vdm_verify(struct tcpc_device *tcpc, uint8_t vdm_verify) +{ + struct tcp_notify tcp_noti; + int ret; + + tcp_noti.pd_state.vdm_verify = vdm_verify; + ret = tcpc_check_notify_time(tcpc, &tcp_noti, + TCP_NOTIFY_IDX_USB, TCP_NOTIFY_PD_VDM_VERIFY); + return ret; +} + int tcpci_set_intrst(struct tcpc_device *tcpc, bool en) { #ifdef CONFIG_TCPC_INTRST_EN diff --git a/drivers/usb/typec/mmi_tcpc/tcpci_event.c b/drivers/usb/typec/mmi_tcpc/tcpci_event.c index da1b09fc113e..4cd346b9b684 100644 --- a/drivers/usb/typec/mmi_tcpc/tcpci_event.c +++ b/drivers/usb/typec/mmi_tcpc/tcpci_event.c @@ -1029,6 +1029,7 @@ void pd_notify_pe_idle(struct pd_port *pd_port) mutex_unlock(&tcpc->access_lock); pd_update_connect_state(pd_port, PD_CONNECT_NONE); + pd_update_vdm_verify_state(pd_port, false); if (notify_pe_idle) tcpc_enable_timer(tcpc, TYPEC_RT_TIMER_PE_IDLE);