Bläddra i källkod

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

The order of the panel timing nodes specified in the device tree is
not guaranteed to be the same while being parsed in the driver. This
results in unintended modes being set as preferred timing mode. The change
introduces cell-index property, so that the timing modes can be
accurately indexed and parsed.

Change-Id: I8ccd4d5a15643bfe72bc8be084f5e91fac26feb4
Signed-off-by: Satya Rama Aditya Pinapala <[email protected]>
Satya Rama Aditya Pinapala 4 år sedan
förälder
incheckning
2fec1685d0
4 ändrade filer med 14 tillägg och 7 borttagningar
  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);