diff options
| author | Ajay Singh Parmar <aparmar@codeaurora.org> | 2016-06-10 23:25:13 -0700 |
|---|---|---|
| committer | Dhaval Patel <pdhaval@codeaurora.org> | 2016-08-01 11:58:14 -0700 |
| commit | be83cf0cd0badacff128e700665cf228c22cb117 (patch) | |
| tree | 5d2853aa55b4dc7698530497f48fe3624a9b82ad /drivers | |
| parent | 017bbcb1fc64025804caa5d563325a9a54d172ba (diff) | |
drm/msm/dsi-staging: fix dynamic fps and seamless updates
Move DSI/INTF updates for dynamic FPS and seamless operations
from 'mode_set' to the pre-enable/enable part of the commit
sequence.
Change-Id: I334fb2395db7174037ab8b1b9c32092ca94aa9b9
Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/msm/dsi-staging/dsi_drm.c | 62 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi-staging/dsi_drm.h | 1 |
2 files changed, 36 insertions, 27 deletions
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c index b8b6040347c3..95e64359c1c9 100644 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.c @@ -96,7 +96,7 @@ static int dsi_bridge_attach(struct drm_bridge *bridge) return -EINVAL; } - pr_debug("Bridge %d attached\n", c_bridge->id); + pr_debug("[%d] attached\n", c_bridge->id); return 0; @@ -109,28 +109,38 @@ static void dsi_bridge_pre_enable(struct drm_bridge *bridge) if (!c_bridge) { pr_err("Invalid params\n"); - rc = -EINVAL; + return; + } + + pr_debug(""); + + /* By this point mode should have been validated through mode_fixup */ + rc = dsi_display_set_mode(c_bridge->display, + &(c_bridge->dsi_mode), 0x0); + if (rc) { + pr_err("[%d] failed to perform a mode set, rc=%d\n", + c_bridge->id, rc); + return; + } + + if (c_bridge->dsi_mode.flags & DSI_MODE_FLAG_SEAMLESS) { + pr_debug("[%d] seamless pre-enable\n", c_bridge->id); + return; } rc = dsi_display_prepare(c_bridge->display); if (rc) { - pr_err("[%d]DSI display prepare failed, rc=%d\n", + pr_err("[%d] DSI display prepare failed, rc=%d\n", c_bridge->id, rc); - goto end; + return; } rc = dsi_display_enable(c_bridge->display); if (rc) { - pr_err("[%d]DSI display enable failed, rc=%d\n", + pr_err("[%d] DSI display enable failed, rc=%d\n", c_bridge->id, rc); - goto error_unprep_display; + (void)dsi_display_unprepare(c_bridge->display); } - - return; -error_unprep_display: - (void)dsi_display_unprepare(c_bridge->display); -end: - pr_debug(""); } static void dsi_bridge_enable(struct drm_bridge *bridge) @@ -143,9 +153,14 @@ static void dsi_bridge_enable(struct drm_bridge *bridge) return; } + if (c_bridge->dsi_mode.flags & DSI_MODE_FLAG_SEAMLESS) { + pr_debug("[%d] seamless enable\n", c_bridge->id); + return; + } + rc = dsi_display_post_enable(c_bridge->display); if (rc) - pr_err("[%d]DSI display post enabled failed, rc=%d\n", + pr_err("[%d] DSI display post enabled failed, rc=%d\n", c_bridge->id, rc); } @@ -162,7 +177,7 @@ static void dsi_bridge_disable(struct drm_bridge *bridge) rc = dsi_display_pre_disable(c_bridge->display); if (rc) { - pr_err("[%d] dsi display pre disable failed, rc=%d\n", + pr_err("[%d] DSI display pre disable failed, rc=%d\n", c_bridge->id, rc); goto error; } @@ -202,24 +217,17 @@ static void dsi_bridge_mode_set(struct drm_bridge *bridge, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { - int rc = 0; struct dsi_bridge *c_bridge = to_dsi_bridge(bridge); - struct dsi_display_mode dsi_mode; if (!c_bridge || !mode || !adjusted_mode) { pr_err("Invalid params\n"); - rc = -EINVAL; + return; } - memset(&dsi_mode, 0x0, sizeof(dsi_mode)); - - convert_to_dsi_mode(adjusted_mode, &dsi_mode); + pr_debug(""); - /* By this point mode should have been validated through mode_fixup */ - rc = dsi_display_set_mode(c_bridge->display, &dsi_mode, 0x0); - if (rc) - pr_err("[%d] failed to perform a mode set, rc=%d\n", - c_bridge->id, rc); + memset(&(c_bridge->dsi_mode), 0x0, sizeof(struct dsi_display_mode)); + convert_to_dsi_mode(adjusted_mode, &(c_bridge->dsi_mode)); } static bool dsi_bridge_mode_fixup(struct drm_bridge *bridge, @@ -241,7 +249,7 @@ static bool dsi_bridge_mode_fixup(struct drm_bridge *bridge, rc = dsi_display_validate_mode(c_bridge->display, &dsi_mode, DSI_VALIDATE_FLAG_ALLOW_ADJUST); if (rc) { - pr_err("[%d] Mode is not valid, rc=%d\n", c_bridge->id, rc); + pr_err("[%d] mode is not valid, rc=%d\n", c_bridge->id, rc); ret = false; } else { convert_to_drm_mode(&dsi_mode, adjusted_mode); @@ -513,7 +521,7 @@ struct dsi_connector *dsi_drm_connector_init(struct dsi_display *display, DRM_MODE_PROP_BLOB | DRM_MODE_PROP_IMMUTABLE, "DISPLAY_TYPE", 0); if (!blob) { - pr_err("Failed to create DISPLAY_TYPE property\n"); + pr_err("failed to create DISPLAY_TYPE property\n"); goto error_unregister_conn; } diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.h b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.h index 905341fed8e6..0fdf2665c079 100644 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_drm.h +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_drm.h @@ -52,6 +52,7 @@ struct dsi_bridge { u32 id; struct dsi_display *display; + struct dsi_display_mode dsi_mode; }; struct dsi_connector *dsi_drm_connector_init(struct dsi_display *display, |
