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:

committed by
Gerrit - the friendly Code Review server

parent
19e9831a45
commit
2fec1685d0
@@ -660,6 +660,7 @@ struct dsi_display_mode_priv_info {
|
|||||||
* @dsi_mode_flags: Flags to signal other drm components via private flags
|
* @dsi_mode_flags: Flags to signal other drm components via private flags
|
||||||
* @panel_mode_caps: panel mode capabilities.
|
* @panel_mode_caps: panel mode capabilities.
|
||||||
* @is_preferred: Is mode preferred
|
* @is_preferred: Is mode preferred
|
||||||
|
* @mode_idx: Mode index as defined by devicetree.
|
||||||
* @priv_info: Mode private info
|
* @priv_info: Mode private info
|
||||||
*/
|
*/
|
||||||
struct dsi_display_mode {
|
struct dsi_display_mode {
|
||||||
@@ -668,6 +669,7 @@ struct dsi_display_mode {
|
|||||||
u32 dsi_mode_flags;
|
u32 dsi_mode_flags;
|
||||||
u32 panel_mode_caps;
|
u32 panel_mode_caps;
|
||||||
bool is_preferred;
|
bool is_preferred;
|
||||||
|
u32 mode_idx;
|
||||||
struct dsi_display_mode_priv_info *priv_info;
|
struct dsi_display_mode_priv_info *priv_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -6778,11 +6778,6 @@ int dsi_display_get_modes(struct dsi_display *display,
|
|||||||
bool is_preferred = false;
|
bool is_preferred = false;
|
||||||
u32 frame_threshold_us = ctrl->ctrl->frame_threshold_time_us;
|
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));
|
memset(&display_mode, 0, sizeof(display_mode));
|
||||||
|
|
||||||
rc = dsi_panel_get_mode(display->panel, mode_idx,
|
rc = dsi_panel_get_mode(display->panel, mode_idx,
|
||||||
@@ -6794,6 +6789,11 @@ int dsi_display_get_modes(struct dsi_display *display,
|
|||||||
goto error;
|
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_cmd_mode = display_mode.panel_mode_caps & DSI_OP_CMD_MODE;
|
||||||
support_video_mode = display_mode.panel_mode_caps & DSI_OP_VIDEO_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));
|
memcpy(sub_mode, &display_mode, sizeof(display_mode));
|
||||||
|
sub_mode->mode_idx = array_idx;
|
||||||
array_idx++;
|
array_idx++;
|
||||||
|
|
||||||
if (!dfps_caps.dfps_support || !support_video_mode)
|
if (!dfps_caps.dfps_support || !support_video_mode)
|
||||||
|
@@ -970,8 +970,8 @@ int dsi_connector_get_modes(struct drm_connector *connector, void *data,
|
|||||||
/* get the preferred mode from dsi display mode */
|
/* get the preferred mode from dsi display mode */
|
||||||
if (modes[i].is_preferred)
|
if (modes[i].is_preferred)
|
||||||
m->type |= DRM_MODE_TYPE_PREFERRED;
|
m->type |= DRM_MODE_TYPE_PREFERRED;
|
||||||
} else if (i == 0) {
|
} else if (modes[i].mode_idx == 0) {
|
||||||
/* set the first mode in list as preferred */
|
/* set the first mode in device tree list as preferred */
|
||||||
m->type |= DRM_MODE_TYPE_PREFERRED;
|
m->type |= DRM_MODE_TYPE_PREFERRED;
|
||||||
}
|
}
|
||||||
drm_mode_probed_add(connector, m);
|
drm_mode_probed_add(connector, m);
|
||||||
|
@@ -4039,6 +4039,10 @@ int dsi_panel_get_mode(struct dsi_panel *panel,
|
|||||||
mode->panel_mode_caps = panel->panel_mode;
|
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);
|
rc = dsi_panel_parse_timing(&mode->timing, utils);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
DSI_ERR("failed to parse panel timing, rc=%d\n", rc);
|
DSI_ERR("failed to parse panel timing, rc=%d\n", rc);
|
||||||
|
Reference in New Issue
Block a user