msm: mdss: fix issues related to transitions in and out of doze mode

When entering doze mode, ensure that the tear-check setup is not
torn down. In addition, do not disable the split-display configuration.
This is to ensure that mdss driver can continue to handle any display
updates in doze mode. Similarly, when transitioning from doze power
state to blank power state, ensure that we do not send panel unblank and
panel on events. These events should only be sent when transitioning to
unblank power state.

Change-Id: If5ca1cdd20bb442e773912575c0a6e204c0ca1a2
Signed-off-by: Aravind Venkateswaran <aravindh@codeaurora.org>
This commit is contained in:
Aravind Venkateswaran 2014-09-09 17:10:35 -07:00 committed by David Keitel
parent cafebb8cdf
commit 19a0721e64
2 changed files with 9 additions and 6 deletions

View file

@ -2353,7 +2353,6 @@ int mdss_mdp_ctl_stop(struct mdss_mdp_ctl *ctl, int power_state)
if (ctl->panel_data->panel_info.fbc.enabled)
mdss_mdp_ctl_fbc_enable(0, sctl->mixer_left,
&sctl->panel_data->panel_info);
mdss_mdp_ctl_split_display_enable(0, ctl, sctl);
}
if (ret) {
pr_warn("error powering off intf ctl=%d\n", ctl->num);
@ -2365,6 +2364,9 @@ int mdss_mdp_ctl_stop(struct mdss_mdp_ctl *ctl, int power_state)
goto end;
}
if (sctl)
mdss_mdp_ctl_split_display_enable(0, ctl, sctl);
mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_TOP, 0);
if (sctl)
mdss_mdp_ctl_write(sctl, MDSS_MDP_REG_CTL_TOP, 0);

View file

@ -59,9 +59,9 @@ struct mdss_mdp_cmd_ctx mdss_mdp_cmd_ctx_list[MAX_SESSIONS];
static int mdss_mdp_cmd_do_notifier(struct mdss_mdp_cmd_ctx *ctx);
static bool __mdss_mdp_cmd_panel_power_on(struct mdss_mdp_cmd_ctx *ctx)
static bool __mdss_mdp_cmd_panel_power_off(struct mdss_mdp_cmd_ctx *ctx)
{
return (ctx->panel_power_state == MDSS_PANEL_POWER_ON);
return mdss_panel_is_power_off(ctx->panel_power_state);
}
static inline u32 mdss_mdp_cmd_line_count(struct mdss_mdp_ctl *ctl)
@ -216,7 +216,7 @@ static inline void mdss_mdp_cmd_clk_on(struct mdss_mdp_cmd_ctx *ctx)
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
int irq_en, rc;
if (!__mdss_mdp_cmd_panel_power_on(ctx))
if (__mdss_mdp_cmd_panel_power_off(ctx))
return;
mutex_lock(&ctx->clk_mtx);
@ -737,7 +737,7 @@ int mdss_mdp_cmd_kickoff(struct mdss_mdp_ctl *ctl, void *arg)
PERF_HW_MDP_STATE, PERF_STATUS_BUSY);
}
if (!__mdss_mdp_cmd_panel_power_on(ctx)) {
if (__mdss_mdp_cmd_panel_power_off(ctx)) {
rc = mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_UNBLANK, NULL);
WARN(rc, "intf %d unblank error (%d)\n", ctl->intf_num, rc);
@ -948,7 +948,8 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state)
(void *) (long int) panel_power_state);
WARN(ret, "intf %d unblank error (%d)\n", ctl->intf_num, ret);
mdss_mdp_cmd_tearcheck_setup(ctl, false);
if (panel_power_state != MDSS_PANEL_POWER_DOZE)
mdss_mdp_cmd_tearcheck_setup(ctl, false);
}
if (panel_power_state != MDSS_PANEL_POWER_OFF) {