summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngrid Gallardo <ingridg@codeaurora.org>2015-10-15 19:00:53 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:46:53 -0700
commitf148bbf8effec3422a79d4178503222a9d35ecb5 (patch)
treea9e682ab80ac16d2d76ad315276db64917b0ea8f
parent76625c4b05a717f6163132e5c75a313984b7f65e (diff)
msm: mdss: fix off work item scheduling during early wakeup
During the early wakeup event, current code cancel any pending Gate or Off work items pending and only schedules a delayed Off work if we are transitioning from OFF state. This is a problem since resources remain enabled when multiple early wakeup calls happen and the state is different than off. Fix this problem by making sure that early wakeup schedules an Off work item if any previous work was cancel by this call. Change-Id: I3c773221b53080443c62a0e7e09ed51ec43028a4 Signed-off-by: Ingrid Gallardo <ingridg@codeaurora.org> [cip@codeaurora.org: Resolved merge conflict] Signed-off-by: Clarence Ip <cip@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index a0799404c55f..47ef5be3ecdb 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -460,6 +460,7 @@ int mdss_mdp_resource_control(struct mdss_mdp_ctl *ctl, u32 sw_event)
struct dsi_panel_clk_ctrl clk_ctrl;
u32 status;
int rc = 0;
+ bool schedule_off = false;
/* Get both controllers in the correct order for dual displays */
mdss_mdp_get_split_display_ctls(&ctl, &sctl);
@@ -718,18 +719,23 @@ int mdss_mdp_resource_control(struct mdss_mdp_ctl *ctl, u32 sw_event)
break;
/* Cancel GATE Work Item */
- if (cancel_work_sync(&ctx->gate_clk_work))
+ if (cancel_work_sync(&ctx->gate_clk_work)) {
pr_debug("%s: %s - gate_work cancelled\n",
__func__, get_sw_event_name(sw_event));
+ schedule_off = true;
+ }
/* Cancel OFF Work Item */
if (cancel_delayed_work_sync(
- &ctx->delayed_off_clk_work))
+ &ctx->delayed_off_clk_work)) {
pr_debug("%s: %s - off work cancelled\n",
__func__, get_sw_event_name(sw_event));
+ schedule_off = true;
+ }
mutex_lock(&ctl->rsrc_lock);
- MDSS_XLOG(ctl->num, mdp5_data->resources_state, sw_event, 0x44);
+ MDSS_XLOG(ctl->num, mdp5_data->resources_state, sw_event,
+ schedule_off, 0x44);
if (mdp5_data->resources_state == MDP_RSRC_CTL_STATE_OFF) {
u32 flags = CTL_INTF_EVENT_FLAG_SKIP_BROADCAST;
@@ -754,6 +760,16 @@ int mdss_mdp_resource_control(struct mdss_mdp_ctl *ctl, u32 sw_event)
mdss_mdp_cmd_clk_on(sctx);
mdp5_data->resources_state = MDP_RSRC_CTL_STATE_ON;
+ schedule_off = true;
+ }
+
+ /*
+ * Driver will schedule off work under three cases:
+ * 1. Early wakeup cancelled the gate work.
+ * 2. Early wakeup cancelled the off work.
+ * 3. Early wakeup changed the state to ON.
+ */
+ if (schedule_off) {
/*
* Schedule off work after cmd mode idle timeout is
* reached. This is to prevent the case where early wake
@@ -761,6 +777,7 @@ int mdss_mdp_resource_control(struct mdss_mdp_ctl *ctl, u32 sw_event)
*/
schedule_delayed_work(&ctx->delayed_off_clk_work,
CMD_MODE_IDLE_TIMEOUT);
+ pr_debug("off work scheduled\n");
}
mutex_unlock(&ctl->rsrc_lock);
break;