]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
usb: typec: ps883x: Rework ps883x_set()
authorKonrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Tue, 14 Oct 2025 16:06:46 +0000 (18:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Oct 2025 08:58:31 +0000 (10:58 +0200)
In preparation to extend it with new alt/USB modes, rework the code a
bit by changing the flow into a pair of switch statements.

Reviewed-by: Jack Pham <jack.pham@oss.qualcomm.com>
Signed-off-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://patch.msgid.link/20251014-topic-ps883x_usb4-v1-2-e6adb1a4296e@oss.qualcomm.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/mux/ps883x.c

index 68f172df7be3b57d468e9e345b1bbea1dc3acc22..72f1e737ca4baab524bc43487c70c2f1f24d3f76 100644 (file)
@@ -99,44 +99,47 @@ static int ps883x_set(struct ps883x_retimer *retimer, struct typec_retimer_state
        int cfg1 = 0x00;
        int cfg2 = 0x00;
 
-       if (retimer->orientation == TYPEC_ORIENTATION_NONE ||
-           state->mode == TYPEC_STATE_SAFE) {
-               return ps883x_configure(retimer, cfg0, cfg1, cfg2);
-       }
-
-       if (state->alt && state->alt->svid != USB_TYPEC_DP_SID)
-               return -EINVAL;
-
        if (retimer->orientation == TYPEC_ORIENTATION_REVERSE)
                cfg0 |= CONN_STATUS_0_ORIENTATION_REVERSED;
 
-       switch (state->mode) {
-       case TYPEC_STATE_USB:
-               cfg0 |= CONN_STATUS_0_USB_3_1_CONNECTED;
-               break;
-
-       case TYPEC_DP_STATE_C:
-               cfg1 = CONN_STATUS_1_DP_CONNECTED |
-                      CONN_STATUS_1_DP_SINK_REQUESTED |
-                      CONN_STATUS_1_DP_PIN_ASSIGNMENT_C_D |
-                      CONN_STATUS_1_DP_HPD_LEVEL;
-               break;
-
-       case TYPEC_DP_STATE_D:
-               cfg0 |= CONN_STATUS_0_USB_3_1_CONNECTED;
-               cfg1 = CONN_STATUS_1_DP_CONNECTED |
-                      CONN_STATUS_1_DP_SINK_REQUESTED |
-                      CONN_STATUS_1_DP_PIN_ASSIGNMENT_C_D |
-                      CONN_STATUS_1_DP_HPD_LEVEL;
-               break;
-
-       case TYPEC_DP_STATE_E:
-               cfg1 = CONN_STATUS_1_DP_CONNECTED |
-                      CONN_STATUS_1_DP_HPD_LEVEL;
-               break;
-
-       default:
-               return -EOPNOTSUPP;
+       if (state->alt) {
+               switch (state->alt->svid) {
+               case USB_TYPEC_DP_SID:
+                       cfg1 |= CONN_STATUS_1_DP_CONNECTED |
+                               CONN_STATUS_1_DP_HPD_LEVEL;
+
+                       switch (state->mode)  {
+                       case TYPEC_DP_STATE_C:
+                               cfg1 |= CONN_STATUS_1_DP_SINK_REQUESTED |
+                                       CONN_STATUS_1_DP_PIN_ASSIGNMENT_C_D;
+                               fallthrough;
+                       case TYPEC_DP_STATE_D:
+                               cfg1 |= CONN_STATUS_0_USB_3_1_CONNECTED;
+                               break;
+                       default: /* MODE_E */
+                               break;
+                       }
+                       break;
+               default:
+                       dev_err(&retimer->client->dev, "Got unsupported SID: 0x%x\n",
+                               state->alt->svid);
+                       return -EOPNOTSUPP;
+               }
+       } else {
+               switch (state->mode) {
+               case TYPEC_STATE_SAFE:
+               /* USB2 pins don't even go through this chip */
+               case TYPEC_MODE_USB2:
+                       break;
+               case TYPEC_STATE_USB:
+               case TYPEC_MODE_USB3:
+                       cfg0 |= CONN_STATUS_0_USB_3_1_CONNECTED;
+                       break;
+               default:
+                       dev_err(&retimer->client->dev, "Got unsupported mode: %lu\n",
+                               state->mode);
+                       return -EOPNOTSUPP;
+               }
        }
 
        return ps883x_configure(retimer, cfg0, cfg1, cfg2);