Loading drivers/video/msm/mdss/mdp3_ctrl.c +84 −4 Original line number Diff line number Diff line Loading @@ -557,6 +557,88 @@ off_error: return 0; } static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd) { int rc = 0; struct mdp3_session_data *mdp3_session; struct mdp3_dma *mdp3_dma; struct mdss_panel_data *panel; struct mdp3_vsync_notification vsync_client; pr_debug("mdp3_ctrl_reset\n"); mdp3_session = (struct mdp3_session_data *)mfd->mdp.private1; if (!mdp3_session || !mdp3_session->panel || !mdp3_session->dma || !mdp3_session->intf) { pr_err("mdp3_ctrl_reset no device"); return -ENODEV; } panel = mdp3_session->panel; mdp3_dma = mdp3_session->dma; mutex_lock(&mdp3_session->lock); vsync_client = mdp3_dma->vsync_client; rc = mdp3_dma->stop(mdp3_dma, mdp3_session->intf); if (rc) { pr_err("fail to stop the MDP3 dma\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, NULL); if (rc) pr_err("fail to turn off panel\n"); rc = mdp3_ctrl_res_req_clk(mfd, 0); if (rc) { pr_err("fail to release mdp clocks\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_BLANK, NULL); if (rc) { pr_err("fail to blank the panel\n"); goto reset_error; } rc = mdp3_iommu_enable(MDP3_CLIENT_DMA_P); if (rc) { pr_err("fail to attach dma iommu\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_UNBLANK, NULL); if (rc) { pr_err("fail to unblank the panel\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_PANEL_ON, NULL); if (rc) { pr_err("fail to turn on the panel\n"); goto reset_error; } rc = mdp3_ctrl_res_req_clk(mfd, 1); if (rc) { pr_err("fail to turn on mdp clks\n"); goto reset_error; } mdp3_ctrl_intf_init(mfd, mdp3_session->intf); mdp3_ctrl_dma_init(mfd, mdp3_dma); if (vsync_client.handler) mdp3_dma->vsync_enable(mdp3_dma, &vsync_client); if (mfd->fbi->screen_base) rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf); reset_error: mutex_unlock(&mdp3_session->lock); return rc; } static int mdp3_overlay_get(struct msm_fb_data_type *mfd, struct mdp_overlay *req) { Loading Loading @@ -680,8 +762,7 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd) if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) { pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_ctrl_reset(mfd); } mdp3_release_splash_memory(); Loading Loading @@ -728,8 +809,7 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd) if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) { pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_ctrl_reset(mfd); } mutex_lock(&mdp3_session->lock); Loading drivers/video/msm/mdss/mdp3_dma.c +1 −0 Original line number Diff line number Diff line Loading @@ -831,6 +831,7 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) MDP3_DMA_CALLBACK_TYPE_DMA_DONE); init_completion(&dma->dma_comp); dma->vsync_client.handler = NULL; return ret; } Loading Loading
drivers/video/msm/mdss/mdp3_ctrl.c +84 −4 Original line number Diff line number Diff line Loading @@ -557,6 +557,88 @@ off_error: return 0; } static int mdp3_ctrl_reset(struct msm_fb_data_type *mfd) { int rc = 0; struct mdp3_session_data *mdp3_session; struct mdp3_dma *mdp3_dma; struct mdss_panel_data *panel; struct mdp3_vsync_notification vsync_client; pr_debug("mdp3_ctrl_reset\n"); mdp3_session = (struct mdp3_session_data *)mfd->mdp.private1; if (!mdp3_session || !mdp3_session->panel || !mdp3_session->dma || !mdp3_session->intf) { pr_err("mdp3_ctrl_reset no device"); return -ENODEV; } panel = mdp3_session->panel; mdp3_dma = mdp3_session->dma; mutex_lock(&mdp3_session->lock); vsync_client = mdp3_dma->vsync_client; rc = mdp3_dma->stop(mdp3_dma, mdp3_session->intf); if (rc) { pr_err("fail to stop the MDP3 dma\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_PANEL_OFF, NULL); if (rc) pr_err("fail to turn off panel\n"); rc = mdp3_ctrl_res_req_clk(mfd, 0); if (rc) { pr_err("fail to release mdp clocks\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_BLANK, NULL); if (rc) { pr_err("fail to blank the panel\n"); goto reset_error; } rc = mdp3_iommu_enable(MDP3_CLIENT_DMA_P); if (rc) { pr_err("fail to attach dma iommu\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_UNBLANK, NULL); if (rc) { pr_err("fail to unblank the panel\n"); goto reset_error; } rc = panel->event_handler(panel, MDSS_EVENT_PANEL_ON, NULL); if (rc) { pr_err("fail to turn on the panel\n"); goto reset_error; } rc = mdp3_ctrl_res_req_clk(mfd, 1); if (rc) { pr_err("fail to turn on mdp clks\n"); goto reset_error; } mdp3_ctrl_intf_init(mfd, mdp3_session->intf); mdp3_ctrl_dma_init(mfd, mdp3_dma); if (vsync_client.handler) mdp3_dma->vsync_enable(mdp3_dma, &vsync_client); if (mfd->fbi->screen_base) rc = mdp3_dma->start(mdp3_dma, mdp3_session->intf); reset_error: mutex_unlock(&mdp3_session->lock); return rc; } static int mdp3_overlay_get(struct msm_fb_data_type *mfd, struct mdp_overlay *req) { Loading Loading @@ -680,8 +762,7 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd) if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) { pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_ctrl_reset(mfd); } mdp3_release_splash_memory(); Loading Loading @@ -728,8 +809,7 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd) if (!mdp3_iommu_is_attached(MDP3_CLIENT_DMA_P)) { pr_debug("continuous splash screen, IOMMU not attached\n"); mdp3_ctrl_off(mfd); mdp3_ctrl_on(mfd); mdp3_ctrl_reset(mfd); } mutex_lock(&mdp3_session->lock); Loading
drivers/video/msm/mdss/mdp3_dma.c +1 −0 Original line number Diff line number Diff line Loading @@ -831,6 +831,7 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) MDP3_DMA_CALLBACK_TYPE_DMA_DONE); init_completion(&dma->dma_comp); dma->vsync_client.handler = NULL; return ret; } Loading