@@ -671,8 +671,20 @@ int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b)
671
671
}
672
672
EXPORT_SYMBOL (vb2_querybuf );
673
673
674
- static void fill_buf_caps (struct vb2_queue * q , u32 * caps )
674
+ static void vb2_set_flags_and_caps (struct vb2_queue * q , u32 memory ,
675
+ u32 * flags , u32 * caps , u32 * max_num_bufs )
675
676
{
677
+ if (!q -> allow_cache_hints || memory != V4L2_MEMORY_MMAP ) {
678
+ /*
679
+ * This needs to clear V4L2_MEMORY_FLAG_NON_COHERENT only,
680
+ * but in order to avoid bugs we zero out all bits.
681
+ */
682
+ * flags = 0 ;
683
+ } else {
684
+ /* Clear all unknown flags. */
685
+ * flags &= V4L2_MEMORY_FLAG_NON_COHERENT ;
686
+ }
687
+
676
688
* caps = V4L2_BUF_CAP_SUPPORTS_ORPHANED_BUFS ;
677
689
if (q -> io_modes & VB2_MMAP )
678
690
* caps |= V4L2_BUF_CAP_SUPPORTS_MMAP ;
@@ -686,21 +698,9 @@ static void fill_buf_caps(struct vb2_queue *q, u32 *caps)
686
698
* caps |= V4L2_BUF_CAP_SUPPORTS_MMAP_CACHE_HINTS ;
687
699
if (q -> supports_requests )
688
700
* caps |= V4L2_BUF_CAP_SUPPORTS_REQUESTS ;
689
- }
690
-
691
- static void validate_memory_flags (struct vb2_queue * q ,
692
- int memory ,
693
- u32 * flags )
694
- {
695
- if (!q -> allow_cache_hints || memory != V4L2_MEMORY_MMAP ) {
696
- /*
697
- * This needs to clear V4L2_MEMORY_FLAG_NON_COHERENT only,
698
- * but in order to avoid bugs we zero out all bits.
699
- */
700
- * flags = 0 ;
701
- } else {
702
- /* Clear all unknown flags. */
703
- * flags &= V4L2_MEMORY_FLAG_NON_COHERENT ;
701
+ if (max_num_bufs ) {
702
+ * max_num_bufs = q -> max_num_buffers ;
703
+ * caps |= V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS ;
704
704
}
705
705
}
706
706
@@ -709,8 +709,8 @@ int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req)
709
709
int ret = vb2_verify_memory_type (q , req -> memory , req -> type );
710
710
u32 flags = req -> flags ;
711
711
712
- fill_buf_caps (q , & req -> capabilities );
713
- validate_memory_flags ( q , req -> memory , & flags );
712
+ vb2_set_flags_and_caps (q , req -> memory , & flags ,
713
+ & req -> capabilities , NULL );
714
714
req -> flags = flags ;
715
715
return ret ? ret : vb2_core_reqbufs (q , req -> memory ,
716
716
req -> flags , & req -> count );
@@ -751,11 +751,9 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create)
751
751
int ret = vb2_verify_memory_type (q , create -> memory , f -> type );
752
752
unsigned i ;
753
753
754
- fill_buf_caps (q , & create -> capabilities );
755
- validate_memory_flags (q , create -> memory , & create -> flags );
756
754
create -> index = vb2_get_num_buffers (q );
757
- create -> max_num_buffers = q -> max_num_buffers ;
758
- create -> capabilities |= V4L2_BUF_CAP_SUPPORTS_MAX_NUM_BUFFERS ;
755
+ vb2_set_flags_and_caps ( q , create -> memory , & create -> flags ,
756
+ & create -> capabilities , & create -> max_num_buffers ) ;
759
757
if (create -> count == 0 )
760
758
return ret != - EBUSY ? ret : 0 ;
761
759
@@ -1006,8 +1004,8 @@ int vb2_ioctl_reqbufs(struct file *file, void *priv,
1006
1004
int res = vb2_verify_memory_type (vdev -> queue , p -> memory , p -> type );
1007
1005
u32 flags = p -> flags ;
1008
1006
1009
- fill_buf_caps (vdev -> queue , & p -> capabilities );
1010
- validate_memory_flags ( vdev -> queue , p -> memory , & flags );
1007
+ vb2_set_flags_and_caps (vdev -> queue , p -> memory , & flags ,
1008
+ & p -> capabilities , NULL );
1011
1009
p -> flags = flags ;
1012
1010
if (res )
1013
1011
return res ;
@@ -1026,12 +1024,11 @@ int vb2_ioctl_create_bufs(struct file *file, void *priv,
1026
1024
struct v4l2_create_buffers * p )
1027
1025
{
1028
1026
struct video_device * vdev = video_devdata (file );
1029
- int res = vb2_verify_memory_type (vdev -> queue , p -> memory ,
1030
- p -> format .type );
1027
+ int res = vb2_verify_memory_type (vdev -> queue , p -> memory , p -> format .type );
1031
1028
1032
1029
p -> index = vb2_get_num_buffers (vdev -> queue );
1033
- fill_buf_caps (vdev -> queue , & p -> capabilities );
1034
- validate_memory_flags ( vdev -> queue , p -> memory , & p -> flags );
1030
+ vb2_set_flags_and_caps (vdev -> queue , p -> memory , & p -> flags ,
1031
+ & p -> capabilities , & p -> max_num_buffers );
1035
1032
/*
1036
1033
* If count == 0, then just check if memory and type are valid.
1037
1034
* Any -EBUSY result from vb2_verify_memory_type can be mapped to 0.
0 commit comments