Loading drivers/video/msm/mdss/mdp3_ctrl.c +25 −8 Original line number Diff line number Diff line Loading @@ -152,10 +152,32 @@ int mdp3_ctrl_notify(struct mdp3_session_data *ses, int event) return blocking_notifier_call_chain(&ses->notifier_head, event, ses); } static void __mdp3_dispatch_dma_done(struct mdp3_session_data *session) { int cnt; cnt = atomic_read(&session->dma_done_cnt); MDSS_XLOG(cnt); while (cnt > 0) { mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); atomic_dec(&session->dma_done_cnt); cnt--; } } void mdp3_flush_dma_done(struct mdp3_session_data *session) { if (!session) return; pr_debug("%s\n", __func__); __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_dma_done(struct kthread_work *work) { struct mdp3_session_data *session; int cnt = 0; pr_debug("%s\n", __func__); session = container_of(work, struct mdp3_session_data, Loading @@ -163,13 +185,7 @@ static void mdp3_dispatch_dma_done(struct kthread_work *work) if (!session) return; cnt = atomic_read(&session->dma_done_cnt); MDSS_XLOG(cnt); while (cnt > 0) { mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); atomic_dec(&session->dma_done_cnt); cnt--; } __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_clk_off(struct work_struct *work) Loading Loading @@ -3219,6 +3235,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) pr_err("fail to init dma\n"); goto init_done; } mdp3_session->dma->session = mdp3_session; intf_type = mdp3_ctrl_get_intf_type(mfd); mdp3_session->intf = mdp3_get_display_intf(intf_type); Loading drivers/video/msm/mdss/mdp3_ctrl.h +1 −0 Original line number Diff line number Diff line Loading @@ -96,5 +96,6 @@ int mdp3_ctrl_get_pack_pattern(u32 imgType); int mdp3_ctrl_reset(struct msm_fb_data_type *mfd); int mdp3_get_ion_client(struct msm_fb_data_type *mfd); int config_secure_display(struct mdp3_session_data *mdp3_session); void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session); #endif /* MDP3_CTRL_H */ drivers/video/msm/mdss/mdp3_dma.c +10 −0 Original line number Diff line number Diff line Loading @@ -1162,6 +1162,16 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) reinit_completion(&dma->dma_comp); dma->vsync_client.handler = NULL; /* * Interrupts are disabled. * Check for blocked dma done interrupt. * Flush items waiting for dma done interrupt. */ if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD && atomic_read(&dma->session->dma_done_cnt)) mdp3_flush_dma_done(dma->session); return ret; } Loading drivers/video/msm/mdss/mdp3_dma.h +2 −0 Original line number Diff line number Diff line Loading @@ -294,6 +294,8 @@ struct mdp3_dma { struct fb_cmap *gc_cmap; struct fb_cmap *hist_cmap; struct mdp3_session_data *session; bool (*busy)(void); int (*dma_config)(struct mdp3_dma *dma, Loading Loading
drivers/video/msm/mdss/mdp3_ctrl.c +25 −8 Original line number Diff line number Diff line Loading @@ -152,10 +152,32 @@ int mdp3_ctrl_notify(struct mdp3_session_data *ses, int event) return blocking_notifier_call_chain(&ses->notifier_head, event, ses); } static void __mdp3_dispatch_dma_done(struct mdp3_session_data *session) { int cnt; cnt = atomic_read(&session->dma_done_cnt); MDSS_XLOG(cnt); while (cnt > 0) { mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); atomic_dec(&session->dma_done_cnt); cnt--; } } void mdp3_flush_dma_done(struct mdp3_session_data *session) { if (!session) return; pr_debug("%s\n", __func__); __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_dma_done(struct kthread_work *work) { struct mdp3_session_data *session; int cnt = 0; pr_debug("%s\n", __func__); session = container_of(work, struct mdp3_session_data, Loading @@ -163,13 +185,7 @@ static void mdp3_dispatch_dma_done(struct kthread_work *work) if (!session) return; cnt = atomic_read(&session->dma_done_cnt); MDSS_XLOG(cnt); while (cnt > 0) { mdp3_ctrl_notify(session, MDP_NOTIFY_FRAME_DONE); atomic_dec(&session->dma_done_cnt); cnt--; } __mdp3_dispatch_dma_done(session); } static void mdp3_dispatch_clk_off(struct work_struct *work) Loading Loading @@ -3219,6 +3235,7 @@ int mdp3_ctrl_init(struct msm_fb_data_type *mfd) pr_err("fail to init dma\n"); goto init_done; } mdp3_session->dma->session = mdp3_session; intf_type = mdp3_ctrl_get_intf_type(mfd); mdp3_session->intf = mdp3_get_display_intf(intf_type); Loading
drivers/video/msm/mdss/mdp3_ctrl.h +1 −0 Original line number Diff line number Diff line Loading @@ -96,5 +96,6 @@ int mdp3_ctrl_get_pack_pattern(u32 imgType); int mdp3_ctrl_reset(struct msm_fb_data_type *mfd); int mdp3_get_ion_client(struct msm_fb_data_type *mfd); int config_secure_display(struct mdp3_session_data *mdp3_session); void mdp3_flush_dma_done(struct mdp3_session_data *mdp3_session); #endif /* MDP3_CTRL_H */
drivers/video/msm/mdss/mdp3_dma.c +10 −0 Original line number Diff line number Diff line Loading @@ -1162,6 +1162,16 @@ static int mdp3_dma_stop(struct mdp3_dma *dma, struct mdp3_intf *intf) reinit_completion(&dma->dma_comp); dma->vsync_client.handler = NULL; /* * Interrupts are disabled. * Check for blocked dma done interrupt. * Flush items waiting for dma done interrupt. */ if (dma->output_config.out_sel == MDP3_DMA_OUTPUT_SEL_DSI_CMD && atomic_read(&dma->session->dma_done_cnt)) mdp3_flush_dma_done(dma->session); return ret; } Loading
drivers/video/msm/mdss/mdp3_dma.h +2 −0 Original line number Diff line number Diff line Loading @@ -294,6 +294,8 @@ struct mdp3_dma { struct fb_cmap *gc_cmap; struct fb_cmap *hist_cmap; struct mdp3_session_data *session; bool (*busy)(void); int (*dma_config)(struct mdp3_dma *dma, Loading