diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h index 5b0959c49628a014ebbc7132d2f8ebe4927a3445..5516c6aa9eddb98343645fc196f467447dc3e65b 100644 --- a/drivers/video/msm/mdss/mdss_dsi.h +++ b/drivers/video/msm/mdss/mdss_dsi.h @@ -281,6 +281,7 @@ struct mdss_dsi_ctrl_pdata { int new_fps; int pwm_enabled; int idle; + int idle_requested; bool bklt_off; bool blanked; struct pwm_device *pwm_bl; diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index 5a8d963ad0a2608384de73c15336a2519910c98b..a928f3b3dee3decf22be2ca2bec9b4316d5de85f 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -270,15 +270,19 @@ static void idle_on_work(struct work_struct *work) static void __mdss_dsi_panel_set_idle_mode(struct mdss_dsi_ctrl_pdata *ctrl, int enable) { - /* don't need to set idle mode if display is blanked */ + if (!ctrl->idle_requested && enable) { + pr_debug("%s: idle: no control from userspace\n", __func__); + return; + } + if (ctrl->blanked) { pr_debug("%s: idle: already blanked\n", __func__); - return; + goto done; } if (ctrl->idle == enable) { pr_debug("%s: idle: no change(%d)\n", __func__, enable); - return; + goto done; } pr_debug("%s: idle %d->%d\n", __func__, ctrl->idle, enable); @@ -294,6 +298,9 @@ static void __mdss_dsi_panel_set_idle_mode(struct mdss_dsi_ctrl_pdata *ctrl, mdss_dsi_panel_cmds_send(ctrl, &ctrl->idle_off_cmds); } } + +done: + ctrl->idle_requested = 0; } static void mdss_dsi_panel_set_idle_mode(struct mdss_panel_data *pdata, @@ -309,6 +316,8 @@ static void mdss_dsi_panel_set_idle_mode(struct mdss_panel_data *pdata, ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); + ctrl->idle_requested = 1; + if (enable && !ctrl->bklt_off) return; // will enable idle later when blkt is off