diff options
| author | Ingrid Gallardo <ingridg@codeaurora.org> | 2017-02-10 09:53:14 -0800 |
|---|---|---|
| committer | Ingrid Gallardo <ingridg@codeaurora.org> | 2017-02-10 14:08:53 -0800 |
| commit | 8c600ca02d44454875ed296a3fe7238bc00b4174 (patch) | |
| tree | e0a11068a6852a531e3d649586bca27a0dda149f | |
| parent | 487ff740cb8a0111016b0da2616aa8104cb0d440 (diff) | |
msm: mdss: fix autorefresh during kickoff
When autorefresh is enabled, any kickoff that
gets processed needs to wait to make sure the
transfer is on-going before continuing
the commit; current driver only waits for
autorefresh interrupt but this doesn't
guarantee that transfer is already on-going.
This change waits for the write pointer,
to make sure a transfer is on-going.
Change-Id: I247b3aad8f2f6ea8954d54f34492e293f80f99d4
Signed-off-by: Ingrid Gallardo <ingridg@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index 2a62ae5881b3..d2579cc6b863 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -2647,10 +2647,11 @@ static void mdss_mdp_cmd_wait4_autorefresh_done(struct mdss_mdp_ctl *ctl) struct mdss_mdp_cmd_ctx *ctx = ctl->intf_ctx[MASTER_CTX]; unsigned long flags; unsigned long autorefresh_timeout; + u32 timeout_us = 20000; line_out = mdss_mdp_pingpong_read(pp_base, MDSS_MDP_REG_PP_LINE_COUNT); - MDSS_XLOG(ctl->num, line_out, ctl->mixer_left->roi.h); + MDSS_XLOG(ctl->num, line_out, ctl->mixer_left->roi.h, 0x111); reinit_completion(&ctx->autorefresh_done); @@ -2709,6 +2710,26 @@ static void mdss_mdp_cmd_wait4_autorefresh_done(struct mdss_mdp_ctl *ctl) "dsi1_ctrl", "dsi1_phy", "vbif", "vbif_nrt", "dbg_bus", "vbif_dbg_bus", "panic"); } + + /* once autorefresh is done, wait for write pointer */ + line_out = mdss_mdp_pingpong_read(pp_base, MDSS_MDP_REG_PP_LINE_COUNT); + MDSS_XLOG(ctl->num, line_out, 0x222); + + /* wait until the first line is out to make sure transfer is on-going */ + rc = readl_poll_timeout(pp_base + + MDSS_MDP_REG_PP_LINE_COUNT, val, + (val & 0xffff) >= 1, 10, timeout_us); + + if (rc) { + pr_err("timed out waiting for line out ctl:%d val:0x%x\n", + ctl->num, val); + MDSS_XLOG(0xbad5, val); + MDSS_XLOG_TOUT_HANDLER("mdp", "dsi0_ctrl", "dsi0_phy", + "dsi1_ctrl", "dsi1_phy", "vbif", "vbif_nrt", + "dbg_bus", "vbif_dbg_bus", "panic"); + } + + MDSS_XLOG(val, 0x333); } /* caller needs to hold autorefresh_lock before calling this function */ |
