summaryrefslogtreecommitdiff
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2016-06-10 23:25:13 -0700
committerDhaval Patel <pdhaval@codeaurora.org>2016-08-01 11:58:14 -0700
commitbe83cf0cd0badacff128e700665cf228c22cb117 (patch)
tree5d2853aa55b4dc7698530497f48fe3624a9b82ad /drivers/gpu
parent017bbcb1fc64025804caa5d563325a9a54d172ba (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/gpu')
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_drm.c62
-rw-r--r--drivers/gpu/drm/msm/dsi-staging/dsi_drm.h1
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,