* vsp1_dlm_irq_frame_end - Display list handler for the frame end interrupt
  * @dlm: the display list manager
  *
- * Return true if the previous display list has completed at frame end, or false
- * if it has been delayed by one frame because the display list commit raced
- * with the frame end interrupt. The function always returns true in header mode
- * as display list processing is then not continuous and races never occur.
+ * Return a set of flags that indicates display list completion status.
+ *
+ * The VSP1_DL_FRAME_END_COMPLETED flag indicates that the previous display list
+ * has completed at frame end. If the flag is not returned display list
+ * completion has been delayed by one frame because the display list commit
+ * raced with the frame end interrupt. The function always returns with the flag
+ * set in header mode as display list processing is then not continuous and
+ * races never occur.
  */
-bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
+unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
 {
-       bool completed = false;
+       unsigned int flags = 0;
 
        spin_lock(&dlm->lock);
 
        if (dlm->singleshot) {
                __vsp1_dl_list_put(dlm->active);
                dlm->active = NULL;
-               completed = true;
+               flags |= VSP1_DL_FRAME_END_COMPLETED;
                goto done;
        }
 
                __vsp1_dl_list_put(dlm->active);
                dlm->active = dlm->queued;
                dlm->queued = NULL;
-               completed = true;
+               flags |= VSP1_DL_FRAME_END_COMPLETED;
        }
 
        /*
 done:
        spin_unlock(&dlm->lock);
 
-       return completed;
+       return flags;
 }
 
 /* Hardware Setup */
 
 struct vsp1_dl_list;
 struct vsp1_dl_manager;
 
+#define VSP1_DL_FRAME_END_COMPLETED            BIT(0)
+
 void vsp1_dlm_setup(struct vsp1_device *vsp1);
 
 struct vsp1_dl_manager *vsp1_dlm_create(struct vsp1_device *vsp1,
                                        unsigned int prealloc);
 void vsp1_dlm_destroy(struct vsp1_dl_manager *dlm);
 void vsp1_dlm_reset(struct vsp1_dl_manager *dlm);
-bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm);
+unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm);
 
 struct vsp1_dl_list *vsp1_dl_list_get(struct vsp1_dl_manager *dlm);
 void vsp1_dl_list_put(struct vsp1_dl_list *dl);
 
  */
 
 static void vsp1_du_pipeline_frame_end(struct vsp1_pipeline *pipe,
-                                      bool completed)
+                                      unsigned int completion)
 {
        struct vsp1_drm_pipeline *drm_pipe = to_vsp1_drm_pipeline(pipe);
 
        if (drm_pipe->du_complete)
-               drm_pipe->du_complete(drm_pipe->du_private, completed);
+               drm_pipe->du_complete(drm_pipe->du_private,
+                                     completion & VSP1_DL_FRAME_END_COMPLETED);
 }
 
 /* -----------------------------------------------------------------------------
 
 
 void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
 {
-       bool completed;
+       unsigned int flags;
 
        if (pipe == NULL)
                return;
 
        /*
         * If the DL commit raced with the frame end interrupt, the commit ends
-        * up being postponed by one frame. @completed represents whether the
+        * up being postponed by one frame. The returned flags tell whether the
         * active frame was finished or postponed.
         */
-       completed = vsp1_dlm_irq_frame_end(pipe->output->dlm);
+       flags = vsp1_dlm_irq_frame_end(pipe->output->dlm);
 
        if (pipe->hgo)
                vsp1_hgo_frame_end(pipe->hgo);
         * frame_end to account for vblank events.
         */
        if (pipe->frame_end)
-               pipe->frame_end(pipe, completed);
+               pipe->frame_end(pipe, flags);
 
        pipe->sequence++;
 }
 
        enum vsp1_pipeline_state state;
        wait_queue_head_t wq;
 
-       void (*frame_end)(struct vsp1_pipeline *pipe, bool completed);
+       void (*frame_end)(struct vsp1_pipeline *pipe, unsigned int completion);
 
        struct mutex lock;
        struct kref kref;
 
 }
 
 static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe,
-                                         bool completed)
+                                         unsigned int completion)
 {
        struct vsp1_device *vsp1 = pipe->output->entity.vsp1;
        enum vsp1_pipeline_state state;
        unsigned int i;
 
        /* M2M Pipelines should never call here with an incomplete frame. */
-       WARN_ON_ONCE(!completed);
+       WARN_ON_ONCE(!(completion & VSP1_DL_FRAME_END_COMPLETED));
 
        spin_lock_irqsave(&pipe->irqlock, flags);