media: v4l: vsp1: Turn frame end completion status into a bitfield
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 4 Apr 2018 21:30:49 +0000 (17:30 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 4 May 2018 12:02:00 +0000 (08:02 -0400)
We will soon need to return more than a boolean completion status from
the vsp1_dlm_irq_frame_end() IRQ handler. Turn the return value into a
bitfield to prepare for that. No functional change is introduced here.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vsp1/vsp1_dl.c
drivers/media/platform/vsp1/vsp1_dl.h
drivers/media/platform/vsp1/vsp1_drm.c
drivers/media/platform/vsp1/vsp1_pipe.c
drivers/media/platform/vsp1/vsp1_pipe.h
drivers/media/platform/vsp1/vsp1_video.c

index 0b86ed01e85db433ad9e11e0271247854232983a..662fa2a347c94336c6d589f629b727705b15340f 100644 (file)
@@ -616,14 +616,18 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl)
  * 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);
 
@@ -634,7 +638,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
        if (dlm->singleshot) {
                __vsp1_dl_list_put(dlm->active);
                dlm->active = NULL;
-               completed = true;
+               flags |= VSP1_DL_FRAME_END_COMPLETED;
                goto done;
        }
 
@@ -655,7 +659,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
                __vsp1_dl_list_put(dlm->active);
                dlm->active = dlm->queued;
                dlm->queued = NULL;
-               completed = true;
+               flags |= VSP1_DL_FRAME_END_COMPLETED;
        }
 
        /*
@@ -672,7 +676,7 @@ bool vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
 done:
        spin_unlock(&dlm->lock);
 
-       return completed;
+       return flags;
 }
 
 /* Hardware Setup */
index ee3508172f0a7fd4b4fb17082c48caebb64aaa6b..cbc2fc53e10b5f2a50a281412d95049d8f4e7a5b 100644 (file)
@@ -20,6 +20,8 @@ struct vsp1_dl_fragment;
 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,
@@ -27,7 +29,7 @@ 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);
index a7cccc9b05ef8add613c2c75397946fba87e0406..541473b1df67fdec1abfc557add79bbd46fe04ba 100644 (file)
  */
 
 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);
 }
 
 /* -----------------------------------------------------------------------------
index 99ccbac3256afcb2ea550f2d5c0b53980cee59e9..1134f14ed4aa11c032ccf075d566ccc8012d876d 100644 (file)
@@ -315,17 +315,17 @@ bool vsp1_pipeline_ready(struct vsp1_pipeline *pipe)
 
 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);
@@ -338,7 +338,7 @@ void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
         * frame_end to account for vblank events.
         */
        if (pipe->frame_end)
-               pipe->frame_end(pipe, completed);
+               pipe->frame_end(pipe, flags);
 
        pipe->sequence++;
 }
index dfff9b5685fe8fa1433f54397070fc303778b579..412da67527c0ba39a0c93dd9df467733ed2d4b3c 100644 (file)
@@ -118,7 +118,7 @@ struct vsp1_pipeline {
        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;
index cdd53d6cc408d24c63def64f4dea87c2b670ae6b..4152704c2ccb26a4807c07ef680b69389d3480ed 100644 (file)
@@ -444,7 +444,7 @@ static void vsp1_video_pipeline_run(struct vsp1_pipeline *pipe)
 }
 
 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;
@@ -452,7 +452,7 @@ static void vsp1_video_pipeline_frame_end(struct vsp1_pipeline *pipe,
        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);