From 2fec1685d0268192bec9f8e18333567cac764797 Mon Sep 17 00:00:00 2001 From: Satya Rama Aditya Pinapala Date: Sun, 21 Mar 2021 20:22:59 -0700 Subject: [PATCH] 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 --- msm/dsi/dsi_defs.h | 2 ++ msm/dsi/dsi_display.c | 11 ++++++----- msm/dsi/dsi_drm.c | 4 ++-- msm/dsi/dsi_panel.c | 4 ++++ 4 files changed, 14 insertions(+), 7 deletions(-) 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);