Re: [PATCH] usb: typec: ucsi_ccg: workaround for NVIDIA test device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 27, 2020 at 04:02:07PM +0200, Heikki Krogerus wrote:
> This did not compile:
> 
> drivers/usb/typec/ucsi/ucsi_ccg.c: In function ‘ucsi_ccg_read’:
> drivers/usb/typec/ucsi/ucsi_ccg.c:505:22: error: ‘USB_TYPEC_NVIDIA_VLINK_DBG_VDO’ undeclared (first use in this function); did you mean ‘USB_TYPEC_NVIDIA_VLINK_SID’?
>   505 |        alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DBG_VDO) {
>       |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                      USB_TYPEC_NVIDIA_VLINK_SID
> drivers/usb/typec/ucsi/ucsi_ccg.c:505:22: note: each undeclared identifier is reported only once for each function it appears in
> drivers/usb/typec/ucsi/ucsi_ccg.c:506:18: error: ‘USB_TYPEC_NVIDIA_VLINK_DP_VDO’ undeclared (first use in this function); did you mean ‘USB_TYPEC_NVIDIA_VLINK_SID’?
>   506 |     alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DP_VDO |
>       |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>       |                  USB_TYPEC_NVIDIA_VLINK_SID

Sorry, I was working on top of the wrong branch. The patch does
compile fine...

> All those nested conditions make the code a bit difficult to read for
> me. You could handle the NVIDIA alt mode in its own function. I'm
> attaching a diff that you should be able to apply on top of your patch
> that should make the code a bit easier to read.

I attached a fixed version of the diff.


thanks,

-- 
heikki
diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c
index b421b0045448..65fa648eea19 100644
--- a/drivers/usb/typec/ucsi/ucsi_ccg.c
+++ b/drivers/usb/typec/ucsi/ucsi_ccg.c
@@ -126,8 +126,8 @@ struct version_format {
 #define CCG_OLD_FW_VERSION	(CCG_VERSION(0x31) | CCG_VERSION_PATCH(10))
 
 /* Altmode offset for NVIDIA Function Test Board (FTB) */
-#define USB_TYPEC_NVIDIA_FTB_DP_OFFSET	(2)
-#define USB_TYPEC_NVIDIA_FTB_DBG_OFFSET	(3)
+#define NVIDIA_FTB_DP_OFFSET	(2)
+#define NVIDIA_FTB_DBG_OFFSET	(3)
 
 struct version_info {
 	struct version_format base;
@@ -481,49 +481,55 @@ static void ucsi_ccg_update_set_new_cam_cmd(struct ucsi_ccg *uc,
 	*cmd |= UCSI_SET_NEW_CAM_SET_AM(cam);
 }
 
+/*
+ * FIXME: A short explanation what this function does.
+ */
+static int ucsi_ccg_nvidia_altmode(struct ucsi_ccg *uc,
+				   struct ucsi_altmode *alt)
+{
+	if (UCSI_ALTMODE_OFFSET(uc->last_cmd_sent) == NVIDIA_FTB_DP_OFFSET &&
+	    alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DBG_VDO)
+		alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DP_VDO |
+		             DP_CAP_DP_SIGNALING | DP_CAP_USB |
+			     DP_CONF_SET_PIN_ASSIGN(BIT(DP_PIN_ASSIGN_E));
+
+	if (UCSI_ALTMODE_OFFSET(uc->last_cmd_sent) == NVIDIA_FTB_DBG_OFFSET &&
+	    alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DP_VDO)
+		alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DBG_VDO;
+
+	return 0;
+}
+
 static int ucsi_ccg_read(struct ucsi *ucsi, unsigned int offset,
 			 void *val, size_t val_len)
 {
 	struct ucsi_ccg *uc = ucsi_get_drvdata(ucsi);
-	int ret;
 	u16 reg = CCGX_RAB_UCSI_DATA_BLOCK(offset);
+	struct ucsi_altmode *alt;
+	int ret;
 
 	ret = ccg_read(uc, reg, val, val_len);
 	if (ret)
 		return ret;
 
-	if (offset == UCSI_MESSAGE_IN) {
-		if (UCSI_COMMAND(uc->last_cmd_sent) ==
-		    UCSI_GET_ALTERNATE_MODES &&
-		    UCSI_ALTMODE_RECIPIENT(uc->last_cmd_sent) ==
-		    UCSI_RECIPIENT_SOP) {
-			struct ucsi_altmode *alt = (struct ucsi_altmode *)val;
-
-			if (alt[0].svid == USB_TYPEC_NVIDIA_VLINK_SID &&
-			    UCSI_ALTMODE_OFFSET(uc->last_cmd_sent) ==
-			    USB_TYPEC_NVIDIA_FTB_DP_OFFSET &&
-			    alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DBG_VDO) {
-				alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DP_VDO |
-						DP_CAP_DP_SIGNALING |
-						DP_CAP_USB |
-						DP_CONF_SET_PIN_ASSIGN(BIT
-							(DP_PIN_ASSIGN_E));
-			}
-			if (alt[0].svid == USB_TYPEC_NVIDIA_VLINK_SID &&
-			    UCSI_ALTMODE_OFFSET(uc->last_cmd_sent) ==
-			    USB_TYPEC_NVIDIA_FTB_DBG_OFFSET &&
-			    alt[0].mid == USB_TYPEC_NVIDIA_VLINK_DP_VDO) {
-				alt[0].mid = USB_TYPEC_NVIDIA_VLINK_DBG_VDO;
-			}
-		}
-		if (UCSI_COMMAND(uc->last_cmd_sent) == UCSI_GET_CURRENT_CAM &&
-		    uc->has_multiple_dp) {
+	if (offset != UCSI_MESSAGE_IN)
+		return 0;
+
+	switch (UCSI_COMMAND(uc->last_cmd_sent)) {
+	case UCSI_GET_CURRENT_CAM:
+		if (uc->has_multiple_dp)
 			ucsi_ccg_update_get_current_cam_cmd(uc, (u8 *)val);
-		}
-		uc->last_cmd_sent = 0;
+		break;
+	case UCSI_GET_ALTERNATE_MODES:
+		alt = val;
+		if (alt[0].svid == USB_TYPEC_NVIDIA_VLINK_SID)
+			return ucsi_ccg_nvidia_altmode(uc, alt);
+		break;
+	default:
+		break;
 	}
 
-	return ret;
+	return 0;
 }
 
 static int ucsi_ccg_async_write(struct ucsi *ucsi, unsigned int offset,

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux