Commit aa2f8871 authored by Niklas Söderlund's avatar Niklas Söderlund Committed by Mauro Carvalho Chehab

media: v4l2-ioctl: create helper to fill in v4l2_standard for ENUMSTD

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: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
[hans.verkuil@cisco.com: fixed 'sdandard' typos in v4l2-ioctl.h]
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 39fb9930
...@@ -125,6 +125,42 @@ int v4l2_video_std_construct(struct v4l2_standard *vs, ...@@ -125,6 +125,42 @@ int v4l2_video_std_construct(struct v4l2_standard *vs,
} }
EXPORT_SYMBOL(v4l2_video_std_construct); 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 */ /* some arrays for pretty-printing debug messages of enum types */
...@@ -1753,36 +1789,8 @@ static int v4l_enumstd(const struct v4l2_ioctl_ops *ops, ...@@ -1753,36 +1789,8 @@ static int v4l_enumstd(const struct v4l2_ioctl_ops *ops,
{ {
struct video_device *vfd = video_devdata(file); struct video_device *vfd = video_devdata(file);
struct v4l2_standard *p = arg; 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 */ return v4l_video_std_enumstd(p, vfd->tvnorms);
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;
} }
static int v4l_s_std(const struct v4l2_ioctl_ops *ops, static int v4l_s_std(const struct v4l2_ioctl_ops *ops,
......
...@@ -621,7 +621,7 @@ const char *v4l2_norm_to_name(v4l2_std_id id); ...@@ -621,7 +621,7 @@ const char *v4l2_norm_to_name(v4l2_std_id id);
* v4l2_video_std_frame_period - Ancillary routine that fills a * v4l2_video_std_frame_period - Ancillary routine that fills a
* struct &v4l2_fract pointer with the default framerate fraction. * 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 * @frameperiod: struct &v4l2_fract pointer to be filled
* *
*/ */
...@@ -632,7 +632,7 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod); ...@@ -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. * a &v4l2_standard structure according to the @id parameter.
* *
* @vs: struct &v4l2_standard pointer to be filled * @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 * @name: name of the standard to be used
* *
* .. note:: * .. note::
...@@ -642,6 +642,17 @@ void v4l2_video_std_frame_period(int id, struct v4l2_fract *frameperiod); ...@@ -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 v4l2_video_std_construct(struct v4l2_standard *vs,
int id, const char *name); 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 * v4l_printk_ioctl - Ancillary routine that prints the ioctl in a
* human-readable format. * human-readable format.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment