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 <psraditya30@codeaurora.org>
This commit is contained in:
Satya Rama Aditya Pinapala
2021-03-21 20:22:59 -07:00
committed by Gerrit - the friendly Code Review server
parent 19e9831a45
commit 2fec1685d0
4 changed files with 14 additions and 7 deletions

View File

@@ -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;
};

View File

@@ -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)

View File

@@ -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);

View File

@@ -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);