Browse Source

disp: msm: dsi: expand matching requirements to find DSI mode match

This change expands on the checks comparing different dsi modes.
Previously, only h and v active and refresh rate were checked to
decide if a matching mode is found. Now the check will include
all h and v components in dsi_mode_info.

Change-Id: I6a4ca3456138c38615fbd5c50dfd9658cc3a2119
Signed-off-by: Samantha Tran <[email protected]>
Samantha Tran 4 years ago
parent
commit
ebedf4b7f4
1 changed files with 34 additions and 3 deletions
  1. 34 3
      msm/dsi/dsi_display.c

+ 34 - 3
msm/dsi/dsi_display.c

@@ -36,6 +36,8 @@
 
 
 #define SEC_PANEL_NAME_MAX_LEN  256
 #define SEC_PANEL_NAME_MAX_LEN  256
 
 
+#define DSI_MODE_MATCH_TIMINGS (1 << 0)
+
 u8 dbgfs_tx_cmd_buf[SZ_4K];
 u8 dbgfs_tx_cmd_buf[SZ_4K];
 static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN];
 static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN];
 static char dsi_display_secondary[MAX_CMDLINE_PARAM_LEN];
 static char dsi_display_secondary[MAX_CMDLINE_PARAM_LEN];
@@ -7019,6 +7021,37 @@ int dsi_display_get_qsync_min_fps(void *display_dsi, u32 mode_fps)
 	return -EINVAL;
 	return -EINVAL;
 }
 }
 
 
+static bool dsi_display_match_timings(const struct dsi_display_mode *mode1,
+		struct dsi_display_mode *mode2)
+{
+	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;
+}
+
+
+static bool dsi_display_mode_match(const struct dsi_display_mode *mode1,
+		struct dsi_display_mode *mode2, unsigned int match_flags)
+{
+	if (!mode1 && !mode2)
+		return true;
+
+	if (!mode1 || !mode2)
+		return false;
+
+	if (match_flags & DSI_MODE_MATCH_TIMINGS && !dsi_display_match_timings(mode1, mode2))
+		return false;
+
+	return true;
+}
+
 int dsi_display_find_mode(struct dsi_display *display,
 int dsi_display_find_mode(struct dsi_display *display,
 		const struct dsi_display_mode *cmp,
 		const struct dsi_display_mode *cmp,
 		struct dsi_display_mode **out_mode)
 		struct dsi_display_mode **out_mode)
@@ -7047,9 +7080,7 @@ int dsi_display_find_mode(struct dsi_display *display,
 	for (i = 0; i < count; i++) {
 	for (i = 0; i < count; i++) {
 		struct dsi_display_mode *m = &display->modes[i];
 		struct dsi_display_mode *m = &display->modes[i];
 
 
-		if (cmp->timing.v_active == m->timing.v_active &&
-			cmp->timing.h_active == m->timing.h_active &&
-			cmp->timing.refresh_rate == m->timing.refresh_rate) {
+		if (dsi_display_mode_match(cmp, m, DSI_MODE_MATCH_TIMINGS)) {
 			*out_mode = m;
 			*out_mode = m;
 			rc = 0;
 			rc = 0;
 			break;
 			break;