msm_fb: display: add wfd suspend/resume to early suspend

wfd on/off was handled by fb_on/fb_close which are called from video
or userspace side. However, this is not the case for this branch. mdp
driver has to register wfd for suspend to make sure proper panel
on/off happen.

Change-Id: If1836598e5ae95e4b2b72e40dc85784a0d20c843
Signed-off-by: Huaibin Yang <huaibiny@codeaurora.org>
This commit is contained in:
Huaibin Yang 2013-01-28 10:44:10 -08:00 committed by Iliyan Malchev
parent 54898d0cd6
commit 4b11a6f021
3 changed files with 18 additions and 6 deletions

View file

@ -1512,7 +1512,7 @@ u32 mdp_get_panel_framerate(struct msm_fb_data_type *mfd)
if (frame_rate == 0) {
frame_rate = DEFAULT_FRAME_RATE;
pr_warn("%s frame rate=%d is default\n", __func__, frame_rate);
pr_debug("%s frame rate=%d is default\n", __func__, frame_rate);
}
pr_debug("%s frame rate=%d total_pixel=%d, pixel_rate=%d\n", __func__,
frame_rate, total_pixel, pixel_rate);
@ -2325,6 +2325,8 @@ static int mdp_off(struct platform_device *pdev)
mfd->panel.type == LCDC_PANEL ||
mfd->panel.type == LVDS_PANEL)
mdp4_lcdc_off(pdev);
else if (mfd->panel.type == WRITEBACK_PANEL)
mdp4_overlay_writeback_off(pdev);
mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
ret = panel_next_off(pdev);

View file

@ -167,9 +167,14 @@ int mdp4_overlay_writeback_on(struct platform_device *pdev)
(0x0 & 0xFFF)); /* 12-bit R */
mdp_clk_ctrl(0);
atomic_set(&vctrl->suspend, 0);
return ret;
}
static void mdp4_wfd_wait4ov(int cndx);
int mdp4_overlay_writeback_off(struct platform_device *pdev)
{
int cndx = 0;
@ -186,17 +191,23 @@ int mdp4_overlay_writeback_off(struct platform_device *pdev)
vctrl = &vsync_ctrl_db[cndx];
pipe = vctrl->base_pipe;
atomic_set(&vctrl->suspend, 1);
if (pipe == NULL) {
pr_err("%s: NO base pipe\n", __func__);
return ret;
}
complete(&vctrl->ov_comp);
msleep(20);
mdp_clk_ctrl(1);
/* sanity check, free pipes besides base layer */
mdp4_overlay_unset_mixer(pipe->mixer_num);
mdp4_mixer_stage_down(pipe, 1);
mdp4_overlay_pipe_free(pipe);
vctrl->base_pipe = NULL;
mdp_clk_ctrl(0);
undx = vctrl->update_ndx;
vp = &vctrl->vlist[undx];
if (vp->update_cnt) {
@ -322,8 +333,6 @@ void mdp4_wfd_pipe_queue(int cndx, struct mdp4_overlay_pipe *pipe)
mdp4_stat.overlay_play[pipe->mixer_num]++;
}
static void mdp4_wfd_wait4ov(int cndx);
int mdp4_wfd_pipe_commit(struct msm_fb_data_type *mfd,
int cndx, int wait)
{
@ -361,6 +370,7 @@ int mdp4_wfd_pipe_commit(struct msm_fb_data_type *mfd,
/* free previous committed iommu back to pool */
mdp4_overlay_iommu_unmap_freelist(mixer);
mdp_clk_ctrl(1);
pipe = vp->plist;
for (i = 0; i < OVERLAY_PIPE_MAX; i++, pipe++) {
if (pipe->pipe_used) {
@ -429,6 +439,7 @@ void mdp4_wfd_init(int cndx)
vctrl->update_ndx = 0;
mutex_init(&vctrl->update_lock);
init_completion(&vctrl->ov_comp);
atomic_set(&vctrl->suspend, 1);
spin_lock_init(&vctrl->spin_lock);
INIT_WORK(&vctrl->clk_work, clk_ctrl_work);
}

View file

@ -1551,8 +1551,7 @@ static int msm_fb_register(struct msm_fb_data_type *mfd)
#ifdef CONFIG_HAS_EARLYSUSPEND
if (hdmi_prim_display ||
(mfd->panel_info.type != DTV_PANEL &&
mfd->panel_info.type != WRITEBACK_PANEL)) {
(mfd->panel_info.type != DTV_PANEL)) {
mfd->early_suspend.suspend = msmfb_early_suspend;
mfd->early_suspend.resume = msmfb_early_resume;
mfd->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 2;