return;
 
        power_supply_unregister(con->psy);
+       con->psy = NULL;
+}
+
+void ucsi_port_psy_changed(struct ucsi_connector *con)
+{
+       if (IS_ERR_OR_NULL(con->psy))
+               return;
+
+       power_supply_changed(con->psy);
 }
 
        role = !!(con->status.flags & UCSI_CONSTAT_PWR_DIR);
 
        if (con->status.change & UCSI_CONSTAT_POWER_OPMODE_CHANGE ||
-           con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE)
+           con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE) {
                ucsi_pwr_opmode_change(con);
+               ucsi_port_psy_changed(con);
+       }
 
        if (con->status.change & UCSI_CONSTAT_POWER_DIR_CHANGE) {
                typec_set_pwr_role(con->port, role);
                        ucsi_register_partner(con);
                else
                        ucsi_unregister_partner(con);
+
+               ucsi_port_psy_changed(con);
        }
 
        if (con->status.change & UCSI_CONSTAT_CAM_CHANGE) {
                                  !!(con->status.flags & UCSI_CONSTAT_PWR_DIR));
                ucsi_pwr_opmode_change(con);
                ucsi_register_partner(con);
+               ucsi_port_psy_changed(con);
        }
 
        if (con->partner) {
 
 #if IS_ENABLED(CONFIG_POWER_SUPPLY)
 int ucsi_register_port_psy(struct ucsi_connector *con);
 void ucsi_unregister_port_psy(struct ucsi_connector *con);
+void ucsi_port_psy_changed(struct ucsi_connector *con);
 #else
 static inline int ucsi_register_port_psy(struct ucsi_connector *con) { return 0; }
 static inline void ucsi_unregister_port_psy(struct ucsi_connector *con) { }
+static inline void ucsi_port_psy_changed(struct ucsi_connector *con) { }
 #endif /* CONFIG_POWER_SUPPLY */
 
 #if IS_ENABLED(CONFIG_TYPEC_DP_ALTMODE)