Merge tag 'driver-core-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / drivers / usb / typec / class.c
index a89d8fd3f46ca4ccd56263527c8cea5293effdfb..cc3182f706730430c4aebf3601043692d18e3b0b 100644 (file)
@@ -583,6 +583,7 @@ void typec_unregister_altmode(struct typec_altmode *adev)
 {
        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);
 }
@@ -2108,16 +2109,26 @@ typec_port_register_altmode(struct typec_port *port,
 {
        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;
 }