usb: typec: Add retimer handle to port altmode
authorPrashant Malani <pmalani@chromium.org>
Thu, 12 Jan 2023 22:16:06 +0000 (22:16 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Jan 2023 16:29:00 +0000 (17:29 +0100)
Just like it does with muxes, the Type-C bus code can update the state
of connected retimers (especially when altmode-related transitions
occur). Add a retimer handle to the port altmode struct to enable this.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20230112221609.540754-2-pmalani@chromium.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/bus.h
drivers/usb/typec/class.c

index 56dec26..c891688 100644 (file)
@@ -7,11 +7,13 @@
 
 struct bus_type;
 struct typec_mux;
+struct typec_retimer;
 
 struct altmode {
        unsigned int                    id;
        struct typec_altmode            adev;
        struct typec_mux                *mux;
+       struct typec_retimer            *retimer;
 
        enum typec_port_data            roles;
 
index 5897905..ed3d070 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;
 }