Merge tag 'driver-core-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / drivers / usb / typec / bus.c
index dbcb96151558ccc662c9ae5ccad199393c3353a8..098f0efaa58d18a764cdbd35f75cf3da83b2b258 100644 (file)
 #include "bus.h"
 #include "class.h"
 #include "mux.h"
+#include "retimer.h"
+
+static inline int
+typec_altmode_set_retimer(struct altmode *alt, unsigned long conf, void *data)
+{
+       struct typec_retimer_state state;
+
+       if (!alt->retimer)
+               return 0;
+
+       state.alt = &alt->adev;
+       state.mode = conf;
+       state.data = data;
+
+       return typec_retimer_set(alt->retimer, &state);
+}
 
 static inline int
 typec_altmode_set_mux(struct altmode *alt, unsigned long conf, void *data)
@@ -27,6 +43,19 @@ typec_altmode_set_mux(struct altmode *alt, unsigned long conf, void *data)
        return typec_mux_set(alt->mux, &state);
 }
 
+/* Wrapper to set various Type-C port switches together. */
+static inline int
+typec_altmode_set_switches(struct altmode *alt, unsigned long conf, void *data)
+{
+       int ret;
+
+       ret = typec_altmode_set_retimer(alt, conf, data);
+       if (ret)
+               return ret;
+
+       return typec_altmode_set_mux(alt, conf, data);
+}
+
 static int typec_altmode_set_state(struct typec_altmode *adev,
                                   unsigned long conf, void *data)
 {
@@ -35,7 +64,7 @@ static int typec_altmode_set_state(struct typec_altmode *adev,
 
        port_altmode = is_port ? to_altmode(adev) : to_altmode(adev)->partner;
 
-       return typec_altmode_set_mux(port_altmode, conf, data);
+       return typec_altmode_set_switches(port_altmode, conf, data);
 }
 
 /* -------------------------------------------------------------------------- */
@@ -73,7 +102,7 @@ int typec_altmode_notify(struct typec_altmode *adev,
        is_port = is_typec_port(adev->dev.parent);
        partner = altmode->partner;
 
-       ret = typec_altmode_set_mux(is_port ? altmode : partner, conf, data);
+       ret = typec_altmode_set_switches(is_port ? altmode : partner, conf, data);
        if (ret)
                return ret;