platform/chrome: cros_ec_typec: Configure muxes at start of port update
authorPrashant Malani <pmalani@chromium.org>
Tue, 8 Feb 2022 18:47:22 +0000 (18:47 +0000)
committerPrashant Malani <pmalani@chromium.org>
Tue, 15 Feb 2022 19:50:04 +0000 (19:50 +0000)
There are situations where the mux state reported by the Embedded
Controller (EC), might lag the partner "connected" state. So, the mux
state might still suggest that a partner is connected, while the PD
"connected" state, being in Try.SNK (for example) suggests that the
partner is disconnected.

In such a scenario, we will end up sending a disconnect command to the
mux driver, followed by a connect command, since the mux is configured
later. Avoid this by configuring the mux before
registering/disconnecting a partner.

Signed-off-by: Prashant Malani <pmalani@chromium.org>
Reviewed-by: Benson Leung <bleung@chromium.org>
Link: https://lore.kernel.org/chrome-platform/20220208184721.1697194-4-pmalani@chromium.org/
drivers/platform/chrome/cros_ec_typec.c

index 3d34ece..3019e29 100644 (file)
@@ -965,6 +965,11 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)
        if (ret < 0)
                return ret;
 
+       /* Update the switches if they exist, according to requested state */
+       ret = cros_typec_configure_mux(typec, port_num, &resp);
+       if (ret)
+               dev_warn(typec->dev, "Configure muxes failed, err = %d\n", ret);
+
        dev_dbg(typec->dev, "Enabled %d: 0x%hhx\n", port_num, resp.enabled);
        dev_dbg(typec->dev, "Role %d: 0x%hhx\n", port_num, resp.role);
        dev_dbg(typec->dev, "Polarity %d: 0x%hhx\n", port_num, resp.polarity);
@@ -980,12 +985,7 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)
        if (typec->typec_cmd_supported)
                cros_typec_handle_status(typec, port_num);
 
-       /* Update the switches if they exist, according to requested state */
-       ret = cros_typec_configure_mux(typec, port_num, &resp);
-       if (ret)
-               dev_warn(typec->dev, "Configure muxes failed, err = %d\n", ret);
-
-       return ret;
+       return 0;
 }
 
 static int cros_typec_get_cmd_version(struct cros_typec_data *typec)