Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 318cff16 authored by Sandeep Panda's avatar Sandeep Panda
Browse files

drm/msm/dsi-staging: fix ESD check scheduling sequence



Currently ESD check thread and display commit thread are
running asynchronously. So there might be a situation where
ESD and display suspend call can interfere with each other
and cause ESD check to fail. Which will in turn cause display
to reset when suspend is already under progress is another
thread. So make sure ESD check is scheduled to run only after
display resume sequence has finished and it is disabled before
display suspend sequence starts.

Change-Id: I7c46d740786f3a89e02252aeb4a98d167693e314
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
parent 34c89b33
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -372,7 +372,7 @@ int dsi_display_check_status(void *display)
	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;
@@ -381,6 +381,14 @@ int dsi_display_check_status(void *display)

	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);

@@ -397,6 +405,7 @@ int dsi_display_check_status(void *display)

	dsi_display_clk_ctrl(dsi_display->dsi_clk_handle,
		DSI_ALL_CLKS, DSI_CLK_OFF);
	mutex_unlock(&dsi_display->display_lock);

	return rc;
}
+1 −10
Original line number Diff line number Diff line
@@ -4033,10 +4033,6 @@ static void sde_crtc_disable(struct drm_crtc *crtc)

	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);

@@ -4133,15 +4129,13 @@ static void sde_crtc_enable(struct drm_crtc *crtc)
	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));
@@ -4205,9 +4199,6 @@ static void sde_crtc_enable(struct drm_crtc *crtc)
		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 {
+10 −0
Original line number Diff line number Diff line
@@ -2225,6 +2225,7 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
	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");
@@ -2300,6 +2301,10 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
		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)
@@ -2307,6 +2312,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)
	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) {
@@ -2328,6 +2334,10 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc)

	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);