Przeglądaj źródła

disp: msm: dp: fix to handle host ready failures

Handle host_ready failures and try to initialize host if not already.
Sometimes customizations for customers causes NOC error as host_ready
doesn't return early upon failure and the customer customization
tries to access aux register to reconfig upon aux failure while
reading EDID. Adding fix will make driver more robust to handle such
cases.

Change-Id: Ifa5c56daa32c4ef366a0e05718495ffcb40b96b3
Signed-off-by: Rajat Gupta <[email protected]>
Signed-off-by: Sandeep Gangadharaiah <[email protected]>
Rajat Gupta 4 lat temu
rodzic
commit
7f0f23c35f
1 zmienionych plików z 20 dodań i 6 usunięć
  1. 20 6
      msm/dp/dp_display.c

+ 20 - 6
msm/dp/dp_display.c

@@ -1052,16 +1052,21 @@ error_ctrl:
 	return rc;
 	return rc;
 }
 }
 
 
-static void dp_display_host_ready(struct dp_display_private *dp)
+static int dp_display_host_ready(struct dp_display_private *dp)
 {
 {
+	int rc = 0;
+
 	if (!dp_display_state_is(DP_STATE_INITIALIZED)) {
 	if (!dp_display_state_is(DP_STATE_INITIALIZED)) {
-		dp_display_state_show("[not initialized]");
-		return;
+		rc = dp_display_host_init(dp);
+		if (rc) {
+			dp_display_state_show("[not initialized]");
+			return rc;
+		}
 	}
 	}
 
 
 	if (dp_display_state_is(DP_STATE_READY)) {
 	if (dp_display_state_is(DP_STATE_READY)) {
 		dp_display_state_log("[already ready]");
 		dp_display_state_log("[already ready]");
-		return;
+		return rc;
 	}
 	}
 
 
 	/*
 	/*
@@ -1089,6 +1094,7 @@ static void dp_display_host_ready(struct dp_display_private *dp)
 	dp_display_state_add(DP_STATE_READY);
 	dp_display_state_add(DP_STATE_READY);
 	/* log this as it results from user action of cable connection */
 	/* log this as it results from user action of cable connection */
 	DP_INFO("[OK]\n");
 	DP_INFO("[OK]\n");
+	return rc;
 }
 }
 
 
 static void dp_display_host_unready(struct dp_display_private *dp)
 static void dp_display_host_unready(struct dp_display_private *dp)
@@ -1191,7 +1197,11 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
 		dp_display_state_remove(DP_STATE_SRC_PWRDN);
 		dp_display_state_remove(DP_STATE_SRC_PWRDN);
 	}
 	}
 
 
-	dp_display_host_ready(dp);
+	rc = dp_display_host_ready(dp);
+	if (rc) {
+		dp_display_state_show("[ready failed]");
+		goto end;
+	}
 
 
 	dp->link->psm_config(dp->link, &dp->panel->link_info, false);
 	dp->link->psm_config(dp->link, &dp->panel->link_info, false);
 	dp->debug->psm_enabled = false;
 	dp->debug->psm_enabled = false;
@@ -2354,7 +2364,11 @@ static int dp_display_prepare(struct dp_display *dp_display, void *panel)
 	}
 	}
 
 
 	/* For supporting DP_PANEL_SRC_INITIATED_POWER_DOWN case */
 	/* For supporting DP_PANEL_SRC_INITIATED_POWER_DOWN case */
-	dp_display_host_ready(dp);
+	rc = dp_display_host_ready(dp);
+	if (rc) {
+		dp_display_state_show("[ready failed]");
+		goto end;
+	}
 
 
 	if (dp->debug->psm_enabled) {
 	if (dp->debug->psm_enabled) {
 		dp->link->psm_config(dp->link, &dp->panel->link_info, false);
 		dp->link->psm_config(dp->link, &dp->panel->link_info, false);