}
 }
 
+static void init_buffer_cache_hints(struct vb2_queue *q, struct vb2_buffer *vb)
+{
+       /*
+        * DMA exporter should take care of cache syncs, so we can avoid
+        * explicit ->prepare()/->finish() syncs. For other ->memory types
+        * we always need ->prepare() or/and ->finish() cache sync.
+        */
+       if (q->memory == VB2_MEMORY_DMABUF) {
+               vb->skip_cache_sync_on_finish = 1;
+               vb->skip_cache_sync_on_prepare = 1;
+               return;
+       }
+
+       /*
+        * ->finish() cache sync can be avoided when queue direction is
+        * TO_DEVICE.
+        */
+       if (q->dma_dir == DMA_TO_DEVICE)
+               vb->skip_cache_sync_on_finish = 1;
+}
+
 /*
  * __vb2_queue_alloc() - allocate videobuf buffer structures and (for MMAP type)
  * video buffer memory for all buffers/planes on the queue and initializes the
                vb->index = q->num_buffers + buffer;
                vb->type = q->type;
                vb->memory = memory;
+               init_buffer_cache_hints(q, vb);
                for (plane = 0; plane < num_planes; ++plane) {
                        vb->planes[plane].length = plane_sizes[plane];
                        vb->planes[plane].min_length = plane_sizes[plane];
 
                                   struct vb2_buffer *vb,
                                   struct v4l2_buffer *b)
 {
-       /*
-        * DMA exporter should take care of cache syncs, so we can avoid
-        * explicit ->prepare()/->finish() syncs. For other ->memory types
-        * we always need ->prepare() or/and ->finish() cache sync.
-        */
-       if (q->memory == VB2_MEMORY_DMABUF) {
-               vb->skip_cache_sync_on_finish = 1;
-               vb->skip_cache_sync_on_prepare = 1;
-               return;
-       }
-
        if (!vb2_queue_allows_cache_hints(q)) {
                /*
                 * Clear buffer cache flags if queue does not support user
                return;
        }
 
-       /*
-        * ->finish() cache sync can be avoided when queue direction is
-        * TO_DEVICE.
-        */
-       if (q->dma_dir == DMA_TO_DEVICE)
-               vb->skip_cache_sync_on_finish = 1;
-
        if (b->flags & V4L2_BUF_FLAG_NO_CACHE_INVALIDATE)
                vb->skip_cache_sync_on_finish = 1;