usb: typec: ucsi: register DP only for NVIDIA DP VDO
authorAjay Gupta <ajayg@nvidia.com>
Mon, 17 Feb 2020 14:49:11 +0000 (17:49 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 Feb 2020 15:50:18 +0000 (16:50 +0100)
NVIDIA VirtualLink (svid 0x955) has two altmode, vdo=0x1 for
VirtualLink DP mode and vdo=0x3 for NVIDIA test mode.
Register display altmode driver only for vdo=0x1

Signed-off-by: Ajay Gupta <ajayg@nvidia.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20200217144913.55330-2-heikki.krogerus@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi.c
drivers/usb/typec/ucsi/ucsi.h

index b1b72cb..ddf2ad3 100644 (file)
@@ -270,9 +270,16 @@ static int ucsi_register_altmode(struct ucsi_connector *con,
 
                switch (desc->svid) {
                case USB_TYPEC_DP_SID:
-               case USB_TYPEC_NVIDIA_VLINK_SID:
                        alt = ucsi_register_displayport(con, override, i, desc);
                        break;
+               case USB_TYPEC_NVIDIA_VLINK_SID:
+                       if (desc->vdo == USB_TYPEC_NVIDIA_VLINK_DBG_VDO)
+                               alt = typec_port_register_altmode(con->port,
+                                                                 desc);
+                       else
+                               alt = ucsi_register_displayport(con, override,
+                                                               i, desc);
+                       break;
                default:
                        alt = typec_port_register_altmode(con->port, desc);
                        break;
@@ -475,7 +482,8 @@ static void ucsi_unregister_altmodes(struct ucsi_connector *con, u8 recipient)
        while (adev[i]) {
                if (recipient == UCSI_RECIPIENT_SOP &&
                    (adev[i]->svid == USB_TYPEC_DP_SID ||
-                       adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID)) {
+                       (adev[i]->svid == USB_TYPEC_NVIDIA_VLINK_SID &&
+                       adev[i]->vdo != USB_TYPEC_NVIDIA_VLINK_DBG_VDO))) {
                        pdev = typec_altmode_get_partner(adev[i]);
                        ucsi_displayport_remove_partner((void *)pdev);
                }
index e434b9c..a89112b 100644 (file)
@@ -340,4 +340,11 @@ static inline void
 ucsi_displayport_remove_partner(struct typec_altmode *adev) { }
 #endif /* CONFIG_TYPEC_DP_ALTMODE */
 
+/*
+ * NVIDIA VirtualLink (svid 0x955) has two altmode. VirtualLink
+ * DP mode with vdo=0x1 and NVIDIA test mode with vdo=0x3
+ */
+#define USB_TYPEC_NVIDIA_VLINK_DP_VDO  0x1
+#define USB_TYPEC_NVIDIA_VLINK_DBG_VDO 0x3
+
 #endif /* __DRIVER_USB_TYPEC_UCSI_H */