diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index 2ab858ec6a..1a4bde88bc 100644 --- a/msm/dsi/dsi_defs.h +++ b/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; }; diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index b09b8a9552..4e1fbec9c9 100644 --- a/msm/dsi/dsi_display.c +++ b/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) diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index f380152c8e..bc32422ff2 100644 --- a/msm/dsi/dsi_drm.c +++ b/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); diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 1a5916fa3d..ef141a688d 100644 --- a/msm/dsi/dsi_panel.c +++ b/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);