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

Commit ec25030c authored by Terence Hampson's avatar Terence Hampson
Browse files

mdp3: Wait for proper vsync when updating display frame



This fixes an issue where we would report that dma is displaying
new frame, but in fact were really still displaying the old
frame.

Change-Id: I99dc89b2341481ea42f9cce451b9b2833dd1f700
Signed-off-by: default avatarTerence Hampson <thampson@codeaurora.org>
parent bf850d5a
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -186,6 +186,7 @@ static irqreturn_t mdp3_irq_handler(int irq, void *ptr)
	int i = 0;
	struct mdp3_hw_resource *mdata = (struct mdp3_hw_resource *)ptr;
	u32 mdp_interrupt = 0;
	u32 mdp_status = 0;

	spin_lock(&mdata->irq_lock);
	if (!mdata->irq_mask)
@@ -194,8 +195,8 @@ static irqreturn_t mdp3_irq_handler(int irq, void *ptr)
	clk_enable(mdp3_res->clocks[MDP3_CLK_AHB]);
	clk_enable(mdp3_res->clocks[MDP3_CLK_CORE]);

	mdp_interrupt = MDP3_REG_READ(MDP3_REG_INTR_STATUS);
	MDP3_REG_WRITE(MDP3_REG_INTR_CLEAR, mdp_interrupt);
	mdp_status = MDP3_REG_READ(MDP3_REG_INTR_STATUS);
	mdp_interrupt = mdp_status;
	pr_debug("mdp3_irq_handler irq=%d\n", mdp_interrupt);

	mdp_interrupt &= mdata->irq_mask;
@@ -206,6 +207,7 @@ static irqreturn_t mdp3_irq_handler(int irq, void *ptr)
		mdp_interrupt = mdp_interrupt >> 1;
		i++;
	}
	MDP3_REG_WRITE(MDP3_REG_INTR_CLEAR, mdp_status);

	clk_disable(mdp3_res->clocks[MDP3_CLK_AHB]);
	clk_disable(mdp3_res->clocks[MDP3_CLK_CORE]);
+1 −1
Original line number Diff line number Diff line
@@ -981,7 +981,7 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd,
		mdp3_bufq_push(&mdp3_session->bufq_out, data);
	}

	if (mdp3_bufq_count(&mdp3_session->bufq_out) > 2) {
	if (mdp3_bufq_count(&mdp3_session->bufq_out) > 1) {
		data = mdp3_bufq_pop(&mdp3_session->bufq_out);
		if (data)
			mdp3_put_img(data, MDP3_CLIENT_DMA_P);
+13 −5
Original line number Diff line number Diff line
@@ -28,17 +28,23 @@ static void mdp3_vsync_intr_handler(int type, void *arg)
{
	struct mdp3_dma *dma = (struct mdp3_dma *)arg;
	struct mdp3_vsync_notification vsync_client;
	unsigned int wait_for_next_vs;

	pr_debug("mdp3_vsync_intr_handler\n");
	spin_lock(&dma->dma_lock);
	vsync_client = dma->vsync_client;
	wait_for_next_vs = !dma->vsync_status;
	dma->vsync_status = 0;
	if (wait_for_next_vs)
		complete(&dma->vsync_comp);
	spin_unlock(&dma->dma_lock);
	if (vsync_client.handler)
	if (vsync_client.handler) {
		vsync_client.handler(vsync_client.arg);
	else
	} else {
		if (wait_for_next_vs)
			mdp3_irq_disable_nosync(type);
	}
}

static void mdp3_dma_done_intr_handler(int type, void *arg)
{
@@ -567,7 +573,9 @@ static int mdp3_dmap_update(struct mdp3_dma *dma, void *buf,
		intf->start(intf);
	}

	wmb();
	mb();
	dma->vsync_status = MDP3_REG_READ(MDP3_REG_INTR_STATUS) &
		(1 << MDP3_INTR_LCDC_START_OF_FRAME);
	init_completion(&dma->vsync_comp);
	spin_unlock_irqrestore(&dma->dma_lock, flag);

+1 −0
Original line number Diff line number Diff line
@@ -256,6 +256,7 @@ struct mdp3_dma {
	struct mdp3_dma_histogram_config histogram_config;
	int histo_state;
	struct mdp3_dma_histogram_data histo_data;
	unsigned int vsync_status;

	int (*dma_config)(struct mdp3_dma *dma,
			struct mdp3_dma_source *source_config,