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

Commit 9093394d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mdp3: Wait for proper vsync when updating display frame"

parents ef5c35bd ec25030c
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,