瀏覽代碼

Merge "disp: msm: dsi: remove porches value check from mode matching for RFI"

qctecmdr 4 年之前
父節點
當前提交
a417ffc4cc
共有 1 個文件被更改,包括 42 次插入17 次删除
  1. 42 17
      msm/dsi/dsi_display.c

+ 42 - 17
msm/dsi/dsi_display.c

@@ -36,7 +36,9 @@
 
 #define SEC_PANEL_NAME_MAX_LEN  256
 
-#define DSI_MODE_MATCH_TIMINGS (1 << 0)
+#define DSI_MODE_MATCH_ACTIVE_TIMINGS (1 << 0)
+#define DSI_MODE_MATCH_PORCH_TIMINGS (1 << 1)
+#define DSI_MODE_MATCH_FULL_TIMINGS (DSI_MODE_MATCH_ACTIVE_TIMINGS | DSI_MODE_MATCH_PORCH_TIMINGS)
 
 u8 dbgfs_tx_cmd_buf[SZ_4K];
 static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN];
@@ -7083,18 +7085,29 @@ int dsi_display_get_avr_step_req_fps(void *display_dsi, u32 mode_fps)
 }
 
 static bool dsi_display_match_timings(const struct dsi_display_mode *mode1,
-		struct dsi_display_mode *mode2)
+		struct dsi_display_mode *mode2, unsigned int match_flags)
 {
-	return mode1->timing.h_active == mode2->timing.h_active &&
-		mode1->timing.h_sync_width == mode2->timing.h_sync_width &&
-		mode1->timing.h_back_porch == mode2->timing.h_back_porch &&
-		mode1->timing.h_front_porch == mode2->timing.h_front_porch &&
-		mode1->timing.h_skew == mode2->timing.h_skew &&
-		mode1->timing.v_active == mode2->timing.v_active &&
-		mode1->timing.v_sync_width == mode2->timing.v_sync_width &&
-		mode1->timing.v_back_porch == mode2->timing.v_back_porch &&
-		mode1->timing.v_front_porch == mode2->timing.v_front_porch &&
-		mode1->timing.refresh_rate == mode2->timing.refresh_rate;
+	bool is_matching = false;
+
+	if (match_flags & DSI_MODE_MATCH_ACTIVE_TIMINGS) {
+		is_matching = mode1->timing.h_active == mode2->timing.h_active &&
+				mode1->timing.v_active == mode2->timing.v_active &&
+				mode1->timing.refresh_rate == mode2->timing.refresh_rate;
+		if (!is_matching)
+			goto end;
+	}
+
+	if (match_flags & DSI_MODE_MATCH_PORCH_TIMINGS)
+		is_matching = mode1->timing.h_back_porch == mode2->timing.h_back_porch &&
+				mode1->timing.h_front_porch == mode2->timing.h_front_porch &&
+				mode1->timing.h_sync_width == mode2->timing.h_sync_width &&
+				mode1->timing.h_skew == mode2->timing.h_skew &&
+				mode1->timing.v_back_porch == mode2->timing.v_back_porch &&
+				mode1->timing.v_front_porch == mode2->timing.v_front_porch &&
+				mode1->timing.v_sync_width == mode2->timing.v_sync_width;
+
+end:
+	return is_matching;
 }
 
 static bool dsi_display_mode_match(const struct dsi_display_mode *mode1,
@@ -7106,7 +7119,8 @@ static bool dsi_display_mode_match(const struct dsi_display_mode *mode1,
 	if (!mode1 || !mode2)
 		return false;
 
-	if (match_flags & DSI_MODE_MATCH_TIMINGS && !dsi_display_match_timings(mode1, mode2))
+	if ((match_flags & DSI_MODE_MATCH_FULL_TIMINGS) &&
+			!dsi_display_match_timings(mode1, mode2, match_flags))
 		return false;
 
 	return true;
@@ -7118,6 +7132,9 @@ int dsi_display_find_mode(struct dsi_display *display,
 {
 	u32 count, i;
 	int rc;
+	struct dsi_display_mode *m;
+	struct dsi_dyn_clk_caps *dyn_clk_caps;
+	unsigned int match_flags = DSI_MODE_MATCH_FULL_TIMINGS;
 
 	if (!display || !out_mode)
 		return -EINVAL;
@@ -7129,18 +7146,26 @@ int dsi_display_find_mode(struct dsi_display *display,
 	mutex_unlock(&display->display_lock);
 
 	if (!display->modes) {
-		struct dsi_display_mode *m;
-
 		rc = dsi_display_get_modes(display, &m);
 		if (rc)
 			return rc;
 	}
 
 	mutex_lock(&display->display_lock);
+	dyn_clk_caps = &(display->panel->dyn_clk_caps);
 	for (i = 0; i < count; i++) {
-		struct dsi_display_mode *m = &display->modes[i];
+		m = &display->modes[i];
+
+		/**
+		 * When dynamic bit clock is enabled with contants FPS,
+		 * the adjusted mode porches value may not match the panel
+		 * default mode porches and panel mode lookup will fail.
+		 * In that case we omit porches in mode matching function.
+		 */
+		if (dyn_clk_caps->maintain_const_fps)
+			match_flags = DSI_MODE_MATCH_ACTIVE_TIMINGS;
 
-		if (dsi_display_mode_match(cmp, m, DSI_MODE_MATCH_TIMINGS)) {
+		if (dsi_display_mode_match(cmp, m, match_flags)) {
 			*out_mode = m;
 			rc = 0;
 			break;