{
        if (IS_ERR_OR_NULL(adev))
                return;
+       typec_retimer_put(to_altmode(adev)->retimer);
        typec_mux_put(to_altmode(adev)->mux);
        device_unregister(&adev->dev);
 }
 {
        struct typec_altmode *adev;
        struct typec_mux *mux;
+       struct typec_retimer *retimer;
 
        mux = typec_mux_get(&port->dev, desc);
        if (IS_ERR(mux))
                return ERR_CAST(mux);
 
+       retimer = typec_retimer_get(&port->dev);
+       if (IS_ERR(retimer)) {
+               typec_mux_put(mux);
+               return ERR_CAST(retimer);
+       }
+
        adev = typec_register_altmode(&port->dev, desc);
-       if (IS_ERR(adev))
+       if (IS_ERR(adev)) {
+               typec_retimer_put(retimer);
                typec_mux_put(mux);
-       else
+       } else {
                to_altmode(adev)->mux = mux;
+               to_altmode(adev)->retimer = retimer;
+       }
 
        return adev;
 }