usb: typec: tcpci: Fix up sink disconnect thresholds for PD
authorBadhri Jagan Sridharan <badhri@google.com>
Tue, 15 Jun 2021 17:43:23 +0000 (10:43 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jun 2021 13:38:37 +0000 (15:38 +0200)
"Table 4-3 VBUS Sink Characteristics" of "Type-C Cable and Connector
Specification" defines the disconnect voltage thresholds of various
configurations. This change fixes the disconnect threshold voltage
calculation based on vSinkPD_min and vSinkDisconnectPD as defined
by the table.

Fixes: e1a97bf80a022 ("usb: typec: tcpci: Implement Auto discharge disconnect callbacks")
Cc: stable <stable@vger.kernel.org>
Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Badhri Jagan Sridharan <badhri@google.com>
Link: https://lore.kernel.org/r/20210615174323.1160132-1-badhri@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tcpm/tcpci.c

index 2286234..9858716 100644 (file)
 #define        PD_RETRY_COUNT_DEFAULT                  3
 #define        PD_RETRY_COUNT_3_0_OR_HIGHER            2
 #define        AUTO_DISCHARGE_DEFAULT_THRESHOLD_MV     3500
-#define        AUTO_DISCHARGE_PD_HEADROOM_MV           850
-#define        AUTO_DISCHARGE_PPS_HEADROOM_MV          1250
+#define        VSINKPD_MIN_IR_DROP_MV                  750
+#define        VSRC_NEW_MIN_PERCENT                    95
+#define        VSRC_VALID_MIN_MV                       500
+#define        VPPS_NEW_MIN_PERCENT                    95
+#define        VPPS_VALID_MIN_MV                       100
+#define        VSINKDISCONNECT_PD_MIN_PERCENT          90
 
 #define tcpc_presenting_rd(reg, cc) \
        (!(TCPC_ROLE_CTRL_DRP & (reg)) && \
@@ -351,11 +355,13 @@ static int tcpci_set_auto_vbus_discharge_threshold(struct tcpc_dev *dev, enum ty
                threshold = AUTO_DISCHARGE_DEFAULT_THRESHOLD_MV;
        } else if (mode == TYPEC_PWR_MODE_PD) {
                if (pps_active)
-                       threshold = (95 * requested_vbus_voltage_mv / 100) -
-                               AUTO_DISCHARGE_PD_HEADROOM_MV;
+                       threshold = ((VPPS_NEW_MIN_PERCENT * requested_vbus_voltage_mv / 100) -
+                                    VSINKPD_MIN_IR_DROP_MV - VPPS_VALID_MIN_MV) *
+                                    VSINKDISCONNECT_PD_MIN_PERCENT / 100;
                else
-                       threshold = (95 * requested_vbus_voltage_mv / 100) -
-                               AUTO_DISCHARGE_PPS_HEADROOM_MV;
+                       threshold = ((VSRC_NEW_MIN_PERCENT * requested_vbus_voltage_mv / 100) -
+                                    VSINKPD_MIN_IR_DROP_MV - VSRC_VALID_MIN_MV) *
+                                    VSINKDISCONNECT_PD_MIN_PERCENT / 100;
        } else {
                /* 3.5V for non-pd sink */
                threshold = AUTO_DISCHARGE_DEFAULT_THRESHOLD_MV;