]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: v4l2-ioctl: create helper to fill in v4l2_standard for ENUMSTD
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Thu, 17 May 2018 14:30:15 +0000 (10:30 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Thu, 28 Jun 2018 11:29:24 +0000 (07:29 -0400)
Prepare for adding a new IOCTL VIDIOC_SUBDEV_ENUMSTD which would
enumerate the standards for a subdevice by breaking out the code which
could be shared between the video and subdevice versions of this IOCTL.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
[hans.verkuil@cisco.com: fixed 'sdandard' typos in v4l2-ioctl.h]
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/v4l2-core/v4l2-ioctl.c
include/media/v4l2-ioctl.h

index dd210067151f8ad0f92bc4e5c5e52bea4e834101..eeed14468a176e832b7aaec014058768c321f44d 100644 (file)
@@ -125,6 +125,42 @@ int v4l2_video_std_construct(struct v4l2_standard *vs,
 }
 EXPORT_SYMBOL(v4l2_video_std_construct);
 
+/* Fill in the fields of a v4l2_standard structure according to the
+ * 'id' and 'vs->index' parameters. Returns negative on error. */
+int v4l_video_std_enumstd(struct v4l2_standard *vs, v4l2_std_id id)
+{
+       v4l2_std_id curr_id = 0;
+       unsigned int index = vs->index, i, j = 0;
+       const char *descr = "";
+
+       /* Return -ENODATA if the id for the current input
+          or output is 0, meaning that it doesn't support this API. */
+       if (id == 0)
+               return -ENODATA;
+
+       /* Return norm array in a canonical way */
+       for (i = 0; i <= index && id; i++) {
+               /* last std value in the standards array is 0, so this
+                  while always ends there since (id & 0) == 0. */
+               while ((id & standards[j].std) != standards[j].std)
+                       j++;
+               curr_id = standards[j].std;
+               descr = standards[j].descr;
+               j++;
+               if (curr_id == 0)
+                       break;
+               if (curr_id != V4L2_STD_PAL &&
+                               curr_id != V4L2_STD_SECAM &&
+                               curr_id != V4L2_STD_NTSC)
+                       id &= ~curr_id;
+       }
+       if (i <= index)
+               return -EINVAL;
+
+       v4l2_video_std_construct(vs, curr_id, descr);
+       return 0;
+}
+
 /* ----------------------------------------------------------------- */
 /* some arrays for pretty-printing debug messages of enum types      */
 
@@ -1753,36 +1789,8 @@ static int v4l_enumstd(const struct v4l2_ioctl_ops *ops,
 {
        struct video_device *vfd = video_devdata(file);
        struct v4l2_standard *p = arg;
-       v4l2_std_id id = vfd->tvnorms, curr_id = 0;
-       unsigned int index = p->index, i, j = 0;
-       const char *descr = "";
-
-       /* Return -ENODATA if the tvnorms for the current input
-          or output is 0, meaning that it doesn't support this API. */
-       if (id == 0)
-               return -ENODATA;
 
-       /* Return norm array in a canonical way */
-       for (i = 0; i <= index && id; i++) {
-               /* last std value in the standards array is 0, so this
-                  while always ends there since (id & 0) == 0. */
-               while ((id & standards[j].std) != standards[j].std)
-                       j++;
-               curr_id = standards[j].std;
-               descr = standards[j].descr;
-               j++;
-               if (curr_id == 0)
-                       break;
-               if (curr_id != V4L2_STD_PAL &&
-                               curr_id != V4L2_STD_SECAM &&
-                               curr_id != V4L2_STD_NTSC)
-                       id &= ~curr_id;
-       }
-       if (i <= index)
-               return -EINVAL;
-
-       v4l2_video_std_construct(p, curr_id, descr);
-       return 0;
+       return v4l_video_std_enumstd(p, vfd->tvnorms);
 }
 
 static int v4l_s_std(const struct v4l2_ioctl_ops *ops,
index a8dbf5b54b5cc936f55e87b66f9382fba867cfe4..5848d92c30da3ddd4ee24f806eaa10315603b2e5 100644 (file)
@@ -621,7 +621,7 @@ const char *v4l2_norm_to_name(v4l2_std_id id);
  * v4l2_video_std_frame_period - Ancillary routine that fills a
  *     struct &v4l2_fract pointer with the default framerate fraction.
  *
- * @id: analog TV sdandard ID.
+ * @id: analog TV standard ID.
  * @frameperiod: struct &v4l2_fract pointer to be filled
  *
  */
@@ -632,7 +632,7 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod);
  *     a &v4l2_standard structure according to the @id parameter.
  *
  * @vs: struct &v4l2_standard pointer to be filled
- * @id: analog TV sdandard ID.
+ * @id: analog TV standard ID.
  * @name: name of the standard to be used
  *
  * .. note::
@@ -642,6 +642,17 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod);
 int v4l2_video_std_construct(struct v4l2_standard *vs,
                                    int id, const char *name);
 
+/**
+ * v4l_video_std_enumstd - Ancillary routine that fills in the fields of
+ *     a &v4l2_standard structure according to the @id and @vs->index
+ *     parameters.
+ *
+ * @vs: struct &v4l2_standard pointer to be filled.
+ * @id: analog TV standard ID.
+ *
+ */
+int v4l_video_std_enumstd(struct v4l2_standard *vs, v4l2_std_id id);
+
 /**
  * v4l_printk_ioctl - Ancillary routine that prints the ioctl in a
  *     human-readable format.