Hi Sakari,
On Monday 12 July 2010 13:06:34 Sakari Ailus wrote:
> Mauro Carvalho Chehab wrote:
> > Em 09-07-2010 12:31, Laurent Pinchart escreveu:
[snip]
> >> diff --git a/drivers/media/video/v4l2-subdev.c
> >> b/drivers/media/video/v4l2-subdev.c index 0ebd760..31bec67 100644
> >> --- a/drivers/media/video/v4l2-subdev.c
> >> +++ b/drivers/media/video/v4l2-subdev.c
> >> @@ -18,26 +18,64 @@
[snip]
> >>
> >> static int subdev_open(struct file *file)
> >> {
> >>
> >> struct video_device *vdev = video_devdata(file);
> >> struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev);
> >>
> >> + struct v4l2_fh *vfh;
> >> + int ret;
> >>
> >> if (!sd->initialized)
> >>
> >> return -EAGAIN;
> >>
> >> + vfh = kzalloc(sizeof(*vfh), GFP_KERNEL);
> >> + if (vfh == NULL)
> >> + return -ENOMEM;
> >> +
> >> + ret = v4l2_fh_init(vfh, vdev);
> >> + if (ret)
> >> + goto err;
> >
> > Why to allocate/init the file handler for devices that don't need it?
> > I would just move the above logic to happen only if
> > V4L2_SUBDEV_FL_HAS_EVENTS.
>
> This patch actually adds subdev support for V4L2 file handles AND
> events. v4l2_fh is also used to support probe formats on subdevs (not
> contained in this patchset).
>
> That v4l2_fh_init() function just initialises a few fields, there is no
> allocation being done. The v4l2_fh structure will be part of
> v4l2_subdev_fh:
>
> struct v4l2_subdev_fh {
> struct v4l2_fh vfh;
> struct v4l2_mbus_framefmt *probe_fmt;
> struct v4l2_rect *probe_crop;
> };
>
> (Again not yet in this patchset.) The probe formats are a new concept to
> allow trying formats across the whole pipeline for which the old try_fmt
> wasn't suitable for: memory vs. bus format and pads matter.
Mauro's point was that v4l2_fh isn't needed if the subdev doesn't support
events. subdev_fh will likely be mandatory, but that's for a future patch, so
I can make the v4l2_fh allocation optional for now.
[snip]
> >> @@ -68,6 +107,18 @@ static long subdev_do_ioctl(struct file *file,
> >> unsigned int cmd, void *arg)
> >>
> >> case VIDIOC_TRY_EXT_CTRLS:
> >> return v4l2_subdev_call(sd, core, try_ext_ctrls, arg);
> >>
> >> + case VIDIOC_DQEVENT:
> >> + if (!(sd->flags & V4L2_SUBDEV_FL_HAS_EVENTS))
> >> + return -ENOIOCTLCMD;
> >> +
> >> + return v4l2_event_dequeue(fh, arg, file->f_flags & O_NONBLOCK);
> >> +
> >> + case VIDIOC_SUBSCRIBE_EVENT:
> >> + return v4l2_subdev_call(sd, core, subscribe_event, fh, arg);
> >> +
> >> + case VIDIOC_UNSUBSCRIBE_EVENT:
> >> + return v4l2_subdev_call(sd, core, unsubscribe_event, fh, arg);
> >
> > Hmm... shouldn't it test also for V4L2_SUBDEV_FL_HAS_EVENTS?
> >
> > I would do, instead:
> > if (fh) {
> >
> > switch(cmd) {
> >
> > /* FH events logic */
> >
> > }
> >
> > }
>
> No need to. If the subdev doesn't support events it likely should not
> define handlers for event specific calls, right? v4l2_subdev_call()
> behaves well if the handler is NULL.
>
> Both would work equally well, I guess.
The check in v4l2_subdev_call is fine, I don't think we need another check.
--
Regards,
Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html