Merge "drm/msm/dsi-staging: fix ESD check scheduling sequence"
diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
index dc9d7f4..b4c115d 100644
--- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
+++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c
@@ -376,7 +376,7 @@
struct dsi_display *dsi_display = display;
struct dsi_panel *panel;
u32 status_mode;
- int rc = 0;
+ int rc = 0x1;
if (dsi_display == NULL)
return -EINVAL;
@@ -385,6 +385,14 @@
status_mode = panel->esd_config.status_mode;
+ mutex_lock(&dsi_display->display_lock);
+
+ if (!panel->panel_initialized) {
+ pr_debug("Panel not initialized\n");
+ mutex_unlock(&dsi_display->display_lock);
+ return rc;
+ }
+
dsi_display_clk_ctrl(dsi_display->dsi_clk_handle,
DSI_ALL_CLKS, DSI_CLK_ON);
@@ -401,6 +409,7 @@
dsi_display_clk_ctrl(dsi_display->dsi_clk_handle,
DSI_ALL_CLKS, DSI_CLK_OFF);
+ mutex_unlock(&dsi_display->display_lock);
return rc;
}
diff --git a/drivers/gpu/drm/msm/sde/sde_crtc.c b/drivers/gpu/drm/msm/sde/sde_crtc.c
index 653b469..bd77dce 100644
--- a/drivers/gpu/drm/msm/sde/sde_crtc.c
+++ b/drivers/gpu/drm/msm/sde/sde_crtc.c
@@ -4059,10 +4059,6 @@
SDE_DEBUG("crtc%d\n", crtc->base.id);
- for (i = 0; i < cstate->num_connectors; i++)
- sde_connector_schedule_status_work(cstate->connectors[i],
- false);
-
if (sde_kms_is_suspend_state(crtc->dev))
_sde_crtc_set_suspend(crtc, true);
@@ -4159,15 +4155,13 @@
struct sde_crtc_irq_info *node = NULL;
struct drm_event event;
u32 power_on;
- int ret, i;
- struct sde_crtc_state *cstate;
+ int ret;
if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
SDE_ERROR("invalid crtc\n");
return;
}
priv = crtc->dev->dev_private;
- cstate = to_sde_crtc_state(crtc->state);
SDE_DEBUG("crtc%d\n", crtc->base.id);
SDE_EVT32_VERBOSE(DRMID(crtc));
@@ -4231,9 +4225,6 @@
SDE_POWER_EVENT_POST_ENABLE | SDE_POWER_EVENT_POST_DISABLE |
SDE_POWER_EVENT_PRE_DISABLE,
sde_crtc_handle_power_event, crtc, sde_crtc->name);
-
- for (i = 0; i < cstate->num_connectors; i++)
- sde_connector_schedule_status_work(cstate->connectors[i], true);
}
struct plane_state {
diff --git a/drivers/gpu/drm/msm/sde/sde_encoder.c b/drivers/gpu/drm/msm/sde/sde_encoder.c
index 28eb4e6..b3e3077 100644
--- a/drivers/gpu/drm/msm/sde/sde_encoder.c
+++ b/drivers/gpu/drm/msm/sde/sde_encoder.c
@@ -2267,6 +2267,7 @@
struct msm_compression_info *comp_info = NULL;
struct drm_display_mode *cur_mode = NULL;
struct msm_mode_info mode_info;
+ struct drm_connector *drm_conn = NULL;
if (!drm_enc) {
SDE_ERROR("invalid encoder\n");
@@ -2342,6 +2343,10 @@
sde_enc->cur_master->ops.enable(sde_enc->cur_master);
_sde_encoder_virt_enable_helper(drm_enc);
+
+ /* Enable ESD thread */
+ drm_conn = sde_enc->cur_master->connector;
+ sde_connector_schedule_status_work(drm_conn, true);
}
static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
@@ -2349,6 +2354,7 @@
struct sde_encoder_virt *sde_enc = NULL;
struct msm_drm_private *priv;
struct sde_kms *sde_kms;
+ struct drm_connector *drm_conn = NULL;
int i = 0;
if (!drm_enc) {
@@ -2370,6 +2376,10 @@
SDE_EVT32(DRMID(drm_enc));
+ /* Disable ESD thread */
+ drm_conn = sde_enc->cur_master->connector;
+ sde_connector_schedule_status_work(drm_conn, false);
+
/* wait for idle */
sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);