diff options
| author | Aravind Venkateswaran <aravindh@codeaurora.org> | 2014-03-12 16:36:50 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:28:19 -0700 |
| commit | b86a5bdecde45c0a9f189802e7e4696ac7061fed (patch) | |
| tree | 92ab6d3992121d75117bfe3a956fa1d71caa4652 | |
| parent | aee0c40b98a068ff5b563c124dea87a28ad87fa1 (diff) | |
msm: mdss: Turn on DSI link clocks after exiting ULPS
DSI branch clocks should only be enabled after removing the DSI clamps
when exiting the Ultra Low Power State (ULPS). If this is not enforced,
then the RCG for these clocks may not get turned on correctly which
may eventually lead to some display corruption. Fix this by
appropriately modifying ULPS exit sequence.
Change-Id: I5109dd140f8921256f95eb479dd33a73615d489f
Signed-off-by: Aravind Venkateswaran <aravindh@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi.c | 48 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 8 |
2 files changed, 50 insertions, 6 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c index 20655025a13e..34054ee2a267 100644 --- a/drivers/video/fbdev/msm/mdss_dsi.c +++ b/drivers/video/fbdev/msm/mdss_dsi.c @@ -472,7 +472,13 @@ static int mdss_dsi_ulps_config_sub(struct mdss_dsi_ctrl_pdata *ctrl_pdata, goto error; } - mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); + ret = mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 1); + if (ret) { + pr_err("%s: Failed to enable clocks. rc=%d\n", + __func__, ret); + goto error; + } + /* * ULPS Entry Request. * Wait for a short duration to ensure that the lanes @@ -480,6 +486,14 @@ static int mdss_dsi_ulps_config_sub(struct mdss_dsi_ctrl_pdata *ctrl_pdata, */ MIPI_OUTP(ctrl_pdata->ctrl_base + 0x0AC, 0x01F); usleep(100); + lane_status = MIPI_INP(ctrl_pdata->ctrl_base + 0xA8); + if (lane_status & 0x1F00) { + pr_err("%s: ULPS entry req failed. Lane status=0x%08x\n", + __func__, lane_status); + ret = -EINVAL; + mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); + goto error; + } /* Enable MMSS DSI Clamps */ MIPI_OUTP(ctrl_pdata->mmss_misc_io.base + 0x14, 0x3FF); @@ -491,10 +505,17 @@ static int mdss_dsi_ulps_config_sub(struct mdss_dsi_ctrl_pdata *ctrl_pdata, /* disable DSI controller */ mdss_dsi_controller_cfg(0, pdata); - lane_status = MIPI_INP(ctrl_pdata->ctrl_base + 0xA8), mdss_dsi_clk_ctrl(ctrl_pdata, DSI_ALL_CLKS, 0); ctrl_pdata->ulps = true; } else if (ctrl_pdata->ulps) { + ret = mdss_dsi_clk_ctrl(ctrl_pdata, DSI_BUS_CLKS, 1); + if (ret) { + pr_err("%s: Failed to enable bus clocks. rc=%d\n", + __func__, ret); + goto error; + } + + MIPI_OUTP(ctrl_pdata->mmss_misc_io.base + 0x108, 0x0); mdss_dsi_phy_init(pdata); __mdss_dsi_ctrl_setup(pdata); @@ -503,9 +524,28 @@ static int mdss_dsi_ulps_config_sub(struct mdss_dsi_ctrl_pdata *ctrl_pdata, mdss_dsi_op_mode_config(pdata->panel_info.mipi.mode, pdata); + /* + * ULPS Entry Request. This is needed because, after power + * collapse and reset, the DSI controller resets back to + * idle state and not ULPS. + * Wait for a short duration to ensure that the lanes + * enter ULP state. + */ + MIPI_OUTP(ctrl_pdata->ctrl_base + 0x0AC, 0x01F); + usleep(100); + /* Disable MMSS DSI Clamps */ + MIPI_OUTP(ctrl_pdata->mmss_misc_io.base + 0x14, 0x3FF); MIPI_OUTP(ctrl_pdata->mmss_misc_io.base + 0x14, 0x0); + ret = mdss_dsi_clk_ctrl(ctrl_pdata, DSI_LINK_CLKS, 1); + if (ret) { + pr_err("%s: Failed to enable link clocks. rc=%d\n", + __func__, ret); + mdss_dsi_clk_ctrl(ctrl_pdata, DSI_BUS_CLKS, 0); + goto error; + } + /* * ULPS Exit Request * Hardware requirement is to wait for at least 1ms @@ -520,7 +560,9 @@ static int mdss_dsi_ulps_config_sub(struct mdss_dsi_ctrl_pdata *ctrl_pdata, */ usleep(100); - lane_status = MIPI_INP(ctrl_pdata->ctrl_base + 0xA8), + lane_status = MIPI_INP(ctrl_pdata->ctrl_base + 0xA8); + mdss_dsi_clk_ctrl(ctrl_pdata, DSI_LINK_CLKS, 0); + mdss_dsi_clk_ctrl(ctrl_pdata, DSI_BUS_CLKS, 0); ctrl_pdata->ulps = false; } diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c index cf4bfacbb363..3cfdc6d87ae2 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c +++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c @@ -189,8 +189,8 @@ static inline void mdss_mdp_cmd_clk_on(struct mdss_mdp_cmd_ctx *ctx) ctx->clk_enabled = 1; if (cancel_delayed_work_sync(&ctx->ulps_work)) pr_debug("deleted pending ulps work\n"); - mdss_mdp_ctl_intf_event - (ctx->ctl, MDSS_EVENT_PANEL_CLK_CTRL, (void *)1); + + mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); if (ctx->ulps) { if (mdss_mdp_cmd_tearcheck_setup(ctx->ctl)) @@ -200,7 +200,9 @@ static inline void mdss_mdp_cmd_clk_on(struct mdss_mdp_cmd_ctx *ctx) ctx->ulps = false; } - mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); + mdss_mdp_ctl_intf_event + (ctx->ctl, MDSS_EVENT_PANEL_CLK_CTRL, (void *)1); + mdss_mdp_hist_intr_setup(&mdata->hist_intr, MDSS_IRQ_RESUME); } spin_lock_irqsave(&ctx->clk_lock, flags); |
