From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from smtp-vbr11.xs4all.nl ([194.109.24.31]:4848 "EHLO smtp-vbr11.xs4all.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753521AbaCKPeS (ORCPT ); Tue, 11 Mar 2014 11:34:18 -0400 Message-ID: <531F2CCB.4050804@xs4all.nl> Date: Tue, 11 Mar 2014 16:33:31 +0100 From: Hans Verkuil MIME-Version: 1.0 To: Laurent Pinchart , linux-media@vger.kernel.org CC: Hans Verkuil , Lars-Peter Clausen Subject: Re: [PATCH v3 26/48] v4l: Add support for DV timings ioctls on subdev nodes References: <1394493359-14115-27-git-send-email-laurent.pinchart@ideasonboard.com> <1394550568-25152-1-git-send-email-laurent.pinchart@ideasonboard.com> In-Reply-To: <1394550568-25152-1-git-send-email-laurent.pinchart@ideasonboard.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Sender: linux-media-owner@vger.kernel.org List-ID: On 03/11/2014 04:09 PM, Laurent Pinchart wrote: > Validate the pad field in the core code whenever specified. > > Signed-off-by: Laurent Pinchart Reviewed-by: Hans Verkuil Regards, Hans > --- > .../DocBook/media/v4l/vidioc-dv-timings-cap.xml | 27 +++++++++++++++---- > .../DocBook/media/v4l/vidioc-enum-dv-timings.xml | 30 +++++++++++++++++----- > drivers/media/v4l2-core/v4l2-subdev.c | 27 +++++++++++++++++++ > include/uapi/linux/v4l2-subdev.h | 5 ++++ > 4 files changed, 77 insertions(+), 12 deletions(-) > > diff --git a/Documentation/DocBook/media/v4l/vidioc-dv-timings-cap.xml b/Documentation/DocBook/media/v4l/vidioc-dv-timings-cap.xml > index cd7720d..28a8c1e 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-dv-timings-cap.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-dv-timings-cap.xml > @@ -1,11 +1,12 @@ > > > - ioctl VIDIOC_DV_TIMINGS_CAP > + ioctl VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP > &manvol; > > > > VIDIOC_DV_TIMINGS_CAP > + VIDIOC_SUBDEV_DV_TIMINGS_CAP > The capabilities of the Digital Video receiver/transmitter > > > @@ -33,7 +34,7 @@ > > request > > - VIDIOC_DV_TIMINGS_CAP > + VIDIOC_DV_TIMINGS_CAP, VIDIOC_SUBDEV_DV_TIMINGS_CAP > > > > @@ -54,10 +55,19 @@ > interface and may change in the future. > > > - To query the capabilities of the DV receiver/transmitter applications can call > -this ioctl and the driver will fill in the structure. Note that drivers may return > + To query the capabilities of the DV receiver/transmitter applications > +can call the VIDIOC_DV_TIMINGS_CAP ioctl on a video node > +and the driver will fill in the structure. Note that drivers may return > different values after switching the video input or output. > > + When implemented by the driver DV capabilities of subdevices can be > +queried by calling the VIDIOC_SUBDEV_DV_TIMINGS_CAP ioctl > +directly on a subdevice node. The capabilities are specific to inputs (for DV > +receivers) or outputs (for DV transmitters), applications must specify the > +desired pad number in the &v4l2-dv-timings-cap; pad > +field. Attempts to query capabilities on a pad that doesn't support them will > +return an &EINVAL;. > + > > struct <structname>v4l2_bt_timings_cap</structname> > > @@ -127,7 +137,14 @@ different values after switching the video input or output. > > > __u32 > - reserved[3] > + pad > + Pad number as reported by the media controller API. This field > + is only used when operating on a subdevice node. When operating on a > + video node applications must set this field to zero. > + > + > + __u32 > + reserved[2] > Reserved for future extensions. Drivers must set the array to zero. > > > diff --git a/Documentation/DocBook/media/v4l/vidioc-enum-dv-timings.xml b/Documentation/DocBook/media/v4l/vidioc-enum-dv-timings.xml > index b3e17c1..b9fdfea 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-enum-dv-timings.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-enum-dv-timings.xml > @@ -1,11 +1,12 @@ > > > - ioctl VIDIOC_ENUM_DV_TIMINGS > + ioctl VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS > &manvol; > > > > VIDIOC_ENUM_DV_TIMINGS > + VIDIOC_SUBDEV_ENUM_DV_TIMINGS > Enumerate supported Digital Video timings > > > @@ -33,7 +34,7 @@ > > request > > - VIDIOC_ENUM_DV_TIMINGS > + VIDIOC_ENUM_DV_TIMINGS, VIDIOC_SUBDEV_ENUM_DV_TIMINGS > > > > @@ -61,14 +62,21 @@ standards or even custom timings that are not in this list. > > To query the available timings, applications initialize the > index field and zero the reserved array of &v4l2-enum-dv-timings; > -and call the VIDIOC_ENUM_DV_TIMINGS ioctl with a pointer to this > -structure. Drivers fill the rest of the structure or return an > +and call the VIDIOC_ENUM_DV_TIMINGS ioctl on a video node with a > +pointer to this structure. Drivers fill the rest of the structure or return an > &EINVAL; when the index is out of bounds. To enumerate all supported DV timings, > applications shall begin at index zero, incrementing by one until the > driver returns EINVAL. Note that drivers may enumerate a > different set of DV timings after switching the video input or > output. > > + When implemented by the driver DV timings of subdevices can be queried > +by calling the VIDIOC_SUBDEV_ENUM_DV_TIMINGS ioctl directly > +on a subdevice node. The DV timings are specific to inputs (for DV receivers) or > +outputs (for DV transmitters), applications must specify the desired pad number > +in the &v4l2-enum-dv-timings; pad field. Attempts to > +enumerate timings on a pad that doesn't support them will return an &EINVAL;. > + >
> struct <structname>v4l2_enum_dv_timings</structname> > > @@ -82,8 +90,16 @@ application. > > > __u32 > - reserved[3] > - Reserved for future extensions. Drivers must set the array to zero. > + pad > + Pad number as reported by the media controller API. This field > + is only used when operating on a subdevice node. When operating on a > + video node applications must set this field to zero. > + > + > + __u32 > + reserved[2] > + Reserved for future extensions. Drivers and applications must > + set the array to zero. > > > &v4l2-dv-timings; > @@ -103,7 +119,7 @@ application. > EINVAL > > The &v4l2-enum-dv-timings; index > -is out of bounds. > +is out of bounds or the pad number is invalid. > > > > diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c > index 60d2550..853fb84 100644 > --- a/drivers/media/v4l2-core/v4l2-subdev.c > +++ b/drivers/media/v4l2-core/v4l2-subdev.c > @@ -354,6 +354,33 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg) > > case VIDIOC_SUBDEV_S_EDID: > return v4l2_subdev_call(sd, pad, set_edid, arg); > + > + case VIDIOC_SUBDEV_DV_TIMINGS_CAP: { > + struct v4l2_dv_timings_cap *cap = arg; > + > + if (cap->pad >= sd->entity.num_pads) > + return -EINVAL; > + > + return v4l2_subdev_call(sd, pad, dv_timings_cap, cap); > + } > + > + case VIDIOC_SUBDEV_ENUM_DV_TIMINGS: { > + struct v4l2_enum_dv_timings *dvt = arg; > + > + if (dvt->pad >= sd->entity.num_pads) > + return -EINVAL; > + > + return v4l2_subdev_call(sd, pad, enum_dv_timings, dvt); > + } > + > + case VIDIOC_SUBDEV_QUERY_DV_TIMINGS: > + return v4l2_subdev_call(sd, video, query_dv_timings, arg); > + > + case VIDIOC_SUBDEV_G_DV_TIMINGS: > + return v4l2_subdev_call(sd, video, g_dv_timings, arg); > + > + case VIDIOC_SUBDEV_S_DV_TIMINGS: > + return v4l2_subdev_call(sd, video, s_dv_timings, arg); > #endif > default: > return v4l2_subdev_call(sd, core, ioctl, cmd, arg); > diff --git a/include/uapi/linux/v4l2-subdev.h b/include/uapi/linux/v4l2-subdev.h > index 9fe3493..8dadb16 100644 > --- a/include/uapi/linux/v4l2-subdev.h > +++ b/include/uapi/linux/v4l2-subdev.h > @@ -169,5 +169,10 @@ struct v4l2_subdev_edid { > #define VIDIOC_SUBDEV_S_SELECTION _IOWR('V', 62, struct v4l2_subdev_selection) > #define VIDIOC_SUBDEV_G_EDID _IOWR('V', 40, struct v4l2_subdev_edid) > #define VIDIOC_SUBDEV_S_EDID _IOWR('V', 41, struct v4l2_subdev_edid) > +#define VIDIOC_SUBDEV_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings) > +#define VIDIOC_SUBDEV_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings) > +#define VIDIOC_SUBDEV_ENUM_DV_TIMINGS _IOWR('V', 98, struct v4l2_enum_dv_timings) > +#define VIDIOC_SUBDEV_QUERY_DV_TIMINGS _IOR('V', 99, struct v4l2_dv_timings) > +#define VIDIOC_SUBDEV_DV_TIMINGS_CAP _IOWR('V', 100, struct v4l2_dv_timings_cap) > > #endif >