q->buf_struct_size = sizeof(struct bcap_buffer);
        q->ops = &bcap_video_qops;
        q->mem_ops = &vb2_dma_contig_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        vb2_queue_init(q);
 
 
        q->ops = &video_qops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct vpbe_disp_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret) {
 
        q->ops = &video_qops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct vpif_cap_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret) {
 
        q->ops = &video_qops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct vpif_disp_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret) {
 
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct camif_buffer);
        q->drv_priv = vp;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret)
 
        q->ops = &fimc_capture_qops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct fimc_vid_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret)
 
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct flite_buffer);
        q->drv_priv = fimc;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret < 0)
 
                goto err_queue_init;
        }
        q->mem_ops = (struct vb2_mem_ops *)&vb2_dma_contig_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_COPY;
        ret = vb2_queue_init(q);
        if (ret) {
                mfc_err("Failed to initialize videobuf2 queue(capture)\n");
                goto err_queue_init;
        }
        q->mem_ops = (struct vb2_mem_ops *)&vb2_dma_contig_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_COPY;
        ret = vb2_queue_init(q);
        if (ret) {
                mfc_err("Failed to initialize videobuf2 queue(output)\n");
 
        q->buf_struct_size = sizeof(struct frame_buffer);
        q->ops = &isi_video_qops;
        q->mem_ops = &vb2_dma_contig_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        return vb2_queue_init(q);
 }
 
        q->ops = &mx2_videobuf_ops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct mx2_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        return vb2_queue_init(q);
 }
 
        q->ops = &mx3_videobuf_ops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct mx3_camera_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        return vb2_queue_init(q);
 }
 
        q->ops = &sh_mobile_ceu_videobuf_ops;
        q->mem_ops = &vb2_dma_contig_memops;
        q->buf_struct_size = sizeof(struct sh_mobile_ceu_buffer);
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        return vb2_queue_init(q);
 }
 
        q->buf_struct_size = sizeof(struct vivi_buffer);
        q->ops = &vivi_video_qops;
        q->mem_ops = &vb2_vmalloc_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        ret = vb2_queue_init(q);
        if (ret)
 
        pdev->vb_queue.buf_struct_size = sizeof(struct pwc_frame_buf);
        pdev->vb_queue.ops = &pwc_vb_queue_ops;
        pdev->vb_queue.mem_ops = &vb2_vmalloc_memops;
+       pdev->vb_queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
        rc = vb2_queue_init(&pdev->vb_queue);
        if (rc < 0) {
                PWC_ERROR("Oops, could not initialize vb2 queue.\n");
 
        q->buf_struct_size = sizeof(struct stk1160_buffer);
        q->ops = &stk1160_video_qops;
        q->mem_ops = &vb2_vmalloc_memops;
+       q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
 
        rc = vb2_queue_init(q);
        if (rc < 0)
 
        queue->queue.buf_struct_size = sizeof(struct uvc_buffer);
        queue->queue.ops = &uvc_queue_qops;
        queue->queue.mem_ops = &vb2_vmalloc_memops;
+       queue->queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
        ret = vb2_queue_init(&queue->queue);
        if (ret)
                return ret;
 
         * Clear any buffer state related flags.
         */
        b->flags &= ~V4L2_BUFFER_MASK_FLAGS;
-       b->flags |= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
+       b->flags |= q->timestamp_type;
 
        switch (vb->state) {
        case VB2_BUF_STATE_QUEUED:
            WARN_ON(!q->type)             ||
            WARN_ON(!q->io_modes)         ||
            WARN_ON(!q->ops->queue_setup) ||
-           WARN_ON(!q->ops->buf_queue))
+           WARN_ON(!q->ops->buf_queue)   ||
+           WARN_ON(q->timestamp_type & ~V4L2_BUF_FLAG_TIMESTAMP_MASK))
                return -EINVAL;
 
+       /* Warn that the driver should choose an appropriate timestamp type */
+       WARN_ON(q->timestamp_type == V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN);
+
        INIT_LIST_HEAD(&q->queued_list);
        INIT_LIST_HEAD(&q->done_list);
        spin_lock_init(&q->done_lock);
 
        const struct vb2_mem_ops        *mem_ops;
        void                            *drv_priv;
        unsigned int                    buf_struct_size;
+       u32                             timestamp_type;
 
 /* private: internal use only */
        enum v4l2_memory                memory;