Browse Source

Merge "disp: msm: dsi: add indexing for panel timing nodes"

qctecmdr 4 years ago
parent
commit
f42268675d
4 changed files with 14 additions and 7 deletions
  1. 2 0
      msm/dsi/dsi_defs.h
  2. 6 5
      msm/dsi/dsi_display.c
  3. 2 2
      msm/dsi/dsi_drm.c
  4. 4 0
      msm/dsi/dsi_panel.c

+ 2 - 0
msm/dsi/dsi_defs.h

@@ -660,6 +660,7 @@ struct dsi_display_mode_priv_info {
  * @dsi_mode_flags: Flags to signal other drm components via private flags
  * @panel_mode_caps: panel mode capabilities.
  * @is_preferred:   Is mode preferred
+ * @mode_idx:       Mode index as defined by devicetree.
  * @priv_info:      Mode private info
  */
 struct dsi_display_mode {
@@ -668,6 +669,7 @@ struct dsi_display_mode {
 	u32 dsi_mode_flags;
 	u32 panel_mode_caps;
 	bool is_preferred;
+	u32 mode_idx;
 	struct dsi_display_mode_priv_info *priv_info;
 };
 

+ 6 - 5
msm/dsi/dsi_display.c

@@ -6778,11 +6778,6 @@ int dsi_display_get_modes(struct dsi_display *display,
 		bool is_preferred = false;
 		u32 frame_threshold_us = ctrl->ctrl->frame_threshold_time_us;
 
-		if (display->cmdline_timing == mode_idx) {
-			topology_override = display->cmdline_topology;
-			is_preferred = true;
-		}
-
 		memset(&display_mode, 0, sizeof(display_mode));
 
 		rc = dsi_panel_get_mode(display->panel, mode_idx,
@@ -6794,6 +6789,11 @@ int dsi_display_get_modes(struct dsi_display *display,
 			goto error;
 		}
 
+		if (display->cmdline_timing == display_mode.mode_idx) {
+			topology_override = display->cmdline_topology;
+			is_preferred = true;
+		}
+
 		support_cmd_mode = display_mode.panel_mode_caps & DSI_OP_CMD_MODE;
 		support_video_mode = display_mode.panel_mode_caps & DSI_OP_VIDEO_MODE;
 
@@ -6851,6 +6851,7 @@ int dsi_display_get_modes(struct dsi_display *display,
 			}
 
 			memcpy(sub_mode, &display_mode, sizeof(display_mode));
+			sub_mode->mode_idx = array_idx;
 			array_idx++;
 
 			if (!dfps_caps.dfps_support || !support_video_mode)

+ 2 - 2
msm/dsi/dsi_drm.c

@@ -970,8 +970,8 @@ int dsi_connector_get_modes(struct drm_connector *connector, void *data,
 			/* get the preferred mode from dsi display mode */
 			if (modes[i].is_preferred)
 				m->type |= DRM_MODE_TYPE_PREFERRED;
-		} else if (i == 0) {
-			/* set the first mode in list as preferred */
+		} else if (modes[i].mode_idx == 0) {
+			/* set the first mode in device tree list as preferred */
 			m->type |= DRM_MODE_TYPE_PREFERRED;
 		}
 		drm_mode_probed_add(connector, m);

+ 4 - 0
msm/dsi/dsi_panel.c

@@ -4039,6 +4039,10 @@ int dsi_panel_get_mode(struct dsi_panel *panel,
 			mode->panel_mode_caps = panel->panel_mode;
 		}
 
+		rc = utils->read_u32(utils->data, "cell-index", &mode->mode_idx);
+		if (rc)
+			mode->mode_idx = index;
+
 		rc = dsi_panel_parse_timing(&mode->timing, utils);
 		if (rc) {
 			DSI_ERR("failed to parse panel timing, rc=%d\n", rc);