struct typec_altmode *alt;
        struct ucsi_dp *dp;
 
+       mutex_lock(&con->lock);
+
        /* We can't rely on the firmware with the capabilities. */
        desc->vdo |= DP_CAP_DP_SIGNALING | DP_CAP_RECEPTACLE;
 
        desc->vdo |= all_assignments << 16;
 
        alt = typec_port_register_altmode(con->port, desc);
-       if (IS_ERR(alt))
+       if (IS_ERR(alt)) {
+               mutex_unlock(&con->lock);
                return alt;
+       }
 
        dp = devm_kzalloc(&alt->dev, sizeof(*dp), GFP_KERNEL);
        if (!dp) {
                typec_unregister_altmode(alt);
+               mutex_unlock(&con->lock);
                return ERR_PTR(-ENOMEM);
        }
 
        alt->ops = &ucsi_displayport_ops;
        typec_altmode_set_drvdata(alt, dp);
 
+       mutex_unlock(&con->lock);
+
        return alt;
 }