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

Commit f64e4f01 authored by Xiaoming Zhou's avatar Xiaoming Zhou
Browse files

msm: mdss: fix display lk to kernel transition issue



Earlier, during lk to kernel transition, display was
shut down and turned on again.  During shutdown, the
previously allocated overlay resource was released
and the vsync was disabled.  To distinguish between
normal shutdown and lk to kernel transition case,
a separate function is added to address the transition
use case.

Change-Id: Ib30abb4a0f97a46260dfd09ad91f59035794e45e
Signed-off-by: default avatarXiaoming Zhou <zhoux@codeaurora.org>
parent 91df8430
Loading
Loading
Loading
Loading
+84 −4
Original line number Diff line number Diff line
@@ -557,6 +557,88 @@ off_error:
	return 0;
}

static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd)
{
	int rc = 0;
	struct mdp3_session_data *mdp3_session;
	struct mdp3_dma *mdp3_dma;
	struct mdss_panel_data *panel;
	struct mdp3_vsync_notification vsync_client;

	pr_debug("mdp3_ctrl_reset\n");
	mdp3_session = (struct mdp3_session_data *)mfd->mdp.private1;
	if (!mdp3_session || !mdp3_session->panel || !mdp3_session->dma ||
		!mdp3_session->intf) {
		pr_err("mdp3_ctrl_reset no device");
		return -ENODEV;
	}

	panel = mdp3_session->panel;
	mdp3_dma = mdp3_session->dma;
	mutex_lock(&mdp3_session->lock);

	vsync_client = mdp3_dma->vsync_client;

	rc = mdp3_dma->stop(mdp3_dma, mdp3_session->intf);
	if (rc) {
		pr_err("fail to stop the MDP3 dma\n");
		goto reset_error;
	}

	rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, NULL);
	if (rc)
		pr_err("fail to turn off panel\n");

	rc = mdp3_ctrl_res_req_clk(mfd, 0);
	if (rc) {
		pr_err("fail to release mdp clocks\n");
		goto reset_error;
	}

	rc = panel->event_handler(panel, MDSS_EVENT_BLANK, NULL);
	if (rc) {
		pr_err("fail to blank the panel\n");
		goto reset_error;
	}

	rc = mdp3_iommu_enable(MDP3_CLIENT_DMA_P);
	if (rc) {
		pr_err("fail to attach dma iommu\n");
		goto reset_error;
	}

	rc = panel->event_handler(panel, MDSS_EVENT_UNBLANK, NULL);
	if (rc) {
		pr_err("fail to unblank the panel\n");
		goto reset_error;
	}

	rc = panel->event_handler(panel, MDSS_EVENT_PANEL_ON, NULL);
	if (rc) {
		pr_err("fail to turn on the panel\n");
		goto reset_error;
	}

	rc = mdp3_ctrl_res_req_clk(mfd, 1);
	if (rc) {
		pr_err("fail to turn on mdp clks\n");
		goto reset_error;
	}

	mdp3_ctrl_intf_init(mfd, mdp3_session->intf);
	mdp3_ctrl_dma_init(mfd, mdp3_dma);

	if (vsync_client.handler)
		mdp3_dma->vsync_enable(mdp3_dma, &vsync_client);

	if (mfd->fbi->screen_base)
		rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf);

reset_error:
	mutex_unlock(&mdp3_session->lock);
	return rc;
}

static int mdp3_overlay_get(struct msm_fb_data_type *mfd,
				struct mdp_overlay *req)
{
@@ -680,8 +762,7 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd)

	if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) {
		pr_debug("continuous splash screen, IOMMU not attached\n");
		mdp3_ctrl_off(mfd);
		mdp3_ctrl_on(mfd);
		mdp3_ctrl_reset(mfd);
	}
	mdp3_release_splash_memory();

@@ -728,8 +809,7 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)

	if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) {
		pr_debug("continuous splash screen, IOMMU not attached\n");
		mdp3_ctrl_off(mfd);
		mdp3_ctrl_on(mfd);
		mdp3_ctrl_reset(mfd);
	}

	mutex_lock(&mdp3_session->lock);
+1 −0
Original line number Diff line number Diff line
@@ -831,6 +831,7 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf)
					MDP3_DMA_CALLBACK_TYPE_DMA_DONE);

	init_completion(&dma->dma_comp);
	dma->vsync_client.handler = NULL;
	return ret;
}